mirror of https://github.com/openssl/openssl.git
				
				
				
			EVP_MAC: Integrate CMAC EVP_PKEY_METHOD into generic MAC EVP_PKEY_METHOD
Reviewed-by: Paul Dale <paul.dale@oracle.com> (Merged from https://github.com/openssl/openssl/pull/7484)
This commit is contained in:
		
							parent
							
								
									f71faf2753
								
							
						
					
					
						commit
						e74a435f58
					
				|  | @ -1,2 +1,2 @@ | |||
| LIBS=../../libcrypto | ||||
| SOURCE[../../libcrypto]=cmac.c cm_ameth.c cm_pmeth.c cm_meth.c | ||||
| SOURCE[../../libcrypto]=cmac.c cm_ameth.c cm_meth.c | ||||
|  |  | |||
|  | @ -1,161 +0,0 @@ | |||
| /*
 | ||||
|  * Copyright 2010-2016 The OpenSSL Project Authors. All Rights Reserved. | ||||
|  * | ||||
|  * Licensed under the OpenSSL license (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 <stdio.h> | ||||
| #include "internal/cryptlib.h" | ||||
| #include <openssl/x509.h> | ||||
| #include <openssl/x509v3.h> | ||||
| #include <openssl/evp.h> | ||||
| #include <openssl/cmac.h> | ||||
| #include "internal/evp_int.h" | ||||
| 
 | ||||
| /* The context structure and "key" is simply a CMAC_CTX */ | ||||
| 
 | ||||
| static int pkey_cmac_init(EVP_PKEY_CTX *ctx) | ||||
| { | ||||
|     ctx->data = CMAC_CTX_new(); | ||||
|     if (ctx->data == NULL) | ||||
|         return 0; | ||||
|     ctx->keygen_info_count = 0; | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int pkey_cmac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) | ||||
| { | ||||
|     if (!pkey_cmac_init(dst)) | ||||
|         return 0; | ||||
|     if (!CMAC_CTX_copy(dst->data, src->data)) | ||||
|         return 0; | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static void pkey_cmac_cleanup(EVP_PKEY_CTX *ctx) | ||||
| { | ||||
|     CMAC_CTX_free(ctx->data); | ||||
| } | ||||
| 
 | ||||
| static int pkey_cmac_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) | ||||
| { | ||||
|     CMAC_CTX *cmkey = CMAC_CTX_new(); | ||||
|     CMAC_CTX *cmctx = ctx->data; | ||||
|     if (cmkey == NULL) | ||||
|         return 0; | ||||
|     if (!CMAC_CTX_copy(cmkey, cmctx)) { | ||||
|         CMAC_CTX_free(cmkey); | ||||
|         return 0; | ||||
|     } | ||||
|     EVP_PKEY_assign(pkey, EVP_PKEY_CMAC, cmkey); | ||||
| 
 | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int int_update(EVP_MD_CTX *ctx, const void *data, size_t count) | ||||
| { | ||||
|     if (!CMAC_Update(EVP_MD_CTX_pkey_ctx(ctx)->data, data, count)) | ||||
|         return 0; | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int cmac_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) | ||||
| { | ||||
|     EVP_MD_CTX_set_flags(mctx, EVP_MD_CTX_FLAG_NO_INIT); | ||||
|     EVP_MD_CTX_set_update_fn(mctx, int_update); | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int cmac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | ||||
|                         EVP_MD_CTX *mctx) | ||||
| { | ||||
|     return CMAC_Final(ctx->data, sig, siglen); | ||||
| } | ||||
| 
 | ||||
| static int pkey_cmac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) | ||||
| { | ||||
|     CMAC_CTX *cmctx = ctx->data; | ||||
|     switch (type) { | ||||
| 
 | ||||
|     case EVP_PKEY_CTRL_SET_MAC_KEY: | ||||
|         if (!p2 || p1 < 0) | ||||
|             return 0; | ||||
|         if (!CMAC_Init(cmctx, p2, p1, NULL, NULL)) | ||||
|             return 0; | ||||
|         break; | ||||
| 
 | ||||
|     case EVP_PKEY_CTRL_CIPHER: | ||||
|         if (!CMAC_Init(cmctx, NULL, 0, p2, ctx->engine)) | ||||
|             return 0; | ||||
|         break; | ||||
| 
 | ||||
|     case EVP_PKEY_CTRL_MD: | ||||
|         if (ctx->pkey && !CMAC_CTX_copy(ctx->data, | ||||
|                                         (CMAC_CTX *)ctx->pkey->pkey.ptr)) | ||||
|             return 0; | ||||
|         if (!CMAC_Init(cmctx, NULL, 0, NULL, NULL)) | ||||
|             return 0; | ||||
|         break; | ||||
| 
 | ||||
|     default: | ||||
|         return -2; | ||||
| 
 | ||||
|     } | ||||
|     return 1; | ||||
| } | ||||
| 
 | ||||
| static int pkey_cmac_ctrl_str(EVP_PKEY_CTX *ctx, | ||||
|                               const char *type, const char *value) | ||||
| { | ||||
|     if (!value) { | ||||
|         return 0; | ||||
|     } | ||||
|     if (strcmp(type, "cipher") == 0) { | ||||
|         const EVP_CIPHER *c; | ||||
|         c = EVP_get_cipherbyname(value); | ||||
|         if (!c) | ||||
|             return 0; | ||||
|         return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_CIPHER, -1, (void *)c); | ||||
|     } | ||||
|     if (strcmp(type, "key") == 0) | ||||
|         return EVP_PKEY_CTX_str2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); | ||||
|     if (strcmp(type, "hexkey") == 0) | ||||
|         return EVP_PKEY_CTX_hex2ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, value); | ||||
|     return -2; | ||||
| } | ||||
| 
 | ||||
| const EVP_PKEY_METHOD cmac_pkey_meth = { | ||||
|     EVP_PKEY_CMAC, | ||||
|     EVP_PKEY_FLAG_SIGCTX_CUSTOM, | ||||
|     pkey_cmac_init, | ||||
|     pkey_cmac_copy, | ||||
|     pkey_cmac_cleanup, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, | ||||
|     pkey_cmac_keygen, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     cmac_signctx_init, | ||||
|     cmac_signctx, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     0, 0, | ||||
| 
 | ||||
|     pkey_cmac_ctrl, | ||||
|     pkey_cmac_ctrl_str | ||||
| }; | ||||
|  | @ -327,15 +327,8 @@ static int pkey_mac_ctrl_str(EVP_PKEY_CTX *ctx, | |||
|     return EVP_MAC_ctrl_str(hctx->ctx, type, value); | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * When this is actually used, the following will be replaced with real | ||||
|  * EVP_PKEY_METHODs, all exactly the same apart from the type and possibly | ||||
|  * the flags. | ||||
|  */ | ||||
| 
 | ||||
| extern const EVP_PKEY_METHOD FAKE_pkey_meth; | ||||
| const EVP_PKEY_METHOD FAKE_pkey_meth = { | ||||
|     20870442 /* EVP_PKEY_FAKE, a beast times 31337 (you do the math) */, | ||||
| const EVP_PKEY_METHOD cmac_pkey_meth = { | ||||
|     EVP_PKEY_CMAC, | ||||
|     EVP_PKEY_FLAG_SIGCTX_CUSTOM, | ||||
|     pkey_mac_init, | ||||
|     pkey_mac_copy, | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue