def BN_MOD_ADD(priv_a, priv_b) -> _EllipticCurvePrivateKey: """ Performs an OpenSSL BN_add on two EllipticCurvePrivateKeys and returns the result in an EllipticCurvePrivateKey. """ group = backend._lib.EC_KEY_get0_group(priv_a._ec_key) backend.openssl_assert(group != backend._ffi.NULL) prv_a = backend._lib.EC_KEY_get0_private_key(priv_a._ec_key) backend.openssl_assert(prv_a != backend._ffi.NULL) prv_b = backend._lib.EC_KEY_get0_private_key(priv_b._ec_key) backend.openssl_assert(prv_b != backend._ffi.NULL) sum = backend._lib.BN_new() backend.openssl_assert(sum != backend._ffi.NULL) sum = backend._ffi.gc(sum, backend._lib.BN_free) 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) res = backend._lib.BN_mod_add(sum, prv_a, prv_b, order, bn_ctx) backend.openssl_assert(res == 1) return _bignum_to_private_key(backend, group, sum)
def BN_MOD_MUL(priv_factor1, priv_factor2) -> _EllipticCurvePrivateKey: """ Performs an OpenSSL BN_mod_mul on two EllipticCurvePrivateKeys and returns the result in an EllipticCurvePrivateKey. """ group = backend._lib.EC_KEY_get0_group(priv_factor1._ec_key) backend.openssl_assert(group != backend._ffi.NULL) factor_a = backend._lib.EC_KEY_get0_private_key(priv_factor1._ec_key) backend.openssl_assert(factor_a != backend._ffi.NULL) factor_b = backend._lib.EC_KEY_get0_private_key(priv_factor2._ec_key) backend.openssl_assert(factor_b != backend._ffi.NULL) prod = backend._lib.BN_new() backend.openssl_assert(prod != backend._ffi.NULL) prod = backend._ffi.gc(prod, backend._lib.BN_free) 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) res = backend._lib.BN_mod_mul(prod, factor_a, factor_b, order, bn_ctx) backend.openssl_assert(res == 1) return _bignum_to_private_key(backend, group, prod)
def BN_MOD_INVERSE(priv_a) -> _EllipticCurvePrivateKey: """ Performs an OpenSSL BN_mod_inverse on an EllipticCurvePrivateKey and returns the result in an EllipticCurvePrivateKey. """ group = backend._lib.EC_KEY_get0_group(priv_a._ec_key) backend.openssl_assert(group != backend._ffi.NULL) prv_a = backend._lib.EC_KEY_get0_private_key(priv_a._ec_key) backend.openssl_assert(prv_a != 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) inv = backend._lib.BN_mod_inverse(backend._ffi.NULL, prv_a, order, bn_ctx) backend.openssl_assert(inv != backend._ffi.NULL) inv = backend._ffi.gc(inv, backend._lib.BN_free) return _bignum_to_private_key(backend, group, inv)
def CURVE_GET_ORDER(curve) -> _EllipticCurvePrivateKey: """ Returns the order of the curve provided. This returns it as a private key to use in the above operations, if needed. """ 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) return _bignum_to_private_key(backend, group, order)
def BN_DIV(priv_dividend, priv_divisor) -> _EllipticCurvePrivateKey: """ Performs an OpenSSL BN_div on two EllipticCurvePrivateKeys and returns the result in an EllipticCurvePrivateKey. """ group = backend._lib.EC_KEY_get0_group(priv_dividend._ec_key) backend.openssl_assert(group != backend._ffi.NULL) dividend = backend._lib.EC_KEY_get0_private_key(priv_dividend._ec_key) backend.openssl_assert(dividend != backend._ffi.NULL) divisor = backend._lib.EC_KEY_get0_private_key(priv_divisor._ec_key) backend.openssl_assert(divisor != backend._ffi.NULL) quotient = backend._lib.BN_new() backend.openssl_assert(quotient != backend._ffi.NULL) quotient = backend._ffi.gc(quotient, backend._lib.BN_free) with backend._tmp_bn_ctx() as bn_ctx: res = backend._lib.BN_div(quotient, backend._ffi.NULL, dividend, divisor, bn_ctx) backend.openssl_assert(res == 1) return _bignum_to_private_key(backend, group, quotient)