]>
git.saurik.com Git - apple/security.git/blob - AppleCSP/AES/rijndaelApi.c
2 * Copyright (c) 2000-2001 Apple Computer, Inc. All Rights Reserved.
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
20 * rijndaelApi.c - AES API layer
22 * Based on rijndael-api-ref.h v2.0 written by Paulo Barreto
28 #include "rijndael-alg-ref.h"
29 #include "rijndaelApi.h"
32 /* this goes somewhere else and gets init'd by the plugin object.... */
33 /* as of 4/11/2001, the vectorized routines do NOT work */
41 static void dumpChainBuf(cipherInstance
*cipher
, char *op
)
44 int columns
= cipher
->blockLen
/ 32;
46 printf("chainBuf %s: ", op
);
47 for (j
= 0; j
< columns
; j
++) {
48 for(t
= 0; t
< 4; t
++) {
49 printf("%02x ", cipher
->chainBlock
[t
][j
]);
55 #define dumpChainBuf(c, o)
60 int keyLen
, // in BITS
61 int blockLen
, // in BITS
69 return BAD_KEY_INSTANCE
;
71 if(keyMaterial
== NULL
) {
74 if ((keyLen
== 128) || (keyLen
== 192) || (keyLen
== 256)) {
79 key
->blockLen
= blockLen
;
80 key
->columns
= blockLen
/ 32;
82 /* initialize key schedule */
83 #if !GLADMAN_AES_128_ENABLE
85 (keyLen
== MIN_AES_KEY_BITS
) &&
86 (blockLen
== MIN_AES_BLOCK_BITS
)) {
87 /* optimized, 128 bit key and block size */
88 word8 k
[4][KC_128_OPT
] __attribute__((aligned(4)));
90 for(i
= 0; i
< (MIN_AES_KEY_BITS
/8); i
++) {
92 k
[i
% 4][i
/ 4] = keyMaterial
[i
];
94 rijndaelKeySched128 (k
, key
->keySched
);
95 memset(k
, 0, 4 * KC_128_OPT
);
98 #endif /* !GLADMAN_AES_128_ENABLE */
104 keyBytes
= keyLen
/ 8;
105 for(i
= 0; i
< keyBytes
; i
++) {
106 k
[i
% 4][i
/ 4] = keyMaterial
[i
];
108 rijndaelKeySched (k
, key
->keyLen
, key
->blockLen
, key
->keySched
);
109 memset(k
, 0, 4 * MAXKC
);
115 * Simplified single-block encrypt/decrypt.
117 #define AES_CONSISTENCY_CHECK 1
119 int rijndaelBlockEncrypt(
125 word8 localBlock
[4][MAXBC
]; // working memory: encrypt/decrypt in place here
127 #if AES_CONSISTENCY_CHECK
129 (key
->keyLen
!= 128 && key
->keyLen
!= 192 && key
->keyLen
!= 256) ||
130 (key
->blockLen
!= 128 && key
->blockLen
!= 192 && key
->blockLen
!= 256)) {
131 return BAD_KEY_INSTANCE
;
133 #endif /* AES_CONSISTENCY_CHECK */
135 #if defined(__ppc__) && defined(ALTIVEC_ENABLE)
136 if(gHasAltivec
&& (key
->blockLen
== 128)) {
137 vBlockEncrypt128(key
, input
, outBuffer
);
142 for (j
= 0; j
< key
->columns
; j
++) {
143 for(t
= 0; t
< 4; t
++)
144 /* parse input stream into rectangular array */
145 localBlock
[t
][j
] = input
[4*j
+t
];
147 rijndaelEncrypt (localBlock
, key
->keyLen
, key
->blockLen
, key
->keySched
);
148 for (j
= 0; j
< key
->columns
; j
++) {
149 /* parse rectangular array into output ciphertext bytes */
150 for(t
= 0; t
< 4; t
++)
151 outBuffer
[4*j
+t
] = (word8
) localBlock
[t
][j
];
153 memset(localBlock
, 0, 4 * MAXBC
);
154 return key
->blockLen
;
157 int rijndaelBlockDecrypt(
163 word8 localBlock
[4][MAXBC
]; // working memory: encrypt/decrypt in place here
165 #if AES_CONSISTENCY_CHECK
167 (key
->keyLen
!= 128 && key
->keyLen
!= 192 && key
->keyLen
!= 256) ||
168 (key
->blockLen
!= 128 && key
->blockLen
!= 192 && key
->blockLen
!= 256)) {
169 return BAD_KEY_INSTANCE
;
171 #endif /* AES_CONSISTENCY_CHECK */
173 #if defined(__ppc__) && defined(ALTIVEC_ENABLE)
174 if(gHasAltivec
&& (cipher
->blockLen
== 128)) {
175 vBlockDecrypt128(key
, input
, outBuffer
);
180 for (j
= 0; j
< key
->columns
; j
++) {
181 for(t
= 0; t
< 4; t
++)
182 /* parse input stream into rectangular array */
183 localBlock
[t
][j
] = input
[4*j
+t
];
185 rijndaelDecrypt (localBlock
, key
->keyLen
, key
->blockLen
, key
->keySched
);
186 for (j
= 0; j
< key
->columns
; j
++) {
187 /* parse rectangular array into output ciphertext bytes */
188 for(t
= 0; t
< 4; t
++)
189 outBuffer
[4*j
+t
] = (word8
) localBlock
[t
][j
];
191 memset(localBlock
, 0, 4 * MAXBC
);
192 return key
->blockLen
;
195 #if !GLADMAN_AES_128_ENABLE
197 * Optimized routines for 128 bit block and 128 bit key.
199 int rijndaelBlockEncrypt128(
205 word8 localBlock
[4][BC_128_OPT
] __attribute__((aligned(4)));
206 word8
*row0
= localBlock
[0];
207 word8
*row1
= localBlock
[1];
208 word8
*row2
= localBlock
[2];
209 word8
*row3
= localBlock
[3];
211 /* parse input stream into rectangular array */
212 for (j
= 0; j
< BC_128_OPT
; j
++) {
218 rijndaelEncrypt128 (localBlock
, key
->keySched
);
220 /* parse rectangular array into output ciphertext bytes */
221 row0
= localBlock
[0];
222 row1
= localBlock
[1];
223 row2
= localBlock
[2];
224 row3
= localBlock
[3];
226 for (j
= 0; j
< BC_128_OPT
; j
++) {
227 *outBuffer
++ = *row0
++;
228 *outBuffer
++ = *row1
++;
229 *outBuffer
++ = *row2
++;
230 *outBuffer
++ = *row3
++;
232 memset(localBlock
, 0, 4*BC_128_OPT
);
233 return MIN_AES_BLOCK_BITS
;
236 int rijndaelBlockDecrypt128(
242 word8 localBlock
[4][BC_128_OPT
] __attribute__((aligned(4)));
243 word8
*row0
= localBlock
[0];
244 word8
*row1
= localBlock
[1];
245 word8
*row2
= localBlock
[2];
246 word8
*row3
= localBlock
[3];
248 /* parse input stream into rectangular array */
249 for (j
= 0; j
< BC_128_OPT
; j
++) {
256 rijndaelDecrypt128 (localBlock
, key
->keySched
);
258 /* parse rectangular array into output ciphertext bytes */
259 row0
= localBlock
[0];
260 row1
= localBlock
[1];
261 row2
= localBlock
[2];
262 row3
= localBlock
[3];
264 for (j
= 0; j
< BC_128_OPT
; j
++) {
265 *outBuffer
++ = *row0
++;
266 *outBuffer
++ = *row1
++;
267 *outBuffer
++ = *row2
++;
268 *outBuffer
++ = *row3
++;
270 memset(localBlock
, 0, 4*BC_128_OPT
);
271 return MIN_AES_BLOCK_BITS
;
273 #endif /* !GLADMAN_AES_128_ENABLE */