Latest update.
This commit is contained in:
+16
-6
@@ -87,11 +87,13 @@ void CMAC_CTX_free(CMAC_CTX *ctx)
|
||||
int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in)
|
||||
{
|
||||
int bl;
|
||||
|
||||
if (in->nlast_block == -1)
|
||||
return 0;
|
||||
if ((bl = EVP_CIPHER_CTX_block_size(in->cctx)) < 0)
|
||||
return 0;
|
||||
if (!EVP_CIPHER_CTX_copy(out->cctx, in->cctx))
|
||||
return 0;
|
||||
bl = EVP_CIPHER_CTX_block_size(in->cctx);
|
||||
memcpy(out->k1, in->k1, bl);
|
||||
memcpy(out->k2, in->k2, bl);
|
||||
memcpy(out->tbl, in->tbl, bl);
|
||||
@@ -104,6 +106,7 @@ int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
|
||||
const EVP_CIPHER *cipher, ENGINE *impl)
|
||||
{
|
||||
static const unsigned char zero_iv[EVP_MAX_BLOCK_LENGTH] = { 0 };
|
||||
|
||||
/* All zeros means restart */
|
||||
if (!key && !cipher && !impl && keylen == 0) {
|
||||
/* Not initialised */
|
||||
@@ -121,13 +124,15 @@ int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
|
||||
/* Non-NULL key means initialisation complete */
|
||||
if (key) {
|
||||
int bl;
|
||||
|
||||
if (!EVP_CIPHER_CTX_cipher(ctx->cctx))
|
||||
return 0;
|
||||
if (!EVP_CIPHER_CTX_set_key_length(ctx->cctx, keylen))
|
||||
return 0;
|
||||
if (!EVP_EncryptInit_ex(ctx->cctx, NULL, NULL, key, zero_iv))
|
||||
return 0;
|
||||
bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
|
||||
if ((bl = EVP_CIPHER_CTX_block_size(ctx->cctx)) < 0)
|
||||
return 0;
|
||||
if (!EVP_Cipher(ctx->cctx, ctx->tbl, zero_iv, bl))
|
||||
return 0;
|
||||
make_kn(ctx->k1, ctx->tbl, bl);
|
||||
@@ -146,15 +151,18 @@ int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
|
||||
int CMAC_Update(CMAC_CTX *ctx, const void *in, size_t dlen)
|
||||
{
|
||||
const unsigned char *data = in;
|
||||
size_t bl;
|
||||
int bl;
|
||||
|
||||
if (ctx->nlast_block == -1)
|
||||
return 0;
|
||||
if (dlen == 0)
|
||||
return 1;
|
||||
bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
|
||||
if ((bl = EVP_CIPHER_CTX_block_size(ctx->cctx)) < 0)
|
||||
return 0;
|
||||
/* Copy into partial block if we need to */
|
||||
if (ctx->nlast_block > 0) {
|
||||
size_t nleft;
|
||||
|
||||
nleft = bl - ctx->nlast_block;
|
||||
if (dlen < nleft)
|
||||
nleft = dlen;
|
||||
@@ -170,7 +178,7 @@ int CMAC_Update(CMAC_CTX *ctx, const void *in, size_t dlen)
|
||||
return 0;
|
||||
}
|
||||
/* Encrypt all but one of the complete blocks left */
|
||||
while (dlen > bl) {
|
||||
while (dlen > (size_t)bl) {
|
||||
if (!EVP_Cipher(ctx->cctx, ctx->tbl, data, bl))
|
||||
return 0;
|
||||
dlen -= bl;
|
||||
@@ -186,9 +194,11 @@ int CMAC_Update(CMAC_CTX *ctx, const void *in, size_t dlen)
|
||||
int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen)
|
||||
{
|
||||
int i, bl, lb;
|
||||
|
||||
if (ctx->nlast_block == -1)
|
||||
return 0;
|
||||
bl = EVP_CIPHER_CTX_block_size(ctx->cctx);
|
||||
if ((bl = EVP_CIPHER_CTX_block_size(ctx->cctx)) < 0)
|
||||
return 0;
|
||||
*poutlen = (size_t)bl;
|
||||
if (!out)
|
||||
return 1;
|
||||
|
||||
Reference in New Issue
Block a user