233 lines
7.1 KiB
Diff
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
|
|
|