Update OpenSSL-1.1.1-pre8-dev
This commit is contained in:
@@ -417,3 +417,19 @@ void EVP_PKEY_asn1_set_set_pub_key(EVP_PKEY_ASN1_METHOD *ameth,
|
||||
{
|
||||
ameth->set_pub_key = set_pub_key;
|
||||
}
|
||||
|
||||
void EVP_PKEY_asn1_set_get_priv_key(EVP_PKEY_ASN1_METHOD *ameth,
|
||||
int (*get_priv_key) (const EVP_PKEY *pk,
|
||||
unsigned char *priv,
|
||||
size_t *len))
|
||||
{
|
||||
ameth->get_priv_key = get_priv_key;
|
||||
}
|
||||
|
||||
void EVP_PKEY_asn1_set_get_pub_key(EVP_PKEY_ASN1_METHOD *ameth,
|
||||
int (*get_pub_key) (const EVP_PKEY *pk,
|
||||
unsigned char *pub,
|
||||
size_t *len))
|
||||
{
|
||||
ameth->get_pub_key = get_pub_key;
|
||||
}
|
||||
@@ -493,6 +493,9 @@ $code.=<<___;
|
||||
mulx $npj,$mul1,$acc1
|
||||
add $tpj,$car1,$car1
|
||||
ld [$np+$j],$npj ! np[j]
|
||||
srlx $car1,32,$tmp0
|
||||
and $car1,$mask,$car1
|
||||
add $tmp0,$sbit,$sbit
|
||||
add $acc0,$car1,$car1
|
||||
ld [$tp+8],$tpj ! tp[j]
|
||||
add $acc1,$car1,$car1
|
||||
|
||||
@@ -438,9 +438,9 @@ my ($a,$b,$c,$d)=@_;
|
||||
"&vxor ('$b','$b','$c')",
|
||||
"&vrlw ('$b','$b','$seven')",
|
||||
|
||||
"&vsldoi ('$c','$c','$c',8)",
|
||||
"&vsldoi ('$b','$b','$b',$odd?4:12)",
|
||||
"&vsldoi ('$d','$d','$d',$odd?12:4)"
|
||||
"&vrldoi ('$c','$c',8)",
|
||||
"&vrldoi ('$b','$b',$odd?4:12)",
|
||||
"&vrldoi ('$d','$d',$odd?12:4)"
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1334,11 +1334,12 @@ foreach (split("\n",$code)) {
|
||||
s/\?lvsr/lvsl/ or
|
||||
s/\?lvsl/lvsr/ or
|
||||
s/\?(vperm\s+v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+,\s*)(v[0-9]+)/$1$3$2$4/ or
|
||||
s/(vsldoi\s+v[0-9]+,\s*)(v[0-9]+,)\s*(v[0-9]+,\s*)([0-9]+)/$1$3$2 16-$4/;
|
||||
s/vrldoi(\s+v[0-9]+,\s*)(v[0-9]+,)\s*([0-9]+)/vsldoi$1$2$2 16-$3/;
|
||||
} else { # little-endian
|
||||
s/le\?// or
|
||||
s/be\?/#be#/ or
|
||||
s/\?([a-z]+)/$1/;
|
||||
s/\?([a-z]+)/$1/ or
|
||||
s/vrldoi(\s+v[0-9]+,\s*)(v[0-9]+,)\s*([0-9]+)/vsldoi$1$2$2 $3/;
|
||||
}
|
||||
|
||||
print $_,"\n";
|
||||
|
||||
+6
-1
@@ -78,10 +78,15 @@ static int generate_key(DH *dh)
|
||||
int ok = 0;
|
||||
int generate_new_key = 0;
|
||||
unsigned l;
|
||||
BN_CTX *ctx;
|
||||
BN_CTX *ctx = NULL;
|
||||
BN_MONT_CTX *mont = NULL;
|
||||
BIGNUM *pub_key = NULL, *priv_key = NULL;
|
||||
|
||||
if (BN_num_bits(dh->p) > OPENSSL_DH_MAX_MODULUS_BITS) {
|
||||
DHerr(DH_F_GENERATE_KEY, DH_R_MODULUS_TOO_LARGE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
ctx = BN_CTX_new();
|
||||
if (ctx == NULL)
|
||||
goto err;
|
||||
|
||||
+63
-7
@@ -196,7 +196,8 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
||||
EC_KEY *eckey)
|
||||
{
|
||||
int ok = 0, i;
|
||||
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL;
|
||||
BIGNUM *kinv = NULL, *s, *m = NULL, *tmp = NULL, *blind = NULL;
|
||||
BIGNUM *blindm = NULL;
|
||||
const BIGNUM *order, *ckinv;
|
||||
BN_CTX *ctx = NULL;
|
||||
const EC_GROUP *group;
|
||||
@@ -229,8 +230,18 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
||||
}
|
||||
s = ret->s;
|
||||
|
||||
if ((ctx = BN_CTX_new()) == NULL ||
|
||||
(tmp = BN_new()) == NULL || (m = BN_new()) == NULL) {
|
||||
ctx = BN_CTX_secure_new();
|
||||
if (ctx == NULL) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
BN_CTX_start(ctx);
|
||||
tmp = BN_CTX_get(ctx);
|
||||
m = BN_CTX_get(ctx);
|
||||
blind = BN_CTX_get(ctx);
|
||||
blindm = BN_CTX_get(ctx);
|
||||
if (blindm == NULL) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
@@ -270,18 +281,64 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
||||
}
|
||||
}
|
||||
|
||||
if (!BN_mod_mul(tmp, priv_key, ret->r, order, ctx)) {
|
||||
/*
|
||||
* The normal signature calculation is:
|
||||
*
|
||||
* s := k^-1 * (m + r * priv_key) mod order
|
||||
*
|
||||
* We will blind this to protect against side channel attacks
|
||||
*
|
||||
* s := k^-1 * blind^-1 * (blind * m + blind * r * priv_key) mod order
|
||||
*/
|
||||
|
||||
/* Generate a blinding value */
|
||||
do {
|
||||
if (!BN_priv_rand(blind, BN_num_bits(order) - 1,
|
||||
BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY))
|
||||
goto err;
|
||||
} while (BN_is_zero(blind));
|
||||
BN_set_flags(blind, BN_FLG_CONSTTIME);
|
||||
BN_set_flags(blindm, BN_FLG_CONSTTIME);
|
||||
BN_set_flags(tmp, BN_FLG_CONSTTIME);
|
||||
|
||||
/* tmp := blind * priv_key * r mod order */
|
||||
if (!BN_mod_mul(tmp, blind, priv_key, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (!BN_mod_add_quick(s, tmp, m, order)) {
|
||||
if (!BN_mod_mul(tmp, tmp, ret->r, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* blindm := blind * m mod order */
|
||||
if (!BN_mod_mul(blindm, blind, m, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* s : = (blind * priv_key * r) + (blind * m) mod order */
|
||||
if (!BN_mod_add_quick(s, tmp, blindm, order)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* s:= s * blind^-1 mod order */
|
||||
if (BN_mod_inverse(blind, blind, order, ctx) == NULL) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (!BN_mod_mul(s, s, blind, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* s := s * k^-1 mod order */
|
||||
if (!BN_mod_mul(s, s, ckinv, order, ctx)) {
|
||||
ECerr(EC_F_OSSL_ECDSA_SIGN_SIG, ERR_R_BN_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (BN_is_zero(s)) {
|
||||
/*
|
||||
* if kinv and r have been supplied by the caller, don't
|
||||
@@ -303,9 +360,8 @@ ECDSA_SIG *ossl_ecdsa_sign_sig(const unsigned char *dgst, int dgst_len,
|
||||
ECDSA_SIG_free(ret);
|
||||
ret = NULL;
|
||||
}
|
||||
BN_CTX_end(ctx);
|
||||
BN_CTX_free(ctx);
|
||||
BN_clear_free(m);
|
||||
BN_clear_free(tmp);
|
||||
BN_clear_free(kinv);
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -354,6 +354,47 @@ static int ecx_set_pub_key(EVP_PKEY *pkey, const unsigned char *pub, size_t len)
|
||||
KEY_OP_PUBLIC);
|
||||
}
|
||||
|
||||
static int ecx_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
|
||||
size_t *len)
|
||||
{
|
||||
const ECX_KEY *key = pkey->pkey.ecx;
|
||||
|
||||
if (priv == NULL) {
|
||||
*len = KEYLENID(pkey->ameth->pkey_id);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (key == NULL
|
||||
|| key->privkey == NULL
|
||||
|| *len < (size_t)KEYLENID(pkey->ameth->pkey_id))
|
||||
return 0;
|
||||
|
||||
*len = KEYLENID(pkey->ameth->pkey_id);
|
||||
memcpy(priv, key->privkey, *len);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ecx_get_pub_key(const EVP_PKEY *pkey, unsigned char *pub,
|
||||
size_t *len)
|
||||
{
|
||||
const ECX_KEY *key = pkey->pkey.ecx;
|
||||
|
||||
if (pub == NULL) {
|
||||
*len = KEYLENID(pkey->ameth->pkey_id);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (key == NULL
|
||||
|| *len < (size_t)KEYLENID(pkey->ameth->pkey_id))
|
||||
return 0;
|
||||
|
||||
*len = KEYLENID(pkey->ameth->pkey_id);
|
||||
memcpy(pub, key->pubkey, *len);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD ecx25519_asn1_meth = {
|
||||
EVP_PKEY_X25519,
|
||||
EVP_PKEY_X25519,
|
||||
@@ -393,6 +434,8 @@ const EVP_PKEY_ASN1_METHOD ecx25519_asn1_meth = {
|
||||
|
||||
ecx_set_priv_key,
|
||||
ecx_set_pub_key,
|
||||
ecx_get_priv_key,
|
||||
ecx_get_pub_key,
|
||||
};
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD ecx448_asn1_meth = {
|
||||
@@ -434,6 +477,8 @@ const EVP_PKEY_ASN1_METHOD ecx448_asn1_meth = {
|
||||
|
||||
ecx_set_priv_key,
|
||||
ecx_set_pub_key,
|
||||
ecx_get_priv_key,
|
||||
ecx_get_pub_key,
|
||||
};
|
||||
|
||||
static int ecd_size25519(const EVP_PKEY *pkey)
|
||||
@@ -547,6 +592,8 @@ const EVP_PKEY_ASN1_METHOD ed25519_asn1_meth = {
|
||||
|
||||
ecx_set_priv_key,
|
||||
ecx_set_pub_key,
|
||||
ecx_get_priv_key,
|
||||
ecx_get_pub_key,
|
||||
};
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD ed448_asn1_meth = {
|
||||
@@ -587,6 +634,8 @@ const EVP_PKEY_ASN1_METHOD ed448_asn1_meth = {
|
||||
|
||||
ecx_set_priv_key,
|
||||
ecx_set_pub_key,
|
||||
ecx_get_priv_key,
|
||||
ecx_get_pub_key,
|
||||
};
|
||||
|
||||
static int pkey_ecx_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
|
||||
|
||||
@@ -757,6 +757,8 @@ EVP_F_EVP_PKEY_GET0_HMAC:183:EVP_PKEY_get0_hmac
|
||||
EVP_F_EVP_PKEY_GET0_POLY1305:184:EVP_PKEY_get0_poly1305
|
||||
EVP_F_EVP_PKEY_GET0_RSA:121:EVP_PKEY_get0_RSA
|
||||
EVP_F_EVP_PKEY_GET0_SIPHASH:172:EVP_PKEY_get0_siphash
|
||||
EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY:202:EVP_PKEY_get_raw_private_key
|
||||
EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY:203:EVP_PKEY_get_raw_public_key
|
||||
EVP_F_EVP_PKEY_KEYGEN:146:EVP_PKEY_keygen
|
||||
EVP_F_EVP_PKEY_KEYGEN_INIT:147:EVP_PKEY_keygen_init
|
||||
EVP_F_EVP_PKEY_METH_ADD0:194:EVP_PKEY_meth_add0
|
||||
@@ -2199,6 +2201,7 @@ EVP_R_EXPECTING_A_EC_KEY:142:expecting a ec key
|
||||
EVP_R_EXPECTING_A_POLY1305_KEY:164:expecting a poly1305 key
|
||||
EVP_R_EXPECTING_A_SIPHASH_KEY:175:expecting a siphash key
|
||||
EVP_R_FIPS_MODE_NOT_SUPPORTED:167:fips mode not supported
|
||||
EVP_R_GET_RAW_KEY_FAILED:182:get raw key failed
|
||||
EVP_R_ILLEGAL_SCRYPT_PARAMETERS:171:illegal scrypt parameters
|
||||
EVP_R_INITIALIZATION_ERROR:134:initialization error
|
||||
EVP_R_INPUT_NOT_INITIALIZED:111:input not initialized
|
||||
|
||||
@@ -93,6 +93,10 @@ static const ERR_STRING_DATA EVP_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_GET0_RSA, 0), "EVP_PKEY_get0_RSA"},
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_GET0_SIPHASH, 0),
|
||||
"EVP_PKEY_get0_siphash"},
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY, 0),
|
||||
"EVP_PKEY_get_raw_private_key"},
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY, 0),
|
||||
"EVP_PKEY_get_raw_public_key"},
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_KEYGEN, 0), "EVP_PKEY_keygen"},
|
||||
{ERR_PACK(ERR_LIB_EVP, EVP_F_EVP_PKEY_KEYGEN_INIT, 0),
|
||||
"EVP_PKEY_keygen_init"},
|
||||
@@ -185,6 +189,7 @@ static const ERR_STRING_DATA EVP_str_reasons[] = {
|
||||
"expecting a siphash key"},
|
||||
{ERR_PACK(ERR_LIB_EVP, 0, EVP_R_FIPS_MODE_NOT_SUPPORTED),
|
||||
"fips mode not supported"},
|
||||
{ERR_PACK(ERR_LIB_EVP, 0, EVP_R_GET_RAW_KEY_FAILED), "get raw key failed"},
|
||||
{ERR_PACK(ERR_LIB_EVP, 0, EVP_R_ILLEGAL_SCRYPT_PARAMETERS),
|
||||
"illegal scrypt parameters"},
|
||||
{ERR_PACK(ERR_LIB_EVP, 0, EVP_R_INITIALIZATION_ERROR),
|
||||
|
||||
@@ -280,6 +280,40 @@ EVP_PKEY *EVP_PKEY_new_raw_public_key(int type, ENGINE *e,
|
||||
return NULL;
|
||||
}
|
||||
|
||||
int EVP_PKEY_get_raw_private_key(const EVP_PKEY *pkey, unsigned char *priv,
|
||||
size_t *len)
|
||||
{
|
||||
if (pkey->ameth->get_priv_key == NULL) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY,
|
||||
EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pkey->ameth->get_priv_key(pkey, priv, len)) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET_RAW_PRIVATE_KEY, EVP_R_GET_RAW_KEY_FAILED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
int EVP_PKEY_get_raw_public_key(const EVP_PKEY *pkey, unsigned char *pub,
|
||||
size_t *len)
|
||||
{
|
||||
if (pkey->ameth->get_pub_key == NULL) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY,
|
||||
EVP_R_OPERATION_NOT_SUPPORTED_FOR_THIS_KEYTYPE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (!pkey->ameth->get_pub_key(pkey, pub, len)) {
|
||||
EVPerr(EVP_F_EVP_PKEY_GET_RAW_PUBLIC_KEY, EVP_R_GET_RAW_KEY_FAILED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
EVP_PKEY *EVP_PKEY_new_CMAC_key(ENGINE *e, const unsigned char *priv,
|
||||
size_t len, const EVP_CIPHER *cipher)
|
||||
{
|
||||
|
||||
@@ -72,6 +72,25 @@ static int hmac_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int hmac_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
|
||||
size_t *len)
|
||||
{
|
||||
ASN1_OCTET_STRING *os = (ASN1_OCTET_STRING *)pkey->pkey.ptr;
|
||||
|
||||
if (priv == NULL) {
|
||||
*len = ASN1_STRING_length(os);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (os == NULL || *len < (size_t)ASN1_STRING_length(os))
|
||||
return 0;
|
||||
|
||||
*len = ASN1_STRING_length(os);
|
||||
memcpy(priv, ASN1_STRING_get0_data(os), *len);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD hmac_asn1_meth = {
|
||||
EVP_PKEY_HMAC,
|
||||
EVP_PKEY_HMAC,
|
||||
@@ -103,4 +122,6 @@ const EVP_PKEY_ASN1_METHOD hmac_asn1_meth = {
|
||||
|
||||
hmac_set_priv_key,
|
||||
NULL,
|
||||
hmac_get_priv_key,
|
||||
NULL,
|
||||
};
|
||||
@@ -61,6 +61,8 @@ struct evp_pkey_asn1_method_st {
|
||||
/* Get/set raw private/public key data */
|
||||
int (*set_priv_key) (EVP_PKEY *pk, const unsigned char *priv, size_t len);
|
||||
int (*set_pub_key) (EVP_PKEY *pk, const unsigned char *pub, size_t len);
|
||||
int (*get_priv_key) (const EVP_PKEY *pk, unsigned char *priv, size_t *len);
|
||||
int (*get_pub_key) (const EVP_PKEY *pk, unsigned char *pub, size_t *len);
|
||||
} /* EVP_PKEY_ASN1_METHOD */ ;
|
||||
|
||||
DEFINE_STACK_OF_CONST(EVP_PKEY_ASN1_METHOD)
|
||||
|
||||
@@ -178,12 +178,13 @@ struct ocb128_context {
|
||||
OCB_BLOCK l_dollar;
|
||||
OCB_BLOCK *l;
|
||||
/* Must be reset for each session */
|
||||
u64 blocks_hashed;
|
||||
u64 blocks_processed;
|
||||
OCB_BLOCK tag;
|
||||
OCB_BLOCK offset_aad;
|
||||
OCB_BLOCK sum;
|
||||
OCB_BLOCK offset;
|
||||
OCB_BLOCK checksum;
|
||||
struct {
|
||||
u64 blocks_hashed;
|
||||
u64 blocks_processed;
|
||||
OCB_BLOCK offset_aad;
|
||||
OCB_BLOCK sum;
|
||||
OCB_BLOCK offset;
|
||||
OCB_BLOCK checksum;
|
||||
} sess;
|
||||
};
|
||||
#endif /* OPENSSL_NO_OCB */
|
||||
+66
-65
@@ -239,6 +239,9 @@ int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv,
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Reset nonce-dependent variables */
|
||||
memset(&ctx->sess, 0, sizeof(ctx->sess));
|
||||
|
||||
/* Nonce = num2str(TAGLEN mod 128,7) || zeros(120-bitlen(N)) || 1 || N */
|
||||
nonce[0] = ((taglen * 8) % 128) << 1;
|
||||
memset(nonce + 1, 0, 15);
|
||||
@@ -259,10 +262,10 @@ int CRYPTO_ocb128_setiv(OCB128_CONTEXT *ctx, const unsigned char *iv,
|
||||
|
||||
/* Offset_0 = Stretch[1+bottom..128+bottom] */
|
||||
shift = bottom % 8;
|
||||
ocb_block_lshift(stretch + (bottom / 8), shift, ctx->offset.c);
|
||||
ocb_block_lshift(stretch + (bottom / 8), shift, ctx->sess.offset.c);
|
||||
mask = 0xff;
|
||||
mask <<= 8 - shift;
|
||||
ctx->offset.c[15] |=
|
||||
ctx->sess.offset.c[15] |=
|
||||
(*(stretch + (bottom / 8) + 16) & mask) >> (8 - shift);
|
||||
|
||||
return 1;
|
||||
@@ -281,25 +284,25 @@ int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad,
|
||||
|
||||
/* Calculate the number of blocks of AAD provided now, and so far */
|
||||
num_blocks = len / 16;
|
||||
all_num_blocks = num_blocks + ctx->blocks_hashed;
|
||||
all_num_blocks = num_blocks + ctx->sess.blocks_hashed;
|
||||
|
||||
/* Loop through all full blocks of AAD */
|
||||
for (i = ctx->blocks_hashed + 1; i <= all_num_blocks; i++) {
|
||||
for (i = ctx->sess.blocks_hashed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *lookup;
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset_aad, lookup, &ctx->offset_aad);
|
||||
ocb_block16_xor(&ctx->sess.offset_aad, lookup, &ctx->sess.offset_aad);
|
||||
|
||||
memcpy(tmp.c, aad, 16);
|
||||
aad += 16;
|
||||
|
||||
/* Sum_i = Sum_{i-1} xor ENCIPHER(K, A_i xor Offset_i) */
|
||||
ocb_block16_xor(&ctx->offset_aad, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset_aad, &tmp, &tmp);
|
||||
ctx->encrypt(tmp.c, tmp.c, ctx->keyenc);
|
||||
ocb_block16_xor(&tmp, &ctx->sum, &ctx->sum);
|
||||
ocb_block16_xor(&tmp, &ctx->sess.sum, &ctx->sess.sum);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -310,20 +313,21 @@ int CRYPTO_ocb128_aad(OCB128_CONTEXT *ctx, const unsigned char *aad,
|
||||
|
||||
if (last_len > 0) {
|
||||
/* Offset_* = Offset_m xor L_* */
|
||||
ocb_block16_xor(&ctx->offset_aad, &ctx->l_star, &ctx->offset_aad);
|
||||
ocb_block16_xor(&ctx->sess.offset_aad, &ctx->l_star,
|
||||
&ctx->sess.offset_aad);
|
||||
|
||||
/* CipherInput = (A_* || 1 || zeros(127-bitlen(A_*))) xor Offset_* */
|
||||
memset(tmp.c, 0, 16);
|
||||
memcpy(tmp.c, aad, last_len);
|
||||
tmp.c[last_len] = 0x80;
|
||||
ocb_block16_xor(&ctx->offset_aad, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset_aad, &tmp, &tmp);
|
||||
|
||||
/* Sum = Sum_m xor ENCIPHER(K, CipherInput) */
|
||||
ctx->encrypt(tmp.c, tmp.c, ctx->keyenc);
|
||||
ocb_block16_xor(&tmp, &ctx->sum, &ctx->sum);
|
||||
ocb_block16_xor(&tmp, &ctx->sess.sum, &ctx->sess.sum);
|
||||
}
|
||||
|
||||
ctx->blocks_hashed = all_num_blocks;
|
||||
ctx->sess.blocks_hashed = all_num_blocks;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -344,7 +348,7 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
* so far
|
||||
*/
|
||||
num_blocks = len / 16;
|
||||
all_num_blocks = num_blocks + ctx->blocks_processed;
|
||||
all_num_blocks = num_blocks + ctx->sess.blocks_processed;
|
||||
|
||||
if (num_blocks && all_num_blocks == (size_t)all_num_blocks
|
||||
&& ctx->stream != NULL) {
|
||||
@@ -360,11 +364,11 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
return 0;
|
||||
|
||||
ctx->stream(in, out, num_blocks, ctx->keyenc,
|
||||
(size_t)ctx->blocks_processed + 1, ctx->offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->checksum.c);
|
||||
(size_t)ctx->sess.blocks_processed + 1, ctx->sess.offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->sess.checksum.c);
|
||||
} else {
|
||||
/* Loop through all full blocks to be encrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
for (i = ctx->sess.blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
OCB_BLOCK *lookup;
|
||||
OCB_BLOCK tmp;
|
||||
|
||||
@@ -372,18 +376,18 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
ocb_block16_xor(&ctx->sess.offset, lookup, &ctx->sess.offset);
|
||||
|
||||
memcpy(tmp.c, in, 16);
|
||||
in += 16;
|
||||
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor(&tmp, &ctx->checksum, &ctx->checksum);
|
||||
ocb_block16_xor(&tmp, &ctx->sess.checksum, &ctx->sess.checksum);
|
||||
|
||||
/* C_i = Offset_i xor ENCIPHER(K, P_i xor Offset_i) */
|
||||
ocb_block16_xor(&ctx->offset, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset, &tmp, &tmp);
|
||||
ctx->encrypt(tmp.c, tmp.c, ctx->keyenc);
|
||||
ocb_block16_xor(&ctx->offset, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset, &tmp, &tmp);
|
||||
|
||||
memcpy(out, tmp.c, 16);
|
||||
out += 16;
|
||||
@@ -400,10 +404,10 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
OCB_BLOCK pad;
|
||||
|
||||
/* Offset_* = Offset_m xor L_* */
|
||||
ocb_block16_xor(&ctx->offset, &ctx->l_star, &ctx->offset);
|
||||
ocb_block16_xor(&ctx->sess.offset, &ctx->l_star, &ctx->sess.offset);
|
||||
|
||||
/* Pad = ENCIPHER(K, Offset_*) */
|
||||
ctx->encrypt(ctx->offset.c, pad.c, ctx->keyenc);
|
||||
ctx->encrypt(ctx->sess.offset.c, pad.c, ctx->keyenc);
|
||||
|
||||
/* C_* = P_* xor Pad[1..bitlen(P_*)] */
|
||||
ocb_block_xor(in, pad.c, last_len, out);
|
||||
@@ -412,10 +416,10 @@ int CRYPTO_ocb128_encrypt(OCB128_CONTEXT *ctx,
|
||||
memset(pad.c, 0, 16); /* borrow pad */
|
||||
memcpy(pad.c, in, last_len);
|
||||
pad.c[last_len] = 0x80;
|
||||
ocb_block16_xor(&pad, &ctx->checksum, &ctx->checksum);
|
||||
ocb_block16_xor(&pad, &ctx->sess.checksum, &ctx->sess.checksum);
|
||||
}
|
||||
|
||||
ctx->blocks_processed = all_num_blocks;
|
||||
ctx->sess.blocks_processed = all_num_blocks;
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -436,7 +440,7 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
* so far
|
||||
*/
|
||||
num_blocks = len / 16;
|
||||
all_num_blocks = num_blocks + ctx->blocks_processed;
|
||||
all_num_blocks = num_blocks + ctx->sess.blocks_processed;
|
||||
|
||||
if (num_blocks && all_num_blocks == (size_t)all_num_blocks
|
||||
&& ctx->stream != NULL) {
|
||||
@@ -452,30 +456,30 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
return 0;
|
||||
|
||||
ctx->stream(in, out, num_blocks, ctx->keydec,
|
||||
(size_t)ctx->blocks_processed + 1, ctx->offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->checksum.c);
|
||||
(size_t)ctx->sess.blocks_processed + 1, ctx->sess.offset.c,
|
||||
(const unsigned char (*)[16])ctx->l, ctx->sess.checksum.c);
|
||||
} else {
|
||||
OCB_BLOCK tmp;
|
||||
|
||||
/* Loop through all full blocks to be decrypted */
|
||||
for (i = ctx->blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
for (i = ctx->sess.blocks_processed + 1; i <= all_num_blocks; i++) {
|
||||
|
||||
/* Offset_i = Offset_{i-1} xor L_{ntz(i)} */
|
||||
OCB_BLOCK *lookup = ocb_lookup_l(ctx, ocb_ntz(i));
|
||||
if (lookup == NULL)
|
||||
return 0;
|
||||
ocb_block16_xor(&ctx->offset, lookup, &ctx->offset);
|
||||
ocb_block16_xor(&ctx->sess.offset, lookup, &ctx->sess.offset);
|
||||
|
||||
memcpy(tmp.c, in, 16);
|
||||
in += 16;
|
||||
|
||||
/* P_i = Offset_i xor DECIPHER(K, C_i xor Offset_i) */
|
||||
ocb_block16_xor(&ctx->offset, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset, &tmp, &tmp);
|
||||
ctx->decrypt(tmp.c, tmp.c, ctx->keydec);
|
||||
ocb_block16_xor(&ctx->offset, &tmp, &tmp);
|
||||
ocb_block16_xor(&ctx->sess.offset, &tmp, &tmp);
|
||||
|
||||
/* Checksum_i = Checksum_{i-1} xor P_i */
|
||||
ocb_block16_xor(&tmp, &ctx->checksum, &ctx->checksum);
|
||||
ocb_block16_xor(&tmp, &ctx->sess.checksum, &ctx->sess.checksum);
|
||||
|
||||
memcpy(out, tmp.c, 16);
|
||||
out += 16;
|
||||
@@ -492,10 +496,10 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
OCB_BLOCK pad;
|
||||
|
||||
/* Offset_* = Offset_m xor L_* */
|
||||
ocb_block16_xor(&ctx->offset, &ctx->l_star, &ctx->offset);
|
||||
ocb_block16_xor(&ctx->sess.offset, &ctx->l_star, &ctx->sess.offset);
|
||||
|
||||
/* Pad = ENCIPHER(K, Offset_*) */
|
||||
ctx->encrypt(ctx->offset.c, pad.c, ctx->keyenc);
|
||||
ctx->encrypt(ctx->sess.offset.c, pad.c, ctx->keyenc);
|
||||
|
||||
/* P_* = C_* xor Pad[1..bitlen(C_*)] */
|
||||
ocb_block_xor(in, pad.c, last_len, out);
|
||||
@@ -504,39 +508,46 @@ int CRYPTO_ocb128_decrypt(OCB128_CONTEXT *ctx,
|
||||
memset(pad.c, 0, 16); /* borrow pad */
|
||||
memcpy(pad.c, out, last_len);
|
||||
pad.c[last_len] = 0x80;
|
||||
ocb_block16_xor(&pad, &ctx->checksum, &ctx->checksum);
|
||||
ocb_block16_xor(&pad, &ctx->sess.checksum, &ctx->sess.checksum);
|
||||
}
|
||||
|
||||
ctx->blocks_processed = all_num_blocks;
|
||||
ctx->sess.blocks_processed = all_num_blocks;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int ocb_finish(OCB128_CONTEXT *ctx, unsigned char *tag, size_t len,
|
||||
int write)
|
||||
{
|
||||
OCB_BLOCK tmp;
|
||||
|
||||
if (len > 16 || len < 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Tag = ENCIPHER(K, Checksum_* xor Offset_* xor L_$) xor HASH(K,A)
|
||||
*/
|
||||
ocb_block16_xor(&ctx->sess.checksum, &ctx->sess.offset, &tmp);
|
||||
ocb_block16_xor(&ctx->l_dollar, &tmp, &tmp);
|
||||
ctx->encrypt(tmp.c, tmp.c, ctx->keyenc);
|
||||
ocb_block16_xor(&tmp, &ctx->sess.sum, &tmp);
|
||||
|
||||
if (write) {
|
||||
memcpy(tag, &tmp, len);
|
||||
return 1;
|
||||
} else {
|
||||
return CRYPTO_memcmp(&tmp, tag, len);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the tag and verify it against the supplied tag
|
||||
*/
|
||||
int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag,
|
||||
size_t len)
|
||||
{
|
||||
OCB_BLOCK tmp;
|
||||
|
||||
/*
|
||||
* Tag = ENCIPHER(K, Checksum_* xor Offset_* xor L_$) xor HASH(K,A)
|
||||
*/
|
||||
ocb_block16_xor(&ctx->checksum, &ctx->offset, &tmp);
|
||||
ocb_block16_xor(&ctx->l_dollar, &tmp, &tmp);
|
||||
ctx->encrypt(tmp.c, tmp.c, ctx->keyenc);
|
||||
ocb_block16_xor(&tmp, &ctx->sum, &ctx->tag);
|
||||
|
||||
if (len > 16 || len < 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Compare the tag if we've been given one */
|
||||
if (tag)
|
||||
return CRYPTO_memcmp(&ctx->tag, tag, len);
|
||||
else
|
||||
return -1;
|
||||
return ocb_finish(ctx, (unsigned char*)tag, len, 0);
|
||||
}
|
||||
|
||||
/*
|
||||
@@ -544,17 +555,7 @@ int CRYPTO_ocb128_finish(OCB128_CONTEXT *ctx, const unsigned char *tag,
|
||||
*/
|
||||
int CRYPTO_ocb128_tag(OCB128_CONTEXT *ctx, unsigned char *tag, size_t len)
|
||||
{
|
||||
if (len > 16 || len < 1) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Calculate the tag */
|
||||
CRYPTO_ocb128_finish(ctx, NULL, 0);
|
||||
|
||||
/* Copy the tag into the supplied buffer */
|
||||
memcpy(tag, ctx->tag.c, len);
|
||||
|
||||
return 1;
|
||||
return ocb_finish(ctx, tag, len, 1);
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
*/
|
||||
|
||||
/* Serialized OID's */
|
||||
static const unsigned char so[7626] = {
|
||||
static const unsigned char so[7746] = {
|
||||
0x2A,0x86,0x48,0x86,0xF7,0x0D, /* [ 0] OBJ_rsadsi */
|
||||
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01, /* [ 6] OBJ_pkcs */
|
||||
0x2A,0x86,0x48,0x86,0xF7,0x0D,0x02,0x02, /* [ 13] OBJ_md2 */
|
||||
@@ -1060,9 +1060,23 @@ static const unsigned char so[7626] = {
|
||||
0x2B,0x6F, /* [ 7610] OBJ_ieee */
|
||||
0x2B,0x6F,0x02,0x8C,0x53, /* [ 7612] OBJ_ieee_siswg */
|
||||
0x2A,0x81,0x1C,0xCF,0x55,0x01,0x82,0x2D, /* [ 7617] OBJ_sm2 */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x01, /* [ 7625] OBJ_id_tc26_cipher_gostr3412_2015_magma */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x01,0x01, /* [ 7633] OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x01,0x02, /* [ 7642] OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x02, /* [ 7651] OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x02,0x01, /* [ 7659] OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x05,0x02,0x02, /* [ 7668] OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x07, /* [ 7677] OBJ_id_tc26_wrap */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x07,0x01, /* [ 7684] OBJ_id_tc26_wrap_gostr3412_2015_magma */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x07,0x01,0x01, /* [ 7692] OBJ_id_tc26_wrap_gostr3412_2015_magma_kexp15 */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x07,0x02, /* [ 7701] OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x01,0x07,0x01,0x01, /* [ 7709] OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x02,0x01,0x01,0x02, /* [ 7718] OBJ_id_tc26_gost_3410_2012_256_paramSetB */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x02,0x01,0x01,0x03, /* [ 7727] OBJ_id_tc26_gost_3410_2012_256_paramSetC */
|
||||
0x2A,0x85,0x03,0x07,0x01,0x02,0x01,0x01,0x04, /* [ 7736] OBJ_id_tc26_gost_3410_2012_256_paramSetD */
|
||||
};
|
||||
|
||||
#define NUM_NID 1173
|
||||
#define NUM_NID 1193
|
||||
static const ASN1_OBJECT nid_objs[NUM_NID] = {
|
||||
{"UNDEF", "undefined", NID_undef},
|
||||
{"rsadsi", "RSA Data Security, Inc.", NID_rsadsi, 6, &so[0]},
|
||||
@@ -2237,9 +2251,29 @@ static const ASN1_OBJECT nid_objs[NUM_NID] = {
|
||||
{"ieee", "ieee", NID_ieee, 2, &so[7610]},
|
||||
{"ieee-siswg", "IEEE Security in Storage Working Group", NID_ieee_siswg, 5, &so[7612]},
|
||||
{"SM2", "sm2", NID_sm2, 8, &so[7617]},
|
||||
{"id-tc26-cipher-gostr3412-2015-magma", "id-tc26-cipher-gostr3412-2015-magma", NID_id_tc26_cipher_gostr3412_2015_magma, 8, &so[7625]},
|
||||
{"id-tc26-cipher-gostr3412-2015-magma-ctracpkm", "id-tc26-cipher-gostr3412-2015-magma-ctracpkm", NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm, 9, &so[7633]},
|
||||
{"id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac", "id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac", NID_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac, 9, &so[7642]},
|
||||
{"id-tc26-cipher-gostr3412-2015-kuznyechik", "id-tc26-cipher-gostr3412-2015-kuznyechik", NID_id_tc26_cipher_gostr3412_2015_kuznyechik, 8, &so[7651]},
|
||||
{"id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm", "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm", NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm, 9, &so[7659]},
|
||||
{"id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac", "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac", NID_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac, 9, &so[7668]},
|
||||
{"id-tc26-wrap", "id-tc26-wrap", NID_id_tc26_wrap, 7, &so[7677]},
|
||||
{"id-tc26-wrap-gostr3412-2015-magma", "id-tc26-wrap-gostr3412-2015-magma", NID_id_tc26_wrap_gostr3412_2015_magma, 8, &so[7684]},
|
||||
{"id-tc26-wrap-gostr3412-2015-magma-kexp15", "id-tc26-wrap-gostr3412-2015-magma-kexp15", NID_id_tc26_wrap_gostr3412_2015_magma_kexp15, 9, &so[7692]},
|
||||
{"id-tc26-wrap-gostr3412-2015-kuznyechik", "id-tc26-wrap-gostr3412-2015-kuznyechik", NID_id_tc26_wrap_gostr3412_2015_kuznyechik, 8, &so[7701]},
|
||||
{"id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15", "id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15", NID_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15, 9, &so[7709]},
|
||||
{"id-tc26-gost-3410-2012-256-paramSetB", "GOST R 34.10-2012 (256 bit) ParamSet B", NID_id_tc26_gost_3410_2012_256_paramSetB, 9, &so[7718]},
|
||||
{"id-tc26-gost-3410-2012-256-paramSetC", "GOST R 34.10-2012 (256 bit) ParamSet C", NID_id_tc26_gost_3410_2012_256_paramSetC, 9, &so[7727]},
|
||||
{"id-tc26-gost-3410-2012-256-paramSetD", "GOST R 34.10-2012 (256 bit) ParamSet D", NID_id_tc26_gost_3410_2012_256_paramSetD, 9, &so[7736]},
|
||||
{"magma-ecb", "magma-ecb", NID_magma_ecb},
|
||||
{"magma-ctr", "magma-ctr", NID_magma_ctr},
|
||||
{"magma-ofb", "magma-ofb", NID_magma_ofb},
|
||||
{"magma-cbc", "magma-cbc", NID_magma_cbc},
|
||||
{"magma-cfb", "magma-cfb", NID_magma_cfb},
|
||||
{"magma-mac", "magma-mac", NID_magma_mac},
|
||||
};
|
||||
|
||||
#define NUM_SN 1164
|
||||
#define NUM_SN 1184
|
||||
static const unsigned int sn_objs[NUM_SN] = {
|
||||
364, /* "AD_DVCS" */
|
||||
419, /* "AES-128-CBC" */
|
||||
@@ -2999,6 +3033,12 @@ static const unsigned int sn_objs[NUM_SN] = {
|
||||
977, /* "id-tc26-algorithms" */
|
||||
990, /* "id-tc26-cipher" */
|
||||
1001, /* "id-tc26-cipher-constants" */
|
||||
1176, /* "id-tc26-cipher-gostr3412-2015-kuznyechik" */
|
||||
1177, /* "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm" */
|
||||
1178, /* "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac" */
|
||||
1173, /* "id-tc26-cipher-gostr3412-2015-magma" */
|
||||
1174, /* "id-tc26-cipher-gostr3412-2015-magma-ctracpkm" */
|
||||
1175, /* "id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac" */
|
||||
994, /* "id-tc26-constants" */
|
||||
981, /* "id-tc26-digest" */
|
||||
1000, /* "id-tc26-digest-constants" */
|
||||
@@ -3006,6 +3046,9 @@ static const unsigned int sn_objs[NUM_SN] = {
|
||||
1003, /* "id-tc26-gost-28147-param-Z" */
|
||||
1147, /* "id-tc26-gost-3410-2012-256-constants" */
|
||||
1148, /* "id-tc26-gost-3410-2012-256-paramSetA" */
|
||||
1184, /* "id-tc26-gost-3410-2012-256-paramSetB" */
|
||||
1185, /* "id-tc26-gost-3410-2012-256-paramSetC" */
|
||||
1186, /* "id-tc26-gost-3410-2012-256-paramSetD" */
|
||||
996, /* "id-tc26-gost-3410-2012-512-constants" */
|
||||
998, /* "id-tc26-gost-3410-2012-512-paramSetA" */
|
||||
999, /* "id-tc26-gost-3410-2012-512-paramSetB" */
|
||||
@@ -3019,6 +3062,11 @@ static const unsigned int sn_objs[NUM_SN] = {
|
||||
984, /* "id-tc26-signwithdigest" */
|
||||
985, /* "id-tc26-signwithdigest-gost3410-2012-256" */
|
||||
986, /* "id-tc26-signwithdigest-gost3410-2012-512" */
|
||||
1179, /* "id-tc26-wrap" */
|
||||
1182, /* "id-tc26-wrap-gostr3412-2015-kuznyechik" */
|
||||
1183, /* "id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15" */
|
||||
1180, /* "id-tc26-wrap-gostr3412-2015-magma" */
|
||||
1181, /* "id-tc26-wrap-gostr3412-2015-magma-kexp15" */
|
||||
676, /* "identified-organization" */
|
||||
1170, /* "ieee" */
|
||||
1171, /* "ieee-siswg" */
|
||||
@@ -3045,6 +3093,12 @@ static const unsigned int sn_objs[NUM_SN] = {
|
||||
476, /* "lastModifiedTime" */
|
||||
157, /* "localKeyID" */
|
||||
480, /* "mXRecord" */
|
||||
1190, /* "magma-cbc" */
|
||||
1191, /* "magma-cfb" */
|
||||
1188, /* "magma-ctr" */
|
||||
1187, /* "magma-ecb" */
|
||||
1192, /* "magma-mac" */
|
||||
1189, /* "magma-ofb" */
|
||||
460, /* "mail" */
|
||||
493, /* "mailPreferenceOption" */
|
||||
467, /* "manager" */
|
||||
@@ -3407,7 +3461,7 @@ static const unsigned int sn_objs[NUM_SN] = {
|
||||
1093, /* "x509ExtAdmission" */
|
||||
};
|
||||
|
||||
#define NUM_LN 1164
|
||||
#define NUM_LN 1184
|
||||
static const unsigned int ln_objs[NUM_LN] = {
|
||||
363, /* "AD Time Stamping" */
|
||||
405, /* "ANSI X9.62" */
|
||||
@@ -3464,6 +3518,9 @@ static const unsigned int ln_objs[NUM_LN] = {
|
||||
811, /* "GOST R 34.10-2001" */
|
||||
817, /* "GOST R 34.10-2001 DH" */
|
||||
1148, /* "GOST R 34.10-2012 (256 bit) ParamSet A" */
|
||||
1184, /* "GOST R 34.10-2012 (256 bit) ParamSet B" */
|
||||
1185, /* "GOST R 34.10-2012 (256 bit) ParamSet C" */
|
||||
1186, /* "GOST R 34.10-2012 (256 bit) ParamSet D" */
|
||||
998, /* "GOST R 34.10-2012 (512 bit) ParamSet A" */
|
||||
999, /* "GOST R 34.10-2012 (512 bit) ParamSet B" */
|
||||
1149, /* "GOST R 34.10-2012 (512 bit) ParamSet C" */
|
||||
@@ -4154,6 +4211,12 @@ static const unsigned int ln_objs[NUM_LN] = {
|
||||
977, /* "id-tc26-algorithms" */
|
||||
990, /* "id-tc26-cipher" */
|
||||
1001, /* "id-tc26-cipher-constants" */
|
||||
1176, /* "id-tc26-cipher-gostr3412-2015-kuznyechik" */
|
||||
1177, /* "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm" */
|
||||
1178, /* "id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac" */
|
||||
1173, /* "id-tc26-cipher-gostr3412-2015-magma" */
|
||||
1174, /* "id-tc26-cipher-gostr3412-2015-magma-ctracpkm" */
|
||||
1175, /* "id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac" */
|
||||
994, /* "id-tc26-constants" */
|
||||
981, /* "id-tc26-digest" */
|
||||
1000, /* "id-tc26-digest-constants" */
|
||||
@@ -4164,6 +4227,11 @@ static const unsigned int ln_objs[NUM_LN] = {
|
||||
978, /* "id-tc26-sign" */
|
||||
995, /* "id-tc26-sign-constants" */
|
||||
984, /* "id-tc26-signwithdigest" */
|
||||
1179, /* "id-tc26-wrap" */
|
||||
1182, /* "id-tc26-wrap-gostr3412-2015-kuznyechik" */
|
||||
1183, /* "id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15" */
|
||||
1180, /* "id-tc26-wrap-gostr3412-2015-magma" */
|
||||
1181, /* "id-tc26-wrap-gostr3412-2015-magma-kexp15" */
|
||||
34, /* "idea-cbc" */
|
||||
35, /* "idea-cfb" */
|
||||
36, /* "idea-ecb" */
|
||||
@@ -4201,6 +4269,12 @@ static const unsigned int ln_objs[NUM_LN] = {
|
||||
157, /* "localKeyID" */
|
||||
15, /* "localityName" */
|
||||
480, /* "mXRecord" */
|
||||
1190, /* "magma-cbc" */
|
||||
1191, /* "magma-cfb" */
|
||||
1188, /* "magma-ctr" */
|
||||
1187, /* "magma-ecb" */
|
||||
1192, /* "magma-mac" */
|
||||
1189, /* "magma-ofb" */
|
||||
493, /* "mailPreferenceOption" */
|
||||
467, /* "manager" */
|
||||
3, /* "md2" */
|
||||
@@ -4575,7 +4649,7 @@ static const unsigned int ln_objs[NUM_LN] = {
|
||||
125, /* "zlib compression" */
|
||||
};
|
||||
|
||||
#define NUM_OBJ 1055
|
||||
#define NUM_OBJ 1069
|
||||
static const unsigned int obj_objs[NUM_OBJ] = {
|
||||
0, /* OBJ_undef 0 */
|
||||
181, /* OBJ_iso 1 */
|
||||
@@ -4975,6 +5049,7 @@ static const unsigned int obj_objs[NUM_OBJ] = {
|
||||
987, /* OBJ_id_tc26_mac 1 2 643 7 1 1 4 */
|
||||
990, /* OBJ_id_tc26_cipher 1 2 643 7 1 1 5 */
|
||||
991, /* OBJ_id_tc26_agreement 1 2 643 7 1 1 6 */
|
||||
1179, /* OBJ_id_tc26_wrap 1 2 643 7 1 1 7 */
|
||||
995, /* OBJ_id_tc26_sign_constants 1 2 643 7 1 2 1 */
|
||||
1000, /* OBJ_id_tc26_digest_constants 1 2 643 7 1 2 2 */
|
||||
1001, /* OBJ_id_tc26_cipher_constants 1 2 643 7 1 2 5 */
|
||||
@@ -5063,8 +5138,12 @@ static const unsigned int obj_objs[NUM_OBJ] = {
|
||||
986, /* OBJ_id_tc26_signwithdigest_gost3410_2012_512 1 2 643 7 1 1 3 3 */
|
||||
988, /* OBJ_id_tc26_hmac_gost_3411_2012_256 1 2 643 7 1 1 4 1 */
|
||||
989, /* OBJ_id_tc26_hmac_gost_3411_2012_512 1 2 643 7 1 1 4 2 */
|
||||
1173, /* OBJ_id_tc26_cipher_gostr3412_2015_magma 1 2 643 7 1 1 5 1 */
|
||||
1176, /* OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik 1 2 643 7 1 1 5 2 */
|
||||
992, /* OBJ_id_tc26_agreement_gost_3410_2012_256 1 2 643 7 1 1 6 1 */
|
||||
993, /* OBJ_id_tc26_agreement_gost_3410_2012_512 1 2 643 7 1 1 6 2 */
|
||||
1180, /* OBJ_id_tc26_wrap_gostr3412_2015_magma 1 2 643 7 1 1 7 1 */
|
||||
1182, /* OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik 1 2 643 7 1 1 7 2 */
|
||||
1147, /* OBJ_id_tc26_gost_3410_2012_256_constants 1 2 643 7 1 2 1 1 */
|
||||
996, /* OBJ_id_tc26_gost_3410_2012_512_constants 1 2 643 7 1 2 1 2 */
|
||||
1002, /* OBJ_id_tc26_gost_28147_constants 1 2 643 7 1 2 5 1 */
|
||||
@@ -5270,7 +5349,16 @@ static const unsigned int obj_objs[NUM_OBJ] = {
|
||||
1120, /* OBJ_aria_128_ccm 1 2 410 200046 1 1 37 */
|
||||
1121, /* OBJ_aria_192_ccm 1 2 410 200046 1 1 38 */
|
||||
1122, /* OBJ_aria_256_ccm 1 2 410 200046 1 1 39 */
|
||||
1174, /* OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm 1 2 643 7 1 1 5 1 1 */
|
||||
1175, /* OBJ_id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac 1 2 643 7 1 1 5 1 2 */
|
||||
1177, /* OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm 1 2 643 7 1 1 5 2 1 */
|
||||
1178, /* OBJ_id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac 1 2 643 7 1 1 5 2 2 */
|
||||
1181, /* OBJ_id_tc26_wrap_gostr3412_2015_magma_kexp15 1 2 643 7 1 1 7 1 1 */
|
||||
1183, /* OBJ_id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 1 2 643 7 1 1 7 1 1 */
|
||||
1148, /* OBJ_id_tc26_gost_3410_2012_256_paramSetA 1 2 643 7 1 2 1 1 1 */
|
||||
1184, /* OBJ_id_tc26_gost_3410_2012_256_paramSetB 1 2 643 7 1 2 1 1 2 */
|
||||
1185, /* OBJ_id_tc26_gost_3410_2012_256_paramSetC 1 2 643 7 1 2 1 1 3 */
|
||||
1186, /* OBJ_id_tc26_gost_3410_2012_256_paramSetD 1 2 643 7 1 2 1 1 4 */
|
||||
997, /* OBJ_id_tc26_gost_3410_2012_512_paramSetTest 1 2 643 7 1 2 1 2 0 */
|
||||
998, /* OBJ_id_tc26_gost_3410_2012_512_paramSetA 1 2 643 7 1 2 1 2 1 */
|
||||
999, /* OBJ_id_tc26_gost_3410_2012_512_paramSetB 1 2 643 7 1 2 1 2 2 */
|
||||
|
||||
@@ -1170,3 +1170,23 @@ uacurve9 1169
|
||||
ieee 1170
|
||||
ieee_siswg 1171
|
||||
sm2 1172
|
||||
id_tc26_cipher_gostr3412_2015_magma 1173
|
||||
id_tc26_cipher_gostr3412_2015_magma_ctracpkm 1174
|
||||
id_tc26_cipher_gostr3412_2015_magma_ctracpkm_omac 1175
|
||||
id_tc26_cipher_gostr3412_2015_kuznyechik 1176
|
||||
id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm 1177
|
||||
id_tc26_cipher_gostr3412_2015_kuznyechik_ctracpkm_omac 1178
|
||||
id_tc26_wrap 1179
|
||||
id_tc26_wrap_gostr3412_2015_magma 1180
|
||||
id_tc26_wrap_gostr3412_2015_magma_kexp15 1181
|
||||
id_tc26_wrap_gostr3412_2015_kuznyechik 1182
|
||||
id_tc26_wrap_gostr3412_2015_kuznyechik_kexp15 1183
|
||||
id_tc26_gost_3410_2012_256_paramSetB 1184
|
||||
id_tc26_gost_3410_2012_256_paramSetC 1185
|
||||
id_tc26_gost_3410_2012_256_paramSetD 1186
|
||||
magma_ecb 1187
|
||||
magma_ctr 1188
|
||||
magma_ofb 1189
|
||||
magma_cbc 1190
|
||||
magma_cfb 1191
|
||||
magma_mac 1192
|
||||
@@ -1339,16 +1339,31 @@ id-tc26-mac 1 : id-tc26-hmac-gost-3411-2012-256 : HMAC GOST 34.11-2012 256 bit
|
||||
id-tc26-mac 2 : id-tc26-hmac-gost-3411-2012-512 : HMAC GOST 34.11-2012 512 bit
|
||||
|
||||
id-tc26-algorithms 5 : id-tc26-cipher
|
||||
id-tc26-cipher 1 : id-tc26-cipher-gostr3412-2015-magma
|
||||
id-tc26-cipher-gostr3412-2015-magma 1 : id-tc26-cipher-gostr3412-2015-magma-ctracpkm
|
||||
id-tc26-cipher-gostr3412-2015-magma 2 : id-tc26-cipher-gostr3412-2015-magma-ctracpkm-omac
|
||||
id-tc26-cipher 2 : id-tc26-cipher-gostr3412-2015-kuznyechik
|
||||
id-tc26-cipher-gostr3412-2015-kuznyechik 1 : id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm
|
||||
id-tc26-cipher-gostr3412-2015-kuznyechik 2 : id-tc26-cipher-gostr3412-2015-kuznyechik-ctracpkm-omac
|
||||
|
||||
id-tc26-algorithms 6 : id-tc26-agreement
|
||||
id-tc26-agreement 1 : id-tc26-agreement-gost-3410-2012-256
|
||||
id-tc26-agreement 2 : id-tc26-agreement-gost-3410-2012-512
|
||||
|
||||
id-tc26-algorithms 7 : id-tc26-wrap
|
||||
id-tc26-wrap 1 : id-tc26-wrap-gostr3412-2015-magma
|
||||
id-tc26-wrap-gostr3412-2015-magma 1 : id-tc26-wrap-gostr3412-2015-magma-kexp15
|
||||
id-tc26-wrap 2 : id-tc26-wrap-gostr3412-2015-kuznyechik
|
||||
id-tc26-wrap-gostr3412-2015-magma 1 : id-tc26-wrap-gostr3412-2015-kuznyechik-kexp15
|
||||
|
||||
id-tc26 2 : id-tc26-constants
|
||||
|
||||
id-tc26-constants 1 : id-tc26-sign-constants
|
||||
id-tc26-sign-constants 1: id-tc26-gost-3410-2012-256-constants
|
||||
id-tc26-gost-3410-2012-256-constants 1 : id-tc26-gost-3410-2012-256-paramSetA: GOST R 34.10-2012 (256 bit) ParamSet A
|
||||
id-tc26-gost-3410-2012-256-constants 2 : id-tc26-gost-3410-2012-256-paramSetB: GOST R 34.10-2012 (256 bit) ParamSet B
|
||||
id-tc26-gost-3410-2012-256-constants 3 : id-tc26-gost-3410-2012-256-paramSetC: GOST R 34.10-2012 (256 bit) ParamSet C
|
||||
id-tc26-gost-3410-2012-256-constants 4 : id-tc26-gost-3410-2012-256-paramSetD: GOST R 34.10-2012 (256 bit) ParamSet D
|
||||
id-tc26-sign-constants 2: id-tc26-gost-3410-2012-512-constants
|
||||
id-tc26-gost-3410-2012-512-constants 0 : id-tc26-gost-3410-2012-512-paramSetTest: GOST R 34.10-2012 (512 bit) testing parameter set
|
||||
id-tc26-gost-3410-2012-512-constants 1 : id-tc26-gost-3410-2012-512-paramSetA: GOST R 34.10-2012 (512 bit) ParamSet A
|
||||
@@ -1374,6 +1389,14 @@ member-body 643 100 112 : issuerSignTool : Signing Tool of Issuer
|
||||
: grasshopper-cfb
|
||||
: grasshopper-mac
|
||||
|
||||
#GOST R34.13-2015 Magma
|
||||
: magma-ecb
|
||||
: magma-ctr
|
||||
: magma-ofb
|
||||
: magma-cbc
|
||||
: magma-cfb
|
||||
: magma-mac
|
||||
|
||||
# Definitions for Camellia cipher - CBC MODE
|
||||
|
||||
1 2 392 200011 61 1 1 1 2 : CAMELLIA-128-CBC : camellia-128-cbc
|
||||
|
||||
@@ -67,6 +67,25 @@ static int poly1305_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int poly1305_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
|
||||
size_t *len)
|
||||
{
|
||||
ASN1_OCTET_STRING *os = (ASN1_OCTET_STRING *)pkey->pkey.ptr;
|
||||
|
||||
if (priv == NULL) {
|
||||
*len = POLY1305_KEY_SIZE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (os == NULL || *len < POLY1305_KEY_SIZE)
|
||||
return 0;
|
||||
|
||||
memcpy(priv, ASN1_STRING_get0_data(os), ASN1_STRING_length(os));
|
||||
*len = POLY1305_KEY_SIZE;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD poly1305_asn1_meth = {
|
||||
EVP_PKEY_POLY1305,
|
||||
EVP_PKEY_POLY1305,
|
||||
@@ -98,4 +117,6 @@ const EVP_PKEY_ASN1_METHOD poly1305_asn1_meth = {
|
||||
|
||||
poly1305_set_priv_key,
|
||||
NULL,
|
||||
poly1305_get_priv_key,
|
||||
NULL,
|
||||
};
|
||||
+18
-8
@@ -229,17 +229,9 @@ static size_t sysctl_random(char *buf, size_t buflen)
|
||||
*/
|
||||
int syscall_random(void *buf, size_t buflen)
|
||||
{
|
||||
union {
|
||||
void *p;
|
||||
int (*f)(void *buffer, size_t length);
|
||||
} p_getentropy;
|
||||
|
||||
/*
|
||||
* Do runtime detection to find getentropy().
|
||||
*
|
||||
* We could cache the result of the lookup, but we normally don't
|
||||
* call this function often.
|
||||
*
|
||||
* Known OSs that should support this:
|
||||
* - Darwin since 16 (OSX 10.12, IOS 10.0).
|
||||
* - Solaris since 11.3
|
||||
@@ -247,9 +239,27 @@ int syscall_random(void *buf, size_t buflen)
|
||||
* - Linux since 3.17 with glibc 2.25
|
||||
* - FreeBSD since 12.0 (1200061)
|
||||
*/
|
||||
# if defined(__GNUC__) && __GNUC__>=2 && defined(__ELF__)
|
||||
extern int getentropy(void *bufer, size_t length) __attribute__((weak));
|
||||
|
||||
if (getentropy != NULL)
|
||||
return getentropy(buf, buflen) == 0 ? buflen : 0;
|
||||
# else
|
||||
union {
|
||||
void *p;
|
||||
int (*f)(void *buffer, size_t length);
|
||||
} p_getentropy;
|
||||
|
||||
/*
|
||||
* We could cache the result of the lookup, but we normally don't
|
||||
* call this function often.
|
||||
*/
|
||||
ERR_set_mark();
|
||||
p_getentropy.p = DSO_global_lookup("getentropy");
|
||||
ERR_pop_to_mark();
|
||||
if (p_getentropy.p != NULL)
|
||||
return p_getentropy.f(buf, buflen) == 0 ? buflen : 0;
|
||||
# endif
|
||||
|
||||
/* Linux supports this since version 3.17 */
|
||||
# if defined(__linux) && defined(SYS_getrandom)
|
||||
|
||||
@@ -68,6 +68,25 @@ static int siphash_set_priv_key(EVP_PKEY *pkey, const unsigned char *priv,
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int siphash_get_priv_key(const EVP_PKEY *pkey, unsigned char *priv,
|
||||
size_t *len)
|
||||
{
|
||||
ASN1_OCTET_STRING *os = (ASN1_OCTET_STRING *)pkey->pkey.ptr;
|
||||
|
||||
if (priv == NULL) {
|
||||
*len = SIPHASH_KEY_SIZE;
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (os == NULL || *len < SIPHASH_KEY_SIZE)
|
||||
return 0;
|
||||
|
||||
memcpy(priv, ASN1_STRING_get0_data(os), ASN1_STRING_length(os));
|
||||
*len = SIPHASH_KEY_SIZE;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
|
||||
EVP_PKEY_SIPHASH,
|
||||
EVP_PKEY_SIPHASH,
|
||||
@@ -99,4 +118,6 @@ const EVP_PKEY_ASN1_METHOD siphash_asn1_meth = {
|
||||
|
||||
siphash_set_priv_key,
|
||||
NULL,
|
||||
siphash_get_priv_key,
|
||||
NULL,
|
||||
};
|
||||
@@ -189,7 +189,7 @@ static SRP_user_pwd *SRP_user_pwd_new(void)
|
||||
SRP_user_pwd *ret;
|
||||
|
||||
if ((ret = OPENSSL_malloc(sizeof(*ret))) == NULL) {
|
||||
/* SRPerr(SRP_F_SRP_USER_PWD_NEW, ERR_R_MALLOC_FAILURE); */
|
||||
/* SRPerr(SRP_F_SRP_USER_PWD_NEW, ERR_R_MALLOC_FAILURE); */ /*ckerr_ignore*/
|
||||
return NULL;
|
||||
}
|
||||
ret->N = NULL;
|
||||
|
||||
@@ -35,6 +35,9 @@ int X509_certificate_type(const X509 *x, const EVP_PKEY *pkey)
|
||||
/* if (!sign only extension) */
|
||||
ret |= EVP_PKT_ENC;
|
||||
break;
|
||||
case EVP_PKEY_RSA_PSS:
|
||||
ret = EVP_PK_RSA | EVP_PKT_SIGN;
|
||||
break;
|
||||
case EVP_PKEY_DSA:
|
||||
ret = EVP_PK_DSA | EVP_PKT_SIGN;
|
||||
break;
|
||||
|
||||
Reference in New Issue
Block a user