Latest update
This commit is contained in:
@@ -20,6 +20,6 @@ IF[{- !$disabled{legacy} -}]
|
||||
SOURCE[legacy]=legacy.ld
|
||||
GENERATE[legacy.ld]=../util/providers.num
|
||||
ENDIF
|
||||
INCLUDE[legacy]=.. ../include ../crypto/include
|
||||
INCLUDE[legacy]=.. ../include ../crypto/include common/include
|
||||
DEPEND[legacy]=../libcrypto
|
||||
ENDIF
|
||||
@@ -1,4 +1,4 @@
|
||||
SUBDIRS=digests ciphers
|
||||
|
||||
SOURCE[../../libcrypto]=\
|
||||
provider_err.c
|
||||
provider_err.c provlib.c
|
||||
+131
-123
@@ -27,13 +27,6 @@ static OSSL_OP_cipher_final_fn aes_stream_final;
|
||||
static OSSL_OP_cipher_cipher_fn aes_cipher;
|
||||
static OSSL_OP_cipher_freectx_fn aes_freectx;
|
||||
static OSSL_OP_cipher_dupctx_fn aes_dupctx;
|
||||
static OSSL_OP_cipher_key_length_fn key_length_256;
|
||||
static OSSL_OP_cipher_key_length_fn key_length_192;
|
||||
static OSSL_OP_cipher_key_length_fn key_length_128;
|
||||
static OSSL_OP_cipher_iv_length_fn iv_length_16;
|
||||
static OSSL_OP_cipher_iv_length_fn iv_length_0;
|
||||
static OSSL_OP_cipher_block_size_fn block_size_16;
|
||||
static OSSL_OP_cipher_block_size_fn block_size_1;
|
||||
static OSSL_OP_cipher_ctx_get_params_fn aes_ctx_get_params;
|
||||
static OSSL_OP_cipher_ctx_set_params_fn aes_ctx_set_params;
|
||||
|
||||
@@ -255,69 +248,82 @@ static int aes_cipher(void *vctx,
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define IMPLEMENT_new_params(lcmode, UCMODE) \
|
||||
static OSSL_OP_cipher_get_params_fn aes_##lcmode##_get_params; \
|
||||
static int aes_##lcmode##_get_params(const OSSL_PARAM params[]) \
|
||||
#define IMPLEMENT_cipher(lcmode, UCMODE, flags, kbits, blkbits, ivbits) \
|
||||
static OSSL_OP_cipher_get_params_fn aes_##kbits##_##lcmode##_get_params; \
|
||||
static int aes_##kbits##_##lcmode##_get_params(OSSL_PARAM params[]) \
|
||||
{ \
|
||||
const OSSL_PARAM *p; \
|
||||
\
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_MODE); \
|
||||
if (p != NULL && !OSSL_PARAM_set_int(p, EVP_CIPH_##UCMODE##_MODE)) \
|
||||
return 0; \
|
||||
OSSL_PARAM *p; \
|
||||
\
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_MODE); \
|
||||
if (p != NULL) { \
|
||||
if (!OSSL_PARAM_set_int(p, EVP_CIPH_##UCMODE##_MODE)) \
|
||||
return 0; \
|
||||
} \
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_FLAGS); \
|
||||
if (p != NULL) { \
|
||||
if (!OSSL_PARAM_set_ulong(p, (flags))) \
|
||||
return 0; \
|
||||
} \
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN); \
|
||||
if (p != NULL) { \
|
||||
if (!OSSL_PARAM_set_int(p, (kbits) / 8)) \
|
||||
return 0; \
|
||||
} \
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_BLOCK_SIZE); \
|
||||
if (p != NULL) { \
|
||||
if (!OSSL_PARAM_set_int(p, (blkbits) / 8)) \
|
||||
return 0; \
|
||||
} \
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN); \
|
||||
if (p != NULL) { \
|
||||
if (!OSSL_PARAM_set_int(p, (ivbits) / 8)) \
|
||||
return 0; \
|
||||
} \
|
||||
\
|
||||
return 1; \
|
||||
}
|
||||
|
||||
#define IMPLEMENT_new_ctx(lcmode, UCMODE, len) \
|
||||
static OSSL_OP_cipher_newctx_fn aes_##len##_##lcmode##_newctx; \
|
||||
static void *aes_##len##_##lcmode##_newctx(void *provctx) \
|
||||
} \
|
||||
static OSSL_OP_cipher_newctx_fn aes_##kbits##_##lcmode##_newctx; \
|
||||
static void *aes_##kbits##_##lcmode##_newctx(void *provctx) \
|
||||
{ \
|
||||
PROV_AES_KEY *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
|
||||
\
|
||||
ctx->pad = 1; \
|
||||
ctx->keylen = (len / 8); \
|
||||
ctx->keylen = ((kbits) / 8); \
|
||||
ctx->ciph = PROV_AES_CIPHER_##lcmode(ctx->keylen); \
|
||||
ctx->mode = EVP_CIPH_##UCMODE##_MODE; \
|
||||
return ctx; \
|
||||
}
|
||||
|
||||
/* ECB */
|
||||
IMPLEMENT_new_params(ecb, ECB)
|
||||
IMPLEMENT_new_ctx(ecb, ECB, 256)
|
||||
IMPLEMENT_new_ctx(ecb, ECB, 192)
|
||||
IMPLEMENT_new_ctx(ecb, ECB, 128)
|
||||
IMPLEMENT_cipher(ecb, ECB, 0, 256, 128, 0)
|
||||
IMPLEMENT_cipher(ecb, ECB, 0, 192, 128, 0)
|
||||
IMPLEMENT_cipher(ecb, ECB, 0, 128, 128, 0)
|
||||
|
||||
/* CBC */
|
||||
IMPLEMENT_new_params(cbc, CBC)
|
||||
IMPLEMENT_new_ctx(cbc, CBC, 256)
|
||||
IMPLEMENT_new_ctx(cbc, CBC, 192)
|
||||
IMPLEMENT_new_ctx(cbc, CBC, 128)
|
||||
IMPLEMENT_cipher(cbc, CBC, 0, 256, 128, 128)
|
||||
IMPLEMENT_cipher(cbc, CBC, 0, 192, 128, 128)
|
||||
IMPLEMENT_cipher(cbc, CBC, 0, 128, 128, 128)
|
||||
|
||||
/* OFB */
|
||||
IMPLEMENT_new_params(ofb, OFB)
|
||||
IMPLEMENT_new_ctx(ofb, OFB, 256)
|
||||
IMPLEMENT_new_ctx(ofb, OFB, 192)
|
||||
IMPLEMENT_new_ctx(ofb, OFB, 128)
|
||||
IMPLEMENT_cipher(ofb, OFB, 0, 256, 8, 128)
|
||||
IMPLEMENT_cipher(ofb, OFB, 0, 192, 8, 128)
|
||||
IMPLEMENT_cipher(ofb, OFB, 0, 128, 8, 128)
|
||||
|
||||
/* CFB */
|
||||
IMPLEMENT_new_params(cfb, CFB)
|
||||
IMPLEMENT_new_params(cfb1, CFB)
|
||||
IMPLEMENT_new_params(cfb8, CFB)
|
||||
IMPLEMENT_new_ctx(cfb, CFB, 256)
|
||||
IMPLEMENT_new_ctx(cfb, CFB, 192)
|
||||
IMPLEMENT_new_ctx(cfb, CFB, 128)
|
||||
IMPLEMENT_new_ctx(cfb1, CFB, 256)
|
||||
IMPLEMENT_new_ctx(cfb1, CFB, 192)
|
||||
IMPLEMENT_new_ctx(cfb1, CFB, 128)
|
||||
IMPLEMENT_new_ctx(cfb8, CFB, 256)
|
||||
IMPLEMENT_new_ctx(cfb8, CFB, 192)
|
||||
IMPLEMENT_new_ctx(cfb8, CFB, 128)
|
||||
IMPLEMENT_cipher(cfb, CFB, 0, 256, 8, 128)
|
||||
IMPLEMENT_cipher(cfb, CFB, 0, 192, 8, 128)
|
||||
IMPLEMENT_cipher(cfb, CFB, 0, 128, 8, 128)
|
||||
IMPLEMENT_cipher(cfb1, CFB, 0, 256, 8, 128)
|
||||
IMPLEMENT_cipher(cfb1, CFB, 0, 192, 8, 128)
|
||||
IMPLEMENT_cipher(cfb1, CFB, 0, 128, 8, 128)
|
||||
IMPLEMENT_cipher(cfb8, CFB, 0, 256, 8, 128)
|
||||
IMPLEMENT_cipher(cfb8, CFB, 0, 192, 8, 128)
|
||||
IMPLEMENT_cipher(cfb8, CFB, 0, 128, 8, 128)
|
||||
|
||||
/* CTR */
|
||||
IMPLEMENT_new_params(ctr, CTR)
|
||||
IMPLEMENT_new_ctx(ctr, CTR, 256)
|
||||
IMPLEMENT_new_ctx(ctr, CTR, 192)
|
||||
IMPLEMENT_new_ctx(ctr, CTR, 128)
|
||||
IMPLEMENT_cipher(ctr, CTR, 0, 256, 8, 128)
|
||||
IMPLEMENT_cipher(ctr, CTR, 0, 192, 8, 128)
|
||||
IMPLEMENT_cipher(ctr, CTR, 0, 128, 8, 128)
|
||||
|
||||
static void aes_freectx(void *vctx)
|
||||
{
|
||||
@@ -340,51 +346,36 @@ static void *aes_dupctx(void *ctx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t key_length_256(void)
|
||||
{
|
||||
return 256 / 8;
|
||||
}
|
||||
|
||||
static size_t key_length_192(void)
|
||||
{
|
||||
return 192 / 8;
|
||||
}
|
||||
|
||||
static size_t key_length_128(void)
|
||||
{
|
||||
return 128 / 8;
|
||||
}
|
||||
|
||||
static size_t iv_length_16(void)
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
static size_t iv_length_0(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t block_size_16(void)
|
||||
{
|
||||
return 16;
|
||||
}
|
||||
|
||||
static size_t block_size_1(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int aes_ctx_get_params(void *vctx, const OSSL_PARAM params[])
|
||||
static int aes_ctx_get_params(void *vctx, OSSL_PARAM params[])
|
||||
{
|
||||
PROV_AES_KEY *ctx = (PROV_AES_KEY *)vctx;
|
||||
const OSSL_PARAM *p;
|
||||
OSSL_PARAM *p;
|
||||
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_PADDING);
|
||||
if (p != NULL && !OSSL_PARAM_set_int(p, ctx->pad)) {
|
||||
PROVerr(PROV_F_AES_CTX_GET_PARAMS, PROV_R_FAILED_TO_SET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IV);
|
||||
if (p != NULL
|
||||
&& !OSSL_PARAM_set_octet_ptr(p, &ctx->iv, AES_BLOCK_SIZE)
|
||||
&& !OSSL_PARAM_set_octet_string(p, &ctx->iv, AES_BLOCK_SIZE)) {
|
||||
PROVerr(PROV_F_AES_CTX_GET_PARAMS,
|
||||
PROV_R_FAILED_TO_SET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_NUM);
|
||||
if (p != NULL && !OSSL_PARAM_set_size_t(p, ctx->num)) {
|
||||
PROVerr(PROV_F_AES_CTX_GET_PARAMS,
|
||||
PROV_R_FAILED_TO_SET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN);
|
||||
if (p != NULL && !OSSL_PARAM_set_int(p, ctx->keylen)) {
|
||||
PROVerr(PROV_F_AES_CTX_GET_PARAMS,
|
||||
PROV_R_FAILED_TO_SET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
@@ -394,22 +385,45 @@ static int aes_ctx_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
PROV_AES_KEY *ctx = (PROV_AES_KEY *)vctx;
|
||||
const OSSL_PARAM *p;
|
||||
|
||||
p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_PADDING);
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_PADDING);
|
||||
if (p != NULL) {
|
||||
int pad;
|
||||
|
||||
if (!OSSL_PARAM_get_int(p, &pad)) {
|
||||
PROVerr(PROV_F_AES_CTX_SET_PARAMS, PROV_R_FAILED_TO_GET_PARAMETER);
|
||||
PROVerr(PROV_F_AES_CTX_SET_PARAMS,
|
||||
PROV_R_FAILED_TO_GET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
ctx->pad = pad ? 1 : 0;
|
||||
}
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_NUM);
|
||||
if (p != NULL) {
|
||||
int num;
|
||||
|
||||
if (!OSSL_PARAM_get_int(p, &num)) {
|
||||
PROVerr(PROV_F_AES_CTX_SET_PARAMS,
|
||||
PROV_R_FAILED_TO_GET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
ctx->num = num;
|
||||
}
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN);
|
||||
if (p != NULL) {
|
||||
int keylen;
|
||||
|
||||
if (!OSSL_PARAM_get_int(p, &keylen)) {
|
||||
PROVerr(PROV_F_AES_CTX_SET_PARAMS,
|
||||
PROV_R_FAILED_TO_GET_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
ctx->keylen = keylen;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
#define IMPLEMENT_block_funcs(mode, keylen, ivlen) \
|
||||
const OSSL_DISPATCH aes##keylen##mode##_functions[] = { \
|
||||
{ OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))aes_##keylen##_##mode##_newctx }, \
|
||||
#define IMPLEMENT_block_funcs(mode, kbits) \
|
||||
const OSSL_DISPATCH aes##kbits##mode##_functions[] = { \
|
||||
{ OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))aes_##kbits##_##mode##_newctx }, \
|
||||
{ OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))aes_einit }, \
|
||||
{ OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))aes_dinit }, \
|
||||
{ OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))aes_block_update }, \
|
||||
@@ -417,18 +431,15 @@ static int aes_ctx_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{ OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))aes_cipher }, \
|
||||
{ OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))aes_freectx }, \
|
||||
{ OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void))aes_dupctx }, \
|
||||
{ OSSL_FUNC_CIPHER_KEY_LENGTH, (void (*)(void))key_length_##keylen }, \
|
||||
{ OSSL_FUNC_CIPHER_IV_LENGTH, (void (*)(void))iv_length_##ivlen }, \
|
||||
{ OSSL_FUNC_CIPHER_BLOCK_SIZE, (void (*)(void))block_size_16 }, \
|
||||
{ OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void))aes_##mode##_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void))aes_##kbits##_##mode##_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_CTX_GET_PARAMS, (void (*)(void))aes_ctx_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_CTX_SET_PARAMS, (void (*)(void))aes_ctx_set_params }, \
|
||||
{ 0, NULL } \
|
||||
};
|
||||
|
||||
#define IMPLEMENT_stream_funcs(mode, keylen, ivlen) \
|
||||
const OSSL_DISPATCH aes##keylen##mode##_functions[] = { \
|
||||
{ OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))aes_##keylen##_##mode##_newctx }, \
|
||||
#define IMPLEMENT_stream_funcs(mode, kbits) \
|
||||
const OSSL_DISPATCH aes##kbits##mode##_functions[] = { \
|
||||
{ OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))aes_##kbits##_##mode##_newctx }, \
|
||||
{ OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))aes_einit }, \
|
||||
{ OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))aes_dinit }, \
|
||||
{ OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))aes_stream_update }, \
|
||||
@@ -436,42 +447,39 @@ static int aes_ctx_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{ OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))aes_cipher }, \
|
||||
{ OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))aes_freectx }, \
|
||||
{ OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void))aes_dupctx }, \
|
||||
{ OSSL_FUNC_CIPHER_KEY_LENGTH, (void (*)(void))key_length_##keylen }, \
|
||||
{ OSSL_FUNC_CIPHER_IV_LENGTH, (void (*)(void))iv_length_##ivlen }, \
|
||||
{ OSSL_FUNC_CIPHER_BLOCK_SIZE, (void (*)(void))block_size_1 }, \
|
||||
{ OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void))aes_##mode##_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void))aes_##kbits##_##mode##_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_CTX_GET_PARAMS, (void (*)(void))aes_ctx_get_params }, \
|
||||
{ OSSL_FUNC_CIPHER_CTX_SET_PARAMS, (void (*)(void))aes_ctx_set_params }, \
|
||||
{ 0, NULL } \
|
||||
};
|
||||
|
||||
/* ECB */
|
||||
IMPLEMENT_block_funcs(ecb, 256, 0)
|
||||
IMPLEMENT_block_funcs(ecb, 192, 0)
|
||||
IMPLEMENT_block_funcs(ecb, 128, 0)
|
||||
IMPLEMENT_block_funcs(ecb, 256)
|
||||
IMPLEMENT_block_funcs(ecb, 192)
|
||||
IMPLEMENT_block_funcs(ecb, 128)
|
||||
|
||||
/* CBC */
|
||||
IMPLEMENT_block_funcs(cbc, 256, 16)
|
||||
IMPLEMENT_block_funcs(cbc, 192, 16)
|
||||
IMPLEMENT_block_funcs(cbc, 128, 16)
|
||||
IMPLEMENT_block_funcs(cbc, 256)
|
||||
IMPLEMENT_block_funcs(cbc, 192)
|
||||
IMPLEMENT_block_funcs(cbc, 128)
|
||||
|
||||
/* OFB */
|
||||
IMPLEMENT_stream_funcs(ofb, 256, 16)
|
||||
IMPLEMENT_stream_funcs(ofb, 192, 16)
|
||||
IMPLEMENT_stream_funcs(ofb, 128, 16)
|
||||
IMPLEMENT_stream_funcs(ofb, 256)
|
||||
IMPLEMENT_stream_funcs(ofb, 192)
|
||||
IMPLEMENT_stream_funcs(ofb, 128)
|
||||
|
||||
/* CFB */
|
||||
IMPLEMENT_stream_funcs(cfb, 256, 16)
|
||||
IMPLEMENT_stream_funcs(cfb, 192, 16)
|
||||
IMPLEMENT_stream_funcs(cfb, 128, 16)
|
||||
IMPLEMENT_stream_funcs(cfb1, 256, 16)
|
||||
IMPLEMENT_stream_funcs(cfb1, 192, 16)
|
||||
IMPLEMENT_stream_funcs(cfb1, 128, 16)
|
||||
IMPLEMENT_stream_funcs(cfb8, 256, 16)
|
||||
IMPLEMENT_stream_funcs(cfb8, 192, 16)
|
||||
IMPLEMENT_stream_funcs(cfb8, 128, 16)
|
||||
IMPLEMENT_stream_funcs(cfb, 256)
|
||||
IMPLEMENT_stream_funcs(cfb, 192)
|
||||
IMPLEMENT_stream_funcs(cfb, 128)
|
||||
IMPLEMENT_stream_funcs(cfb1, 256)
|
||||
IMPLEMENT_stream_funcs(cfb1, 192)
|
||||
IMPLEMENT_stream_funcs(cfb1, 128)
|
||||
IMPLEMENT_stream_funcs(cfb8, 256)
|
||||
IMPLEMENT_stream_funcs(cfb8, 192)
|
||||
IMPLEMENT_stream_funcs(cfb8, 128)
|
||||
|
||||
/* CTR */
|
||||
IMPLEMENT_stream_funcs(ctr, 256, 16)
|
||||
IMPLEMENT_stream_funcs(ctr, 192, 16)
|
||||
IMPLEMENT_stream_funcs(ctr, 128, 16)
|
||||
IMPLEMENT_stream_funcs(ctr, 256)
|
||||
IMPLEMENT_stream_funcs(ctr, 192)
|
||||
IMPLEMENT_stream_funcs(ctr, 128)
|
||||
@@ -606,9 +606,9 @@ static const PROV_AES_CIPHER aes_##mode = { \
|
||||
}; \
|
||||
const PROV_AES_CIPHER *PROV_AES_CIPHER_##mode(size_t keylen) \
|
||||
{ \
|
||||
if ((keylen == 128 && S390X_aes_128_##mode##_CAPABLE) \
|
||||
|| (keylen == 192 && S390X_aes_192_##mode##_CAPABLE) \
|
||||
|| (keylen == 256 && S390X_aes_256_##mode##_CAPABLE)) \
|
||||
if ((keylen == 16 && S390X_aes_128_##mode##_CAPABLE) \
|
||||
|| (keylen == 24 && S390X_aes_192_##mode##_CAPABLE) \
|
||||
|| (keylen == 32 && S390X_aes_256_##mode##_CAPABLE)) \
|
||||
return &s390x_aes_##mode; \
|
||||
\
|
||||
return &aes_##mode; \
|
||||
|
||||
@@ -2,3 +2,7 @@ LIBS=../../../libcrypto
|
||||
SOURCE[../../../libcrypto]=\
|
||||
block.c aes.c aes_basic.c
|
||||
INCLUDE[../../../libcrypto]=. ../../../crypto
|
||||
|
||||
SOURCE[../../fips]=\
|
||||
block.c aes.c aes_basic.c
|
||||
INCLUDE[../../fips]=. ../../../crypto
|
||||
@@ -1,5 +1,5 @@
|
||||
SOURCE[../../../libcrypto]=\
|
||||
sha2.c
|
||||
sha2_prov.c sha3_prov.c
|
||||
|
||||
SOURCE[../../fips]=\
|
||||
sha2.c
|
||||
sha2_prov.c sha3_prov.c
|
||||
@@ -1,87 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/sha.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/core_numbers.h>
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
/*
|
||||
* Forward declaration of everything implemented here. This is not strictly
|
||||
* necessary for the compiler, but provides an assurance that the signatures
|
||||
* of the functions in the dispatch table are correct.
|
||||
*/
|
||||
static OSSL_OP_digest_newctx_fn sha256_newctx;
|
||||
#if 0 /* Not defined here */
|
||||
static OSSL_OP_digest_init_fn sha256_init;
|
||||
static OSSL_OP_digest_update_fn sha256_update;
|
||||
#endif
|
||||
static OSSL_OP_digest_final_fn sha256_final;
|
||||
static OSSL_OP_digest_freectx_fn sha256_freectx;
|
||||
static OSSL_OP_digest_dupctx_fn sha256_dupctx;
|
||||
static OSSL_OP_digest_size_fn sha256_size;
|
||||
static OSSL_OP_digest_block_size_fn sha256_size;
|
||||
|
||||
static int sha256_final(void *ctx,
|
||||
unsigned char *md, size_t *mdl, size_t mdsz)
|
||||
{
|
||||
if (mdsz >= SHA256_DIGEST_LENGTH
|
||||
&& SHA256_Final(md, ctx)) {
|
||||
*mdl = SHA256_DIGEST_LENGTH;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *sha256_newctx(void *provctx)
|
||||
{
|
||||
SHA256_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
static void sha256_freectx(void *vctx)
|
||||
{
|
||||
SHA256_CTX *ctx = (SHA256_CTX *)vctx;
|
||||
|
||||
OPENSSL_clear_free(ctx, sizeof(*ctx));
|
||||
}
|
||||
|
||||
static void *sha256_dupctx(void *ctx)
|
||||
{
|
||||
SHA256_CTX *in = (SHA256_CTX *)ctx;
|
||||
SHA256_CTX *ret = OPENSSL_malloc(sizeof(*ret));
|
||||
|
||||
*ret = *in;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t sha256_size(void)
|
||||
{
|
||||
return SHA256_DIGEST_LENGTH;
|
||||
}
|
||||
|
||||
static size_t sha256_block_size(void)
|
||||
{
|
||||
return SHA256_CBLOCK;
|
||||
}
|
||||
|
||||
const OSSL_DISPATCH sha256_functions[] = {
|
||||
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))sha256_newctx },
|
||||
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))SHA256_Init },
|
||||
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))SHA256_Update },
|
||||
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))sha256_final },
|
||||
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))sha256_freectx },
|
||||
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))sha256_dupctx },
|
||||
{ OSSL_FUNC_DIGEST_SIZE, (void (*)(void))sha256_size },
|
||||
{ OSSL_FUNC_DIGEST_BLOCK_SIZE, (void (*)(void))sha256_block_size },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -0,0 +1,65 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/core_numbers.h>
|
||||
#include <openssl/sha.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/params.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
#include "internal/sha.h"
|
||||
|
||||
static OSSL_OP_digest_set_params_fn sha1_set_params;
|
||||
|
||||
/* Special set_params method for SSL3 */
|
||||
static int sha1_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
SHA_CTX *ctx = (SHA_CTX *)vctx;
|
||||
|
||||
if (ctx != NULL && params != NULL) {
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_SSL3_MS);
|
||||
if (p != NULL && p->data_type == OSSL_PARAM_OCTET_STRING)
|
||||
return sha1_ctrl(ctx, EVP_CTRL_SSL3_MASTER_SECRET, p->data_size,
|
||||
p->data);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_PARAMS(sha1, SHA_CTX,
|
||||
SHA_CBLOCK, SHA_DIGEST_LENGTH,
|
||||
SHA1_Init, SHA1_Update, SHA1_Final,
|
||||
sha1_set_params)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha224, SHA256_CTX,
|
||||
SHA256_CBLOCK, SHA224_DIGEST_LENGTH,
|
||||
SHA224_Init, SHA224_Update, SHA224_Final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha256, SHA256_CTX,
|
||||
SHA256_CBLOCK, SHA256_DIGEST_LENGTH,
|
||||
SHA256_Init, SHA256_Update, SHA256_Final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha384, SHA512_CTX,
|
||||
SHA512_CBLOCK, SHA384_DIGEST_LENGTH,
|
||||
SHA384_Init, SHA384_Update, SHA384_Final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha512, SHA512_CTX,
|
||||
SHA512_CBLOCK, SHA512_DIGEST_LENGTH,
|
||||
SHA512_Init, SHA512_Update, SHA512_Final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha512_224, SHA512_CTX,
|
||||
SHA512_CBLOCK, SHA224_DIGEST_LENGTH,
|
||||
sha512_224_init, SHA512_Update, SHA512_Final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sha512_256, SHA512_CTX,
|
||||
SHA512_CBLOCK, SHA256_DIGEST_LENGTH,
|
||||
sha512_256_init, SHA512_Update, SHA512_Final)
|
||||
|
||||
@@ -0,0 +1,278 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/core_names.h>
|
||||
#include <string.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/params.h>
|
||||
#include "internal/sha3.h"
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
/*
|
||||
* Forward declaration of any unique methods implemented here. This is not strictly
|
||||
* necessary for the compiler, but provides an assurance that the signatures
|
||||
* of the functions in the dispatch table are correct.
|
||||
*/
|
||||
static OSSL_OP_digest_init_fn keccak_init;
|
||||
static OSSL_OP_digest_update_fn keccak_update;
|
||||
static OSSL_OP_digest_final_fn keccak_final;
|
||||
static OSSL_OP_digest_freectx_fn keccak_freectx;
|
||||
static OSSL_OP_digest_dupctx_fn keccak_dupctx;
|
||||
static OSSL_OP_digest_set_params_fn shake_set_params;
|
||||
static sha3_absorb_fn generic_sha3_absorb;
|
||||
static sha3_final_fn generic_sha3_final;
|
||||
|
||||
#if defined(OPENSSL_CPUID_OBJ) && defined(__s390__) && defined(KECCAK1600_ASM)
|
||||
/*
|
||||
* IBM S390X support
|
||||
*/
|
||||
# include "s390x_arch.h"
|
||||
# define S390_SHA3 1
|
||||
# define S390_SHA3_CAPABLE(name) \
|
||||
((OPENSSL_s390xcap_P.kimd[0] & S390X_CAPBIT(S390X_##name)) && \
|
||||
(OPENSSL_s390xcap_P.klmd[0] & S390X_CAPBIT(S390X_##name)))
|
||||
|
||||
#endif
|
||||
|
||||
static int keccak_init(void *vctx)
|
||||
{
|
||||
/* The newctx() handles most of the ctx fixed setup. */
|
||||
sha3_reset((KECCAK1600_CTX *)vctx);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int keccak_update(void *vctx, const unsigned char *inp, size_t len)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
const size_t bsz = ctx->block_size;
|
||||
size_t num, rem;
|
||||
|
||||
if (len == 0)
|
||||
return 1;
|
||||
|
||||
/* Is there anything in the buffer already ? */
|
||||
if ((num = ctx->bufsz) != 0) {
|
||||
/* Calculate how much space is left in the buffer */
|
||||
rem = bsz - num;
|
||||
/* If the new input does not fill the buffer then just add it */
|
||||
if (len < rem) {
|
||||
memcpy(ctx->buf + num, inp, len);
|
||||
ctx->bufsz += len;
|
||||
return 1;
|
||||
}
|
||||
/* otherwise fill up the buffer and absorb the buffer */
|
||||
memcpy(ctx->buf + num, inp, rem);
|
||||
/* Update the input pointer */
|
||||
inp += rem;
|
||||
len -= rem;
|
||||
ctx->meth.absorb(ctx, ctx->buf, bsz);
|
||||
ctx->bufsz = 0;
|
||||
}
|
||||
/* Absorb the input - rem = leftover part of the input < blocksize) */
|
||||
rem = ctx->meth.absorb(ctx, inp, len);
|
||||
/* Copy the leftover bit of the input into the buffer */
|
||||
if (rem) {
|
||||
memcpy(ctx->buf, inp + len - rem, rem);
|
||||
ctx->bufsz = rem;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int keccak_final(void *vctx, unsigned char *out, size_t *outl,
|
||||
size_t outsz)
|
||||
{
|
||||
int ret;
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
|
||||
ret = ctx->meth.final(out, ctx);
|
||||
*outl = ctx->md_size;
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*-
|
||||
* Generic software version of the absorb() and final().
|
||||
*/
|
||||
static size_t generic_sha3_absorb(void *vctx, const void *inp, size_t len)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
|
||||
return SHA3_absorb(ctx->A, inp, len, ctx->block_size);
|
||||
}
|
||||
|
||||
static int generic_sha3_final(unsigned char *md, void *vctx)
|
||||
{
|
||||
return sha3_final(md, (KECCAK1600_CTX *)vctx);
|
||||
}
|
||||
|
||||
static PROV_SHA3_METHOD sha3_generic_md =
|
||||
{
|
||||
generic_sha3_absorb,
|
||||
generic_sha3_final
|
||||
};
|
||||
|
||||
#if defined(S390_SHA3)
|
||||
|
||||
static sha3_absorb_fn s390x_sha3_absorb;
|
||||
static sha3_final_fn s390x_sha3_final;
|
||||
static sha3_final_fn s390x_shake_final;
|
||||
|
||||
/*-
|
||||
* The platform specific parts of the absorb() and final() for S390X.
|
||||
*/
|
||||
static size_t s390x_sha3_absorb(void *vctx, const void *inp, size_t len)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
size_t rem = len % ctx->block_size;
|
||||
|
||||
s390x_kimd(inp, len - rem, ctx->pad, ctx->A);
|
||||
return rem;
|
||||
}
|
||||
|
||||
static int s390x_sha3_final(unsigned char *md, void *vctx)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
|
||||
s390x_klmd(ctx->buf, ctx->bufsz, NULL, 0, ctx->pad, ctx->A);
|
||||
memcpy(md, ctx->A, ctx->md_size);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int s390x_shake_final(unsigned char *md, void *vctx)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = vctx;
|
||||
|
||||
s390x_klmd(ctx->buf, ctx->bufsz, md, ctx->md_size, ctx->pad, ctx->A);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static PROV_SHA3_METHOD sha3_s390x_md =
|
||||
{
|
||||
s390x_sha3_absorb,
|
||||
s390x_sha3_final
|
||||
};
|
||||
|
||||
static PROV_SHA3_METHOD shake_s390x_md =
|
||||
{
|
||||
s390x_sha3_absorb,
|
||||
s390x_shake_final
|
||||
};
|
||||
|
||||
# define SHA3_SET_MD(uname, typ) \
|
||||
if (S390_SHA3_CAPABLE(uname)) { \
|
||||
ctx->pad = S390X_##uname; \
|
||||
ctx->meth = typ##_s390x_md; \
|
||||
} else { \
|
||||
ctx->meth = sha3_generic_md; \
|
||||
}
|
||||
#else
|
||||
# define SHA3_SET_MD(uname, typ) ctx->meth = sha3_generic_md;
|
||||
#endif /* S390_SHA3 */
|
||||
|
||||
#define SHA3_newctx(typ, uname, name, bitlen, pad) \
|
||||
static OSSL_OP_digest_newctx_fn name##_newctx; \
|
||||
static void *name##_newctx(void *provctx) \
|
||||
{ \
|
||||
KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
|
||||
\
|
||||
if (ctx == NULL) \
|
||||
return NULL; \
|
||||
sha3_init(ctx, pad, bitlen); \
|
||||
SHA3_SET_MD(uname, typ) \
|
||||
return ctx; \
|
||||
}
|
||||
|
||||
#define KMAC_newctx(uname, bitlen, pad) \
|
||||
static OSSL_OP_digest_newctx_fn uname##_newctx; \
|
||||
static void *uname##_newctx(void *provctx) \
|
||||
{ \
|
||||
KECCAK1600_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
|
||||
\
|
||||
if (ctx == NULL) \
|
||||
return NULL; \
|
||||
keccak_kmac_init(ctx, pad, bitlen); \
|
||||
ctx->meth = sha3_generic_md; \
|
||||
return ctx; \
|
||||
}
|
||||
|
||||
#define OSSL_FUNC_SHA3_DIGEST(name, bitlen, dgstsize, stparams) \
|
||||
static OSSL_OP_digest_size_fn name##_size; \
|
||||
static OSSL_OP_digest_block_size_fn name##_block_size; \
|
||||
static size_t name##_block_size(void) \
|
||||
{ \
|
||||
return SHA3_BLOCKSIZE(bitlen); \
|
||||
} \
|
||||
static size_t name##_size(void) \
|
||||
{ \
|
||||
return dgstsize; \
|
||||
} \
|
||||
const OSSL_DISPATCH name##_functions[] = { \
|
||||
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \
|
||||
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))keccak_init }, \
|
||||
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))keccak_update }, \
|
||||
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))keccak_final }, \
|
||||
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))keccak_freectx }, \
|
||||
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))keccak_dupctx }, \
|
||||
{ OSSL_FUNC_DIGEST_SIZE, (void (*)(void))name##_size }, \
|
||||
{ OSSL_FUNC_DIGEST_BLOCK_SIZE, (void (*)(void))name##_block_size }, \
|
||||
{ OSSL_FUNC_DIGEST_SET_PARAMS, (void (*)(void))stparams },\
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_END
|
||||
|
||||
static void keccak_freectx(void *vctx)
|
||||
{
|
||||
KECCAK1600_CTX *ctx = (KECCAK1600_CTX *)vctx;
|
||||
|
||||
OPENSSL_clear_free(ctx, sizeof(*ctx));
|
||||
}
|
||||
|
||||
static void *keccak_dupctx(void *ctx)
|
||||
{
|
||||
KECCAK1600_CTX *in = (KECCAK1600_CTX *)ctx;
|
||||
KECCAK1600_CTX *ret = OPENSSL_malloc(sizeof(*ret));
|
||||
|
||||
*ret = *in;
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int shake_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
KECCAK1600_CTX *ctx = (KECCAK1600_CTX *)vctx;
|
||||
|
||||
if (ctx != NULL && params != NULL) {
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_XOFLEN);
|
||||
if (p != NULL && !OSSL_PARAM_get_size_t(p, &ctx->md_size))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
return 0; /* Null Parameter */
|
||||
}
|
||||
|
||||
#define SHA3(bitlen) \
|
||||
SHA3_newctx(sha3, SHA3_##bitlen, sha3_##bitlen, bitlen, '\x06') \
|
||||
OSSL_FUNC_SHA3_DIGEST(sha3_##bitlen, bitlen, SHA3_MDSIZE(bitlen), NULL)
|
||||
|
||||
#define SHAKE(bitlen) \
|
||||
SHA3_newctx(shake, SHAKE_##bitlen, shake_##bitlen, bitlen, '\x1f') \
|
||||
OSSL_FUNC_SHA3_DIGEST(shake_##bitlen, bitlen, SHA3_MDSIZE(bitlen), \
|
||||
shake_set_params)
|
||||
#define KMAC(bitlen) \
|
||||
KMAC_newctx(keccak_kmac_##bitlen, bitlen, '\x04') \
|
||||
OSSL_FUNC_SHA3_DIGEST(keccak_kmac_##bitlen, bitlen, KMAC_MDSIZE(bitlen), \
|
||||
shake_set_params)
|
||||
|
||||
SHA3(224)
|
||||
SHA3(256)
|
||||
SHA3(384)
|
||||
SHA3(512)
|
||||
SHAKE(128)
|
||||
SHAKE(256)
|
||||
KMAC(128)
|
||||
KMAC(256)
|
||||
@@ -0,0 +1,95 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#ifndef OSSL_CORE_MKDIGEST_H
|
||||
# define OSSL_CORE_MKDIGEST_H
|
||||
|
||||
# include <openssl/core_numbers.h>
|
||||
|
||||
# ifdef __cplusplus
|
||||
extern "C" {
|
||||
# endif
|
||||
|
||||
# define OSSL_FUNC_DIGEST_ALLOC_METHODS(name, CTX_NAME) \
|
||||
static OSSL_OP_digest_newctx_fn name##_newctx; \
|
||||
static OSSL_OP_digest_freectx_fn name##_freectx; \
|
||||
static OSSL_OP_digest_dupctx_fn name##_dupctx; \
|
||||
static void *name##_newctx(void *prov_ctx) \
|
||||
{ \
|
||||
CTX_NAME *ctx = OPENSSL_zalloc(sizeof(*ctx)); \
|
||||
return ctx; \
|
||||
} \
|
||||
static void name##_freectx(void *vctx) \
|
||||
{ \
|
||||
CTX_NAME *ctx = (CTX_NAME *)vctx; \
|
||||
OPENSSL_clear_free(ctx, sizeof(*ctx)); \
|
||||
} \
|
||||
static void *name##_dupctx(void *ctx) \
|
||||
{ \
|
||||
CTX_NAME *in = (CTX_NAME *)ctx; \
|
||||
CTX_NAME *ret = OPENSSL_malloc(sizeof(*ret)); \
|
||||
*ret = *in; \
|
||||
return ret; \
|
||||
}
|
||||
|
||||
# define OSSL_FUNC_DIGEST_SET_FINAL(name, dgstsize, fin) \
|
||||
static OSSL_OP_digest_final_fn name##_wrapfinal; \
|
||||
static int name##_wrapfinal(void *ctx, unsigned char *out, size_t *outl, size_t outsz) \
|
||||
{ \
|
||||
if (outsz >= dgstsize && fin(out, ctx)) { \
|
||||
*outl = dgstsize; \
|
||||
return 1; \
|
||||
} \
|
||||
return 0; \
|
||||
}
|
||||
|
||||
# define OSSL_FUNC_DIGEST_COMMON(name, blksize, dgstsize, init, upd) \
|
||||
static OSSL_OP_digest_block_size_fn name##_block_size; \
|
||||
static OSSL_OP_digest_size_fn name##_size; \
|
||||
static size_t name##_block_size(void) \
|
||||
{ \
|
||||
return blksize; \
|
||||
} \
|
||||
static size_t name##_size(void) \
|
||||
{ \
|
||||
return dgstsize; \
|
||||
} \
|
||||
const OSSL_DISPATCH name##_functions[] = { \
|
||||
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))name##_newctx }, \
|
||||
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))init }, \
|
||||
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))upd }, \
|
||||
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))name##_wrapfinal }, \
|
||||
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))name##_freectx }, \
|
||||
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))name##_dupctx }, \
|
||||
{ OSSL_FUNC_DIGEST_SIZE, (void (*)(void))name##_size }, \
|
||||
{ OSSL_FUNC_DIGEST_BLOCK_SIZE, (void (*)(void))name##_block_size },
|
||||
|
||||
# define OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, init, upd, fin) \
|
||||
OSSL_FUNC_DIGEST_ALLOC_METHODS(name, CTX) \
|
||||
OSSL_FUNC_DIGEST_SET_FINAL(name, dgstsize, fin) \
|
||||
OSSL_FUNC_DIGEST_COMMON(name, blksize, dgstsize, init, upd)
|
||||
|
||||
# define OSSL_FUNC_DIGEST_CONSTRUCT_END \
|
||||
{ 0, NULL } \
|
||||
};
|
||||
|
||||
# define OSSL_FUNC_DIGEST_CONSTRUCT(name, CTX, blksize, dgstsize, init, upd, fin) \
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, init, upd, fin) \
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_END
|
||||
|
||||
# define OSSL_FUNC_DIGEST_CONSTRUCT_PARAMS(name, CTX, blksize, dgstsize, init, upd, fin, setparams) \
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_START(name, CTX, blksize, dgstsize, init, upd, fin) \
|
||||
{ OSSL_FUNC_DIGEST_SET_PARAMS, (void (*)(void))setparams }, \
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_END
|
||||
|
||||
# ifdef __cplusplus
|
||||
}
|
||||
# endif
|
||||
|
||||
#endif /* OSSL_CORE_MKDIGEST_H */
|
||||
@@ -8,7 +8,32 @@
|
||||
*/
|
||||
|
||||
/* Digests */
|
||||
extern const OSSL_DISPATCH sha1_functions[];
|
||||
extern const OSSL_DISPATCH sha224_functions[];
|
||||
extern const OSSL_DISPATCH sha256_functions[];
|
||||
extern const OSSL_DISPATCH sha384_functions[];
|
||||
extern const OSSL_DISPATCH sha512_functions[];
|
||||
extern const OSSL_DISPATCH sha512_224_functions[];
|
||||
extern const OSSL_DISPATCH sha512_256_functions[];
|
||||
extern const OSSL_DISPATCH sha3_224_functions[];
|
||||
extern const OSSL_DISPATCH sha3_256_functions[];
|
||||
extern const OSSL_DISPATCH sha3_384_functions[];
|
||||
extern const OSSL_DISPATCH sha3_512_functions[];
|
||||
extern const OSSL_DISPATCH keccak_kmac_128_functions[];
|
||||
extern const OSSL_DISPATCH keccak_kmac_256_functions[];
|
||||
extern const OSSL_DISPATCH shake_128_functions[];
|
||||
extern const OSSL_DISPATCH shake_256_functions[];
|
||||
extern const OSSL_DISPATCH blake2s256_functions[];
|
||||
extern const OSSL_DISPATCH blake2b512_functions[];
|
||||
extern const OSSL_DISPATCH md5_functions[];
|
||||
extern const OSSL_DISPATCH md5_sha1_functions[];
|
||||
extern const OSSL_DISPATCH sm3_functions[];
|
||||
extern const OSSL_DISPATCH nullmd_functions[];
|
||||
extern const OSSL_DISPATCH md2_functions[];
|
||||
extern const OSSL_DISPATCH md4_functions[];
|
||||
extern const OSSL_DISPATCH mdc2_functions[];
|
||||
extern const OSSL_DISPATCH wp_functions[];
|
||||
extern const OSSL_DISPATCH ripemd160_functions[];
|
||||
|
||||
/* Ciphers */
|
||||
extern const OSSL_DISPATCH aes256ecb_functions[];
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* To be used anywhere the library context needs to be passed, such as to
|
||||
* fetching functions.
|
||||
*/
|
||||
#define PROV_LIBRARY_CONTEXT_OF(provctx) (provctx)
|
||||
@@ -0,0 +1,14 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/provider.h>
|
||||
|
||||
const OSSL_PROVIDER *FIPS_get_provider(OPENSSL_CTX *ctx);
|
||||
|
||||
const char *ossl_prov_util_nid_to_name(int nid);
|
||||
@@ -0,0 +1,21 @@
|
||||
/*
|
||||
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/objects.h>
|
||||
#include "internal/providercommon.h"
|
||||
|
||||
/*
|
||||
* The FIPS provider has its own version of this in fipsprov.c because it does
|
||||
* not have OBJ_nid2sn();
|
||||
*/
|
||||
const char *ossl_prov_util_nid_to_name(int nid)
|
||||
{
|
||||
return OBJ_nid2sn(nid);
|
||||
}
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
SUBDIRS=digests
|
||||
LIBS=../../libcrypto
|
||||
SOURCE[../../libcrypto]=\
|
||||
defltprov.c
|
||||
@@ -32,10 +32,9 @@ static const OSSL_ITEM *deflt_get_param_types(const OSSL_PROVIDER *prov)
|
||||
return deflt_param_types;
|
||||
}
|
||||
|
||||
static int deflt_get_params(const OSSL_PROVIDER *prov,
|
||||
const OSSL_PARAM params[])
|
||||
static int deflt_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
OSSL_PARAM *p;
|
||||
|
||||
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
|
||||
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL Default Provider"))
|
||||
@@ -51,7 +50,42 @@ static int deflt_get_params(const OSSL_PROVIDER *prov,
|
||||
}
|
||||
|
||||
static const OSSL_ALGORITHM deflt_digests[] = {
|
||||
{ "SHA1", "default=yes", sha1_functions },
|
||||
|
||||
{ "SHA224", "default=yes", sha224_functions },
|
||||
{ "SHA256", "default=yes", sha256_functions },
|
||||
{ "SHA384", "default=yes", sha384_functions },
|
||||
{ "SHA512", "default=yes", sha512_functions },
|
||||
{ "SHA512-224", "default=yes", sha512_224_functions },
|
||||
{ "SHA512-256", "default=yes", sha512_256_functions },
|
||||
|
||||
{ "SHA3-224", "default=yes", sha3_224_functions },
|
||||
{ "SHA3-256", "default=yes", sha3_256_functions },
|
||||
{ "SHA3-384", "default=yes", sha3_384_functions },
|
||||
{ "SHA3-512", "default=yes", sha3_512_functions },
|
||||
|
||||
{ "KMAC128", "default=yes", keccak_kmac_128_functions },
|
||||
{ "KMAC256", "default=yes", keccak_kmac_256_functions },
|
||||
|
||||
{ "SHAKE128", "default=yes", shake_128_functions },
|
||||
{ "SHAKE256", "default=yes", shake_256_functions },
|
||||
|
||||
#ifndef OPENSSL_NO_BLAKE2
|
||||
{ "BLAKE2s256", "default=yes", blake2s256_functions },
|
||||
{ "BLAKE2b512", "default=yes", blake2b512_functions },
|
||||
#endif /* OPENSSL_NO_BLAKE2 */
|
||||
|
||||
#ifndef OPENSSL_NO_SM3
|
||||
{ "SM3", "default=yes", sm3_functions },
|
||||
#endif /* OPENSSL_NO_SM3 */
|
||||
|
||||
#ifndef OPENSSL_NO_MD5
|
||||
{ "MD5", "default=yes", md5_functions },
|
||||
{ "MD5-SHA1", "default=yes", md5_sha1_functions },
|
||||
#endif /* OPENSSL_NO_MD5 */
|
||||
|
||||
/*{ "UNDEF", "default=yes", nullmd_functions }, */
|
||||
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -109,6 +143,8 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider,
|
||||
const OSSL_DISPATCH **out,
|
||||
void **provctx)
|
||||
{
|
||||
OSSL_core_get_library_context_fn *c_get_libctx = NULL;
|
||||
|
||||
for (; in->function_id != 0; in++) {
|
||||
switch (in->function_id) {
|
||||
case OSSL_FUNC_CORE_GET_PARAM_TYPES:
|
||||
@@ -117,12 +153,25 @@ int ossl_default_provider_init(const OSSL_PROVIDER *provider,
|
||||
case OSSL_FUNC_CORE_GET_PARAMS:
|
||||
c_get_params = OSSL_get_core_get_params(in);
|
||||
break;
|
||||
case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
|
||||
c_get_libctx = OSSL_get_core_get_library_context(in);
|
||||
break;
|
||||
default:
|
||||
/* Just ignore anything we don't understand */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (c_get_libctx == NULL)
|
||||
return 0;
|
||||
|
||||
*out = deflt_dispatch_table;
|
||||
|
||||
/*
|
||||
* We want to make sure that all calls from this provider that requires
|
||||
* a library context use the same context as the one used to call our
|
||||
* functions. We do that by passing it along as the provider context.
|
||||
*/
|
||||
*provctx = c_get_libctx(provider);
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,129 @@
|
||||
/*
|
||||
* Copyright 2016-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* Derived from the BLAKE2 reference implementation written by Samuel Neves.
|
||||
* Copyright 2012, Samuel Neves <sneves@dei.uc.pt>
|
||||
* More information about the BLAKE2 hash function and its implementations
|
||||
* can be found at https://blake2.net.
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
|
||||
static ossl_inline uint32_t load32(const uint8_t *src)
|
||||
{
|
||||
const union {
|
||||
long one;
|
||||
char little;
|
||||
} is_endian = { 1 };
|
||||
|
||||
if (is_endian.little) {
|
||||
uint32_t w;
|
||||
memcpy(&w, src, sizeof(w));
|
||||
return w;
|
||||
} else {
|
||||
uint32_t w = ((uint32_t)src[0])
|
||||
| ((uint32_t)src[1] << 8)
|
||||
| ((uint32_t)src[2] << 16)
|
||||
| ((uint32_t)src[3] << 24);
|
||||
return w;
|
||||
}
|
||||
}
|
||||
|
||||
static ossl_inline uint64_t load64(const uint8_t *src)
|
||||
{
|
||||
const union {
|
||||
long one;
|
||||
char little;
|
||||
} is_endian = { 1 };
|
||||
|
||||
if (is_endian.little) {
|
||||
uint64_t w;
|
||||
memcpy(&w, src, sizeof(w));
|
||||
return w;
|
||||
} else {
|
||||
uint64_t w = ((uint64_t)src[0])
|
||||
| ((uint64_t)src[1] << 8)
|
||||
| ((uint64_t)src[2] << 16)
|
||||
| ((uint64_t)src[3] << 24)
|
||||
| ((uint64_t)src[4] << 32)
|
||||
| ((uint64_t)src[5] << 40)
|
||||
| ((uint64_t)src[6] << 48)
|
||||
| ((uint64_t)src[7] << 56);
|
||||
return w;
|
||||
}
|
||||
}
|
||||
|
||||
static ossl_inline void store32(uint8_t *dst, uint32_t w)
|
||||
{
|
||||
const union {
|
||||
long one;
|
||||
char little;
|
||||
} is_endian = { 1 };
|
||||
|
||||
if (is_endian.little) {
|
||||
memcpy(dst, &w, sizeof(w));
|
||||
} else {
|
||||
uint8_t *p = (uint8_t *)dst;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 4; i++)
|
||||
p[i] = (uint8_t)(w >> (8 * i));
|
||||
}
|
||||
}
|
||||
|
||||
static ossl_inline void store64(uint8_t *dst, uint64_t w)
|
||||
{
|
||||
const union {
|
||||
long one;
|
||||
char little;
|
||||
} is_endian = { 1 };
|
||||
|
||||
if (is_endian.little) {
|
||||
memcpy(dst, &w, sizeof(w));
|
||||
} else {
|
||||
uint8_t *p = (uint8_t *)dst;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 8; i++)
|
||||
p[i] = (uint8_t)(w >> (8 * i));
|
||||
}
|
||||
}
|
||||
|
||||
static ossl_inline uint64_t load48(const uint8_t *src)
|
||||
{
|
||||
uint64_t w = ((uint64_t)src[0])
|
||||
| ((uint64_t)src[1] << 8)
|
||||
| ((uint64_t)src[2] << 16)
|
||||
| ((uint64_t)src[3] << 24)
|
||||
| ((uint64_t)src[4] << 32)
|
||||
| ((uint64_t)src[5] << 40);
|
||||
return w;
|
||||
}
|
||||
|
||||
static ossl_inline void store48(uint8_t *dst, uint64_t w)
|
||||
{
|
||||
uint8_t *p = (uint8_t *)dst;
|
||||
p[0] = (uint8_t)w;
|
||||
p[1] = (uint8_t)(w>>8);
|
||||
p[2] = (uint8_t)(w>>16);
|
||||
p[3] = (uint8_t)(w>>24);
|
||||
p[4] = (uint8_t)(w>>32);
|
||||
p[5] = (uint8_t)(w>>40);
|
||||
}
|
||||
|
||||
static ossl_inline uint32_t rotr32(const uint32_t w, const unsigned int c)
|
||||
{
|
||||
return (w >> c) | (w << (32 - c));
|
||||
}
|
||||
|
||||
static ossl_inline uint64_t rotr64(const uint64_t w, const unsigned int c)
|
||||
{
|
||||
return (w >> c) | (w << (64 - c));
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include "internal/blake2.h"
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_OP_digest_init_fn blake2s256_init;
|
||||
OSSL_OP_digest_init_fn blake2b512_init;
|
||||
|
||||
int blake2s256_init(void *ctx)
|
||||
{
|
||||
BLAKE2S_PARAM P;
|
||||
|
||||
blake2s_param_init(&P);
|
||||
return blake2s_init((BLAKE2S_CTX *)ctx, &P);
|
||||
}
|
||||
|
||||
int blake2b512_init(void *ctx)
|
||||
{
|
||||
BLAKE2B_PARAM P;
|
||||
|
||||
blake2b_param_init(&P);
|
||||
return blake2b_init((BLAKE2B_CTX *)ctx, &P);
|
||||
}
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(blake2s256, BLAKE2S_CTX,
|
||||
BLAKE2S_BLOCKBYTES, BLAKE2S_DIGEST_LENGTH,
|
||||
blake2s256_init, blake2s_update, blake2s_final)
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(blake2b512, BLAKE2B_CTX,
|
||||
BLAKE2B_BLOCKBYTES, BLAKE2B_DIGEST_LENGTH,
|
||||
blake2b512_init, blake2b_update, blake2b_final)
|
||||
@@ -0,0 +1,329 @@
|
||||
/*
|
||||
* Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* Derived from the BLAKE2 reference implementation written by Samuel Neves.
|
||||
* Copyright 2012, Samuel Neves <sneves@dei.uc.pt>
|
||||
* More information about the BLAKE2 hash function and its implementations
|
||||
* can be found at https://blake2.net.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include "blake2_impl.h"
|
||||
|
||||
#include "internal/blake2.h"
|
||||
|
||||
static const uint64_t blake2b_IV[8] =
|
||||
{
|
||||
0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,
|
||||
0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,
|
||||
0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,
|
||||
0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL
|
||||
};
|
||||
|
||||
static const uint8_t blake2b_sigma[12][16] =
|
||||
{
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ,
|
||||
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } ,
|
||||
{ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } ,
|
||||
{ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } ,
|
||||
{ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } ,
|
||||
{ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } ,
|
||||
{ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } ,
|
||||
{ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } ,
|
||||
{ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } ,
|
||||
{ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } ,
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ,
|
||||
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 }
|
||||
};
|
||||
|
||||
/* Set that it's the last block we'll compress */
|
||||
static ossl_inline void blake2b_set_lastblock(BLAKE2B_CTX *S)
|
||||
{
|
||||
S->f[0] = -1;
|
||||
}
|
||||
|
||||
/* Initialize the hashing state. */
|
||||
static ossl_inline void blake2b_init0(BLAKE2B_CTX *S)
|
||||
{
|
||||
int i;
|
||||
|
||||
memset(S, 0, sizeof(BLAKE2B_CTX));
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] = blake2b_IV[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* init xors IV with input parameter block and sets the output length */
|
||||
static void blake2b_init_param(BLAKE2B_CTX *S, const BLAKE2B_PARAM *P)
|
||||
{
|
||||
size_t i;
|
||||
const uint8_t *p = (const uint8_t *)(P);
|
||||
|
||||
blake2b_init0(S);
|
||||
S->outlen = P->digest_length;
|
||||
|
||||
/* The param struct is carefully hand packed, and should be 64 bytes on
|
||||
* every platform. */
|
||||
assert(sizeof(BLAKE2B_PARAM) == 64);
|
||||
/* IV XOR ParamBlock */
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] ^= load64(p + sizeof(S->h[i]) * i);
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the parameter block with default values */
|
||||
void blake2b_param_init(BLAKE2B_PARAM *P)
|
||||
{
|
||||
P->digest_length = BLAKE2B_DIGEST_LENGTH;
|
||||
P->key_length = 0;
|
||||
P->fanout = 1;
|
||||
P->depth = 1;
|
||||
store32(P->leaf_length, 0);
|
||||
store64(P->node_offset, 0);
|
||||
P->node_depth = 0;
|
||||
P->inner_length = 0;
|
||||
memset(P->reserved, 0, sizeof(P->reserved));
|
||||
memset(P->salt, 0, sizeof(P->salt));
|
||||
memset(P->personal, 0, sizeof(P->personal));
|
||||
}
|
||||
|
||||
void blake2b_param_set_digest_length(BLAKE2B_PARAM *P, uint8_t outlen)
|
||||
{
|
||||
P->digest_length = outlen;
|
||||
}
|
||||
|
||||
void blake2b_param_set_key_length(BLAKE2B_PARAM *P, uint8_t keylen)
|
||||
{
|
||||
P->key_length = keylen;
|
||||
}
|
||||
|
||||
void blake2b_param_set_personal(BLAKE2B_PARAM *P, const uint8_t *personal, size_t len)
|
||||
{
|
||||
memcpy(P->personal, personal, len);
|
||||
memset(P->personal + len, 0, BLAKE2B_PERSONALBYTES - len);
|
||||
}
|
||||
|
||||
void blake2b_param_set_salt(BLAKE2B_PARAM *P, const uint8_t *salt, size_t len)
|
||||
{
|
||||
memcpy(P->salt, salt, len);
|
||||
memset(P->salt + len, 0, BLAKE2B_SALTBYTES - len);
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the hashing context with the given parameter block.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2b_init(BLAKE2B_CTX *c, const BLAKE2B_PARAM *P)
|
||||
{
|
||||
blake2b_init_param(c, P);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the hashing context with the given parameter block and key.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2b_init_key(BLAKE2B_CTX *c, const BLAKE2B_PARAM *P, const void *key)
|
||||
{
|
||||
blake2b_init_param(c, P);
|
||||
|
||||
/* Pad the key to form first data block */
|
||||
{
|
||||
uint8_t block[BLAKE2B_BLOCKBYTES] = {0};
|
||||
|
||||
memcpy(block, key, P->key_length);
|
||||
blake2b_update(c, block, BLAKE2B_BLOCKBYTES);
|
||||
OPENSSL_cleanse(block, BLAKE2B_BLOCKBYTES);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Permute the state while xoring in the block of data. */
|
||||
static void blake2b_compress(BLAKE2B_CTX *S,
|
||||
const uint8_t *blocks,
|
||||
size_t len)
|
||||
{
|
||||
uint64_t m[16];
|
||||
uint64_t v[16];
|
||||
int i;
|
||||
size_t increment;
|
||||
|
||||
/*
|
||||
* There are two distinct usage vectors for this function:
|
||||
*
|
||||
* a) BLAKE2b_Update uses it to process complete blocks,
|
||||
* possibly more than one at a time;
|
||||
*
|
||||
* b) BLAK2b_Final uses it to process last block, always
|
||||
* single but possibly incomplete, in which case caller
|
||||
* pads input with zeros.
|
||||
*/
|
||||
assert(len < BLAKE2B_BLOCKBYTES || len % BLAKE2B_BLOCKBYTES == 0);
|
||||
|
||||
/*
|
||||
* Since last block is always processed with separate call,
|
||||
* |len| not being multiple of complete blocks can be observed
|
||||
* only with |len| being less than BLAKE2B_BLOCKBYTES ("less"
|
||||
* including even zero), which is why following assignment doesn't
|
||||
* have to reside inside the main loop below.
|
||||
*/
|
||||
increment = len < BLAKE2B_BLOCKBYTES ? len : BLAKE2B_BLOCKBYTES;
|
||||
|
||||
for (i = 0; i < 8; ++i) {
|
||||
v[i] = S->h[i];
|
||||
}
|
||||
|
||||
do {
|
||||
for (i = 0; i < 16; ++i) {
|
||||
m[i] = load64(blocks + i * sizeof(m[i]));
|
||||
}
|
||||
|
||||
/* blake2b_increment_counter */
|
||||
S->t[0] += increment;
|
||||
S->t[1] += (S->t[0] < increment);
|
||||
|
||||
v[8] = blake2b_IV[0];
|
||||
v[9] = blake2b_IV[1];
|
||||
v[10] = blake2b_IV[2];
|
||||
v[11] = blake2b_IV[3];
|
||||
v[12] = S->t[0] ^ blake2b_IV[4];
|
||||
v[13] = S->t[1] ^ blake2b_IV[5];
|
||||
v[14] = S->f[0] ^ blake2b_IV[6];
|
||||
v[15] = S->f[1] ^ blake2b_IV[7];
|
||||
#define G(r,i,a,b,c,d) \
|
||||
do { \
|
||||
a = a + b + m[blake2b_sigma[r][2*i+0]]; \
|
||||
d = rotr64(d ^ a, 32); \
|
||||
c = c + d; \
|
||||
b = rotr64(b ^ c, 24); \
|
||||
a = a + b + m[blake2b_sigma[r][2*i+1]]; \
|
||||
d = rotr64(d ^ a, 16); \
|
||||
c = c + d; \
|
||||
b = rotr64(b ^ c, 63); \
|
||||
} while (0)
|
||||
#define ROUND(r) \
|
||||
do { \
|
||||
G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
|
||||
G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
|
||||
G(r,2,v[ 2],v[ 6],v[10],v[14]); \
|
||||
G(r,3,v[ 3],v[ 7],v[11],v[15]); \
|
||||
G(r,4,v[ 0],v[ 5],v[10],v[15]); \
|
||||
G(r,5,v[ 1],v[ 6],v[11],v[12]); \
|
||||
G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
|
||||
G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
|
||||
} while (0)
|
||||
#if defined(OPENSSL_SMALL_FOOTPRINT)
|
||||
/* 3x size reduction on x86_64, almost 7x on ARMv8, 9x on ARMv4 */
|
||||
for (i = 0; i < 12; i++) {
|
||||
ROUND(i);
|
||||
}
|
||||
#else
|
||||
ROUND(0);
|
||||
ROUND(1);
|
||||
ROUND(2);
|
||||
ROUND(3);
|
||||
ROUND(4);
|
||||
ROUND(5);
|
||||
ROUND(6);
|
||||
ROUND(7);
|
||||
ROUND(8);
|
||||
ROUND(9);
|
||||
ROUND(10);
|
||||
ROUND(11);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] = v[i] ^= v[i + 8] ^ S->h[i];
|
||||
}
|
||||
#undef G
|
||||
#undef ROUND
|
||||
blocks += increment;
|
||||
len -= increment;
|
||||
} while (len);
|
||||
}
|
||||
|
||||
/* Absorb the input data into the hash state. Always returns 1. */
|
||||
int blake2b_update(BLAKE2B_CTX *c, const void *data, size_t datalen)
|
||||
{
|
||||
const uint8_t *in = data;
|
||||
size_t fill;
|
||||
|
||||
/*
|
||||
* Intuitively one would expect intermediate buffer, c->buf, to
|
||||
* store incomplete blocks. But in this case we are interested to
|
||||
* temporarily stash even complete blocks, because last one in the
|
||||
* stream has to be treated in special way, and at this point we
|
||||
* don't know if last block in *this* call is last one "ever". This
|
||||
* is the reason for why |datalen| is compared as >, and not >=.
|
||||
*/
|
||||
fill = sizeof(c->buf) - c->buflen;
|
||||
if (datalen > fill) {
|
||||
if (c->buflen) {
|
||||
memcpy(c->buf + c->buflen, in, fill); /* Fill buffer */
|
||||
blake2b_compress(c, c->buf, BLAKE2B_BLOCKBYTES);
|
||||
c->buflen = 0;
|
||||
in += fill;
|
||||
datalen -= fill;
|
||||
}
|
||||
if (datalen > BLAKE2B_BLOCKBYTES) {
|
||||
size_t stashlen = datalen % BLAKE2B_BLOCKBYTES;
|
||||
/*
|
||||
* If |datalen| is a multiple of the blocksize, stash
|
||||
* last complete block, it can be final one...
|
||||
*/
|
||||
stashlen = stashlen ? stashlen : BLAKE2B_BLOCKBYTES;
|
||||
datalen -= stashlen;
|
||||
blake2b_compress(c, in, datalen);
|
||||
in += datalen;
|
||||
datalen = stashlen;
|
||||
}
|
||||
}
|
||||
|
||||
assert(datalen <= BLAKE2B_BLOCKBYTES);
|
||||
|
||||
memcpy(c->buf + c->buflen, in, datalen);
|
||||
c->buflen += datalen; /* Be lazy, do not compress */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the final hash and save it in md.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2b_final(unsigned char *md, BLAKE2B_CTX *c)
|
||||
{
|
||||
uint8_t outbuffer[BLAKE2B_OUTBYTES] = {0};
|
||||
uint8_t *target = outbuffer;
|
||||
int iter = (c->outlen + 7) / 8;
|
||||
int i;
|
||||
|
||||
/* Avoid writing to the temporary buffer if possible */
|
||||
if ((c->outlen % sizeof(c->h[0])) == 0)
|
||||
target = md;
|
||||
|
||||
blake2b_set_lastblock(c);
|
||||
/* Padding */
|
||||
memset(c->buf + c->buflen, 0, sizeof(c->buf) - c->buflen);
|
||||
blake2b_compress(c, c->buf, c->buflen);
|
||||
|
||||
/* Output full hash to buffer */
|
||||
for (i = 0; i < iter; ++i)
|
||||
store64(target + sizeof(c->h[i]) * i, c->h[i]);
|
||||
|
||||
if (target != md)
|
||||
memcpy(md, target, c->outlen);
|
||||
|
||||
OPENSSL_cleanse(c, sizeof(BLAKE2B_CTX));
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,319 @@
|
||||
/*
|
||||
* Copyright 2016-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/*
|
||||
* Derived from the BLAKE2 reference implementation written by Samuel Neves.
|
||||
* Copyright 2012, Samuel Neves <sneves@dei.uc.pt>
|
||||
* More information about the BLAKE2 hash function and its implementations
|
||||
* can be found at https://blake2.net.
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <string.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include "blake2_impl.h"
|
||||
#include "internal/blake2.h"
|
||||
|
||||
static const uint32_t blake2s_IV[8] =
|
||||
{
|
||||
0x6A09E667U, 0xBB67AE85U, 0x3C6EF372U, 0xA54FF53AU,
|
||||
0x510E527FU, 0x9B05688CU, 0x1F83D9ABU, 0x5BE0CD19U
|
||||
};
|
||||
|
||||
static const uint8_t blake2s_sigma[10][16] =
|
||||
{
|
||||
{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 } ,
|
||||
{ 14, 10, 4, 8, 9, 15, 13, 6, 1, 12, 0, 2, 11, 7, 5, 3 } ,
|
||||
{ 11, 8, 12, 0, 5, 2, 15, 13, 10, 14, 3, 6, 7, 1, 9, 4 } ,
|
||||
{ 7, 9, 3, 1, 13, 12, 11, 14, 2, 6, 5, 10, 4, 0, 15, 8 } ,
|
||||
{ 9, 0, 5, 7, 2, 4, 10, 15, 14, 1, 11, 12, 6, 8, 3, 13 } ,
|
||||
{ 2, 12, 6, 10, 0, 11, 8, 3, 4, 13, 7, 5, 15, 14, 1, 9 } ,
|
||||
{ 12, 5, 1, 15, 14, 13, 4, 10, 0, 7, 6, 3, 9, 2, 8, 11 } ,
|
||||
{ 13, 11, 7, 14, 12, 1, 3, 9, 5, 0, 15, 4, 8, 6, 2, 10 } ,
|
||||
{ 6, 15, 14, 9, 11, 3, 0, 8, 12, 2, 13, 7, 1, 4, 10, 5 } ,
|
||||
{ 10, 2, 8, 4, 7, 6, 1, 5, 15, 11, 9, 14, 3, 12, 13 , 0 } ,
|
||||
};
|
||||
|
||||
/* Set that it's the last block we'll compress */
|
||||
static ossl_inline void blake2s_set_lastblock(BLAKE2S_CTX *S)
|
||||
{
|
||||
S->f[0] = -1;
|
||||
}
|
||||
|
||||
/* Initialize the hashing state. */
|
||||
static ossl_inline void blake2s_init0(BLAKE2S_CTX *S)
|
||||
{
|
||||
int i;
|
||||
|
||||
memset(S, 0, sizeof(BLAKE2S_CTX));
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] = blake2s_IV[i];
|
||||
}
|
||||
}
|
||||
|
||||
/* init xors IV with input parameter block and sets the output length */
|
||||
static void blake2s_init_param(BLAKE2S_CTX *S, const BLAKE2S_PARAM *P)
|
||||
{
|
||||
size_t i;
|
||||
const uint8_t *p = (const uint8_t *)(P);
|
||||
|
||||
blake2s_init0(S);
|
||||
S->outlen = P->digest_length;
|
||||
|
||||
/* The param struct is carefully hand packed, and should be 32 bytes on
|
||||
* every platform. */
|
||||
assert(sizeof(BLAKE2S_PARAM) == 32);
|
||||
/* IV XOR ParamBlock */
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] ^= load32(&p[i*4]);
|
||||
}
|
||||
}
|
||||
|
||||
void blake2s_param_init(BLAKE2S_PARAM *P)
|
||||
{
|
||||
P->digest_length = BLAKE2S_DIGEST_LENGTH;
|
||||
P->key_length = 0;
|
||||
P->fanout = 1;
|
||||
P->depth = 1;
|
||||
store32(P->leaf_length, 0);
|
||||
store48(P->node_offset, 0);
|
||||
P->node_depth = 0;
|
||||
P->inner_length = 0;
|
||||
memset(P->salt, 0, sizeof(P->salt));
|
||||
memset(P->personal, 0, sizeof(P->personal));
|
||||
}
|
||||
|
||||
void blake2s_param_set_digest_length(BLAKE2S_PARAM *P, uint8_t outlen)
|
||||
{
|
||||
P->digest_length = outlen;
|
||||
}
|
||||
|
||||
void blake2s_param_set_key_length(BLAKE2S_PARAM *P, uint8_t keylen)
|
||||
{
|
||||
P->key_length = keylen;
|
||||
}
|
||||
|
||||
void blake2s_param_set_personal(BLAKE2S_PARAM *P, const uint8_t *personal, size_t len)
|
||||
{
|
||||
memcpy(P->personal, personal, len);
|
||||
memset(P->personal + len, 0, BLAKE2S_PERSONALBYTES - len);
|
||||
}
|
||||
|
||||
void blake2s_param_set_salt(BLAKE2S_PARAM *P, const uint8_t *salt, size_t len)
|
||||
{
|
||||
memcpy(P->salt, salt, len);
|
||||
memset(P->salt + len, 0, BLAKE2S_SALTBYTES - len);}
|
||||
|
||||
/*
|
||||
* Initialize the hashing context with the given parameter block.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2s_init(BLAKE2S_CTX *c, const BLAKE2S_PARAM *P)
|
||||
{
|
||||
blake2s_init_param(c, P);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Initialize the hashing context with the given parameter block and key.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2s_init_key(BLAKE2S_CTX *c, const BLAKE2S_PARAM *P, const void *key)
|
||||
{
|
||||
blake2s_init_param(c, P);
|
||||
|
||||
/* Pad the key to form first data block */
|
||||
{
|
||||
uint8_t block[BLAKE2S_BLOCKBYTES] = {0};
|
||||
|
||||
memcpy(block, key, P->key_length);
|
||||
blake2s_update(c, block, BLAKE2S_BLOCKBYTES);
|
||||
OPENSSL_cleanse(block, BLAKE2S_BLOCKBYTES);
|
||||
}
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Permute the state while xoring in the block of data. */
|
||||
static void blake2s_compress(BLAKE2S_CTX *S,
|
||||
const uint8_t *blocks,
|
||||
size_t len)
|
||||
{
|
||||
uint32_t m[16];
|
||||
uint32_t v[16];
|
||||
size_t i;
|
||||
size_t increment;
|
||||
|
||||
/*
|
||||
* There are two distinct usage vectors for this function:
|
||||
*
|
||||
* a) BLAKE2s_Update uses it to process complete blocks,
|
||||
* possibly more than one at a time;
|
||||
*
|
||||
* b) BLAK2s_Final uses it to process last block, always
|
||||
* single but possibly incomplete, in which case caller
|
||||
* pads input with zeros.
|
||||
*/
|
||||
assert(len < BLAKE2S_BLOCKBYTES || len % BLAKE2S_BLOCKBYTES == 0);
|
||||
|
||||
/*
|
||||
* Since last block is always processed with separate call,
|
||||
* |len| not being multiple of complete blocks can be observed
|
||||
* only with |len| being less than BLAKE2S_BLOCKBYTES ("less"
|
||||
* including even zero), which is why following assignment doesn't
|
||||
* have to reside inside the main loop below.
|
||||
*/
|
||||
increment = len < BLAKE2S_BLOCKBYTES ? len : BLAKE2S_BLOCKBYTES;
|
||||
|
||||
for (i = 0; i < 8; ++i) {
|
||||
v[i] = S->h[i];
|
||||
}
|
||||
|
||||
do {
|
||||
for (i = 0; i < 16; ++i) {
|
||||
m[i] = load32(blocks + i * sizeof(m[i]));
|
||||
}
|
||||
|
||||
/* blake2s_increment_counter */
|
||||
S->t[0] += increment;
|
||||
S->t[1] += (S->t[0] < increment);
|
||||
|
||||
v[ 8] = blake2s_IV[0];
|
||||
v[ 9] = blake2s_IV[1];
|
||||
v[10] = blake2s_IV[2];
|
||||
v[11] = blake2s_IV[3];
|
||||
v[12] = S->t[0] ^ blake2s_IV[4];
|
||||
v[13] = S->t[1] ^ blake2s_IV[5];
|
||||
v[14] = S->f[0] ^ blake2s_IV[6];
|
||||
v[15] = S->f[1] ^ blake2s_IV[7];
|
||||
#define G(r,i,a,b,c,d) \
|
||||
do { \
|
||||
a = a + b + m[blake2s_sigma[r][2*i+0]]; \
|
||||
d = rotr32(d ^ a, 16); \
|
||||
c = c + d; \
|
||||
b = rotr32(b ^ c, 12); \
|
||||
a = a + b + m[blake2s_sigma[r][2*i+1]]; \
|
||||
d = rotr32(d ^ a, 8); \
|
||||
c = c + d; \
|
||||
b = rotr32(b ^ c, 7); \
|
||||
} while (0)
|
||||
#define ROUND(r) \
|
||||
do { \
|
||||
G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \
|
||||
G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \
|
||||
G(r,2,v[ 2],v[ 6],v[10],v[14]); \
|
||||
G(r,3,v[ 3],v[ 7],v[11],v[15]); \
|
||||
G(r,4,v[ 0],v[ 5],v[10],v[15]); \
|
||||
G(r,5,v[ 1],v[ 6],v[11],v[12]); \
|
||||
G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \
|
||||
G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \
|
||||
} while (0)
|
||||
#if defined(OPENSSL_SMALL_FOOTPRINT)
|
||||
/* almost 3x reduction on x86_64, 4.5x on ARMv8, 4x on ARMv4 */
|
||||
for (i = 0; i < 10; i++) {
|
||||
ROUND(i);
|
||||
}
|
||||
#else
|
||||
ROUND(0);
|
||||
ROUND(1);
|
||||
ROUND(2);
|
||||
ROUND(3);
|
||||
ROUND(4);
|
||||
ROUND(5);
|
||||
ROUND(6);
|
||||
ROUND(7);
|
||||
ROUND(8);
|
||||
ROUND(9);
|
||||
#endif
|
||||
|
||||
for (i = 0; i < 8; ++i) {
|
||||
S->h[i] = v[i] ^= v[i + 8] ^ S->h[i];
|
||||
}
|
||||
#undef G
|
||||
#undef ROUND
|
||||
blocks += increment;
|
||||
len -= increment;
|
||||
} while (len);
|
||||
}
|
||||
|
||||
/* Absorb the input data into the hash state. Always returns 1. */
|
||||
int blake2s_update(BLAKE2S_CTX *c, const void *data, size_t datalen)
|
||||
{
|
||||
const uint8_t *in = data;
|
||||
size_t fill;
|
||||
|
||||
/*
|
||||
* Intuitively one would expect intermediate buffer, c->buf, to
|
||||
* store incomplete blocks. But in this case we are interested to
|
||||
* temporarily stash even complete blocks, because last one in the
|
||||
* stream has to be treated in special way, and at this point we
|
||||
* don't know if last block in *this* call is last one "ever". This
|
||||
* is the reason for why |datalen| is compared as >, and not >=.
|
||||
*/
|
||||
fill = sizeof(c->buf) - c->buflen;
|
||||
if (datalen > fill) {
|
||||
if (c->buflen) {
|
||||
memcpy(c->buf + c->buflen, in, fill); /* Fill buffer */
|
||||
blake2s_compress(c, c->buf, BLAKE2S_BLOCKBYTES);
|
||||
c->buflen = 0;
|
||||
in += fill;
|
||||
datalen -= fill;
|
||||
}
|
||||
if (datalen > BLAKE2S_BLOCKBYTES) {
|
||||
size_t stashlen = datalen % BLAKE2S_BLOCKBYTES;
|
||||
/*
|
||||
* If |datalen| is a multiple of the blocksize, stash
|
||||
* last complete block, it can be final one...
|
||||
*/
|
||||
stashlen = stashlen ? stashlen : BLAKE2S_BLOCKBYTES;
|
||||
datalen -= stashlen;
|
||||
blake2s_compress(c, in, datalen);
|
||||
in += datalen;
|
||||
datalen = stashlen;
|
||||
}
|
||||
}
|
||||
|
||||
assert(datalen <= BLAKE2S_BLOCKBYTES);
|
||||
|
||||
memcpy(c->buf + c->buflen, in, datalen);
|
||||
c->buflen += datalen; /* Be lazy, do not compress */
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Calculate the final hash and save it in md.
|
||||
* Always returns 1.
|
||||
*/
|
||||
int blake2s_final(unsigned char *md, BLAKE2S_CTX *c)
|
||||
{
|
||||
uint8_t outbuffer[BLAKE2S_OUTBYTES] = {0};
|
||||
uint8_t *target = outbuffer;
|
||||
int iter = (c->outlen + 3) / 4;
|
||||
int i;
|
||||
|
||||
/* Avoid writing to the temporary buffer if possible */
|
||||
if ((c->outlen % sizeof(c->h[0])) == 0)
|
||||
target = md;
|
||||
|
||||
blake2s_set_lastblock(c);
|
||||
/* Padding */
|
||||
memset(c->buf + c->buflen, 0, sizeof(c->buf) - c->buflen);
|
||||
blake2s_compress(c, c->buf, c->buflen);
|
||||
|
||||
/* Output full hash to buffer */
|
||||
for (i = 0; i < iter; ++i)
|
||||
store32(target + sizeof(c->h[i]) * i, c->h[i]);
|
||||
|
||||
if (target != md)
|
||||
memcpy(md, target, c->outlen);
|
||||
|
||||
OPENSSL_cleanse(c, sizeof(BLAKE2S_CTX));
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
SOURCE[../../../libcrypto]=\
|
||||
null_prov.c
|
||||
|
||||
IF[{- !$disabled{blake2} -}]
|
||||
SOURCE[../../../libcrypto]=\
|
||||
blake2_prov.c blake2b_prov.c blake2s_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{sm3} -}]
|
||||
SOURCE[../../../libcrypto]=\
|
||||
sm3_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{md5} -}]
|
||||
SOURCE[../../../libcrypto]=\
|
||||
md5_prov.c md5_sha1_prov.c
|
||||
ENDIF
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/md5.h>
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(md5, MD5_CTX,
|
||||
MD5_CBLOCK, MD5_DIGEST_LENGTH,
|
||||
MD5_Init, MD5_Update, MD5_Final)
|
||||
@@ -0,0 +1,40 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
|
||||
#include <string.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/params.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/md5_sha1.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
static OSSL_OP_digest_set_params_fn md5_sha1_set_params;
|
||||
|
||||
/* Special set_params method for SSL3 */
|
||||
static int md5_sha1_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
MD5_SHA1_CTX *ctx = (MD5_SHA1_CTX *)vctx;
|
||||
|
||||
if (ctx != NULL && params != NULL) {
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_SSL3_MS);
|
||||
if (p != NULL && p->data_type == OSSL_PARAM_OCTET_STRING)
|
||||
return md5_sha1_ctrl(ctx, EVP_CTRL_SSL3_MASTER_SECRET, p->data_size,
|
||||
p->data);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_PARAMS(md5_sha1, MD5_SHA1_CTX,
|
||||
MD5_SHA1_CBLOCK, MD5_SHA1_DIGEST_LENGTH,
|
||||
md5_sha1_init, md5_sha1_update, md5_sha1_final,
|
||||
md5_sha1_set_params)
|
||||
@@ -0,0 +1,75 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/core_numbers.h>
|
||||
#include <openssl/whrlpool.h>
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
static int nullmd_dummy = 1;
|
||||
|
||||
static OSSL_OP_digest_init_fn nullmd_init;
|
||||
static OSSL_OP_digest_update_fn nullmd_update;
|
||||
static OSSL_OP_digest_final_fn nullmd_final;
|
||||
static OSSL_OP_digest_newctx_fn nullmd_newctx;
|
||||
static OSSL_OP_digest_freectx_fn nullmd_freectx;
|
||||
static OSSL_OP_digest_dupctx_fn nullmd_dupctx;
|
||||
static OSSL_OP_digest_size_fn nullmd_size;
|
||||
static OSSL_OP_digest_block_size_fn nullmd_block_size;
|
||||
|
||||
static size_t nullmd_block_size(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static size_t nullmd_size(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nullmd_init(void *vctx)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nullmd_update(void *vctx, const unsigned char *inp, size_t bytes)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int nullmd_final(void *ctx, unsigned char *out, size_t *outl, size_t outsz)
|
||||
{
|
||||
*outl = 0;
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void *nullmd_newctx(void *prov_ctx)
|
||||
{
|
||||
return &nullmd_dummy;
|
||||
}
|
||||
|
||||
static void nullmd_freectx(void *vctx)
|
||||
{
|
||||
}
|
||||
|
||||
static void *nullmd_dupctx(void *ctx)
|
||||
{
|
||||
return &nullmd_dummy;
|
||||
}
|
||||
|
||||
const OSSL_DISPATCH nullmd_functions[] = {
|
||||
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))nullmd_newctx },
|
||||
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))nullmd_init },
|
||||
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))nullmd_update },
|
||||
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))nullmd_final },
|
||||
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))nullmd_freectx },
|
||||
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))nullmd_dupctx },
|
||||
{ OSSL_FUNC_DIGEST_SIZE, (void (*)(void))nullmd_size },
|
||||
{ OSSL_FUNC_DIGEST_BLOCK_SIZE, (void (*)(void))nullmd_block_size },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -0,0 +1,17 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include "internal/sm3.h"
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(sm3, SM3_CTX,
|
||||
SM3_CBLOCK, SM3_DIGEST_LENGTH,
|
||||
sm3_init, sm3_update, sm3_final)
|
||||
+353
-30
@@ -15,17 +15,69 @@
|
||||
#include <openssl/params.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/evp.h>
|
||||
|
||||
/* TODO(3.0): Needed for dummy_evp_call(). To be removed */
|
||||
#include <openssl/sha.h>
|
||||
#include <openssl/rand_drbg.h>
|
||||
|
||||
#include "internal/cryptlib.h"
|
||||
#include "internal/property.h"
|
||||
#include "internal/evp_int.h"
|
||||
#include "internal/provider_algs.h"
|
||||
#include "internal/provider_ctx.h"
|
||||
#include "internal/providercommon.h"
|
||||
|
||||
extern OSSL_core_thread_start_fn *c_thread_start;
|
||||
|
||||
/*
|
||||
* TODO(3.0): Should these be stored in the provider side provctx? Could they
|
||||
* ever be different from one init to the next? Unfortunately we can't do this
|
||||
* at the moment because c_put_error/c_add_error_vdata do not provide
|
||||
* us with the OPENSSL_CTX as a parameter.
|
||||
*/
|
||||
/* Functions provided by the core */
|
||||
static OSSL_core_get_param_types_fn *c_get_param_types = NULL;
|
||||
static OSSL_core_get_params_fn *c_get_params = NULL;
|
||||
static OSSL_core_put_error_fn *c_put_error = NULL;
|
||||
static OSSL_core_add_error_vdata_fn *c_add_error_vdata = NULL;
|
||||
static OSSL_core_get_param_types_fn *c_get_param_types;
|
||||
static OSSL_core_get_params_fn *c_get_params;
|
||||
OSSL_core_thread_start_fn *c_thread_start;
|
||||
static OSSL_core_put_error_fn *c_put_error;
|
||||
static OSSL_core_add_error_vdata_fn *c_add_error_vdata;
|
||||
static OSSL_CRYPTO_malloc_fn *c_CRYPTO_malloc;
|
||||
static OSSL_CRYPTO_zalloc_fn *c_CRYPTO_zalloc;
|
||||
static OSSL_CRYPTO_memdup_fn *c_CRYPTO_memdup;
|
||||
static OSSL_CRYPTO_strdup_fn *c_CRYPTO_strdup;
|
||||
static OSSL_CRYPTO_strndup_fn *c_CRYPTO_strndup;
|
||||
static OSSL_CRYPTO_free_fn *c_CRYPTO_free;
|
||||
static OSSL_CRYPTO_clear_free_fn *c_CRYPTO_clear_free;
|
||||
static OSSL_CRYPTO_realloc_fn *c_CRYPTO_realloc;
|
||||
static OSSL_CRYPTO_clear_realloc_fn *c_CRYPTO_clear_realloc;
|
||||
static OSSL_CRYPTO_secure_malloc_fn *c_CRYPTO_secure_malloc;
|
||||
static OSSL_CRYPTO_secure_zalloc_fn *c_CRYPTO_secure_zalloc;
|
||||
static OSSL_CRYPTO_secure_free_fn *c_CRYPTO_secure_free;
|
||||
static OSSL_CRYPTO_secure_clear_free_fn *c_CRYPTO_secure_clear_free;
|
||||
static OSSL_CRYPTO_secure_allocated_fn *c_CRYPTO_secure_allocated;
|
||||
static OSSL_OPENSSL_hexstr2buf_fn *c_OPENSSL_hexstr2buf;
|
||||
|
||||
typedef struct fips_global_st {
|
||||
const OSSL_PROVIDER *prov;
|
||||
} FIPS_GLOBAL;
|
||||
|
||||
static void *fips_prov_ossl_ctx_new(OPENSSL_CTX *libctx)
|
||||
{
|
||||
FIPS_GLOBAL *fgbl = OPENSSL_zalloc(sizeof(*fgbl));
|
||||
|
||||
return fgbl;
|
||||
}
|
||||
|
||||
static void fips_prov_ossl_ctx_free(void *fgbl)
|
||||
{
|
||||
OPENSSL_free(fgbl);
|
||||
}
|
||||
|
||||
static const OPENSSL_CTX_METHOD fips_prov_ossl_ctx_method = {
|
||||
fips_prov_ossl_ctx_new,
|
||||
fips_prov_ossl_ctx_free,
|
||||
};
|
||||
|
||||
|
||||
/* Parameters we provide to the core */
|
||||
static const OSSL_ITEM fips_param_types[] = {
|
||||
@@ -36,8 +88,9 @@ static const OSSL_ITEM fips_param_types[] = {
|
||||
};
|
||||
|
||||
/* TODO(3.0): To be removed */
|
||||
static int dummy_evp_call(OPENSSL_CTX *libctx)
|
||||
static int dummy_evp_call(void *provctx)
|
||||
{
|
||||
OPENSSL_CTX *libctx = PROV_LIBRARY_CONTEXT_OF(provctx);
|
||||
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
|
||||
EVP_MD *sha256 = EVP_MD_fetch(libctx, "SHA256", NULL);
|
||||
char msg[] = "Hello World!";
|
||||
@@ -49,8 +102,12 @@ static int dummy_evp_call(OPENSSL_CTX *libctx)
|
||||
unsigned int dgstlen = 0;
|
||||
unsigned char dgst[SHA256_DIGEST_LENGTH];
|
||||
int ret = 0;
|
||||
BN_CTX *bnctx = NULL;
|
||||
BIGNUM *a = NULL, *b = NULL;
|
||||
unsigned char randbuf[128];
|
||||
RAND_DRBG *drbg = OPENSSL_CTX_get0_public_drbg(libctx);
|
||||
|
||||
if (ctx == NULL || sha256 == NULL)
|
||||
if (ctx == NULL || sha256 == NULL || drbg == NULL)
|
||||
goto err;
|
||||
|
||||
if (!EVP_DigestInit_ex(ctx, sha256, NULL))
|
||||
@@ -62,8 +119,31 @@ static int dummy_evp_call(OPENSSL_CTX *libctx)
|
||||
if (dgstlen != sizeof(exptd) || memcmp(dgst, exptd, sizeof(exptd)) != 0)
|
||||
goto err;
|
||||
|
||||
bnctx = BN_CTX_new_ex(libctx);
|
||||
if (bnctx == NULL)
|
||||
goto err;
|
||||
BN_CTX_start(bnctx);
|
||||
a = BN_CTX_get(bnctx);
|
||||
b = BN_CTX_get(bnctx);
|
||||
if (b == NULL)
|
||||
goto err;
|
||||
BN_zero(a);
|
||||
if (!BN_one(b)
|
||||
|| !BN_add(a, a, b)
|
||||
|| BN_cmp(a, b) != 0)
|
||||
goto err;
|
||||
|
||||
if (RAND_DRBG_bytes(drbg, randbuf, sizeof(randbuf)) <= 0)
|
||||
goto err;
|
||||
|
||||
if (!BN_rand_ex(a, 256, BN_RAND_TOP_ANY, BN_RAND_BOTTOM_ANY, bnctx))
|
||||
goto err;
|
||||
|
||||
ret = 1;
|
||||
err:
|
||||
BN_CTX_end(bnctx);
|
||||
BN_CTX_free(bnctx);
|
||||
|
||||
EVP_MD_CTX_free(ctx);
|
||||
EVP_MD_meth_free(sha256);
|
||||
return ret;
|
||||
@@ -74,10 +154,9 @@ static const OSSL_ITEM *fips_get_param_types(const OSSL_PROVIDER *prov)
|
||||
return fips_param_types;
|
||||
}
|
||||
|
||||
static int fips_get_params(const OSSL_PROVIDER *prov,
|
||||
const OSSL_PARAM params[])
|
||||
static int fips_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
OSSL_PARAM *p;
|
||||
|
||||
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
|
||||
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL FIPS Provider"))
|
||||
@@ -92,10 +171,88 @@ static int fips_get_params(const OSSL_PROVIDER *prov,
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern const OSSL_DISPATCH sha256_functions[];
|
||||
/* FIPS specific version of the function of the same name in provlib.c */
|
||||
const char *ossl_prov_util_nid_to_name(int nid)
|
||||
{
|
||||
/* We don't have OBJ_nid2n() in FIPS_MODE so we have an explicit list */
|
||||
|
||||
switch (nid) {
|
||||
/* Digests */
|
||||
case NID_sha1:
|
||||
return "SHA224";
|
||||
case NID_sha224:
|
||||
return "SHA224";
|
||||
case NID_sha256:
|
||||
return "SHA256";
|
||||
case NID_sha384:
|
||||
return "SHA384";
|
||||
case NID_sha512:
|
||||
return "SHA512";
|
||||
case NID_sha512_224:
|
||||
return "SHA512-224";
|
||||
case NID_sha512_256:
|
||||
return "SHA512-256";
|
||||
case NID_sha3_224:
|
||||
return "SHA3-224";
|
||||
case NID_sha3_256:
|
||||
return "SHA3-256";
|
||||
case NID_sha3_384:
|
||||
return "SHA3-384";
|
||||
case NID_sha3_512:
|
||||
return "SHA3-512";
|
||||
|
||||
/* Ciphers */
|
||||
case NID_aes_256_ecb:
|
||||
return "AES-256-ECB";
|
||||
case NID_aes_192_ecb:
|
||||
return "AES-192-ECB";
|
||||
case NID_aes_128_ecb:
|
||||
return "AES-128-ECB";
|
||||
case NID_aes_256_cbc:
|
||||
return "AES-256-CBC";
|
||||
case NID_aes_192_cbc:
|
||||
return "AES-192-CBC";
|
||||
case NID_aes_128_cbc:
|
||||
return "AES-128-CBC";
|
||||
case NID_aes_256_ctr:
|
||||
return "AES-256-CTR";
|
||||
case NID_aes_192_ctr:
|
||||
return "AES-192-CTR";
|
||||
case NID_aes_128_ctr:
|
||||
return "AES-128-CTR";
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static const OSSL_ALGORITHM fips_digests[] = {
|
||||
{ "SHA1", "fips=yes", sha1_functions },
|
||||
{ "SHA224", "fips=yes", sha224_functions },
|
||||
{ "SHA256", "fips=yes", sha256_functions },
|
||||
{ "SHA384", "fips=yes", sha384_functions },
|
||||
{ "SHA512", "fips=yes", sha512_functions },
|
||||
{ "SHA512-224", "fips=yes", sha512_224_functions },
|
||||
{ "SHA512-256", "fips=yes", sha512_256_functions },
|
||||
{ "SHA3-224", "fips=yes", sha3_224_functions },
|
||||
{ "SHA3-256", "fips=yes", sha3_256_functions },
|
||||
{ "SHA3-384", "fips=yes", sha3_384_functions },
|
||||
{ "SHA3-512", "fips=yes", sha3_512_functions },
|
||||
{ "KMAC128", "fips=yes", keccak_kmac_128_functions },
|
||||
{ "KMAC256", "fips=yes", keccak_kmac_256_functions },
|
||||
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
static const OSSL_ALGORITHM fips_ciphers[] = {
|
||||
{ "AES-256-ECB", "fips=yes", aes256ecb_functions },
|
||||
{ "AES-192-ECB", "fips=yes", aes192ecb_functions },
|
||||
{ "AES-128-ECB", "fips=yes", aes128ecb_functions },
|
||||
{ "AES-256-CBC", "fips=yes", aes256cbc_functions },
|
||||
{ "AES-192-CBC", "fips=yes", aes192cbc_functions },
|
||||
{ "AES-128-CBC", "fips=yes", aes128cbc_functions },
|
||||
{ "AES-256-CTR", "fips=yes", aes256ctr_functions },
|
||||
{ "AES-192-CTR", "fips=yes", aes192ctr_functions },
|
||||
{ "AES-128-CTR", "fips=yes", aes128ctr_functions },
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -107,6 +264,8 @@ static const OSSL_ALGORITHM *fips_query(OSSL_PROVIDER *prov,
|
||||
switch (operation_id) {
|
||||
case OSSL_OP_DIGEST:
|
||||
return fips_digests;
|
||||
case OSSL_OP_CIPHER:
|
||||
return fips_ciphers;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
@@ -136,6 +295,7 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
|
||||
const OSSL_DISPATCH **out,
|
||||
void **provctx)
|
||||
{
|
||||
FIPS_GLOBAL *fgbl;
|
||||
OPENSSL_CTX *ctx;
|
||||
|
||||
for (; in->function_id != 0; in++) {
|
||||
@@ -146,46 +306,97 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
|
||||
case OSSL_FUNC_CORE_GET_PARAMS:
|
||||
c_get_params = OSSL_get_core_get_params(in);
|
||||
break;
|
||||
case OSSL_FUNC_CORE_THREAD_START:
|
||||
c_thread_start = OSSL_get_core_thread_start(in);
|
||||
break;
|
||||
case OSSL_FUNC_CORE_PUT_ERROR:
|
||||
c_put_error = OSSL_get_core_put_error(in);
|
||||
break;
|
||||
case OSSL_FUNC_CORE_ADD_ERROR_VDATA:
|
||||
c_add_error_vdata = OSSL_get_core_add_error_vdata(in);
|
||||
break;
|
||||
/* Just ignore anything we don't understand */
|
||||
case OSSL_FUNC_CRYPTO_MALLOC:
|
||||
c_CRYPTO_malloc = OSSL_get_CRYPTO_malloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_ZALLOC:
|
||||
c_CRYPTO_zalloc = OSSL_get_CRYPTO_zalloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_MEMDUP:
|
||||
c_CRYPTO_memdup = OSSL_get_CRYPTO_memdup(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_STRDUP:
|
||||
c_CRYPTO_strdup = OSSL_get_CRYPTO_strdup(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_STRNDUP:
|
||||
c_CRYPTO_strndup = OSSL_get_CRYPTO_strndup(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_FREE:
|
||||
c_CRYPTO_free = OSSL_get_CRYPTO_free(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_CLEAR_FREE:
|
||||
c_CRYPTO_clear_free = OSSL_get_CRYPTO_clear_free(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_REALLOC:
|
||||
c_CRYPTO_realloc = OSSL_get_CRYPTO_realloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_CLEAR_REALLOC:
|
||||
c_CRYPTO_clear_realloc = OSSL_get_CRYPTO_clear_realloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_SECURE_MALLOC:
|
||||
c_CRYPTO_secure_malloc = OSSL_get_CRYPTO_secure_malloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_SECURE_ZALLOC:
|
||||
c_CRYPTO_secure_zalloc = OSSL_get_CRYPTO_secure_zalloc(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_SECURE_FREE:
|
||||
c_CRYPTO_secure_free = OSSL_get_CRYPTO_secure_free(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_SECURE_CLEAR_FREE:
|
||||
c_CRYPTO_secure_clear_free = OSSL_get_CRYPTO_secure_clear_free(in);
|
||||
break;
|
||||
case OSSL_FUNC_CRYPTO_SECURE_ALLOCATED:
|
||||
c_CRYPTO_secure_allocated = OSSL_get_CRYPTO_secure_allocated(in);
|
||||
break;
|
||||
case OSSL_FUNC_OPENSSL_HEXSTR2BUF:
|
||||
c_OPENSSL_hexstr2buf = OSSL_get_OPENSSL_hexstr2buf(in);
|
||||
break;
|
||||
default:
|
||||
/* Just ignore anything we don't understand */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ctx = OPENSSL_CTX_new();
|
||||
if (ctx == NULL)
|
||||
/* Create a context. */
|
||||
if ((ctx = OPENSSL_CTX_new()) == NULL)
|
||||
return 0;
|
||||
if ((fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
|
||||
&fips_prov_ossl_ctx_method)) == NULL) {
|
||||
OPENSSL_CTX_free(ctx);
|
||||
return 0;
|
||||
}
|
||||
fgbl->prov = provider;
|
||||
*out = fips_dispatch_table;
|
||||
*provctx = ctx;
|
||||
|
||||
/*
|
||||
* TODO(3.0): Remove me. This is just a dummy call to demonstrate making
|
||||
* EVP calls from within the FIPS module.
|
||||
*/
|
||||
if (!dummy_evp_call(ctx)) {
|
||||
OPENSSL_CTX_free(ctx);
|
||||
if (!dummy_evp_call(*provctx)) {
|
||||
OPENSSL_CTX_free(*provctx);
|
||||
*provctx = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
*out = fips_dispatch_table;
|
||||
*provctx = ctx;
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* The internal init function used when the FIPS module uses EVP to call
|
||||
* another algorithm also in the FIPS module. This is a recursive call that has
|
||||
* been made from within the FIPS module itself. Normally we are responsible for
|
||||
* providing our own provctx value, but in this recursive case it has been
|
||||
* pre-populated for us with the same library context that was used in the EVP
|
||||
* call that initiated this recursive call - so we don't need to do anything
|
||||
* further with that parameter. This only works because we *know* in the core
|
||||
* code that the FIPS module uses a library context for its provctx. This is
|
||||
* not generally true for all providers.
|
||||
* been made from within the FIPS module itself. To make this work, we populate
|
||||
* the provider context of this inner instance with the same library context
|
||||
* that was used in the EVP call that initiated this recursive call.
|
||||
*/
|
||||
OSSL_provider_init_fn fips_intern_provider_init;
|
||||
int fips_intern_provider_init(const OSSL_PROVIDER *provider,
|
||||
@@ -193,6 +404,30 @@ int fips_intern_provider_init(const OSSL_PROVIDER *provider,
|
||||
const OSSL_DISPATCH **out,
|
||||
void **provctx)
|
||||
{
|
||||
OSSL_core_get_library_context_fn *c_get_libctx = NULL;
|
||||
|
||||
for (; in->function_id != 0; in++) {
|
||||
switch (in->function_id) {
|
||||
case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
|
||||
c_get_libctx = OSSL_get_core_get_library_context(in);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (c_get_libctx == NULL)
|
||||
return 0;
|
||||
|
||||
*provctx = c_get_libctx(provider);
|
||||
|
||||
/*
|
||||
* Safety measure... we should get the library context that was
|
||||
* created up in OSSL_provider_init().
|
||||
*/
|
||||
if (*provctx == NULL)
|
||||
return 0;
|
||||
|
||||
*out = intern_dispatch_table;
|
||||
return 1;
|
||||
}
|
||||
@@ -200,17 +435,18 @@ int fips_intern_provider_init(const OSSL_PROVIDER *provider,
|
||||
void ERR_put_error(int lib, int func, int reason, const char *file, int line)
|
||||
{
|
||||
/*
|
||||
* TODO(3.0): This works for the FIPS module because we're going to be
|
||||
* using lib/func/reason codes that libcrypto already knows about. This
|
||||
* won't work for third party providers that have their own error mechanisms,
|
||||
* so we'll need to come up with something else for them.
|
||||
* TODO(3.0) the first argument is currently NULL but is expected to
|
||||
* be passed something else in the future, either an OSSL_PROVIDER or
|
||||
* a OPENSSL_CTX pointer.
|
||||
*/
|
||||
c_put_error(lib, func, reason, file, line);
|
||||
c_put_error(NULL, ERR_PACK(lib, func, reason), file, line);
|
||||
ERR_add_error_data(1, "(in the FIPS module)");
|
||||
}
|
||||
|
||||
void ERR_add_error_data(int num, ...)
|
||||
{
|
||||
va_list args;
|
||||
|
||||
va_start(args, num);
|
||||
ERR_add_error_vdata(num, args);
|
||||
va_end(args);
|
||||
@@ -218,5 +454,92 @@ void ERR_add_error_data(int num, ...)
|
||||
|
||||
void ERR_add_error_vdata(int num, va_list args)
|
||||
{
|
||||
c_add_error_vdata(num, args);
|
||||
c_add_error_vdata(NULL, num, args);
|
||||
}
|
||||
|
||||
const OSSL_PROVIDER *FIPS_get_provider(OPENSSL_CTX *ctx)
|
||||
{
|
||||
FIPS_GLOBAL *fgbl = openssl_ctx_get_data(ctx, OPENSSL_CTX_FIPS_PROV_INDEX,
|
||||
&fips_prov_ossl_ctx_method);
|
||||
|
||||
if (fgbl == NULL)
|
||||
return NULL;
|
||||
|
||||
return fgbl->prov;
|
||||
}
|
||||
|
||||
void *CRYPTO_malloc(size_t num, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_malloc(num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_zalloc(size_t num, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_zalloc(num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_memdup(const void *str, size_t siz, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_memdup(str, siz, file, line);
|
||||
}
|
||||
|
||||
char *CRYPTO_strdup(const char *str, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_strdup(str, file, line);
|
||||
}
|
||||
|
||||
char *CRYPTO_strndup(const char *str, size_t s, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_strndup(str, s, file, line);
|
||||
}
|
||||
|
||||
void CRYPTO_free(void *ptr, const char *file, int line)
|
||||
{
|
||||
c_CRYPTO_free(ptr, file, line);
|
||||
}
|
||||
|
||||
void CRYPTO_clear_free(void *ptr, size_t num, const char *file, int line)
|
||||
{
|
||||
c_CRYPTO_clear_free(ptr, num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_realloc(void *addr, size_t num, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_realloc(addr, num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_clear_realloc(void *addr, size_t old_num, size_t num,
|
||||
const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_clear_realloc(addr, old_num, num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_secure_malloc(size_t num, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_secure_malloc(num, file, line);
|
||||
}
|
||||
|
||||
void *CRYPTO_secure_zalloc(size_t num, const char *file, int line)
|
||||
{
|
||||
return c_CRYPTO_secure_zalloc(num, file, line);
|
||||
}
|
||||
|
||||
void CRYPTO_secure_free(void *ptr, const char *file, int line)
|
||||
{
|
||||
c_CRYPTO_secure_free(ptr, file, line);
|
||||
}
|
||||
|
||||
void CRYPTO_secure_clear_free(void *ptr, size_t num, const char *file, int line)
|
||||
{
|
||||
c_CRYPTO_secure_clear_free(ptr, num, file, line);
|
||||
}
|
||||
|
||||
unsigned char *OPENSSL_hexstr2buf(const char *str, long *len)
|
||||
{
|
||||
return c_OPENSSL_hexstr2buf(str, len);
|
||||
}
|
||||
|
||||
int CRYPTO_secure_allocated(const void *ptr)
|
||||
{
|
||||
return c_CRYPTO_secure_allocated(ptr);
|
||||
}
|
||||
@@ -1,4 +1,24 @@
|
||||
IF[{- !$disabled{md2} -}]
|
||||
SOURCE[../../legacy]=\
|
||||
md2.c
|
||||
md2_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{md4} -}]
|
||||
SOURCE[../../legacy]=\
|
||||
md4_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{mdc2} -}]
|
||||
SOURCE[../../legacy]=\
|
||||
mdc2_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{whirlpool} -}]
|
||||
SOURCE[../../legacy]=\
|
||||
wp_prov.c
|
||||
ENDIF
|
||||
|
||||
IF[{- !$disabled{rmd160} -}]
|
||||
SOURCE[../../legacy]=\
|
||||
ripemd_prov.c
|
||||
ENDIF
|
||||
@@ -1,63 +0,0 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/md2.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/core_numbers.h>
|
||||
|
||||
static int md2_final(void *ctx, unsigned char *md, size_t *size)
|
||||
{
|
||||
if (MD2_Final(md, ctx)) {
|
||||
*size = MD2_DIGEST_LENGTH;
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *md2_newctx(void)
|
||||
{
|
||||
MD2_CTX *ctx = OPENSSL_zalloc(sizeof(*ctx));
|
||||
|
||||
return ctx;
|
||||
}
|
||||
|
||||
static void md2_freectx(void *vctx)
|
||||
{
|
||||
MD2_CTX *ctx = (MD2_CTX *)vctx;
|
||||
|
||||
OPENSSL_clear_free(ctx, sizeof(*ctx));
|
||||
}
|
||||
|
||||
static void *md2_dupctx(void *ctx)
|
||||
{
|
||||
MD2_CTX *in = (MD2_CTX *)ctx;
|
||||
MD2_CTX *ret = OPENSSL_malloc(sizeof(*ret));
|
||||
|
||||
*ret = *in;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static size_t md2_size(void)
|
||||
{
|
||||
return MD2_DIGEST_LENGTH;
|
||||
}
|
||||
|
||||
extern const OSSL_DISPATCH md2_functions[];
|
||||
const OSSL_DISPATCH md2_functions[] = {
|
||||
{ OSSL_FUNC_DIGEST_NEWCTX, (void (*)(void))md2_newctx },
|
||||
{ OSSL_FUNC_DIGEST_INIT, (void (*)(void))MD2_Init },
|
||||
{ OSSL_FUNC_DIGEST_UPDATE, (void (*)(void))MD2_Update },
|
||||
{ OSSL_FUNC_DIGEST_FINAL, (void (*)(void))md2_final },
|
||||
{ OSSL_FUNC_DIGEST_FREECTX, (void (*)(void))md2_freectx },
|
||||
{ OSSL_FUNC_DIGEST_DUPCTX, (void (*)(void))md2_dupctx },
|
||||
{ OSSL_FUNC_DIGEST_SIZE, (void (*)(void))md2_size },
|
||||
{ 0, NULL }
|
||||
};
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/md2.h>
|
||||
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(md2, MD2_CTX,
|
||||
MD2_BLOCK, MD2_DIGEST_LENGTH,
|
||||
MD2_Init, MD2_Update, MD2_Final)
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/md4.h>
|
||||
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(md4, MD4_CTX,
|
||||
MD4_CBLOCK, MD4_DIGEST_LENGTH,
|
||||
MD4_Init, MD4_Update, MD4_Final)
|
||||
@@ -0,0 +1,37 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/params.h>
|
||||
#include <openssl/mdc2.h>
|
||||
#include <openssl/core_names.h>
|
||||
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
static OSSL_OP_digest_set_params_fn mdc2_set_params;
|
||||
|
||||
static int mdc2_set_params(void *vctx, const OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
MDC2_CTX *ctx = (MDC2_CTX *)vctx;
|
||||
|
||||
if (ctx != NULL && params != NULL) {
|
||||
p = OSSL_PARAM_locate_const(params, OSSL_DIGEST_PARAM_PAD_TYPE);
|
||||
if (p != NULL && !OSSL_PARAM_get_int(p, &ctx->pad_type))
|
||||
return 0;
|
||||
return 1;
|
||||
}
|
||||
return 0; /* Null Parameter */
|
||||
}
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT_PARAMS(mdc2, MDC2_CTX,
|
||||
MDC2_BLOCK, MDC2_DIGEST_LENGTH,
|
||||
MDC2_Init, MDC2_Update, MDC2_Final,
|
||||
mdc2_set_params)
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/ripemd.h>
|
||||
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(ripemd160, RIPEMD160_CTX,
|
||||
RIPEMD160_CBLOCK, RIPEMD160_DIGEST_LENGTH,
|
||||
RIPEMD160_Init, RIPEMD160_Update, RIPEMD160_Final)
|
||||
@@ -0,0 +1,18 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/crypto.h>
|
||||
#include <openssl/whrlpool.h>
|
||||
|
||||
#include "internal/core_mkdigest.h"
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
OSSL_FUNC_DIGEST_CONSTRUCT(wp, WHIRLPOOL_CTX,
|
||||
WHIRLPOOL_BBLOCK / 8, WHIRLPOOL_DIGEST_LENGTH,
|
||||
WHIRLPOOL_Init, WHIRLPOOL_Update, WHIRLPOOL_Final)
|
||||
@@ -13,6 +13,7 @@
|
||||
#include <openssl/core_numbers.h>
|
||||
#include <openssl/core_names.h>
|
||||
#include <openssl/params.h>
|
||||
#include "internal/provider_algs.h"
|
||||
|
||||
/* Functions provided by the core */
|
||||
static OSSL_core_get_param_types_fn *c_get_param_types = NULL;
|
||||
@@ -31,10 +32,9 @@ static const OSSL_ITEM *legacy_get_param_types(const OSSL_PROVIDER *prov)
|
||||
return legacy_param_types;
|
||||
}
|
||||
|
||||
static int legacy_get_params(const OSSL_PROVIDER *prov,
|
||||
const OSSL_PARAM params[])
|
||||
static int legacy_get_params(const OSSL_PROVIDER *prov, OSSL_PARAM params[])
|
||||
{
|
||||
const OSSL_PARAM *p;
|
||||
OSSL_PARAM *p;
|
||||
|
||||
p = OSSL_PARAM_locate(params, OSSL_PROV_PARAM_NAME);
|
||||
if (p != NULL && !OSSL_PARAM_set_utf8_ptr(p, "OpenSSL Legacy Provider"))
|
||||
@@ -49,12 +49,27 @@ static int legacy_get_params(const OSSL_PROVIDER *prov,
|
||||
return 1;
|
||||
}
|
||||
|
||||
extern const OSSL_DISPATCH md2_functions[];
|
||||
|
||||
static const OSSL_ALGORITHM legacy_digests[] = {
|
||||
#ifndef OPENSSL_NO_MD2
|
||||
{ "MD2", "legacy=yes", md2_functions },
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_MD4
|
||||
{ "MD4", "legacy=yes", md4_functions },
|
||||
#endif
|
||||
|
||||
#ifndef OPENSSL_NO_MDC2
|
||||
{ "MDC2", "legacy=yes", mdc2_functions },
|
||||
#endif /* OPENSSL_NO_MDC2 */
|
||||
|
||||
#ifndef OPENSSL_NO_WHIRLPOOL
|
||||
{ "whirlpool", "legacy=yes", wp_functions },
|
||||
#endif /* OPENSSL_NO_WHIRLPOOL */
|
||||
|
||||
#ifndef OPENSSL_NO_RMD160
|
||||
{ "RIPEMD160", "legacy=yes", ripemd160_functions },
|
||||
#endif /* OPENSSL_NO_RMD160 */
|
||||
|
||||
{ NULL, NULL, NULL }
|
||||
};
|
||||
|
||||
@@ -83,6 +98,8 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
|
||||
const OSSL_DISPATCH **out,
|
||||
void **provctx)
|
||||
{
|
||||
OSSL_core_get_library_context_fn *c_get_libctx = NULL;
|
||||
|
||||
for (; in->function_id != 0; in++) {
|
||||
switch (in->function_id) {
|
||||
case OSSL_FUNC_CORE_GET_PARAM_TYPES:
|
||||
@@ -91,12 +108,25 @@ int OSSL_provider_init(const OSSL_PROVIDER *provider,
|
||||
case OSSL_FUNC_CORE_GET_PARAMS:
|
||||
c_get_params = OSSL_get_core_get_params(in);
|
||||
break;
|
||||
case OSSL_FUNC_CORE_GET_LIBRARY_CONTEXT:
|
||||
c_get_libctx = OSSL_get_core_get_library_context(in);
|
||||
break;
|
||||
/* Just ignore anything we don't understand */
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if (c_get_libctx == NULL)
|
||||
return 0;
|
||||
|
||||
*out = legacy_dispatch_table;
|
||||
|
||||
/*
|
||||
* We want to make sure that all calls from this provider that requires
|
||||
* a library context use the same context as the one used to call our
|
||||
* functions. We do that by passing it along as the provider context.
|
||||
*/
|
||||
*provctx = c_get_libctx(provider);
|
||||
return 1;
|
||||
}
|
||||
Reference in New Issue
Block a user