Example #1
0
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)
Example #2
0
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)
Example #3
0
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)
Example #4
0
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)
Example #5
0
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)