1 /* crypto.h
2  *
3  * Copyright (C) 2006-2021 wolfSSL Inc.
4  *
5  * This file is part of wolfSSL.
6  *
7  * wolfSSL is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * wolfSSL is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License
18  * along with this program; if not, write to the Free Software
19  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA
20  */
21 
22 
23 
24 /* Defines Microchip CRYPTO API layer */
25 
26 
27 #ifndef MC_CRYPTO_API_H
28 #define MC_CRYPTO_API_H
29 
30 
31 #ifdef __cplusplus
32     extern "C" {
33 #endif
34 
35 /* MD5 */
36 typedef struct CRYPT_MD5_CTX {
37     int holder[28];   /* big enough to hold internal, but check on init */
38 } CRYPT_MD5_CTX;
39 
40 int CRYPT_MD5_Initialize(CRYPT_MD5_CTX*);
41 int CRYPT_MD5_DataAdd(CRYPT_MD5_CTX*, const unsigned char*, unsigned int);
42 int CRYPT_MD5_Finalize(CRYPT_MD5_CTX*, unsigned char*);
43 int CRYPT_MD5_DataSizeSet(CRYPT_MD5_CTX* md5, unsigned int sz);
44 
45 enum {
46     CRYPT_MD5_DIGEST_SIZE = 16
47 };
48 
49 
50 /* SHA */
51 typedef struct CRYPT_SHA_CTX {
52     int holder[29];   /* big enough to hold internal, but check on init */
53 } CRYPT_SHA_CTX;
54 
55 int CRYPT_SHA_Initialize(CRYPT_SHA_CTX*);
56 int CRYPT_SHA_DataAdd(CRYPT_SHA_CTX*, const unsigned char*, unsigned int);
57 int CRYPT_SHA_Finalize(CRYPT_SHA_CTX*, unsigned char*);
58 int CRYPT_SHA_DataSizeSet(CRYPT_SHA_CTX* sha, unsigned int sz);
59 
60 enum {
61     CRYPT_SHA_DIGEST_SIZE = 20
62 };
63 
64 
65 /* SHA-256 */
66 typedef struct CRYPT_SHA256_CTX {
67     int holder[32];   /* big enough to hold internal, but check on init */
68 } CRYPT_SHA256_CTX;
69 
70 int CRYPT_SHA256_Initialize(CRYPT_SHA256_CTX*);
71 int CRYPT_SHA256_DataAdd(CRYPT_SHA256_CTX*, const unsigned char*, unsigned int);
72 int CRYPT_SHA256_Finalize(CRYPT_SHA256_CTX*, unsigned char*);
73 int CRYPT_SHA256_DataSizeSet(CRYPT_SHA256_CTX* sha256, unsigned int sz);
74 
75 enum {
76     CRYPT_SHA256_DIGEST_SIZE = 32
77 };
78 
79 
80 /* SHA-384 */
81 typedef struct CRYPT_SHA384_CTX {
82     long long holder[36];   /* big enough to hold internal, but check on init */
83 } CRYPT_SHA384_CTX;
84 
85 int CRYPT_SHA384_Initialize(CRYPT_SHA384_CTX*);
86 int CRYPT_SHA384_DataAdd(CRYPT_SHA384_CTX*, const unsigned char*, unsigned int);
87 int CRYPT_SHA384_Finalize(CRYPT_SHA384_CTX*, unsigned char*);
88 
89 enum {
90     CRYPT_SHA384_DIGEST_SIZE = 48
91 };
92 
93 
94 /* SHA-512 */
95 typedef struct CRYPT_SHA512_CTX {
96     long long holder[36];   /* big enough to hold internal, but check on init */
97 } CRYPT_SHA512_CTX;
98 
99 int CRYPT_SHA512_Initialize(CRYPT_SHA512_CTX*);
100 int CRYPT_SHA512_DataAdd(CRYPT_SHA512_CTX*, const unsigned char*, unsigned int);
101 int CRYPT_SHA512_Finalize(CRYPT_SHA512_CTX*, unsigned char*);
102 
103 enum {
104     CRYPT_SHA512_DIGEST_SIZE = 64
105 };
106 
107 
108 /* HMAC */
109 typedef struct CRYPT_HMAC_CTX {
110     long long holder[98];   /* big enough to hold internal, but check on init */
111 } CRYPT_HMAC_CTX;
112 
113 int CRYPT_HMAC_SetKey(CRYPT_HMAC_CTX*, int, const unsigned char*, unsigned int);
114 int CRYPT_HMAC_DataAdd(CRYPT_HMAC_CTX*, const unsigned char*, unsigned int);
115 int CRYPT_HMAC_Finalize(CRYPT_HMAC_CTX*, unsigned char*);
116 
117 /* HMAC types */
118 enum {
119     CRYPT_HMAC_SHA    = 4,
120     CRYPT_HMAC_SHA256 = 6,
121     CRYPT_HMAC_SHA384 = 7,
122     CRYPT_HMAC_SHA512 = 8
123 };
124 
125 
126 /* Huffman */
127 int CRYPT_HUFFMAN_Compress(unsigned char*, unsigned int, const unsigned char*,
128                            unsigned int, unsigned int);
129 int CRYPT_HUFFMAN_DeCompress(unsigned char*, unsigned int, const unsigned char*,
130                              unsigned int);
131 
132 /* flag to use static huffman */
133 enum {
134     CRYPT_HUFFMAN_COMPRESS_STATIC = 1
135 };
136 
137 
138 /* RNG */
139 typedef struct CRYPT_RNG_CTX {
140     int holder[66];   /* big enough to hold internal, but check on init */
141 } CRYPT_RNG_CTX;
142 
143 int CRYPT_RNG_Initialize(CRYPT_RNG_CTX*);
144 int CRYPT_RNG_Get(CRYPT_RNG_CTX*, unsigned char*);
145 int CRYPT_RNG_BlockGenerate(CRYPT_RNG_CTX*, unsigned char*, unsigned int);
146 
147 
148 /* TDES */
149 typedef struct CRYPT_TDES_CTX {
150     int holder[104];   /* big enough to hold internal, but check on init */
151 } CRYPT_TDES_CTX;
152 
153 int CRYPT_TDES_KeySet(CRYPT_TDES_CTX*, const unsigned char*,
154                       const unsigned char*, int);
155 int CRYPT_TDES_IvSet(CRYPT_TDES_CTX*, const unsigned char*);
156 int CRYPT_TDES_CBC_Encrypt(CRYPT_TDES_CTX*, unsigned char*,
157                            const unsigned char*, unsigned int);
158 int CRYPT_TDES_CBC_Decrypt(CRYPT_TDES_CTX*, unsigned char*,
159                            const unsigned char*, unsigned int);
160 
161 /* key direction flags for setup */
162 enum {
163     CRYPT_TDES_ENCRYPTION = 0,
164     CRYPT_TDES_DECRYPTION = 1
165 };
166 
167 
168 /* AES */
169 typedef struct CRYPT_AES_CTX {
170     int holder[90];   /* big enough to hold internal, but check on init */
171 } CRYPT_AES_CTX;
172 
173 /* key */
174 int CRYPT_AES_KeySet(CRYPT_AES_CTX*, const unsigned char*, unsigned int,
175                       const unsigned char*, int);
176 int CRYPT_AES_IvSet(CRYPT_AES_CTX*, const unsigned char*);
177 
178 /* cbc */
179 int CRYPT_AES_CBC_Encrypt(CRYPT_AES_CTX*, unsigned char*,
180                            const unsigned char*, unsigned int);
181 int CRYPT_AES_CBC_Decrypt(CRYPT_AES_CTX*, unsigned char*,
182                            const unsigned char*, unsigned int);
183 
184 /* ctr (counter), use Encrypt both ways with ENCRYPT key setup */
185 int CRYPT_AES_CTR_Encrypt(CRYPT_AES_CTX*, unsigned char*,
186                           const unsigned char*, unsigned int);
187 
188 /* direct, one block at a time */
189 int CRYPT_AES_DIRECT_Encrypt(CRYPT_AES_CTX*, unsigned char*,
190                            const unsigned char*);
191 int CRYPT_AES_DIRECT_Decrypt(CRYPT_AES_CTX*, unsigned char*,
192                            const unsigned char*);
193 
194 /* key direction flags for setup, ctr always uses ENCRYPT flag */
195 enum {
196     CRYPT_AES_ENCRYPTION = 0,
197     CRYPT_AES_DECRYPTION = 1,
198     CRYPT_AES_BLOCK_SIZE = 16
199 };
200 
201 
202 
203 /* RSA */
204 typedef struct CRYPT_RSA_CTX {
205     void* holder;
206 } CRYPT_RSA_CTX;
207 
208 /* init/free */
209 int CRYPT_RSA_Initialize(CRYPT_RSA_CTX*);
210 int CRYPT_RSA_Free(CRYPT_RSA_CTX*);
211 
212 /* key decode */
213 int CRYPT_RSA_PublicKeyDecode(CRYPT_RSA_CTX*, const unsigned char*,
214                               unsigned int);
215 int CRYPT_RSA_PrivateKeyDecode(CRYPT_RSA_CTX*, const unsigned char*,
216                                unsigned int);
217 
218 /* encrypt/decrypt */
219 int CRYPT_RSA_PublicEncrypt(CRYPT_RSA_CTX*, unsigned char*,
220                             unsigned int, const unsigned char*, unsigned int,
221                             CRYPT_RNG_CTX*);
222 int CRYPT_RSA_PrivateDecrypt(CRYPT_RSA_CTX*, unsigned char*,
223                              unsigned int, const unsigned char*, unsigned int);
224 
225 /* helpers */
226 int CRYPT_RSA_EncryptSizeGet(CRYPT_RSA_CTX*);
227 int CRYPT_RSA_SetRng(CRYPT_RSA_CTX*, CRYPT_RNG_CTX*);
228 
229 
230 
231 /* ECC */
232 typedef struct CRYPT_ECC_CTX {
233     void* holder;
234 } CRYPT_ECC_CTX;
235 
236 /* init/free */
237 int CRYPT_ECC_Initialize(CRYPT_ECC_CTX*);
238 int CRYPT_ECC_Free(CRYPT_ECC_CTX*);
239 
240 /* key coders */
241 int CRYPT_ECC_PublicExport(CRYPT_ECC_CTX*, unsigned char*, unsigned int,
242                            unsigned int*);
243 int CRYPT_ECC_PublicImport(CRYPT_ECC_CTX*, const unsigned char*, unsigned int);
244 int CRYPT_ECC_PrivateImport(CRYPT_ECC_CTX*, const unsigned char*, unsigned int,
245                             const unsigned char*, unsigned int);
246 
247 /* dhe */
248 int CRYPT_ECC_DHE_KeyMake(CRYPT_ECC_CTX*, CRYPT_RNG_CTX*, int);
249 int CRYPT_ECC_DHE_SharedSecretMake(CRYPT_ECC_CTX*, CRYPT_ECC_CTX*,
250                                    unsigned char*, unsigned int, unsigned int*);
251 
252 /* dsa */
253 int CRYPT_ECC_DSA_HashSign(CRYPT_ECC_CTX*, CRYPT_RNG_CTX*, unsigned char*,
254         unsigned int, unsigned int*, const unsigned char*, unsigned int);
255 int CRYPT_ECC_DSA_HashVerify(CRYPT_ECC_CTX*, const unsigned char*,
256                      unsigned int, unsigned char*, unsigned int, int*);
257 
258 /* helpers */
259 int CRYPT_ECC_KeySizeGet(CRYPT_ECC_CTX*);
260 int CRYPT_ECC_SignatureSizeGet(CRYPT_ECC_CTX*);
261 
262 
263 /* Error string helper, string needs to be >= 80 chars */
264 int CRYPT_ERROR_StringGet(int, char*);
265 
266 
267 #ifdef __cplusplus
268     }  /* extern "C" */
269 #endif
270 
271 
272 #endif /* MC_CRYPTO_API_H */
273 
274