1 /* 2 * Copyright (c) 2021-2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef HKS_OPENSSL_AES_H 17 #define HKS_OPENSSL_AES_H 18 19 #include <openssl/ossl_typ.h> 20 #include <stdbool.h> 21 #include <stdint.h> 22 23 #include "hks_crypto_hal.h" 24 #include "hks_type.h" 25 26 #ifdef __cplusplus 27 extern "C" { 28 #endif 29 30 #ifdef HKS_SUPPORT_AES_C 31 #ifdef HKS_SUPPORT_AES_GENERATE_KEY 32 int32_t HksOpensslAesGenerateKey(const struct HksKeySpec *spec, struct HksBlob *key); 33 #endif /* HKS_SUPPORT_AES_GENERATE_KEY */ 34 35 #if defined(HKS_SUPPORT_AES_CBC_NOPADDING) || defined(HKS_SUPPORT_AES_CBC_PKCS7) || \ 36 defined(HKS_SUPPORT_AES_ECB_PKCS7PADDING) || defined(HKS_SUPPORT_AES_CTR_NOPADDING) || \ 37 defined(HKS_SUPPORT_AES_ECB_NOPADDING) || defined(HKS_SUPPORT_AES_GCM) || defined(HKS_SUPPORT_AES_CCM) 38 int32_t HksOpensslAesEncryptInit(void **cryptoCtx, const struct HksBlob *key, const struct HksUsageSpec *usageSpec); 39 40 int32_t HksOpensslAesEncryptUpdate(void *cryptoCtx, const struct HksBlob *message, struct HksBlob *cipherText); 41 42 int32_t HksOpensslAesEncryptFinal(void **cryptoCtx, const struct HksBlob *message, struct HksBlob *cipherText, 43 struct HksBlob *tagAead); 44 45 int32_t HksOpensslAesDecryptInit(void **cryptoCtx, const struct HksBlob *key, const struct HksUsageSpec *usageSpec); 46 47 int32_t HksOpensslAesDecryptUpdate(void *cryptoCtx, const struct HksBlob *message, struct HksBlob *plainText); 48 49 int32_t HksOpensslAesDecryptFinal(void **cryptoCtx, const struct HksBlob *message, struct HksBlob *cipherText, 50 struct HksBlob *tagAead); 51 52 void HksOpensslAesHalFreeCtx(void **cryptoCtx); 53 54 int32_t HksOpensslAesEncrypt(const struct HksBlob *key, const struct HksUsageSpec *usageSpec, 55 const struct HksBlob *message, struct HksBlob *cipherText, struct HksBlob *tagAead); 56 57 int32_t HksOpensslAesDecrypt(const struct HksBlob *key, const struct HksUsageSpec *usageSpec, 58 const struct HksBlob *message, struct HksBlob *plainText); 59 #endif /* HKS_SUPPORT_AES_CBC_NOPADDING */ 60 #endif /* HKS_SUPPORT_AES_C */ 61 62 #if defined(HKS_SUPPORT_AES_C) || defined(HKS_SUPPORT_SM4_C) 63 #if defined(HKS_SUPPORT_AES_CBC_NOPADDING) || defined(HKS_SUPPORT_AES_CBC_PKCS7) || \ 64 defined(HKS_SUPPORT_AES_ECB_PKCS7PADDING) || defined(HKS_SUPPORT_AES_CTR_NOPADDING) || \ 65 defined(HKS_SUPPORT_AES_ECB_NOPADDING) || defined(HKS_SUPPORT_AES_GCM) || \ 66 defined(HKS_SUPPORT_SM4_CBC_NOPADDING) || defined(HKS_SUPPORT_SM4_CBC_PKCS7) || \ 67 defined(HKS_SUPPORT_SM4_CTR_NOPADDING) || defined(HKS_SUPPORT_SM4_ECB_NOPADDING) || \ 68 defined(HKS_SUPPORT_SM4_ECB_PKCS7) || defined(HKS_SUPPORT_SM4_CFB_NOPADDING) || \ 69 defined(HKS_SUPPORT_SM4_OFB_NOPADDING) || defined(HKS_SUPPORT_AES_CCM) 70 typedef struct HksOpensslBlockCipherCtx { 71 uint32_t algType; 72 uint32_t mode; 73 uint32_t padding; 74 void *append; 75 } HksOpensslBlockCipherCtx; 76 77 const EVP_CIPHER *GetBlockCipherType(uint32_t keySize, uint32_t mode, 78 const EVP_CIPHER *(*getCbcCipherType)(uint32_t keySize), 79 const EVP_CIPHER *(*getCtrCipherType)(uint32_t keySize), 80 const EVP_CIPHER *(*getEcbCipherType)(uint32_t keySize)); 81 82 enum { 83 OPENSSL_CTX_PADDING_NONE = 0, /* set chipher padding none */ 84 OPENSSL_CTX_PADDING_ENABLE = 1, /* set chipher padding enable */ 85 }; 86 87 int32_t OpensslBlockCipherCryptInit( 88 const struct HksBlob *key, const struct HksUsageSpec *usageSpec, bool isEncrypt, void **cryptoCtx, 89 const EVP_CIPHER *(*getCipherType)(uint32_t keySize, uint32_t mode)); 90 91 int32_t OpensslBlockCipherEncryptUpdate( 92 void *cryptoCtx, const struct HksBlob *message, struct HksBlob *cipherText); 93 94 int32_t OpensslBlockCipherEncryptFinalThree( 95 void **cryptoCtx, const struct HksBlob *message, struct HksBlob *cipherText); 96 97 int32_t OpensslBlockCipherDecryptUpdate( 98 void *cryptoCtx, const struct HksBlob *message, struct HksBlob *plainText); 99 100 int32_t OpensslBlockCipherDecryptFinalThree( 101 void **cryptoCtx, const struct HksBlob *message, struct HksBlob *plainText); 102 #endif 103 #endif /* defined(HKS_SUPPORT_AES_C) || defined(HKS_SUPPORT_SM4_C) */ 104 105 #ifdef __cplusplus 106 } 107 #endif 108 109 #endif /* HKS_OPENSSL_AES_H */ 110