zcash-test-vectors/zcash_test_vectors/transparent/zip_0316.py

56 lines
1.4 KiB
Python

#!/usr/bin/env python3
import sys; assert sys.version_info[0] >= 3, "Python 3 required."
from ..output import render_args, render_tv
from ..rand import Rand
from ..sapling.key_components import prf_expand
from secp256k1 import PrivateKey
def derive_ovks(chaincode, pk):
assert len(pk) == 33 and pk[0] in (0x02, 0x03)
I_ovk = prf_expand(chaincode, b'\xD0' + pk)
ovk_external = I_ovk[:32]
ovk_internal = I_ovk[32:]
return (ovk_external, ovk_internal)
def main():
args = render_args()
from random import Random
rng = Random(0xabad533d)
def randbytes(l):
ret = []
while len(ret) < l:
ret.append(rng.randrange(0, 256))
return bytes(ret)
rand = Rand(randbytes)
test_vectors = []
for i in range(10):
chaincode = rand.b(32)
pk = PrivateKey(rand.b(32), True).pubkey.serialize(compressed=True)
(external_ovk, internal_ovk) = derive_ovks(chaincode, pk)
test_vectors.append({
'c' : chaincode,
'pk': pk,
'external_ovk': external_ovk,
'internal_ovk': internal_ovk,
})
render_tv(
args,
'zip_0316',
(
('c', '[u8; 32]'),
('pk', '[u8; 33]'),
('external_ovk', '[u8; 32]'),
('internal_ovk', '[u8; 32]'),
),
test_vectors,
)
if __file__ == '__main__':
main()