• N
    [PROV][KEYMGMT][EC] Import/export of priv_key as padded const time BN · a377871d
    Nicola Tuveri 提交于
    For EC keys it is particularly important to avoid leaking the bit length
    of the secret scalar.
    
    Key import/export should never leak the bit length of the secret
    scalar in the key.
    
    For this reason, on export we use padded BIGNUMs with fixed length,
    using the new `ossl_param_bld_push_BN_pad()`.
    
    When importing we also should make sure that, even if short lived,
    the newly created BIGNUM is marked with the BN_FLG_CONSTTIME flag as
    soon as possible, so that any processing of this BIGNUM might opt for
    constant time implementations in the backend.
    
    Setting the BN_FLG_CONSTTIME flag alone is never enough, we also have
    to preallocate the BIGNUM internal buffer to a fixed size big enough
    that operations performed during the processing never trigger a
    realloc which would leak the size of the scalar through memory
    accesses.
    
    Fixed length
    ------------
    
    The order of the large prime subgroup of the curve is our choice for
    a fixed public size, as that is generally the upper bound for
    generating a private key in EC cryptosystems and should fit all valid
    secret scalars.
    
    For padding on export we just use the bit length of the order
    converted to bytes (rounding up).
    
    For preallocating the BIGNUM storage we look at the number of "words"
    required for the internal representation of the order, and we
    preallocate 2 extra "words" in case any of the subsequent processing
    might temporarily overflow the order length.
    
    Future work
    -----------
    
    To ensure the flag and fixed size preallocation persists upon
    `EC_KEY_set_private_key()`, we need to further harden
    `EC_KEY_set_private_key()` and `BN_copy()`.
    This is done in separate commits.
    Reviewed-by: NMatt Caswell <matt@openssl.org>
    Reviewed-by: NRichard Levitte <levitte@openssl.org>
    Reviewed-by: NShane Lontis <shane.lontis@oracle.com>
    (Merged from https://github.com/openssl/openssl/pull/10631)
    a377871d
ec_kmgmt.c 22.0 KB