diff options
author | CoprDistGit <infra@openeuler.org> | 2023-10-02 03:32:16 +0000 |
---|---|---|
committer | CoprDistGit <infra@openeuler.org> | 2023-10-02 03:32:16 +0000 |
commit | e879981f405f8810d1b0d9c1c77aea3e8be6a469 (patch) | |
tree | 8698c9791c9e77d3be587c5c7ad9d43dce7c6d30 /Backport-providers-Add-SM4-GCM-implementation.patch | |
parent | 80d0cbc46bb935a925d434060b67c794844558d9 (diff) |
automatic import of openssl3openeuler22.03_LTS_SP2openeuler22.03_LTSopeneuler20.03_LTS_SP1openeuler20.03
Diffstat (limited to 'Backport-providers-Add-SM4-GCM-implementation.patch')
-rw-r--r-- | Backport-providers-Add-SM4-GCM-implementation.patch | 360 |
1 files changed, 360 insertions, 0 deletions
diff --git a/Backport-providers-Add-SM4-GCM-implementation.patch b/Backport-providers-Add-SM4-GCM-implementation.patch new file mode 100644 index 0000000..3e2ee23 --- /dev/null +++ b/Backport-providers-Add-SM4-GCM-implementation.patch @@ -0,0 +1,360 @@ +From 2f1c0b5f1b585a307f21a70ef3ae652643c25f6d Mon Sep 17 00:00:00 2001 +From: Tianjia Zhang <tianjia.zhang@linux.alibaba.com> +Date: Wed, 1 Sep 2021 16:54:15 +0800 +Subject: [PATCH 04/13] providers: Add SM4 GCM implementation + +The GCM mode of the SM4 algorithm is specifieded by RFC8998. + +Signed-off-by: Tianjia Zhang <tianjia.zhang@linux.alibaba.com> + +Reviewed-by: Paul Yang <kaishen.yy@antfin.com> +Reviewed-by: Paul Dale <pauli@openssl.org> +(Merged from https://github.com/openssl/openssl/pull/16491) +--- + providers/defltprov.c | 2 + + providers/implementations/ciphers/build.info | 4 +- + .../implementations/ciphers/cipher_sm4_ccm.c | 39 +++++++++++++++++ + .../implementations/ciphers/cipher_sm4_ccm.h | 22 ++++++++++ + .../ciphers/cipher_sm4_ccm_hw.c | 41 ++++++++++++++++++ + .../implementations/ciphers/cipher_sm4_gcm.c | 40 +++++++++++++++++ + .../implementations/ciphers/cipher_sm4_gcm.h | 22 ++++++++++ + .../ciphers/cipher_sm4_gcm_hw.c | 43 +++++++++++++++++++ + .../include/prov/implementations.h | 2 + + .../implementations/include/prov/names.h | 2 + + test/recipes/30-test_evp_data/evpciph_sm4.txt | 20 +++++++++ + 11 files changed, 236 insertions(+), 1 deletion(-) + create mode 100644 providers/implementations/ciphers/cipher_sm4_ccm.c + create mode 100644 providers/implementations/ciphers/cipher_sm4_ccm.h + create mode 100644 providers/implementations/ciphers/cipher_sm4_ccm_hw.c + create mode 100644 providers/implementations/ciphers/cipher_sm4_gcm.c + create mode 100644 providers/implementations/ciphers/cipher_sm4_gcm.h + create mode 100644 providers/implementations/ciphers/cipher_sm4_gcm_hw.c + +diff --git a/providers/defltprov.c b/providers/defltprov.c +index ed3f4799e7..cc0b0c3b62 100644 +--- a/providers/defltprov.c ++++ b/providers/defltprov.c +@@ -289,6 +289,8 @@ static const OSSL_ALGORITHM_CAPABLE deflt_ciphers[] = { + ALG(PROV_NAMES_DES_EDE_CFB, ossl_tdes_ede2_cfb_functions), + #endif /* OPENSSL_NO_DES */ + #ifndef OPENSSL_NO_SM4 ++ ALG(PROV_NAMES_SM4_GCM, ossl_sm4128gcm_functions), ++ ALG(PROV_NAMES_SM4_CCM, ossl_sm4128ccm_functions), + ALG(PROV_NAMES_SM4_ECB, ossl_sm4128ecb_functions), + ALG(PROV_NAMES_SM4_CBC, ossl_sm4128cbc_functions), + ALG(PROV_NAMES_SM4_CTR, ossl_sm4128ctr_functions), +diff --git a/providers/implementations/ciphers/build.info b/providers/implementations/ciphers/build.info +index e4c5f4f051..b5d9d4f6c1 100644 +--- a/providers/implementations/ciphers/build.info ++++ b/providers/implementations/ciphers/build.info +@@ -105,7 +105,9 @@ ENDIF + + IF[{- !$disabled{sm4} -}] + SOURCE[$SM4_GOAL]=\ +- cipher_sm4.c cipher_sm4_hw.c ++ cipher_sm4.c cipher_sm4_hw.c \ ++ cipher_sm4_gcm.c cipher_sm4_gcm_hw.c \ ++ cipher_sm4_ccm.c cipher_sm4_ccm_hw.c + ENDIF + + IF[{- !$disabled{ocb} -}] +diff --git a/providers/implementations/ciphers/cipher_sm4_ccm.c b/providers/implementations/ciphers/cipher_sm4_ccm.c +new file mode 100644 +index 0000000000..f0295a5ca2 +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_ccm.c +@@ -0,0 +1,39 @@ ++/* ++ * Copyright 2021 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 ++ */ ++ ++/* Dispatch functions for SM4 CCM mode */ ++ ++#include "cipher_sm4_ccm.h" ++#include "prov/implementations.h" ++#include "prov/providercommon.h" ++ ++static OSSL_FUNC_cipher_freectx_fn sm4_ccm_freectx; ++ ++static void *sm4_ccm_newctx(void *provctx, size_t keybits) ++{ ++ PROV_SM4_CCM_CTX *ctx; ++ ++ if (!ossl_prov_is_running()) ++ return NULL; ++ ++ ctx = OPENSSL_zalloc(sizeof(*ctx)); ++ if (ctx != NULL) ++ ossl_ccm_initctx(&ctx->base, keybits, ossl_prov_sm4_hw_ccm(keybits)); ++ return ctx; ++} ++ ++static void sm4_ccm_freectx(void *vctx) ++{ ++ PROV_SM4_CCM_CTX *ctx = (PROV_SM4_CCM_CTX *)vctx; ++ ++ OPENSSL_clear_free(ctx, sizeof(*ctx)); ++} ++ ++/* sm4128ccm functions */ ++IMPLEMENT_aead_cipher(sm4, ccm, CCM, AEAD_FLAGS, 128, 8, 96); +diff --git a/providers/implementations/ciphers/cipher_sm4_ccm.h b/providers/implementations/ciphers/cipher_sm4_ccm.h +new file mode 100644 +index 0000000000..189e71e9e4 +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_ccm.h +@@ -0,0 +1,22 @@ ++/* ++ * Copyright 2021 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 "crypto/sm4.h" ++#include "prov/ciphercommon.h" ++#include "prov/ciphercommon_ccm.h" ++ ++typedef struct prov_sm4_ccm_ctx_st { ++ PROV_CCM_CTX base; /* Must be first */ ++ union { ++ OSSL_UNION_ALIGN; ++ SM4_KEY ks; ++ } ks; /* SM4 key schedule to use */ ++} PROV_SM4_CCM_CTX; ++ ++const PROV_CCM_HW *ossl_prov_sm4_hw_ccm(size_t keylen); +diff --git a/providers/implementations/ciphers/cipher_sm4_ccm_hw.c b/providers/implementations/ciphers/cipher_sm4_ccm_hw.c +new file mode 100644 +index 0000000000..791daf3e46 +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_ccm_hw.c +@@ -0,0 +1,41 @@ ++/* ++ * Copyright 2021 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 ++ */ ++ ++/*- ++ * Generic support for SM4 CCM. ++ */ ++ ++#include "cipher_sm4_ccm.h" ++ ++static int ccm_sm4_initkey(PROV_CCM_CTX *ctx, ++ const unsigned char *key, size_t keylen) ++{ ++ PROV_SM4_CCM_CTX *actx = (PROV_SM4_CCM_CTX *)ctx; ++ ++ ossl_sm4_set_key(key, &actx->ks.ks); ++ CRYPTO_ccm128_init(&ctx->ccm_ctx, ctx->m, ctx->l, &actx->ks.ks, ++ (block128_f)ossl_sm4_encrypt); ++ ctx->str = NULL; ++ ctx->key_set = 1; ++ return 1; ++} ++ ++static const PROV_CCM_HW ccm_sm4 = { ++ ccm_sm4_initkey, ++ ossl_ccm_generic_setiv, ++ ossl_ccm_generic_setaad, ++ ossl_ccm_generic_auth_encrypt, ++ ossl_ccm_generic_auth_decrypt, ++ ossl_ccm_generic_gettag ++}; ++ ++const PROV_CCM_HW *ossl_prov_sm4_hw_ccm(size_t keybits) ++{ ++ return &ccm_sm4; ++} +diff --git a/providers/implementations/ciphers/cipher_sm4_gcm.c b/providers/implementations/ciphers/cipher_sm4_gcm.c +new file mode 100644 +index 0000000000..7a936f00ee +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_gcm.c +@@ -0,0 +1,40 @@ ++/* ++ * Copyright 2021 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 ++ */ ++ ++/* Dispatch functions for SM4 GCM mode */ ++ ++#include "cipher_sm4_gcm.h" ++#include "prov/implementations.h" ++#include "prov/providercommon.h" ++ ++static OSSL_FUNC_cipher_freectx_fn sm4_gcm_freectx; ++ ++static void *sm4_gcm_newctx(void *provctx, size_t keybits) ++{ ++ PROV_SM4_GCM_CTX *ctx; ++ ++ if (!ossl_prov_is_running()) ++ return NULL; ++ ++ ctx = OPENSSL_zalloc(sizeof(*ctx)); ++ if (ctx != NULL) ++ ossl_gcm_initctx(provctx, &ctx->base, keybits, ++ ossl_prov_sm4_hw_gcm(keybits)); ++ return ctx; ++} ++ ++static void sm4_gcm_freectx(void *vctx) ++{ ++ PROV_SM4_GCM_CTX *ctx = (PROV_SM4_GCM_CTX *)vctx; ++ ++ OPENSSL_clear_free(ctx, sizeof(*ctx)); ++} ++ ++/* ossl_sm4128gcm_functions */ ++IMPLEMENT_aead_cipher(sm4, gcm, GCM, AEAD_FLAGS, 128, 8, 96); +diff --git a/providers/implementations/ciphers/cipher_sm4_gcm.h b/providers/implementations/ciphers/cipher_sm4_gcm.h +new file mode 100644 +index 0000000000..2b6b5f3ece +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_gcm.h +@@ -0,0 +1,22 @@ ++/* ++ * Copyright 2021 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 "crypto/sm4.h" ++#include "prov/ciphercommon.h" ++#include "prov/ciphercommon_gcm.h" ++ ++typedef struct prov_sm4_gcm_ctx_st { ++ PROV_GCM_CTX base; /* must be first entry in struct */ ++ union { ++ OSSL_UNION_ALIGN; ++ SM4_KEY ks; ++ } ks; ++} PROV_SM4_GCM_CTX; ++ ++const PROV_GCM_HW *ossl_prov_sm4_hw_gcm(size_t keybits); +diff --git a/providers/implementations/ciphers/cipher_sm4_gcm_hw.c b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c +new file mode 100644 +index 0000000000..6bcd1ec406 +--- /dev/null ++++ b/providers/implementations/ciphers/cipher_sm4_gcm_hw.c +@@ -0,0 +1,43 @@ ++/* ++ * Copyright 2021 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 ++ */ ++ ++/*- ++ * Generic support for SM4 GCM. ++ */ ++ ++#include "cipher_sm4_gcm.h" ++ ++static int sm4_gcm_initkey(PROV_GCM_CTX *ctx, const unsigned char *key, ++ size_t keylen) ++{ ++ PROV_SM4_GCM_CTX *actx = (PROV_SM4_GCM_CTX *)ctx; ++ SM4_KEY *ks = &actx->ks.ks; ++ ++ ctx->ks = ks; ++ ossl_sm4_set_key(key, ks); ++ CRYPTO_gcm128_init(&ctx->gcm, ks, (block128_f)ossl_sm4_encrypt); ++ ctx->ctr = (ctr128_f)NULL; ++ ctx->key_set = 1; ++ ++ return 1; ++} ++ ++static const PROV_GCM_HW sm4_gcm = { ++ sm4_gcm_initkey, ++ ossl_gcm_setiv, ++ ossl_gcm_aad_update, ++ ossl_gcm_cipher_update, ++ ossl_gcm_cipher_final, ++ ossl_gcm_one_shot ++}; ++ ++const PROV_GCM_HW *ossl_prov_sm4_hw_gcm(size_t keybits) ++{ ++ return &sm4_gcm; ++} +diff --git a/providers/implementations/include/prov/implementations.h b/providers/implementations/include/prov/implementations.h +index 3f6dd7ee16..498eab4ad4 100644 +--- a/providers/implementations/include/prov/implementations.h ++++ b/providers/implementations/include/prov/implementations.h +@@ -174,6 +174,8 @@ extern const OSSL_DISPATCH ossl_seed128ofb128_functions[]; + extern const OSSL_DISPATCH ossl_seed128cfb128_functions[]; + #endif /* OPENSSL_NO_SEED */ + #ifndef OPENSSL_NO_SM4 ++extern const OSSL_DISPATCH ossl_sm4128gcm_functions[]; ++extern const OSSL_DISPATCH ossl_sm4128ccm_functions[]; + extern const OSSL_DISPATCH ossl_sm4128ecb_functions[]; + extern const OSSL_DISPATCH ossl_sm4128cbc_functions[]; + extern const OSSL_DISPATCH ossl_sm4128ctr_functions[]; +diff --git a/providers/implementations/include/prov/names.h b/providers/implementations/include/prov/names.h +index e0dbb69a9d..0fac23a850 100644 +--- a/providers/implementations/include/prov/names.h ++++ b/providers/implementations/include/prov/names.h +@@ -162,6 +162,8 @@ + #define PROV_NAMES_SM4_CTR "SM4-CTR:1.2.156.10197.1.104.7" + #define PROV_NAMES_SM4_OFB "SM4-OFB:SM4-OFB128:1.2.156.10197.1.104.3" + #define PROV_NAMES_SM4_CFB "SM4-CFB:SM4-CFB128:1.2.156.10197.1.104.4" ++#define PROV_NAMES_SM4_GCM "SM4-GCM:1.2.156.10197.1.104.8" ++#define PROV_NAMES_SM4_CCM "SM4-CCM:1.2.156.10197.1.104.9" + #define PROV_NAMES_ChaCha20 "ChaCha20" + #define PROV_NAMES_ChaCha20_Poly1305 "ChaCha20-Poly1305" + #define PROV_NAMES_CAST5_ECB "CAST5-ECB" +diff --git a/test/recipes/30-test_evp_data/evpciph_sm4.txt b/test/recipes/30-test_evp_data/evpciph_sm4.txt +index ec8a45bd3f..9fb16ca15c 100644 +--- a/test/recipes/30-test_evp_data/evpciph_sm4.txt ++++ b/test/recipes/30-test_evp_data/evpciph_sm4.txt +@@ -36,3 +36,23 @@ Key = 0123456789ABCDEFFEDCBA9876543210 + IV = 0123456789ABCDEFFEDCBA9876543210 + Plaintext = AAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBCCCCCCCCCCCCCCCCDDDDDDDDDDDDDDDDEEEEEEEEEEEEEEEEFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEAAAAAAAAAAAAAAAA + Ciphertext = C2B4759E78AC3CF43D0852F4E8D5F9FD7256E8A5FCB65A350EE00630912E44492A0B17E1B85B060D0FBA612D8A95831638B361FD5FFACD942F081485A83CA35D ++ ++Title = SM4 GCM test vectors from RFC8998 ++ ++Cipher = SM4-GCM ++Key = 0123456789abcdeffedcba9876543210 ++IV = 00001234567800000000abcd ++AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 ++Tag = 83de3541e4c2b58177e065a9bf7b62ec ++Plaintext = aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccddddddddddddddddeeeeeeeeeeeeeeeeffffffffffffffffeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaa ++Ciphertext = 17f399f08c67d5ee19d0dc9969c4bb7d5fd46fd3756489069157b282bb200735d82710ca5c22f0ccfa7cbf93d496ac15a56834cbcf98c397b4024a2691233b8d ++ ++Title = SM4 CCM test vectors from RFC8998 ++ ++Cipher = SM4-CCM ++Key = 0123456789abcdeffedcba9876543210 ++IV = 00001234567800000000abcd ++AAD = feedfacedeadbeeffeedfacedeadbeefabaddad2 ++Tag = 16842d4fa186f56ab33256971fa110f4 ++Plaintext = aaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbccccccccccccccccddddddddddddddddeeeeeeeeeeeeeeeeffffffffffffffffeeeeeeeeeeeeeeeeaaaaaaaaaaaaaaaa ++Ciphertext = 48af93501fa62adbcd414cce6034d895dda1bf8f132f042098661572e7483094fd12e518ce062c98acee28d95df4416bed31a2f04476c18bb40c84a74b97dc5b +-- +2.37.3.windows.1 + |