ebs-cryptolib  0.2.0
Cryptography libraries repacked for convenience from AVR Crypto Lib
aes_enc.c
Go to the documentation of this file.
1 /* aes_enc.c */
2 /*
3  This file is part of the AVR-Crypto-Lib.
4  Copyright (C) 2006-2015 Daniel Otte (bg@nerilex.org)
5 
6  This program is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
28 #include <stdint.h>
29 #include <string.h>
30 #include "aes.h"
31 #include "../gf256mul/gf256mul.h"
32 #include "aes_sbox.h"
33 #include "aes_enc.h"
34 
35 static
36 void aes_shiftcol(void *data, uint8_t shift)
37 {
38  uint8_t tmp[4];
39  tmp[0] = ((uint8_t*) data)[0];
40  tmp[1] = ((uint8_t*) data)[4];
41  tmp[2] = ((uint8_t*) data)[8];
42  tmp[3] = ((uint8_t*) data)[12];
43  ((uint8_t*) data)[0] = tmp[(shift + 0) & 3];
44  ((uint8_t*) data)[4] = tmp[(shift + 1) & 3];
45  ((uint8_t*) data)[8] = tmp[(shift + 2) & 3];
46  ((uint8_t*) data)[12] = tmp[(shift + 3) & 3];
47 }
48 
49 #define GF256MUL_1(a) (a)
50 #define GF256MUL_2(a) (gf256mul(2, (a), 0x1b))
51 #define GF256MUL_3(a) (gf256mul(3, (a), 0x1b))
52 
53 static
54 void aes_enc_round(aes_cipher_state_t *state, const aes_roundkey_t *k)
55 {
56  uint8_t tmp[16], t;
57  uint8_t i;
58  /* subBytes */
59  for (i = 0; i < 16; ++i) {
60  tmp[i] = ROMEM_READ_BYTE(aes_sbox_T_p + state->s[i]);
61  }
62  /* shiftRows */
63  aes_shiftcol(tmp + 1, 1);
64  aes_shiftcol(tmp + 2, 2);
65  aes_shiftcol(tmp + 3, 3);
66  /* mixColums */
67  for (i = 0; i < 4; ++i) {
68  t = tmp[4 * i + 0] ^ tmp[4 * i + 1] ^ tmp[4 * i + 2] ^ tmp[4 * i + 3];
69  state->s[4 * i + 0] =
70  GF256MUL_2(tmp[4*i+0]^tmp[4*i+1])
71  ^ tmp[4 * i + 0]
72  ^ t;
73  state->s[4 * i + 1] =
74  GF256MUL_2(tmp[4*i+1]^tmp[4*i+2])
75  ^ tmp[4 * i + 1]
76  ^ t;
77  state->s[4 * i + 2] =
78  GF256MUL_2(tmp[4*i+2]^tmp[4*i+3])
79  ^ tmp[4 * i + 2]
80  ^ t;
81  state->s[4 * i + 3] =
82  GF256MUL_2(tmp[4*i+3]^tmp[4*i+0])
83  ^ tmp[4 * i + 3]
84  ^ t;
85  }
86 
87  /* addKey */
88  for (i = 0; i < 16; ++i) {
89  state->s[i] ^= k->ks[i];
90  }
91 }
92 
93 static
94 void aes_enc_lastround(aes_cipher_state_t *state, const aes_roundkey_t *k)
95 {
96  uint8_t i;
97  /* subBytes */
98  for (i = 0; i < 16; ++i) {
99  state->s[i] = ROMEM_READ_BYTE(aes_sbox_T_p + state->s[i]);
100  }
101  /* shiftRows */
102  aes_shiftcol(state->s + 1, 1);
103  aes_shiftcol(state->s + 2, 2);
104  aes_shiftcol(state->s + 3, 3);
105  /* keyAdd */
106  for (i = 0; i < 16; ++i) {
107  state->s[i] ^= k->ks[i];
108  }
109 }
110 
111 void aes_encrypt_core(aes_cipher_state_t *state, const aes_genctx_t *ks,
112  uint8_t rounds)
113 {
114  uint8_t i;
115  for (i = 0; i < 16; ++i) {
116  state->s[i] ^= ks->key[0].ks[i];
117  }
118  i = 1;
119  for (; rounds > 1; --rounds) {
120  aes_enc_round(state, &(ks->key[i]));
121  ++i;
122  }
123  aes_enc_lastround(state, &(ks->key[i]));
124 }
125 
126 void aes128_enc(void *buffer, aes128_ctx_t *ctx)
127 {
128  aes_encrypt_core(buffer, (aes_genctx_t*) ctx, 10);
129 }
130 
131 void aes192_enc(void *buffer, aes192_ctx_t *ctx)
132 {
133  aes_encrypt_core(buffer, (aes_genctx_t*) ctx, 12);
134 }
135 
136 void aes256_enc(void *buffer, aes256_ctx_t *ctx){
137  aes_encrypt_core(buffer, (aes_genctx_t*)ctx, 14);
138 }
void aes256_enc(void *buffer, aes256_ctx_t *ctx)
encrypt with 256 bit key.
Definition: aes_enc.c:136
void aes128_enc(void *buffer, aes128_ctx_t *ctx)
encrypt with 128 bit key.
Definition: aes_enc.c:126
void aes192_enc(void *buffer, aes192_ctx_t *ctx)
encrypt with 192 bit key.
Definition: aes_enc.c:131