zcash-primitives-js/src/prf.js

88 lines
1.6 KiB
JavaScript

'use strict'
var typeforce = require('typeforce')
var types = require('./types')
var SHA256Compress = require('./sha256compress')
function prf (a, b, c, d, x, y) {
typeforce(types.tuple(
types.BoolNum,
types.BoolNum,
types.BoolNum,
types.BoolNum,
types.Buffer252bit,
types.Buffer256bit
), arguments)
var blob = Buffer.alloc(64)
x.copy(blob, 0)
y.copy(blob, 32)
blob[0] &= 0x0F
blob[0] |= (a ? 1 << 7 : 0) | (b ? 1 << 6 : 0) | (c ? 1 << 5 : 0) | (d ? 1 << 4 : 0)
var hasher = new SHA256Compress()
hasher.update(blob)
return hasher.hash()
}
function prfAddr (aSk, t) {
typeforce(types.tuple(types.Buffer252bit, types.UInt8), arguments)
var y = Buffer.alloc(32)
y.fill(0)
y[0] = t
return prf(1, 1, 0, 0, aSk, y)
}
function prfAddrAPk (aSk) {
return prfAddr(aSk, 0)
}
function prfAddrSkEnc (aSk) {
return prfAddr(aSk, 1)
}
function prfNf (aSk, rho) {
return prf(1, 1, 1, 0, aSk, rho)
}
function prfPk (aSk, i0, hSig) {
typeforce(types.tuple(
types.Buffer252bit,
types.Number,
types.Buffer256bit
), arguments)
if ((i0 !== 0) && (i0 !== 1)) {
throw new Error('PRF_pk invoked with index out of bounds')
}
return prf(0, i0, 0, 0, aSk, hSig)
}
function prfRho (phi, i0, hSig) {
typeforce(types.tuple(
types.Buffer252bit,
types.Number,
types.Buffer256bit
), arguments)
if ((i0 !== 0) && (i0 !== 1)) {
throw new Error('PRF_rho invoked with index out of bounds')
}
return prf(0, i0, 1, 0, phi, hSig)
}
module.exports = {
PRF_addr_a_pk: prfAddrAPk,
PRF_addr_sk_enc: prfAddrSkEnc,
PRF_nf: prfNf,
PRF_pk: prfPk,
PRF_rho: prfRho
}