56 lines
1.4 KiB
Python
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()
|