Add aes.c and required headers from axtls tree
[people/xl0/gpxe.git] / src / crypto / axtls / crypto.h
1 /*
2  *  Copyright(C) 2006 Cameron Rich
3  *
4  *  This library is free software; you can redistribute it and/or modify
5  *  it under the terms of the GNU Lesser General Public License as published by
6  *  the Free Software Foundation; either version 2 of the License, or
7  *  (at your option) any later version.
8  *
9  *  This library is distributed in the hope that it will be useful,
10  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
11  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  *  GNU Lesser General Public License for more details.
13  *
14  *  You should have received a copy of the GNU Lesser General Public License
15  *  along with this library; if not, write to the Free Software
16  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
17  */
18
19 /**
20  * @file crypto.h
21  */
22
23 #ifndef HEADER_CRYPTO_H
24 #define HEADER_CRYPTO_H
25
26 #ifdef __cplusplus
27 extern "C" {
28 #endif
29
30 #include "bigint.h"
31
32 /**************************************************************************
33  * AES declarations 
34  **************************************************************************/
35
36 #define AES_MAXROUNDS                   14
37
38 typedef struct aes_key_st 
39 {
40     uint16_t rounds;
41     uint16_t key_size;
42     uint32_t ks[(AES_MAXROUNDS+1)*8];
43     uint8_t iv[16];
44 } AES_CTX;
45
46 typedef enum
47 {
48     AES_MODE_128,
49     AES_MODE_256
50 } AES_MODE;
51
52 void AES_set_key(AES_CTX *ctx, const uint8_t *key, 
53         const uint8_t *iv, AES_MODE mode);
54 void AES_cbc_encrypt(AES_CTX *ctx, const uint8_t *msg, 
55         uint8_t *out, int length);
56 void AES_cbc_decrypt(AES_CTX *ks, const uint8_t *in, uint8_t *out, int length);
57 void AES_convert_key(AES_CTX *ctx);
58
59 /**************************************************************************
60  * RC4 declarations 
61  **************************************************************************/
62
63 typedef struct 
64 {
65     int x, y, m[256];
66 } RC4_CTX;
67
68 void RC4_setup(RC4_CTX *s, const uint8_t *key, int length);
69 void RC4_crypt(RC4_CTX *s, const uint8_t *msg, uint8_t *data, int length);
70
71 /**************************************************************************
72  * SHA1 declarations 
73  **************************************************************************/
74
75 #define SHA1_SIZE   20
76
77 /*
78  *  This structure will hold context information for the SHA-1
79  *  hashing operation
80  */
81 typedef struct 
82 {
83     uint32_t Intermediate_Hash[SHA1_SIZE/4]; /* Message Digest  */
84     uint32_t Length_Low;            /* Message length in bits      */
85     uint32_t Length_High;           /* Message length in bits      */
86     uint16_t Message_Block_Index;   /* Index into message block array   */
87     uint8_t Message_Block[64];      /* 512-bit message blocks      */
88 } SHA1_CTX;
89
90 void SHA1Init(SHA1_CTX *);
91 void SHA1Update(SHA1_CTX *, const uint8_t * msg, int len);
92 void SHA1Final(SHA1_CTX *, uint8_t *digest);
93
94 /**************************************************************************
95  * MD5 declarations 
96  **************************************************************************/
97
98 /* MD5 context. */
99
100 #define MD5_SIZE    16
101
102 typedef struct 
103 {
104   uint32_t state[4];        /* state (ABCD) */
105   uint32_t count[2];        /* number of bits, modulo 2^64 (lsb first) */
106   uint8_t buffer[64];       /* input buffer */
107 } MD5_CTX;
108
109 void MD5Init(MD5_CTX *);
110 void MD5Update(MD5_CTX *, const uint8_t *msg, int len);
111 void MD5Final(MD5_CTX *, uint8_t *digest);
112
113 /**************************************************************************
114  * HMAC declarations 
115  **************************************************************************/
116 void hmac_md5(const uint8_t *msg, int length, const uint8_t *key, 
117         int key_len, uint8_t *digest);
118 void hmac_sha1(const uint8_t *msg, int length, const uint8_t *key, 
119         int key_len, uint8_t *digest);
120
121 /**************************************************************************
122  * RNG declarations 
123  **************************************************************************/
124 void RNG_initialize(const uint8_t *seed_buf, int size);
125 void RNG_terminate(void);
126 void get_random(int num_rand_bytes, uint8_t *rand_data);
127 void get_random_NZ(int num_rand_bytes, uint8_t *rand_data);
128
129 /**************************************************************************
130  * RSA declarations 
131  **************************************************************************/
132
133 typedef struct 
134 {
135     bigint *m;              /* modulus */
136     bigint *e;              /* public exponent */
137     bigint *d;              /* private exponent */
138 #ifdef CONFIG_BIGINT_CRT
139     bigint *p;              /* p as in m = pq */
140     bigint *q;              /* q as in m = pq */
141     bigint *dP;             /* d mod (p-1) */
142     bigint *dQ;             /* d mod (q-1) */
143     bigint *qInv;           /* q^-1 mod p */
144 #endif
145     int num_octets;
146     bigint *sig_m;         /* signature modulus */
147     BI_CTX *bi_ctx;
148 } RSA_CTX;
149
150 void RSA_priv_key_new(RSA_CTX **rsa_ctx, 
151         const uint8_t *modulus, int mod_len,
152         const uint8_t *pub_exp, int pub_len,
153         const uint8_t *priv_exp, int priv_len
154 #ifdef CONFIG_BIGINT_CRT
155       , const uint8_t *p, int p_len,
156         const uint8_t *q, int q_len,
157         const uint8_t *dP, int dP_len,
158         const uint8_t *dQ, int dQ_len,
159         const uint8_t *qInv, int qInv_len
160 #endif
161         );
162 void RSA_pub_key_new(RSA_CTX **rsa_ctx, 
163         const uint8_t *modulus, int mod_len,
164         const uint8_t *pub_exp, int pub_len);
165 void RSA_free(RSA_CTX *ctx);
166 int RSA_decrypt(RSA_CTX *ctx, const uint8_t *in_data, uint8_t *out_data,
167         int is_decryption);
168 bigint *RSA_private(RSA_CTX *c, bigint *bi_msg);
169 #ifdef CONFIG_SSL_CERT_VERIFICATION
170 bigint *RSA_raw_sign_verify(RSA_CTX *c, bigint *bi_msg);
171 bigint *RSA_sign_verify(BI_CTX *ctx, const uint8_t *sig, int sig_len,
172         bigint *modulus, bigint *pub_exp);
173 bigint *RSA_public(RSA_CTX *c, bigint *bi_msg);
174 int RSA_encrypt(RSA_CTX *ctx, const uint8_t *in_data, uint16_t in_len, 
175         uint8_t *out_data, int is_signing);
176 void RSA_print(const RSA_CTX *ctx);
177 #endif
178
179 /**************************************************************************
180  * ASN1 declarations 
181  **************************************************************************/
182 #define X509_OK                             0
183 #define X509_NOT_OK                         -1
184 #define X509_VFY_ERROR_NO_TRUSTED_CERT      -2
185 #define X509_VFY_ERROR_BAD_SIGNATURE        -3      
186 #define X509_VFY_ERROR_NOT_YET_VALID        -4
187 #define X509_VFY_ERROR_EXPIRED              -5
188 #define X509_VFY_ERROR_SELF_SIGNED          -6
189 #define X509_VFY_ERROR_INVALID_CHAIN        -7
190 #define X509_VFY_ERROR_UNSUPPORTED_DIGEST   -8
191 #define X509_INVALID_PRIV_KEY               -9
192
193 /*
194  * The Distinguished Name
195  */
196 #define X509_NUM_DN_TYPES                   3
197 #define X509_COMMON_NAME                    0
198 #define X509_ORGANIZATION                   1
199 #define X509_ORGANIZATIONAL_TYPE            2
200
201 #define ASN1_INTEGER            0x02
202 #define ASN1_BIT_STRING         0x03
203 #define ASN1_OCTET_STRING       0x04
204 #define ASN1_NULL               0x05
205 #define ASN1_OID                0x06
206 #define ASN1_PRINTABLE_STR      0x13
207 #define ASN1_TELETEX_STR        0x14
208 #define ASN1_IA5_STR            0x16
209 #define ASN1_UTC_TIME           0x17
210 #define ASN1_SEQUENCE           0x30
211 #define ASN1_SET                0x31
212 #define ASN1_IMPLICIT_TAG       0x80
213 #define ASN1_EXPLICIT_TAG       0xa0
214
215 #define SALT_SIZE               8
216
217 struct _x509_ctx
218 {
219     char *ca_cert_dn[X509_NUM_DN_TYPES];
220     char *cert_dn[X509_NUM_DN_TYPES];
221 #if defined(_WIN32_WCE)
222     long not_before;
223     long not_after;
224 #else
225     time_t not_before;
226     time_t not_after;
227 #endif
228     uint8_t *signature;
229     uint16_t sig_len;
230     uint8_t sig_type;
231     RSA_CTX *rsa_ctx;
232     bigint *digest;
233     struct _x509_ctx *next;
234 };
235
236 typedef struct _x509_ctx X509_CTX;
237
238 #ifdef CONFIG_SSL_CERT_VERIFICATION
239 typedef struct 
240 {
241     X509_CTX *cert[CONFIG_X509_MAX_CA_CERTS];
242 } CA_CERT_CTX;
243 #endif
244
245 int asn1_get_private_key(const uint8_t *buf, int len, RSA_CTX **rsa_ctx);
246 int asn1_next_obj(const uint8_t *buf, int *offset, int obj_type);
247 int asn1_skip_obj(const uint8_t *buf, int *offset, int obj_type);
248 int asn1_get_int(const uint8_t *buf, int *offset, uint8_t **object);
249 int x509_new(const uint8_t *cert, int *len, X509_CTX **ctx);
250 void x509_free(X509_CTX *x509_ctx);
251 #ifdef CONFIG_SSL_CERT_VERIFICATION
252 int x509_verify(const CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
253 const uint8_t *x509_get_signature(const uint8_t *asn1_signature, int *len);
254 #endif
255 #ifdef CONFIG_SSL_FULL_MODE
256 void x509_print(CA_CERT_CTX *ca_cert_ctx, const X509_CTX *cert);
257 void x509_display_error(int error);
258 #endif
259
260 /**************************************************************************
261  * MISC declarations 
262  **************************************************************************/
263
264 extern const char * const unsupported_str;
265
266 typedef void (*crypt_func)(void *, const uint8_t *, uint8_t *, int);
267 typedef void (*hmac_func)(const uint8_t *msg, int length, const uint8_t *key, 
268         int key_len, uint8_t *digest);
269
270 typedef struct
271 {
272     uint8_t *pre_data;  /* include the ssl record bytes */
273     uint8_t *data;      /* the regular ssl data */
274     int max_len;
275     int index;
276 } BUF_MEM;
277
278 BUF_MEM buf_new(void);
279 void buf_grow(BUF_MEM *bm, int len);
280 void buf_free(BUF_MEM *bm);
281 int get_file(const char *filename, uint8_t **buf);
282
283 #if defined(CONFIG_SSL_FULL_MODE) || defined(WIN32) || defined(CONFIG_DEBUG)
284 void print_blob(const char *format, const uint8_t *data, int size, ...);
285 #else
286     #define print_blob(...)
287 #endif
288
289 #ifdef __cplusplus
290 }
291 #endif
292
293 #endif