buildroot/package/libopenssl/0008-afalg-engine-support-a...

233 lines
7.1 KiB
Diff

From e3e0e0f6741cfd44a1b28dff73b394b4afcf04ae Mon Sep 17 00:00:00 2001
From: yanhaodong <haodong.yan@spacemit.com>
Date: Wed, 17 Jan 2024 20:25:02 +0800
Subject: [PATCH] afalg engine support aes-ecb
---
engines/e_afalg.c | 106 +++++++++++++++++++++++++++++++++++++++++-----
engines/e_afalg.h | 12 ++++++
2 files changed, 107 insertions(+), 11 deletions(-)
diff --git a/engines/e_afalg.c b/engines/e_afalg.c
index 14d1d47..18582a8 100644
--- a/engines/e_afalg.c
+++ b/engines/e_afalg.c
@@ -77,7 +77,9 @@ static int afalg_destroy(ENGINE *e);
static int afalg_init(ENGINE *e);
static int afalg_finish(ENGINE *e);
static const EVP_CIPHER *afalg_aes_cbc(int nid);
-static cbc_handles *get_cipher_handle(int nid);
+static const EVP_CIPHER *afalg_aes_ecb(int nid);
+static cbc_handles *cbc_get_cipher_handle(int nid);
+static ecb_handles *ecb_get_cipher_handle(int nid);
static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
const int **nids, int nid);
static int afalg_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
@@ -95,11 +97,17 @@ static int afalg_cipher_nids[] = {
NID_aes_128_cbc,
NID_aes_192_cbc,
NID_aes_256_cbc,
+ NID_aes_128_ecb,
+ NID_aes_192_ecb,
+ NID_aes_256_ecb,
};
static cbc_handles cbc_handle[] = {{AES_KEY_SIZE_128, NULL},
{AES_KEY_SIZE_192, NULL},
{AES_KEY_SIZE_256, NULL}};
+static ecb_handles ecb_handle[] = {{AES_KEY_SIZE_128, NULL},
+ {AES_KEY_SIZE_192, NULL},
+ {AES_KEY_SIZE_256, NULL}};
static ossl_inline int io_setup(unsigned n, aio_context_t *ctx)
{
@@ -567,6 +575,11 @@ static int afalg_cipher_init(EVP_CIPHER_CTX *ctx, const unsigned char *key,
case NID_aes_256_cbc:
ciphername = "cbc(aes)";
break;
+ case NID_aes_128_ecb:
+ case NID_aes_192_ecb:
+ case NID_aes_256_ecb:
+ ciphername = "ecb(aes)";
+ break;
default:
ALG_WARN("%s(%d): Unsupported Cipher type %d\n", __FILE__, __LINE__,
ciphertype);
@@ -686,7 +699,7 @@ static int afalg_cipher_cleanup(EVP_CIPHER_CTX *ctx)
return 1;
}
-static cbc_handles *get_cipher_handle(int nid)
+static cbc_handles *cbc_get_cipher_handle(int nid)
{
switch (nid) {
case NID_aes_128_cbc:
@@ -700,9 +713,23 @@ static cbc_handles *get_cipher_handle(int nid)
}
}
+static ecb_handles *ecb_get_cipher_handle(int nid)
+{
+ switch (nid) {
+ case NID_aes_128_ecb:
+ return &ecb_handle[AES_ECB_128];
+ case NID_aes_192_ecb:
+ return &ecb_handle[AES_ECB_192];
+ case NID_aes_256_ecb:
+ return &ecb_handle[AES_ECB_256];
+ default:
+ return NULL;
+ }
+}
+
static const EVP_CIPHER *afalg_aes_cbc(int nid)
{
- cbc_handles *cipher_handle = get_cipher_handle(nid);
+ cbc_handles *cipher_handle = cbc_get_cipher_handle(nid);
if (cipher_handle->_hidden == NULL
&& ((cipher_handle->_hidden =
EVP_CIPHER_meth_new(nid,
@@ -727,6 +754,33 @@ static const EVP_CIPHER *afalg_aes_cbc(int nid)
return cipher_handle->_hidden;
}
+static const EVP_CIPHER *afalg_aes_ecb(int nid)
+{
+ ecb_handles *cipher_handle = ecb_get_cipher_handle(nid);
+ if (cipher_handle->_hidden == NULL
+ && ((cipher_handle->_hidden =
+ EVP_CIPHER_meth_new(nid,
+ AES_BLOCK_SIZE,
+ cipher_handle->key_size)) == NULL
+ || !EVP_CIPHER_meth_set_iv_length(cipher_handle->_hidden,
+ AES_IV_LEN)
+ || !EVP_CIPHER_meth_set_flags(cipher_handle->_hidden,
+ EVP_CIPH_ECB_MODE |
+ EVP_CIPH_FLAG_DEFAULT_ASN1)
+ || !EVP_CIPHER_meth_set_init(cipher_handle->_hidden,
+ afalg_cipher_init)
+ || !EVP_CIPHER_meth_set_do_cipher(cipher_handle->_hidden,
+ afalg_do_cipher)
+ || !EVP_CIPHER_meth_set_cleanup(cipher_handle->_hidden,
+ afalg_cipher_cleanup)
+ || !EVP_CIPHER_meth_set_impl_ctx_size(cipher_handle->_hidden,
+ sizeof(afalg_ctx)))) {
+ EVP_CIPHER_meth_free(cipher_handle->_hidden);
+ cipher_handle->_hidden= NULL;
+ }
+ return cipher_handle->_hidden;
+}
+
static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
const int **nids, int nid)
{
@@ -743,6 +797,11 @@ static int afalg_ciphers(ENGINE *e, const EVP_CIPHER **cipher,
case NID_aes_256_cbc:
*cipher = afalg_aes_cbc(nid);
break;
+ case NID_aes_128_ecb:
+ case NID_aes_192_ecb:
+ case NID_aes_256_ecb:
+ *cipher = afalg_aes_ecb(nid);
+ break;
default:
*cipher = NULL;
r = 0;
@@ -771,10 +830,22 @@ static int bind_afalg(ENGINE *e)
* time.
*/
for(i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
- if (afalg_aes_cbc(afalg_cipher_nids[i]) == NULL) {
- AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED);
- return 0;
- }
+ switch (i) {
+ case NID_aes_128_cbc:
+ case NID_aes_192_cbc:
+ case NID_aes_256_cbc:
+ if (afalg_aes_cbc(afalg_cipher_nids[i]) == NULL) {
+ AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED);
+ break;
+ }
+ case NID_aes_128_ecb:
+ case NID_aes_192_ecb:
+ case NID_aes_256_ecb:
+ if (afalg_aes_ecb(afalg_cipher_nids[i]) == NULL) {
+ AFALGerr(AFALG_F_BIND_AFALG, AFALG_R_INIT_FAILED);
+ break;
+ }
+ }
}
if (!ENGINE_set_ciphers(e, afalg_ciphers)) {
@@ -886,12 +957,24 @@ static int afalg_finish(ENGINE *e)
return 1;
}
-static int free_cbc(void)
+static int free_cipher(void)
{
short unsigned int i;
for(i = 0; i < OSSL_NELEM(afalg_cipher_nids); i++) {
- EVP_CIPHER_meth_free(cbc_handle[i]._hidden);
- cbc_handle[i]._hidden = NULL;
+ switch (i) {
+ case NID_aes_128_cbc:
+ case NID_aes_192_cbc:
+ case NID_aes_256_cbc:
+ EVP_CIPHER_meth_free(cbc_handle[i]._hidden);
+ cbc_handle[i]._hidden = NULL;
+ break;
+ case NID_aes_128_ecb:
+ case NID_aes_192_ecb:
+ case NID_aes_256_ecb:
+ EVP_CIPHER_meth_free(ecb_handle[i]._hidden);
+ ecb_handle[i]._hidden = NULL;
+ break;
+ }
}
return 1;
}
@@ -899,7 +982,8 @@ static int free_cbc(void)
static int afalg_destroy(ENGINE *e)
{
ERR_unload_AFALG_strings();
- free_cbc();
+ free_cipher();
+
return 1;
}
diff --git a/engines/e_afalg.h b/engines/e_afalg.h
index 3323c89..e68d441 100644
--- a/engines/e_afalg.h
+++ b/engines/e_afalg.h
@@ -59,12 +59,24 @@ enum {
AES_CBC_256
};
+enum {
+ AES_ECB_128 = 0,
+ AES_ECB_192,
+ AES_ECB_256
+};
+
struct cbc_cipher_handles {
int key_size;
EVP_CIPHER *_hidden;
};
+struct ecb_cipher_handles {
+ int key_size;
+ EVP_CIPHER *_hidden;
+};
+
typedef struct cbc_cipher_handles cbc_handles;
+typedef struct ecb_cipher_handles ecb_handles;
struct afalg_aio_st {
int efd;
--
2.25.1