mirror of https://github.com/nucypher/pyUmbral.git
Add BigNum class method gen_rand
parent
115816b5c9
commit
823dd8d794
|
@ -0,0 +1,48 @@
|
||||||
|
import os
|
||||||
|
from cryptography.hazmat.backends.openssl import backend
|
||||||
|
|
||||||
|
|
||||||
|
class BigNum(object):
|
||||||
|
"""
|
||||||
|
Represents an OpenSSL BIGNUM except more Pythonic
|
||||||
|
"""
|
||||||
|
|
||||||
|
def __init__(self, bignum, curve_nid, curve_group, curve_order):
|
||||||
|
self.bignum = bignum
|
||||||
|
self.curve_nid = curve_nid
|
||||||
|
self.curve_group = curve_group
|
||||||
|
self.curve_order = curve_order
|
||||||
|
|
||||||
|
@classmethod
|
||||||
|
def gen_rand(cls, curve):
|
||||||
|
"""
|
||||||
|
Returns a BigNum object with a cryptographically secure BigNum based
|
||||||
|
on the given curve.
|
||||||
|
"""
|
||||||
|
curve_nid = backend._elliptic_curve_to_nid(curve)
|
||||||
|
|
||||||
|
group = backend._lib.EC_GROUP_new_by_curve_name(curve_nid)
|
||||||
|
backend.openssl_assert(group != backend._ffi.NULL)
|
||||||
|
|
||||||
|
order = backend._lib.BN_new()
|
||||||
|
backend.openssl_assert(order != backend._ffi.NULL)
|
||||||
|
order = backend._ffi.gc(order, backend._lib.BN_free)
|
||||||
|
|
||||||
|
with backend._tmp_bn_ctx() as bn_ctx:
|
||||||
|
res = backend._lib.EC_GROUP_get_order(group, order, bn_ctx)
|
||||||
|
backend.openssl_assert(res == 1)
|
||||||
|
|
||||||
|
order_int = backend._bn_to_int(order)
|
||||||
|
|
||||||
|
# Generate random number on curve
|
||||||
|
rand_num = int.from_bytes(os.urandom(curve.key_size // 8), 'big')
|
||||||
|
while rand_num >= order_int or rand_num <= 0:
|
||||||
|
rand_num = int.from_bytes(os.urandom(curve.key_size // 8), 'big')
|
||||||
|
|
||||||
|
new_rand_bn = backend._int_to_bn(rand_num)
|
||||||
|
new_rand_bn = backend._ffi.gc(new_rand_bn, backend._lib.BN_free)
|
||||||
|
|
||||||
|
return BigNum(new_rand_bn, curve_nid, group, order)
|
||||||
|
|
||||||
|
def __int__(self):
|
||||||
|
return backend._bn_to_int(self.bignum)
|
Loading…
Reference in New Issue