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