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 }; 62 63 struct HksAbility { 64 uint32_t id; 65 void *func; 66 }; 67 68 #define HKS_ABILITY_MAX_SIZE 128 69 70 #define HKS_ABILITY_SHIFT 24 71 #define HKS_CRYPTO_OPERATION_SHIFT 16 72 73 #define HKS_CRYPTO_ABILITY(type, alg) \ 74 ((HKS_ABILITY_CRYPTO << HKS_ABILITY_SHIFT) | ((type) << HKS_CRYPTO_OPERATION_SHIFT) | (alg)) 75 76 #define HKS_CRYPTO_ABILITY_GENERATE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_GENERATE_KEY, alg) 77 #define HKS_CRYPTO_ABILITY_GET_PUBLIC_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_GET_PUBLIC_KEY, alg) 78 #define HKS_CRYPTO_ABILITY_DERIVE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DERIVE_KEY, alg) 79 #define HKS_CRYPTO_ABILITY_AGREE_KEY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_AGREE_KEY, alg) 80 #define HKS_CRYPTO_ABILITY_SIGN(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_SIGN, alg) 81 #define HKS_CRYPTO_ABILITY_VERIFY(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_VERIFY, alg) 82 83 #define HKS_CRYPTO_ABILITY_HMAC HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC, 0) 84 #define HKS_CRYPTO_ABILITY_HMAC_INIT HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_INIT, 0) 85 #define HKS_CRYPTO_ABILITY_HMAC_UPDATE HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_UPDATE, 0) 86 #define HKS_CRYPTO_ABILITY_HMAC_FINAL HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_FINAL, 0) 87 #define HKS_CRYPTO_ABILITY_HMAC_FREE_CTX HKS_CRYPTO_ABILITY(HKS_OPERATION_HMAC_FREE_CTX, 0) 88 89 #define HKS_CRYPTO_ABILITY_HASH HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH, 0) 90 #define HKS_CRYPTO_ABILITY_HASH_INIT HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_INIT, 0) 91 #define HKS_CRYPTO_ABILITY_HASH_UPDATE HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_UPDATE, 0) 92 #define HKS_CRYPTO_ABILITY_HASH_FINAL HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_FINAL, 0) 93 #define HKS_CRYPTO_ABILITY_HASH_FREE_CTX HKS_CRYPTO_ABILITY(HKS_OPERATION_HASH_FREE_CTX, 0) 94 95 #define HKS_CRYPTO_ABILITY_ENCRYPT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT, alg) 96 #define HKS_CRYPTO_ABILITY_ENCRYPT_INIT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_INIT, alg) 97 #define HKS_CRYPTO_ABILITY_ENCRYPT_UPDATE(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_UPDATE, alg) 98 #define HKS_CRYPTO_ABILITY_ENCRYPT_FINAL(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_FINAL, alg) 99 #define HKS_CRYPTO_ABILITY_ENCRYPT_FREE_CTX(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_ENCRYPT_FREE_CTX, alg) 100 101 #define HKS_CRYPTO_ABILITY_DECRYPT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT, alg) 102 #define HKS_CRYPTO_ABILITY_DECRYPT_INIT(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_INIT, alg) 103 #define HKS_CRYPTO_ABILITY_DECRYPT_UPDATE(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_UPDATE, alg) 104 #define HKS_CRYPTO_ABILITY_DECRYPT_FINAL(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_FINAL, alg) 105 #define HKS_CRYPTO_ABILITY_DECRYPT_FREE_CTX(alg) HKS_CRYPTO_ABILITY(HKS_OPERATION_DECRYPT_FREE_CTX, alg) 106 107 #define HKS_CRYPTO_ABILITY_GET_MAIN_KEY HKS_CRYPTO_ABILITY(HKS_OPERATION_GET_MAIN_KEY, 0) 108 109 #define HKS_CRYPTO_ABILITY_FILL_RANDOM HKS_CRYPTO_ABILITY(HKS_OPERATION_FILL_RANDOM, 0) 110 #define HKS_CRYPTO_ABILITY_BN_EXP_MOD HKS_CRYPTO_ABILITY(HKS_OPERATION_BN_EXP_MOD, 0) 111 #define HKS_CRYPTO_ABILITY_FILL_PRI_RANDOM HKS_CRYPTO_ABILITY(HKS_OPERATION_FILL_PRI_RANDOM, 0) 112 113 #ifdef __cplusplus 114 extern "C" { 115 #endif 116 117 int32_t RegisterAbility(uint32_t id, void *func); 118 119 void *GetAbility(uint32_t id); 120 121 int32_t HksCryptoAbilityInit(void); 122 123 #ifdef __cplusplus 124 } 125 #endif 126 127 #endif /* HKS_ABILITY_H */ 128