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