#include <stdio.h>
#include "rijndael-alg-fst.h"
rijndael-api-fst.hのインクルード依存関係図
このグラフは、どのファイルから直接、間接的にインクルードされているかを示しています。
構成 | |
struct | keyInstance |
struct | cipherInstance |
マクロ定義 | |
#define | DIR_ENCRYPT 0 /* Are we encrpyting? */ |
rijndael-api-fst.h | |
#define | DIR_DECRYPT 1 /* Are we decrpyting? */ |
#define | MODE_ECB 1 /* Are we ciphering in ECB mode? */ |
#define | MODE_CBC 2 /* Are we ciphering in CBC mode? */ |
#define | MODE_CFB1 3 /* Are we ciphering in 1-bit CFB mode? */ |
#define | TRUE 1 |
#define | FALSE 0 |
#define | BITSPERBLOCK 128 /* Default number of bits in a cipher block */ |
#define | BAD_KEY_DIR -1 /* Key direction is invalid, e.g., unknown value */ |
#define | BAD_KEY_MAT -2 /* Key material not of correct length */ |
#define | BAD_KEY_INSTANCE -3 /* Key passed is not valid */ |
#define | BAD_CIPHER_MODE -4 /* Params struct passed to cipherInit invalid */ |
#define | BAD_CIPHER_STATE -5 /* Cipher in wrong state (e.g., not initialized) */ |
#define | BAD_BLOCK_LENGTH -6 |
#define | BAD_CIPHER_INSTANCE -7 |
#define | BAD_DATA -8 /* Data contents are invalid, e.g., invalid padding */ |
#define | BAD_OTHER -9 /* Unknown error */ |
#define | MAX_KEY_SIZE 64 /* # of ASCII char's needed to represent a key */ |
#define | MAX_IV_SIZE 16 /* # bytes needed to represent an IV */ |
型定義 | |
typedef unsigned char | BYTE |
関数 | |
int | makeKey (keyInstance *key, BYTE direction, int keyLen, char *keyMaterial) |
rijndael-api-fst.c | |
int | cipherInit (cipherInstance *cipher, BYTE mode, char *IV) |
int | blockEncrypt (cipherInstance *cipher, keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer) |
int | padEncrypt (cipherInstance *cipher, keyInstance *key, BYTE *input, int inputOctets, BYTE *outBuffer) |
Encrypt data partitioned in octets, using RFC 2040-like padding. | |
int | blockDecrypt (cipherInstance *cipher, keyInstance *key, BYTE *input, int inputLen, BYTE *outBuffer) |
int | padDecrypt (cipherInstance *cipher, keyInstance *key, BYTE *input, int inputOctets, BYTE *outBuffer) |
|
rijndael-api-fst.h の 71 行で定義されています。 |
|
rijndael-api-fst.h の 72 行で定義されています。 参照元 cipherInit(). |
|
rijndael-api-fst.h の 67 行で定義されています。 参照元 cipherInit(). |
|
rijndael-api-fst.h の 69 行で定義されています。 参照元 blockDecrypt(), blockEncrypt(), padDecrypt(), と padEncrypt(). |
|
rijndael-api-fst.h の 73 行で定義されています。 参照元 padDecrypt(). |
|
rijndael-api-fst.h の 61 行で定義されています。 参照元 makeKey(). |
|
rijndael-api-fst.h の 65 行で定義されています。 参照元 makeKey(). |
|
rijndael-api-fst.h の 63 行で定義されています。 参照元 makeKey(). |
|
rijndael-api-fst.h の 75 行で定義されています。 |
|
rijndael-api-fst.h の 57 行で定義されています。 |
|
rijndael-api-fst.h の 47 行で定義されています。 参照元 blockEncrypt(), makeKey(), と padEncrypt(). |
|
rijndael-api-fst.h
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Acknowledgements: We are deeply indebted to the following people for their bug reports, fixes, and improvement suggestions to this implementation. Though we tried to list all contributions, we apologise in advance for any missing reference. Andrew Bales <Andrew.Bales@Honeywell.com> Markus Friedl <markus.friedl@informatik.uni-erlangen.de> John Skodon <skodonj@webquill.com> rijndael-api-fst.h の 45 行で定義されています。 参照元 blockDecrypt(), makeKey(), と padDecrypt(). |
|
rijndael-api-fst.h の 56 行で定義されています。 |
|
rijndael-api-fst.h の 81 行で定義されています。 参照元 cipherInit(). |
|
rijndael-api-fst.h の 79 行で定義されています。 |
|
rijndael-api-fst.h の 51 行で定義されています。 参照元 blockDecrypt(), blockEncrypt(), cipherInit(), padDecrypt(), と padEncrypt(). |
|
rijndael-api-fst.h の 53 行で定義されています。 参照元 blockDecrypt(), blockEncrypt(), と cipherInit(). |
|
rijndael-api-fst.h の 49 行で定義されています。 参照元 blockDecrypt(), blockEncrypt(), cipherInit(), padDecrypt(), と padEncrypt(). |
|
rijndael-api-fst.h の 55 行で定義されています。 |
|
rijndael-api-fst.h の 89 行で定義されています。 |
|
rijndael-api-fst.c の 269 行で定義されています。 参照先 BAD_CIPHER_STATE, BYTE, DIR_ENCRYPT, keyInstance::direction, keyInstance::ek, cipherInstance::IV, cipherInstance::mode, MODE_CBC, MODE_CFB1, MODE_ECB, keyInstance::Nr, NULL, rijndaelDecrypt(), rijndaelEncrypt(), keyInstance::rk, u32, と u8. 参照元 dkcRijndaelBlockDecrypt().
00270 { 00271 int i, k, t, numBlocks; 00272 u8 block[16], *iv; 00273 00274 if (cipher == NULL || 00275 key == NULL || 00276 cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT) { 00277 return BAD_CIPHER_STATE; 00278 } 00279 if (input == NULL || inputLen <= 0) { 00280 return 0; /* nothing to do */ 00281 } 00282 00283 numBlocks = inputLen/128; 00284 00285 switch (cipher->mode) { 00286 case MODE_ECB: 00287 for (i = numBlocks; i > 0; i--) { 00288 rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); 00289 input += 16; 00290 outBuffer += 16; 00291 } 00292 break; 00293 00294 case MODE_CBC: 00295 iv = cipher->IV; 00296 for (i = numBlocks; i > 0; i--) { 00297 rijndaelDecrypt(key->rk, key->Nr, input, block); 00298 ((u32*)block)[0] ^= ((u32*)iv)[0]; 00299 ((u32*)block)[1] ^= ((u32*)iv)[1]; 00300 ((u32*)block)[2] ^= ((u32*)iv)[2]; 00301 ((u32*)block)[3] ^= ((u32*)iv)[3]; 00302 memcpy(cipher->IV, input, 16); 00303 memcpy(outBuffer, block, 16); 00304 input += 16; 00305 outBuffer += 16; 00306 } 00307 break; 00308 00309 case MODE_CFB1: 00310 iv = cipher->IV; 00311 for (i = numBlocks; i > 0; i--) { 00312 memcpy(outBuffer, input, 16); 00313 for (k = 0; k < 128; k++) { 00314 rijndaelEncrypt(key->ek, key->Nr, iv, block); 00315 for (t = 0; t < 15; t++) { 00316 //d金魚改:(u8)でくくった 00317 iv[t] = (u8)( (iv[t] << 1) | (iv[t + 1] >> 7) ); 00318 } 00319 //d金魚改:(u8)でくくった 00320 iv[15] = (u8)( (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1) ); 00321 outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7); 00322 } 00323 outBuffer += 16; 00324 input += 16; 00325 } 00326 break; 00327 00328 default: 00329 return BAD_CIPHER_STATE; 00330 } 00331 00332 return 128*numBlocks; 00333 } |
|
rijndael-api-fst.c の 133 行で定義されています。 参照先 BAD_CIPHER_STATE, BYTE, DIR_DECRYPT, keyInstance::direction, keyInstance::ek, cipherInstance::IV, cipherInstance::mode, MODE_CBC, MODE_CFB1, MODE_ECB, keyInstance::Nr, NULL, rijndaelEncrypt(), keyInstance::rk, u32, と u8. 参照元 dkcRijndaelBlockEncrypt().
00134 { 00135 int i, k, t, numBlocks; 00136 u8 block[16], *iv; 00137 00138 if (cipher == NULL || 00139 key == NULL || 00140 key->direction == DIR_DECRYPT) { 00141 return BAD_CIPHER_STATE; 00142 } 00143 if (input == NULL || inputLen <= 0) { 00144 return 0; /* nothing to do */ 00145 } 00146 00147 numBlocks = inputLen/128; 00148 00149 switch (cipher->mode) { 00150 case MODE_ECB: 00151 for (i = numBlocks; i > 0; i--) { 00152 rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); 00153 input += 16; 00154 outBuffer += 16; 00155 } 00156 break; 00157 00158 case MODE_CBC: 00159 iv = cipher->IV; 00160 for (i = numBlocks; i > 0; i--) { 00161 ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0]; 00162 ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1]; 00163 ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2]; 00164 ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3]; 00165 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 00166 iv = outBuffer; 00167 input += 16; 00168 outBuffer += 16; 00169 } 00170 break; 00171 00172 case MODE_CFB1: 00173 iv = cipher->IV; 00174 for (i = numBlocks; i > 0; i--) { 00175 memcpy(outBuffer, input, 16); 00176 for (k = 0; k < 128; k++) { 00177 rijndaelEncrypt(key->ek, key->Nr, iv, block); 00178 outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7); 00179 for (t = 0; t < 15; t++) { 00180 //d金魚改:大丈夫かな?by d金魚 00181 iv[t] = (u8)((iv[t] << 1) | (iv[t + 1] >> 7)); 00182 } 00183 //d金魚改:(u8)でくくった 00184 iv[15] = (u8)( (iv[15] << 1) | ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1) ); 00185 } 00186 outBuffer += 16; 00187 input += 16; 00188 } 00189 break; 00190 00191 default: 00192 return BAD_CIPHER_STATE; 00193 } 00194 00195 return 128*numBlocks; 00196 } |
|
rijndael-api-fst.c の 102 行で定義されています。 参照先 BAD_CIPHER_INSTANCE, BAD_CIPHER_MODE, BYTE, cipherInstance::IV, MAX_IV_SIZE, cipherInstance::mode, MODE_CBC, MODE_CFB1, MODE_ECB, NULL, TRUE, と u8.
00102 { 00103 if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) { 00104 cipher->mode = mode; 00105 } else { 00106 return BAD_CIPHER_MODE; 00107 } 00108 if (IV != NULL) { 00109 int i; 00110 for (i = 0; i < MAX_IV_SIZE; i++) { 00111 int t, j; 00112 00113 t = IV[2*i]; 00114 if ((t >= '0') && (t <= '9')) j = (t - '0') << 4; 00115 else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4; 00116 else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4; 00117 else return BAD_CIPHER_INSTANCE; 00118 00119 t = IV[2*i+1]; 00120 if ((t >= '0') && (t <= '9')) j ^= (t - '0'); 00121 else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10); 00122 else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10); 00123 else return BAD_CIPHER_INSTANCE; 00124 00125 cipher->IV[i] = (u8)j; 00126 } 00127 } else { 00128 memset(cipher->IV, 0, MAX_IV_SIZE); 00129 } 00130 return TRUE; 00131 } |
|
rijndael-api-fst.c
THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. Acknowledgements: We are deeply indebted to the following people for their bug reports, fixes, and improvement suggestions to this implementation. Though we tried to list all contributions, we apologise in advance for any missing reference. Andrew Bales <Andrew.Bales@Honeywell.com> Markus Friedl <markus.friedl@informatik.uni-erlangen.de> John Skodon <skodonj@webquill.com> rijndael-api-fst.c の 49 行で定義されています。 参照先 BAD_KEY_DIR, BAD_KEY_INSTANCE, BAD_KEY_MAT, BYTE, DIR_DECRYPT, DIR_ENCRYPT, keyInstance::direction, keyInstance::ek, keyInstance::keyLen, keyInstance::keyMaterial, MAXKB, keyInstance::Nr, NULL, rijndaelKeySetupDec(), rijndaelKeySetupEnc(), keyInstance::rk, TRUE, と u8.
00049 { 00050 int i; 00051 char *keyMat; 00052 u8 cipherKey[MAXKB]; 00053 00054 if (key == NULL) { 00055 return BAD_KEY_INSTANCE; 00056 } 00057 00058 if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) { 00059 key->direction = direction; 00060 } else { 00061 return BAD_KEY_DIR; 00062 } 00063 00064 if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) { 00065 key->keyLen = keyLen; 00066 } else { 00067 return BAD_KEY_MAT; 00068 } 00069 00070 if (keyMaterial != NULL) { 00071 strncpy(key->keyMaterial, keyMaterial, keyLen/4); 00072 } 00073 00074 /* initialize key schedule: */ 00075 keyMat = key->keyMaterial; 00076 for (i = 0; i < key->keyLen/8; i++) { 00077 int t, v; 00078 00079 t = *keyMat++; 00080 if ((t >= '0') && (t <= '9')) v = (t - '0') << 4; 00081 else if ((t >= 'a') && (t <= 'f')) v = (t - 'a' + 10) << 4; 00082 else if ((t >= 'A') && (t <= 'F')) v = (t - 'A' + 10) << 4; 00083 else return BAD_KEY_MAT; 00084 00085 t = *keyMat++; 00086 if ((t >= '0') && (t <= '9')) v ^= (t - '0'); 00087 else if ((t >= 'a') && (t <= 'f')) v ^= (t - 'a' + 10); 00088 else if ((t >= 'A') && (t <= 'F')) v ^= (t - 'A' + 10); 00089 else return BAD_KEY_MAT; 00090 00091 cipherKey[i] = (u8)v; 00092 } 00093 if (direction == DIR_ENCRYPT) { 00094 key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen); 00095 } else { 00096 key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen); 00097 } 00098 rijndaelKeySetupEnc(key->ek, cipherKey, keyLen); 00099 return TRUE; 00100 } |
|
rijndael-api-fst.c の 335 行で定義されています。 参照先 BAD_CIPHER_STATE, BAD_DATA, BYTE, DIR_ENCRYPT, keyInstance::direction, cipherInstance::IV, cipherInstance::mode, MODE_CBC, MODE_ECB, keyInstance::Nr, NULL, rijndaelDecrypt(), keyInstance::rk, u32, と u8.
00336 { 00337 int i, numBlocks, padLen; 00338 u8 block[16]; 00339 00340 if (cipher == NULL || 00341 key == NULL || 00342 key->direction == DIR_ENCRYPT) { 00343 return BAD_CIPHER_STATE; 00344 } 00345 if (input == NULL || inputOctets <= 0) { 00346 return 0; /* nothing to do */ 00347 } 00348 if (inputOctets % 16 != 0) { 00349 return BAD_DATA; 00350 } 00351 00352 numBlocks = inputOctets/16; 00353 00354 switch (cipher->mode) { 00355 case MODE_ECB: 00356 /* all blocks but last */ 00357 for (i = numBlocks - 1; i > 0; i--) { 00358 rijndaelDecrypt(key->rk, key->Nr, input, outBuffer); 00359 input += 16; 00360 outBuffer += 16; 00361 } 00362 /* last block */ 00363 rijndaelDecrypt(key->rk, key->Nr, input, block); 00364 padLen = block[15]; 00365 if (padLen >= 16) { 00366 return BAD_DATA; 00367 } 00368 for (i = 16 - padLen; i < 16; i++) { 00369 if (block[i] != padLen) { 00370 return BAD_DATA; 00371 } 00372 } 00373 memcpy(outBuffer, block, 16 - padLen); 00374 break; 00375 00376 case MODE_CBC: 00377 /* all blocks but last */ 00378 for (i = numBlocks - 1; i > 0; i--) { 00379 rijndaelDecrypt(key->rk, key->Nr, input, block); 00380 ((u32*)block)[0] ^= ((u32*)cipher->IV)[0]; 00381 ((u32*)block)[1] ^= ((u32*)cipher->IV)[1]; 00382 ((u32*)block)[2] ^= ((u32*)cipher->IV)[2]; 00383 ((u32*)block)[3] ^= ((u32*)cipher->IV)[3]; 00384 memcpy(cipher->IV, input, 16); 00385 memcpy(outBuffer, block, 16); 00386 input += 16; 00387 outBuffer += 16; 00388 } 00389 /* last block */ 00390 rijndaelDecrypt(key->rk, key->Nr, input, block); 00391 ((u32*)block)[0] ^= ((u32*)cipher->IV)[0]; 00392 ((u32*)block)[1] ^= ((u32*)cipher->IV)[1]; 00393 ((u32*)block)[2] ^= ((u32*)cipher->IV)[2]; 00394 ((u32*)block)[3] ^= ((u32*)cipher->IV)[3]; 00395 padLen = block[15]; 00396 if (padLen <= 0 || padLen > 16) { 00397 return BAD_DATA; 00398 } 00399 for (i = 16 - padLen; i < 16; i++) { 00400 if (block[i] != padLen) { 00401 return BAD_DATA; 00402 } 00403 } 00404 memcpy(outBuffer, block, 16 - padLen); 00405 break; 00406 00407 default: 00408 return BAD_CIPHER_STATE; 00409 } 00410 00411 return 16*numBlocks - padLen; 00412 } |
|
Encrypt data partitioned in octets, using RFC 2040-like padding.
rijndael-api-fst.c の 207 行で定義されています。 参照先 BAD_CIPHER_STATE, BYTE, DIR_DECRYPT, keyInstance::direction, cipherInstance::IV, cipherInstance::mode, MODE_CBC, MODE_ECB, keyInstance::Nr, NULL, rijndaelEncrypt(), keyInstance::rk, u32, と u8.
00208 { 00209 int i, numBlocks, padLen; 00210 u8 block[16], *iv; 00211 00212 if (cipher == NULL || 00213 key == NULL || 00214 key->direction == DIR_DECRYPT) { 00215 return BAD_CIPHER_STATE; 00216 } 00217 if (input == NULL || inputOctets <= 0) { 00218 return 0; /* nothing to do */ 00219 } 00220 00221 numBlocks = inputOctets/16; 00222 00223 switch (cipher->mode) { 00224 case MODE_ECB: 00225 for (i = numBlocks; i > 0; i--) { 00226 rijndaelEncrypt(key->rk, key->Nr, input, outBuffer); 00227 input += 16; 00228 outBuffer += 16; 00229 } 00230 padLen = 16 - (inputOctets - 16*numBlocks); 00231 assert(padLen > 0 && padLen <= 16); 00232 memcpy(block, input, 16 - padLen); 00233 memset(block + 16 - padLen, padLen, padLen); 00234 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 00235 break; 00236 00237 case MODE_CBC: 00238 iv = cipher->IV; 00239 for (i = numBlocks; i > 0; i--) { 00240 ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0]; 00241 ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1]; 00242 ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2]; 00243 ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3]; 00244 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 00245 iv = outBuffer; 00246 input += 16; 00247 outBuffer += 16; 00248 } 00249 padLen = 16 - (inputOctets - 16*numBlocks); 00250 assert(padLen > 0 && padLen <= 16); 00251 for (i = 0; i < 16 - padLen; i++) { 00252 //d金魚改:(u8)でくくった 00253 block[i] = (u8)(input[i] ^ iv[i]); 00254 } 00255 for (i = 16 - padLen; i < 16; i++) { 00256 //d金魚改:(u8)でくくった 00257 block[i] = (u8)( (u8)padLen ^ iv[i] ); 00258 } 00259 rijndaelEncrypt(key->rk, key->Nr, block, outBuffer); 00260 break; 00261 00262 default: 00263 return BAD_CIPHER_STATE; 00264 } 00265 00266 return 16*(numBlocks + 1); 00267 } |