Latest update.
This commit is contained in:
@@ -23,18 +23,22 @@
|
||||
int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
|
||||
unsigned char *md, unsigned int *len)
|
||||
{
|
||||
int i;
|
||||
int inl;
|
||||
unsigned char *str, *p;
|
||||
|
||||
i = i2d(data, NULL);
|
||||
if ((str = OPENSSL_malloc(i)) == NULL) {
|
||||
inl = i2d(data, NULL);
|
||||
if (inl <= 0) {
|
||||
ASN1err(ASN1_F_ASN1_DIGEST, ERR_R_INTERNAL_ERROR);
|
||||
return 0;
|
||||
}
|
||||
if ((str = OPENSSL_malloc(inl)) == NULL) {
|
||||
ASN1err(ASN1_F_ASN1_DIGEST, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
p = str;
|
||||
i2d(data, &p);
|
||||
|
||||
if (!EVP_Digest(str, i, md, len, type, NULL)) {
|
||||
if (!EVP_Digest(str, inl, md, len, type, NULL)) {
|
||||
OPENSSL_free(str);
|
||||
return 0;
|
||||
}
|
||||
|
||||
+22
-10
@@ -29,7 +29,8 @@ int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2,
|
||||
{
|
||||
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
|
||||
unsigned char *p, *buf_in = NULL, *buf_out = NULL;
|
||||
int i, inl = 0, outl = 0, outll = 0;
|
||||
int i, inl = 0, outl = 0;
|
||||
size_t inll = 0, outll = 0;
|
||||
X509_ALGOR *a;
|
||||
|
||||
if (ctx == NULL) {
|
||||
@@ -70,10 +71,15 @@ int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2,
|
||||
}
|
||||
}
|
||||
inl = i2d(data, NULL);
|
||||
buf_in = OPENSSL_malloc((unsigned int)inl);
|
||||
if (inl <= 0) {
|
||||
ASN1err(ASN1_F_ASN1_SIGN, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
inll = (size_t)inl;
|
||||
buf_in = OPENSSL_malloc(inll);
|
||||
outll = outl = EVP_PKEY_size(pkey);
|
||||
buf_out = OPENSSL_malloc((unsigned int)outl);
|
||||
if ((buf_in == NULL) || (buf_out == NULL)) {
|
||||
buf_out = OPENSSL_malloc(outll);
|
||||
if (buf_in == NULL || buf_out == NULL) {
|
||||
outl = 0;
|
||||
ASN1err(ASN1_F_ASN1_SIGN, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
@@ -101,7 +107,7 @@ int ASN1_sign(i2d_of_void *i2d, X509_ALGOR *algor1, X509_ALGOR *algor2,
|
||||
signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
|
||||
err:
|
||||
EVP_MD_CTX_free(ctx);
|
||||
OPENSSL_clear_free((char *)buf_in, (unsigned int)inl);
|
||||
OPENSSL_clear_free((char *)buf_in, inll);
|
||||
OPENSSL_clear_free((char *)buf_out, outll);
|
||||
return outl;
|
||||
}
|
||||
@@ -138,7 +144,7 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it,
|
||||
EVP_PKEY *pkey;
|
||||
unsigned char *buf_in = NULL, *buf_out = NULL;
|
||||
size_t inl = 0, outl = 0, outll = 0;
|
||||
int signid, paramtype;
|
||||
int signid, paramtype, buf_len = 0;
|
||||
int rv;
|
||||
|
||||
type = EVP_MD_CTX_md(ctx);
|
||||
@@ -198,10 +204,16 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it,
|
||||
|
||||
}
|
||||
|
||||
inl = ASN1_item_i2d(asn, &buf_in, it);
|
||||
buf_len = ASN1_item_i2d(asn, &buf_in, it);
|
||||
if (buf_len <= 0) {
|
||||
outl = 0;
|
||||
ASN1err(ASN1_F_ASN1_ITEM_SIGN_CTX, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
inl = buf_len;
|
||||
outll = outl = EVP_PKEY_size(pkey);
|
||||
buf_out = OPENSSL_malloc((unsigned int)outl);
|
||||
if ((buf_in == NULL) || (buf_out == NULL)) {
|
||||
buf_out = OPENSSL_malloc(outll);
|
||||
if (buf_in == NULL || buf_out == NULL) {
|
||||
outl = 0;
|
||||
ASN1err(ASN1_F_ASN1_ITEM_SIGN_CTX, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
@@ -223,7 +235,7 @@ int ASN1_item_sign_ctx(const ASN1_ITEM *it,
|
||||
signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
|
||||
signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
|
||||
err:
|
||||
OPENSSL_clear_free((char *)buf_in, (unsigned int)inl);
|
||||
OPENSSL_clear_free((char *)buf_in, inl);
|
||||
OPENSSL_clear_free((char *)buf_out, outll);
|
||||
return outl;
|
||||
}
|
||||
+13
-5
@@ -48,6 +48,10 @@ int ASN1_verify(i2d_of_void *i2d, X509_ALGOR *a, ASN1_BIT_STRING *signature,
|
||||
}
|
||||
|
||||
inl = i2d(data, NULL);
|
||||
if (inl <= 0) {
|
||||
ASN1err(ASN1_F_ASN1_VERIFY, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
buf_in = OPENSSL_malloc((unsigned int)inl);
|
||||
if (buf_in == NULL) {
|
||||
ASN1err(ASN1_F_ASN1_VERIFY, ERR_R_MALLOC_FAILURE);
|
||||
@@ -87,8 +91,8 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
|
||||
EVP_MD_CTX *ctx = NULL;
|
||||
unsigned char *buf_in = NULL;
|
||||
int ret = -1, inl = 0;
|
||||
|
||||
int mdnid, pknid;
|
||||
size_t inll = 0;
|
||||
|
||||
if (!pkey) {
|
||||
ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_PASSED_NULL_PARAMETER);
|
||||
@@ -127,8 +131,8 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
|
||||
goto err;
|
||||
ret = -1;
|
||||
} else {
|
||||
const EVP_MD *type;
|
||||
type = EVP_get_digestbynid(mdnid);
|
||||
const EVP_MD *type = EVP_get_digestbynid(mdnid);
|
||||
|
||||
if (type == NULL) {
|
||||
ASN1err(ASN1_F_ASN1_ITEM_VERIFY,
|
||||
ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
|
||||
@@ -150,11 +154,15 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
|
||||
}
|
||||
|
||||
inl = ASN1_item_i2d(asn, &buf_in, it);
|
||||
|
||||
if (inl <= 0) {
|
||||
ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_INTERNAL_ERROR);
|
||||
goto err;
|
||||
}
|
||||
if (buf_in == NULL) {
|
||||
ASN1err(ASN1_F_ASN1_ITEM_VERIFY, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
inll = inl;
|
||||
|
||||
ret = EVP_DigestVerify(ctx, signature->data, (size_t)signature->length,
|
||||
buf_in, inl);
|
||||
@@ -164,7 +172,7 @@ int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
|
||||
}
|
||||
ret = 1;
|
||||
err:
|
||||
OPENSSL_clear_free(buf_in, (unsigned int)inl);
|
||||
OPENSSL_clear_free(buf_in, inll);
|
||||
EVP_MD_CTX_free(ctx);
|
||||
return ret;
|
||||
}
|
||||
@@ -373,6 +373,7 @@ int cms_RecipientInfo_pwri_crypt(CMS_ContentInfo *cms, CMS_RecipientInfo *ri,
|
||||
goto err;
|
||||
}
|
||||
|
||||
OPENSSL_clear_free(ec->key, ec->keylen);
|
||||
ec->key = key;
|
||||
ec->keylen = keylen;
|
||||
|
||||
|
||||
@@ -25,6 +25,8 @@
|
||||
|
||||
#include "internal/engine.h"
|
||||
|
||||
/* #define ENGINE_DEVCRYPTO_DEBUG */
|
||||
|
||||
#ifdef CRYPTO_ALGORITHM_MIN
|
||||
# define CHECK_BSD_STYLE_MACROS
|
||||
#endif
|
||||
@@ -1156,7 +1158,10 @@ void engine_load_devcrypto_int()
|
||||
ENGINE *e = NULL;
|
||||
|
||||
if ((cfd = open("/dev/crypto", O_RDWR, 0)) < 0) {
|
||||
fprintf(stderr, "Could not open /dev/crypto: %s\n", strerror(errno));
|
||||
#ifndef ENGINE_DEVCRYPTO_DEBUG
|
||||
if (errno != ENOENT)
|
||||
#endif
|
||||
fprintf(stderr, "Could not open /dev/crypto: %s\n", strerror(errno));
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -697,6 +697,7 @@ DEFINE_RUN_ONCE_STATIC(err_do_init)
|
||||
ERR_STATE *ERR_get_state(void)
|
||||
{
|
||||
ERR_STATE *state;
|
||||
int saveerrno = get_last_sys_error();
|
||||
|
||||
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
|
||||
return NULL;
|
||||
@@ -728,6 +729,7 @@ ERR_STATE *ERR_get_state(void)
|
||||
OPENSSL_init_crypto(OPENSSL_INIT_LOAD_CRYPTO_STRINGS, NULL);
|
||||
}
|
||||
|
||||
set_sys_error(saveerrno);
|
||||
return state;
|
||||
}
|
||||
|
||||
@@ -737,6 +739,8 @@ ERR_STATE *ERR_get_state(void)
|
||||
*/
|
||||
int err_shelve_state(void **state)
|
||||
{
|
||||
int saveerrno = get_last_sys_error();
|
||||
|
||||
if (!OPENSSL_init_crypto(OPENSSL_INIT_BASE_ONLY, NULL))
|
||||
return 0;
|
||||
|
||||
@@ -747,6 +751,7 @@ int err_shelve_state(void **state)
|
||||
if (!CRYPTO_THREAD_set_local(&err_thread_local, (ERR_STATE*)-1))
|
||||
return 0;
|
||||
|
||||
set_sys_error(saveerrno);
|
||||
return 1;
|
||||
}
|
||||
|
||||
|
||||
+1
-1
@@ -42,7 +42,7 @@ int EVP_PKEY_security_bits(const EVP_PKEY *pkey)
|
||||
return pkey->ameth->pkey_security_bits(pkey);
|
||||
}
|
||||
|
||||
int EVP_PKEY_size(EVP_PKEY *pkey)
|
||||
int EVP_PKEY_size(const EVP_PKEY *pkey)
|
||||
{
|
||||
if (pkey && pkey->ameth && pkey->ameth->pkey_size)
|
||||
return pkey->ameth->pkey_size(pkey);
|
||||
|
||||
+23
-23
@@ -178,8 +178,7 @@ static int tls1_prf_P_hash(const EVP_MD *md,
|
||||
unsigned char *out, size_t olen)
|
||||
{
|
||||
int chunk;
|
||||
EVP_MD_CTX *ctx = NULL, *ctx_tmp = NULL, *ctx_init = NULL;
|
||||
EVP_PKEY *mac_key = NULL;
|
||||
EVP_MAC_CTX *ctx = NULL, *ctx_tmp = NULL, *ctx_init = NULL;
|
||||
unsigned char A1[EVP_MAX_MD_SIZE];
|
||||
size_t A1_len;
|
||||
int ret = 0;
|
||||
@@ -188,47 +187,49 @@ static int tls1_prf_P_hash(const EVP_MD *md,
|
||||
if (!ossl_assert(chunk > 0))
|
||||
goto err;
|
||||
|
||||
ctx = EVP_MD_CTX_new();
|
||||
ctx_tmp = EVP_MD_CTX_new();
|
||||
ctx_init = EVP_MD_CTX_new();
|
||||
ctx = EVP_MAC_CTX_new_id(EVP_MAC_HMAC);
|
||||
ctx_tmp = EVP_MAC_CTX_new_id(EVP_MAC_HMAC);
|
||||
ctx_init = EVP_MAC_CTX_new_id(EVP_MAC_HMAC);
|
||||
if (ctx == NULL || ctx_tmp == NULL || ctx_init == NULL)
|
||||
goto err;
|
||||
EVP_MD_CTX_set_flags(ctx_init, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);
|
||||
mac_key = EVP_PKEY_new_raw_private_key(EVP_PKEY_HMAC, NULL, sec, sec_len);
|
||||
if (mac_key == NULL)
|
||||
if (EVP_MAC_ctrl(ctx_init, EVP_MAC_CTRL_SET_FLAGS, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW) != 1)
|
||||
goto err;
|
||||
if (!EVP_DigestSignInit(ctx_init, NULL, md, NULL, mac_key))
|
||||
if (EVP_MAC_ctrl(ctx_init, EVP_MAC_CTRL_SET_MD, md) != 1)
|
||||
goto err;
|
||||
if (!EVP_MD_CTX_copy_ex(ctx, ctx_init))
|
||||
if (EVP_MAC_ctrl(ctx_init, EVP_MAC_CTRL_SET_KEY, sec, sec_len) != 1)
|
||||
goto err;
|
||||
if (seed != NULL && !EVP_DigestSignUpdate(ctx, seed, seed_len))
|
||||
if (!EVP_MAC_init(ctx_init))
|
||||
goto err;
|
||||
if (!EVP_DigestSignFinal(ctx, A1, &A1_len))
|
||||
if (!EVP_MAC_CTX_copy(ctx, ctx_init))
|
||||
goto err;
|
||||
if (seed != NULL && !EVP_MAC_update(ctx, seed, seed_len))
|
||||
goto err;
|
||||
if (!EVP_MAC_final(ctx, A1, &A1_len))
|
||||
goto err;
|
||||
|
||||
for (;;) {
|
||||
/* Reinit mac contexts */
|
||||
if (!EVP_MD_CTX_copy_ex(ctx, ctx_init))
|
||||
if (!EVP_MAC_CTX_copy(ctx, ctx_init))
|
||||
goto err;
|
||||
if (!EVP_DigestSignUpdate(ctx, A1, A1_len))
|
||||
if (!EVP_MAC_update(ctx, A1, A1_len))
|
||||
goto err;
|
||||
if (olen > (size_t)chunk && !EVP_MD_CTX_copy_ex(ctx_tmp, ctx))
|
||||
if (olen > (size_t)chunk && !EVP_MAC_CTX_copy(ctx_tmp, ctx))
|
||||
goto err;
|
||||
if (seed && !EVP_DigestSignUpdate(ctx, seed, seed_len))
|
||||
if (seed != NULL && !EVP_MAC_update(ctx, seed, seed_len))
|
||||
goto err;
|
||||
|
||||
if (olen > (size_t)chunk) {
|
||||
size_t mac_len;
|
||||
if (!EVP_DigestSignFinal(ctx, out, &mac_len))
|
||||
if (!EVP_MAC_final(ctx, out, &mac_len))
|
||||
goto err;
|
||||
out += mac_len;
|
||||
olen -= mac_len;
|
||||
/* calc the next A1 value */
|
||||
if (!EVP_DigestSignFinal(ctx_tmp, A1, &A1_len))
|
||||
if (!EVP_MAC_final(ctx_tmp, A1, &A1_len))
|
||||
goto err;
|
||||
} else { /* last one */
|
||||
|
||||
if (!EVP_DigestSignFinal(ctx, A1, &A1_len))
|
||||
if (!EVP_MAC_final(ctx, A1, &A1_len))
|
||||
goto err;
|
||||
memcpy(out, A1, olen);
|
||||
break;
|
||||
@@ -236,10 +237,9 @@ static int tls1_prf_P_hash(const EVP_MD *md,
|
||||
}
|
||||
ret = 1;
|
||||
err:
|
||||
EVP_PKEY_free(mac_key);
|
||||
EVP_MD_CTX_free(ctx);
|
||||
EVP_MD_CTX_free(ctx_tmp);
|
||||
EVP_MD_CTX_free(ctx_init);
|
||||
EVP_MAC_CTX_free(ctx);
|
||||
EVP_MAC_CTX_free(ctx_tmp);
|
||||
EVP_MAC_CTX_free(ctx_init);
|
||||
OPENSSL_cleanse(A1, sizeof(A1));
|
||||
return ret;
|
||||
}
|
||||
|
||||
@@ -206,8 +206,8 @@ struct siv128_context {
|
||||
SIV_BLOCK d;
|
||||
SIV_BLOCK tag;
|
||||
EVP_CIPHER_CTX *cipher_ctx;
|
||||
CMAC_CTX *cmac_ctx_init;
|
||||
CMAC_CTX *cmac_ctx;
|
||||
EVP_MAC_CTX *mac_ctx_init;
|
||||
EVP_MAC_CTX *mac_ctx;
|
||||
int final_ret;
|
||||
int crypto_ok;
|
||||
};
|
||||
|
||||
+27
-27
@@ -10,7 +10,6 @@
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/cmac.h>
|
||||
#include "modes_lcl.h"
|
||||
|
||||
#ifndef OPENSSL_NO_SIV
|
||||
@@ -94,15 +93,15 @@ __owur static ossl_inline int siv128_do_s2v_p(SIV128_CONTEXT *ctx, SIV_BLOCK *ou
|
||||
SIV_BLOCK t;
|
||||
size_t out_len = sizeof(out->byte);
|
||||
|
||||
if (!CMAC_CTX_copy(ctx->cmac_ctx, ctx->cmac_ctx_init))
|
||||
if (!EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init))
|
||||
return 0;
|
||||
|
||||
if (len >= SIV_LEN) {
|
||||
if (!CMAC_Update(ctx->cmac_ctx, in, len - SIV_LEN))
|
||||
if (!EVP_MAC_update(ctx->mac_ctx, in, len - SIV_LEN))
|
||||
return 0;
|
||||
memcpy(&t, in + (len-SIV_LEN), SIV_LEN);
|
||||
siv128_xorblock(&t, &ctx->d);
|
||||
if (!CMAC_Update(ctx->cmac_ctx, t.byte, SIV_LEN))
|
||||
if (!EVP_MAC_update(ctx->mac_ctx, t.byte, SIV_LEN))
|
||||
return 0;
|
||||
} else {
|
||||
memset(&t, 0, sizeof(t));
|
||||
@@ -110,10 +109,10 @@ __owur static ossl_inline int siv128_do_s2v_p(SIV128_CONTEXT *ctx, SIV_BLOCK *ou
|
||||
t.byte[len] = 0x80;
|
||||
siv128_dbl(&ctx->d);
|
||||
siv128_xorblock(&t, &ctx->d);
|
||||
if (!CMAC_Update(ctx->cmac_ctx, t.byte, SIV_LEN))
|
||||
if (!EVP_MAC_update(ctx->mac_ctx, t.byte, SIV_LEN))
|
||||
return 0;
|
||||
}
|
||||
if (!CMAC_Final(ctx->cmac_ctx, out->byte, &out_len)
|
||||
if (!EVP_MAC_final(ctx->mac_ctx, out->byte, &out_len)
|
||||
|| out_len != SIV_LEN)
|
||||
return 0;
|
||||
return 1;
|
||||
@@ -160,21 +159,22 @@ int CRYPTO_siv128_init(SIV128_CONTEXT *ctx, const unsigned char *key, int klen,
|
||||
|
||||
memset(&ctx->d, 0, sizeof(ctx->d));
|
||||
ctx->cipher_ctx = NULL;
|
||||
ctx->cmac_ctx = NULL;
|
||||
ctx->cmac_ctx_init = NULL;
|
||||
ctx->mac_ctx = NULL;
|
||||
ctx->mac_ctx_init = NULL;
|
||||
|
||||
if (key == NULL || cbc == NULL || ctr == NULL
|
||||
|| (ctx->cipher_ctx = EVP_CIPHER_CTX_new()) == NULL
|
||||
|| (ctx->cmac_ctx_init = CMAC_CTX_new()) == NULL
|
||||
|| (ctx->cmac_ctx = CMAC_CTX_new()) == NULL
|
||||
|| !CMAC_Init(ctx->cmac_ctx_init, key, klen, cbc, NULL)
|
||||
|| (ctx->mac_ctx_init = EVP_MAC_CTX_new_id(EVP_MAC_CMAC)) == NULL
|
||||
|| (ctx->mac_ctx = EVP_MAC_CTX_new_id(EVP_MAC_CMAC)) == NULL
|
||||
|| !EVP_MAC_ctrl(ctx->mac_ctx_init, EVP_MAC_CTRL_SET_CIPHER, cbc)
|
||||
|| !EVP_MAC_ctrl(ctx->mac_ctx_init, EVP_MAC_CTRL_SET_KEY, key, klen)
|
||||
|| !EVP_EncryptInit_ex(ctx->cipher_ctx, ctr, NULL, key + klen, NULL)
|
||||
|| !CMAC_CTX_copy(ctx->cmac_ctx, ctx->cmac_ctx_init)
|
||||
|| !CMAC_Update(ctx->cmac_ctx, zero, sizeof(zero))
|
||||
|| !CMAC_Final(ctx->cmac_ctx, ctx->d.byte, &out_len)) {
|
||||
|| !EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init)
|
||||
|| !EVP_MAC_update(ctx->mac_ctx, zero, sizeof(zero))
|
||||
|| !EVP_MAC_final(ctx->mac_ctx, ctx->d.byte, &out_len)) {
|
||||
EVP_CIPHER_CTX_free(ctx->cipher_ctx);
|
||||
CMAC_CTX_free(ctx->cmac_ctx_init);
|
||||
CMAC_CTX_free(ctx->cmac_ctx);
|
||||
EVP_MAC_CTX_free(ctx->mac_ctx_init);
|
||||
EVP_MAC_CTX_free(ctx->mac_ctx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -192,9 +192,9 @@ int CRYPTO_siv128_copy_ctx(SIV128_CONTEXT *dest, SIV128_CONTEXT *src)
|
||||
memcpy(&dest->d, &src->d, sizeof(src->d));
|
||||
if (!EVP_CIPHER_CTX_copy(dest->cipher_ctx, src->cipher_ctx))
|
||||
return 0;
|
||||
if (!CMAC_CTX_copy(dest->cmac_ctx_init, src->cmac_ctx_init))
|
||||
if (!EVP_MAC_CTX_copy(dest->mac_ctx_init, src->mac_ctx_init))
|
||||
return 0;
|
||||
/* no need to copy cmac_ctx since it's temp storage */
|
||||
/* no need to copy mac_ctx since it's temp storage */
|
||||
return 1;
|
||||
}
|
||||
|
||||
@@ -206,18 +206,18 @@ int CRYPTO_siv128_copy_ctx(SIV128_CONTEXT *dest, SIV128_CONTEXT *src)
|
||||
int CRYPTO_siv128_aad(SIV128_CONTEXT *ctx, const unsigned char *aad,
|
||||
size_t len)
|
||||
{
|
||||
SIV_BLOCK cmac_out;
|
||||
SIV_BLOCK mac_out;
|
||||
size_t out_len = SIV_LEN;
|
||||
|
||||
siv128_dbl(&ctx->d);
|
||||
|
||||
if (!CMAC_CTX_copy(ctx->cmac_ctx, ctx->cmac_ctx_init)
|
||||
|| !CMAC_Update(ctx->cmac_ctx, aad, len)
|
||||
|| !CMAC_Final(ctx->cmac_ctx, cmac_out.byte, &out_len)
|
||||
if (!EVP_MAC_CTX_copy(ctx->mac_ctx, ctx->mac_ctx_init)
|
||||
|| !EVP_MAC_update(ctx->mac_ctx, aad, len)
|
||||
|| !EVP_MAC_final(ctx->mac_ctx, mac_out.byte, &out_len)
|
||||
|| out_len != SIV_LEN)
|
||||
return 0;
|
||||
|
||||
siv128_xorblock(&ctx->d, &cmac_out);
|
||||
siv128_xorblock(&ctx->d, &mac_out);
|
||||
|
||||
return 1;
|
||||
|
||||
@@ -328,10 +328,10 @@ int CRYPTO_siv128_cleanup(SIV128_CONTEXT *ctx)
|
||||
if (ctx != NULL) {
|
||||
EVP_CIPHER_CTX_free(ctx->cipher_ctx);
|
||||
ctx->cipher_ctx = NULL;
|
||||
CMAC_CTX_free(ctx->cmac_ctx_init);
|
||||
ctx->cmac_ctx_init = NULL;
|
||||
CMAC_CTX_free(ctx->cmac_ctx);
|
||||
ctx->cmac_ctx = NULL;
|
||||
EVP_MAC_CTX_free(ctx->mac_ctx_init);
|
||||
ctx->mac_ctx_init = NULL;
|
||||
EVP_MAC_CTX_free(ctx->mac_ctx);
|
||||
ctx->mac_ctx = NULL;
|
||||
OPENSSL_cleanse(&ctx->d, sizeof(ctx->d));
|
||||
OPENSSL_cleanse(&ctx->tag, sizeof(ctx->tag));
|
||||
ctx->final_ret = -1;
|
||||
|
||||
@@ -161,7 +161,7 @@ int RSA_padding_check_PKCS1_type_2(unsigned char *to, int tlen,
|
||||
unsigned int good, found_zero_byte, mask;
|
||||
int zero_index = 0, msg_index, mlen = -1;
|
||||
|
||||
if (tlen < 0 || flen < 0)
|
||||
if (tlen <= 0 || flen <= 0)
|
||||
return -1;
|
||||
|
||||
/*
|
||||
|
||||
@@ -128,6 +128,8 @@ int RSA_X931_derive_ex(RSA *rsa, BIGNUM *p1, BIGNUM *p2, BIGNUM *q1,
|
||||
|
||||
/* calculate inverse of q mod p */
|
||||
rsa->iqmp = BN_mod_inverse(NULL, rsa->q, rsa->p, ctx2);
|
||||
if (rsa->iqmp == NULL)
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
err:
|
||||
|
||||
@@ -174,6 +174,10 @@ const char *X509_verify_cert_error_string(long n)
|
||||
return "OCSP verification failed";
|
||||
case X509_V_ERR_OCSP_CERT_UNKNOWN:
|
||||
return "OCSP unknown cert";
|
||||
case X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH:
|
||||
return "Subject signature algorithm and issuer public key algorithm mismatch";
|
||||
case X509_V_ERR_NO_ISSUER_PUBLIC_KEY:
|
||||
return "Issuer certificate doesn't have a public key";
|
||||
|
||||
default:
|
||||
/* Printing an error number into a static buffer is not thread-safe */
|
||||
|
||||
@@ -3232,12 +3232,19 @@ static int check_key_level(X509_STORE_CTX *ctx, X509 *cert)
|
||||
EVP_PKEY *pkey = X509_get0_pubkey(cert);
|
||||
int level = ctx->param->auth_level;
|
||||
|
||||
/*
|
||||
* At security level zero, return without checking for a supported public
|
||||
* key type. Some engines support key types not understood outside the
|
||||
* engine, and we only need to understand the key when enforcing a security
|
||||
* floor.
|
||||
*/
|
||||
if (level <= 0)
|
||||
return 1;
|
||||
|
||||
/* Unsupported or malformed keys are not secure */
|
||||
if (pkey == NULL)
|
||||
return 0;
|
||||
|
||||
if (level <= 0)
|
||||
return 1;
|
||||
if (level > NUM_AUTH_LEVELS)
|
||||
level = NUM_AUTH_LEVELS;
|
||||
|
||||
|
||||
+21
-2
@@ -764,8 +764,9 @@ static int no_check(const X509_PURPOSE *xp, const X509 *x, int ca)
|
||||
* subject name.
|
||||
* These are:
|
||||
* 1. Check issuer_name(subject) == subject_name(issuer)
|
||||
* 2. If akid(subject) exists check it matches issuer
|
||||
* 3. If key_usage(issuer) exists check it supports certificate signing
|
||||
* 2. If akid(subject) exists, check that it matches issuer
|
||||
* 3. Check that issuer public key algorithm matches subject signature algorithm
|
||||
* 4. If key_usage(issuer) exists, check that it supports certificate signing
|
||||
* returns 0 for OK, positive for reason for mismatch, reasons match
|
||||
* codes for X509_verify_cert()
|
||||
*/
|
||||
@@ -785,6 +786,24 @@ int X509_check_issued(X509 *issuer, X509 *subject)
|
||||
return ret;
|
||||
}
|
||||
|
||||
{
|
||||
/*
|
||||
* Check if the subject signature algorithm matches the issuer's PUBKEY
|
||||
* algorithm
|
||||
*/
|
||||
EVP_PKEY *i_pkey = X509_get0_pubkey(issuer);
|
||||
X509_ALGOR *s_algor = &subject->cert_info.signature;
|
||||
int s_pknid = NID_undef, s_mdnid = NID_undef;
|
||||
|
||||
if (i_pkey == NULL)
|
||||
return X509_V_ERR_NO_ISSUER_PUBLIC_KEY;
|
||||
|
||||
if (!OBJ_find_sigid_algs(OBJ_obj2nid(s_algor->algorithm),
|
||||
&s_mdnid, &s_pknid)
|
||||
|| EVP_PKEY_type(s_pknid) != EVP_PKEY_base_id(i_pkey))
|
||||
return X509_V_ERR_SIGNATURE_ALGORITHM_MISMATCH;
|
||||
}
|
||||
|
||||
if (subject->ex_flags & EXFLAG_PROXY) {
|
||||
if (ku_reject(issuer, KU_DIGITAL_SIGNATURE))
|
||||
return X509_V_ERR_KEYUSAGE_NO_DIGITAL_SIGNATURE;
|
||||
|
||||
Reference in New Issue
Block a user