[crypto] Move AES_convert_key() hack into axtls_aes.c
[people/asdlkf/gpxe.git] / src / crypto / axtls_aes.c
1 #include "crypto/axtls/crypto.h"
2 #include <string.h>
3 #include <errno.h>
4 #include <gpxe/crypto.h>
5 #include <gpxe/aes.h>
6
7 struct aes_cbc_context {
8         AES_CTX ctx;
9         int decrypting;
10 };
11
12 static int aes_cbc_setkey ( void *ctx, const void *key, size_t keylen ) {
13         struct aes_cbc_context *aesctx = ctx;
14         AES_MODE mode;
15
16         switch ( keylen ) {
17         case ( 128 / 8 ):
18                 mode = AES_MODE_128;
19                 break;
20         case ( 256 / 8 ):
21                 mode = AES_MODE_256;
22                 break;
23         default:
24                 return -EINVAL;
25         }
26
27         AES_set_key ( &aesctx->ctx, key, aesctx->ctx.iv, mode );
28
29         aesctx->decrypting = 0;
30
31         return 0;
32 }
33
34 static void aes_cbc_setiv ( void *ctx, const void *iv ) {
35         struct aes_cbc_context *aesctx = ctx;
36
37         memcpy ( aesctx->ctx.iv, iv, sizeof ( aesctx->ctx.iv ) );
38 }
39
40 static void aes_cbc_encrypt ( void *ctx, const void *data, void *dst,
41                               size_t len ) {
42         struct aes_cbc_context *aesctx = ctx;
43
44         if ( aesctx->decrypting )
45                 assert ( 0 );
46
47         AES_cbc_encrypt ( &aesctx->ctx, data, dst, len );
48 }
49
50 static void aes_cbc_decrypt ( void *ctx, const void *data, void *dst,
51                               size_t len ) {
52         struct aes_cbc_context *aesctx = ctx;
53
54         if ( ! aesctx->decrypting ) {
55                 AES_convert_key ( &aesctx->ctx );
56                 aesctx->decrypting = 1;
57         }
58
59         AES_cbc_decrypt ( &aesctx->ctx, data, dst, len );
60 }
61
62 struct crypto_algorithm aes_cbc_algorithm = {
63         .name           = "aes_cbc",
64         .ctxsize        = sizeof ( struct aes_cbc_context ),
65         .blocksize      = 16,
66         .setkey         = aes_cbc_setkey,
67         .setiv          = aes_cbc_setiv,
68         .encode         = aes_cbc_encrypt,
69         .decode         = aes_cbc_decrypt,
70 };