Host-customized fork of https://github.com/tecnovert/basicswap/
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

61 lines
1.3 KiB

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import hmac
import hashlib
zero = bytes((0,))
one = bytes((1,))
def rfc6979_hmac_sha256_initialize(key):
rng_v = one * 32 # RFC6979 3.2.b.
rng_k = zero * 32 # RFC6979 3.2.c.
# RFC6979 3.2.d.
h = hmac.new(rng_k, digestmod=hashlib.sha256)
h.update(rng_v)
h.update(zero)
h.update(key)
rng_k = h.digest()
h = hmac.new(rng_k, digestmod=hashlib.sha256)
h.update(rng_v)
rng_v = h.digest()
# RFC6979 3.2.f.
h = hmac.new(rng_k, digestmod=hashlib.sha256)
h.update(rng_v)
h.update(one)
h.update(key)
rng_k = h.digest()
h = hmac.new(rng_k, digestmod=hashlib.sha256)
h.update(rng_v)
rng_v = h.digest()
return [rng_k, rng_v, False]
def rfc6979_hmac_sha256_generate(rng, n):
if rng[2]: # Retry
h = hmac.new(rng[0], digestmod=hashlib.sha256)
h.update(rng[1])
h.update(zero)
rng[0] = h.digest()
h = hmac.new(rng[0], digestmod=hashlib.sha256)
h.update(rng[1])
rng[1] = h.digest()
out = bytes()
while n > 0:
i = n if n < 32 else 32
h = hmac.new(rng[0], digestmod=hashlib.sha256)
h.update(rng[1])
rng[1] = h.digest()
out += rng[1][:i]
n -= i
rng[2] = True
return out