All files / src/crypto recover.ts

100% Statements 11/11
100% Branches 1/1
100% Functions 1/1
100% Lines 11/11

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23                  24x 1x   23x 23x 23x 23x 23x 23x 23x 23x 23x    
import {getCurve} from './curves'
 
import {KeyType} from '../'
 
/**
 * Recover public key from signature and recovery id.
 * @internal
 */
export function recover(signature: Uint8Array, message: Uint8Array, type: string) {
    if (type === KeyType.WA) {
        throw new Error(`can't recover webauthn public keys, please use @wharfkit/webauthn.`)
    }
    const curve = getCurve(type)
    const recid = signature[0] - 31
    const r = signature.subarray(1, 33)
    const s = signature.subarray(33, 33 + 32)
    const recoveredSig = new Uint8Array(65)
    recoveredSig[0] = recid
    recoveredSig.set(r, 1)
    recoveredSig.set(s, 33)
    return curve.recoverPublicKey(recoveredSig, message, {prehash: false})
}