1 /* 2 * Copyright (c) 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_ABILITY_H 17 #define HKS_ABILITY_H 18 19 #include <stdint.h> 20 21 enum HksAbilityType { 22 HKS_ABILITY_CRYPTO = 1, 23 HKS_ABILITY_AUTH, 24 }; 25 26 enum HksOperationType { 27 HKS_OPERATION_GENERATE_KEY = 0x1, /* generate key */ 28 HKS_OPERATION_GET_PUBLIC_KEY = 0x2, /* get public key */ 29 HKS_OPERATION_DERIVE_KEY = 0x3, /* derive key */ 30 HKS_OPERATION_AGREE_KEY = 0x4, /* agree key */ 31 HKS_OPERATION_SIGN = 0x5, /* sign */ 32 HKS_OPERATION_VERIFY = 0x6, /* verify */ 33 HKS_OPERATION_HMAC_INIT = 0x7, /* hmac init */ 34 HKS_OPERATION_HMAC_UPDATE = 0x8, /* hmac update */ 35 HKS_OPERATION_HMAC_FINAL = 0x9, /* hmac final */ 36 HKS_OPERATION_HASH_INIT = 0xa, /* hash init */ 37 HKS_OPERATION_HASH_UPDATE = 0xb, /* hash update */ 38 HKS_OPERATION_HASH_FINAL = 0xc, /* hash final */ 39 HKS_OPERATION_ENCRYPT_INIT = 0xd, /* encrypt init */ 40 HKS_OPERATION_ENCRYPT_UPDATE = 0xe, /* encrypt update */ 41 HKS_OPERATION_ENCRYPT_FINAL = 0xf, /* encrypt final */ 42 HKS_OPERATION_DECRYPT_INIT = 0x10, /* decrypt init */ 43 HKS_OPERATION_DECRYPT_UPDATE = 0x11, /* decrypt update */ 44 HKS_OPERATION_DECRYPT_FINAL = 0x12, /* decrypt final */ 45 HKS_OPERATION_GET_MAIN_KEY = 0x13, /* get root main key */ 46 HKS_OPERATION_FILL_RANDOM = 0x14, /* fill random */ 47 HKS_OPERATION_HMAC = 0x15, 48 HKS_OPERATION_HASH = 0x16, 49 HKS_OPERATION_ENCRYPT = 0x17, 50 HKS_OPERATION_DECRYPT = 0x18, 51 HKS_OPERATION_BN_EXP_MOD = 0x19, 52 HKS_OPERATION_HASH_FREE_CTX = 0x1a, /* hash free ctx */ 53 HKS_OPERATION_HMAC_FREE_CTX = 0x1b, /* hmac free ctx */ 54 HKS_OPERATION_ENCRYPT_FREE_CTX = 0x1c, /* encrypt free ctx */ 55 HKS_OPERATION_DECRYPT_FREE_CTX = 0x1d, /* decrypt free ctx */ 56 HKS_OPERATION_FILL_PRI_RANDOM = 0x1e, /* fill private random */ 57 HKS_OPERATION_CHIPSET_PLATFORM_DERIVE_KEY_AND_ECDH = 0x1f, /* hardcoded key implementation did not use the enum */ 58 /* see hks_chipset_platform_key_hardcoded.c */ 59 HKS_OPERATION_CHIPSET_PLATFORM_DERIVE_PUB_KEY = 0x20, /* hardcoded key implementation did not use the enum */ 60 /* see hks_chipset_platform_key_hardcoded.c */ 61 HKS_OPERATION_CMAC_INIT = 0x21, /* cmac init */ 62 HKS_OPERATION_CMAC_UPDATE = 0x22, /* cmac update */ 63 HKS_OPERATION_CMAC_FINAL = 0x23, /* cmac final */ 64 HKS_OPERATION_CMAC_FREE_CTX = 0x24, /* cmac free ctx */ 65 HKS_OPERATION_SIGN_ISO_IEC_9796_2 = 0x25, /* sign ISO/IEC 9796-2 */ 66 HKS_OPERATION_VERIFY_ISO_IEC_9796_2 = 0x26, /* verify ISO/IEC 9796-2 */ 67 }; 68 69 struct HksAbility { 70 uint32_t id; 71 void *func; 72 }; 73 74 #define HKS_ABILITY_MAX_SIZE 128 75 76 #define HKS_ABILITY_SHIFT 24 77 #define HKS_CRYPTO_OPERATION_SHIFT 16 78 79 #define HKS_CRYPTO_ABILITY(type, alg) \ 80 ((HKS_ABILITY_CRYPTO << HKS_ABILITY_SHIFT) | ((type) << HKS_CRYPTO_OPERATION_SHIFT) | (alg)) 81 82 #define HKS_CRYPTO_ABILITY_GENERATE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_GENERATE_KEY, alg) 83 #define HKS_CRYPTO_ABILITY_GET_PUBLIC_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_GET_PUBLIC_KEY, alg) 84 #define HKS_CRYPTO_ABILITY_DERIVE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DERIVE_KEY, alg) 85 #define HKS_CRYPTO_ABILITY_AGREE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_AGREE_KEY, alg) 86 #define HKS_CRYPTO_ABILITY_SIGN(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_SIGN, alg) 87 #define HKS_CRYPTO_ABILITY_VERIFY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_VERIFY, alg) 88 89 #define HKS_CRYPTO_ABILITY_SIGN_ISO_IEC_9796_2 HKS_CRYPTO_ABILITY(HKS_OPERATION_SIGN_ISO_IEC_9796_2, 0) 90 #define HKS_CRYPTO_ABILITY_VERIFY_ISO_IEC_9796_2 HKS_CRYPTO_ABILITY(HKS_OPERATION_VERIFY_ISO_IEC_9796_2, 0) 91 92 #define HKS_CRYPTO_ABILITY_HMAC HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC, 0) 93 #define HKS_CRYPTO_ABILITY_HMAC_INIT HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_INIT, 0) 94 #define HKS_CRYPTO_ABILITY_HMAC_UPDATE HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_UPDATE, 0) 95 #define HKS_CRYPTO_ABILITY_HMAC_FINAL HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_FINAL, 0) 96 #define HKS_CRYPTO_ABILITY_HMAC_FREE_CTX HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_FREE_CTX, 0) 97 98 #define HKS_CRYPTO_ABILITY_CMAC_INIT HKS_CRYPTO_ABILITY(HKS_OPERATION_CMAC_INIT, 0) 99 #define HKS_CRYPTO_ABILITY_CMAC_UPDATE HKS_CRYPTO_ABILITY(HKS_OPERATION_CMAC_UPDATE, 0) 100 #define HKS_CRYPTO_ABILITY_CMAC_FINAL HKS_CRYPTO_ABILITY(HKS_OPERATION_CMAC_FINAL, 0) 101 #define HKS_CRYPTO_ABILITY_CMAC_FREE_CTX HKS_CRYPTO_ABILITY(HKS_OPERATION_CMAC_FREE_CTX, 0) 102 103 #define HKS_CRYPTO_ABILITY_HASH HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH, 0) 104 #define HKS_CRYPTO_ABILITY_HASH_INIT HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_INIT, 0) 105 #define HKS_CRYPTO_ABILITY_HASH_UPDATE HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_UPDATE, 0) 106 #define HKS_CRYPTO_ABILITY_HASH_FINAL HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_FINAL, 0) 107 #define HKS_CRYPTO_ABILITY_HASH_FREE_CTX HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_FREE_CTX, 0) 108 109 #define HKS_CRYPTO_ABILITY_ENCRYPT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT, alg) 110 #define HKS_CRYPTO_ABILITY_ENCRYPT_INIT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_INIT, alg) 111 #define HKS_CRYPTO_ABILITY_ENCRYPT_UPDATE(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_UPDATE, alg) 112 #define HKS_CRYPTO_ABILITY_ENCRYPT_FINAL(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_FINAL, alg) 113 #define HKS_CRYPTO_ABILITY_ENCRYPT_FREE_CTX(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_FREE_CTX, alg) 114 115 #define HKS_CRYPTO_ABILITY_DECRYPT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT, alg) 116 #define HKS_CRYPTO_ABILITY_DECRYPT_INIT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_INIT, alg) 117 #define HKS_CRYPTO_ABILITY_DECRYPT_UPDATE(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_UPDATE, alg) 118 #define HKS_CRYPTO_ABILITY_DECRYPT_FINAL(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_FINAL, alg) 119 #define HKS_CRYPTO_ABILITY_DECRYPT_FREE_CTX(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_FREE_CTX, alg) 120 121 #define HKS_CRYPTO_ABILITY_GET_MAIN_KEY HKS_CRYPTO_ABILITY(HKS_OPERATION_GET_MAIN_KEY, 0) 122 123 #define HKS_CRYPTO_ABILITY_FILL_RANDOM HKS_CRYPTO_ABILITY(HKS_OPERATION_FILL_RANDOM, 0) 124 #define HKS_CRYPTO_ABILITY_BN_EXP_MOD HKS_CRYPTO_ABILITY(HKS_OPERATION_BN_EXP_MOD, 0) 125 #define HKS_CRYPTO_ABILITY_FILL_PRI_RANDOM HKS_CRYPTO_ABILITY(HKS_OPERATION_FILL_PRI_RANDOM, 0) 126 127 #ifdef __cplusplus 128 extern "C" { 129 #endif 130 131 int32_t RegisterAbility(uint32_t id, void *func); 132 133 void *GetAbility(uint32_t id); 134 135 int32_t HksCryptoAbilityInit(void); 136 137 #ifdef __cplusplus 138 } 139 #endif 140 141 #endif /* HKS_ABILITY_H */ 142