rijndael-api-fst.c
上传用户:market2
上传日期:2018-11-18
资源大小:18786k
文件大小:11k
源码类别:

外挂编程

开发平台:

Windows_Unix

  1. /**
  2.  * rijndael-api-fst.c
  3.  *
  4.  * @version 2.9 (December 2000)
  5.  *
  6.  * Optimised ANSI C code for the Rijndael cipher (now AES)
  7.  *
  8.  * @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
  9.  * @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
  10.  * @author Paulo Barreto <paulo.barreto@terra.com.br>
  11.  *
  12.  * This code is hereby placed in the public domain.
  13.  *
  14.  * THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
  15.  * OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
  16.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  17.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
  18.  * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  19.  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
  20.  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  21.  * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  22.  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  23.  * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
  24.  * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  25.  *
  26.  * Acknowledgements:
  27.  *
  28.  * We are deeply indebted to the following people for their bug reports,
  29.  * fixes, and improvement suggestions to this implementation. Though we
  30.  * tried to list all contributions, we apologise in advance for any
  31.  * missing reference.
  32.  *
  33.  * Andrew Bales <Andrew.Bales@Honeywell.com>
  34.  * Markus Friedl <markus.friedl@informatik.uni-erlangen.de>
  35.  * John Skodon <skodonj@webquill.com>
  36.  */
  37. #include <assert.h>
  38. #include <stdlib.h>
  39. #include <string.h>
  40. #include "rijndael-alg-fst.h"
  41. #include "rijndael-api-fst.h"
  42. int makeKey(keyInstance *key, BYTE direction, int keyLen, char *keyMaterial) {
  43. int i;
  44. char *keyMat;
  45. u8 cipherKey[MAXKB];
  46. if (key == NULL) {
  47. return BAD_KEY_INSTANCE;
  48. }
  49. if ((direction == DIR_ENCRYPT) || (direction == DIR_DECRYPT)) {
  50. key->direction = direction;
  51. } else {
  52. return BAD_KEY_DIR;
  53. }
  54. if ((keyLen == 128) || (keyLen == 192) || (keyLen == 256)) {
  55. key->keyLen = keyLen;
  56. } else {
  57. return BAD_KEY_MAT;
  58. }
  59. if (keyMaterial != NULL) {
  60. strncpy(key->keyMaterial, keyMaterial, keyLen/4);
  61. }
  62. /* initialize key schedule: */
  63. keyMat = key->keyMaterial;
  64.   for (i = 0; i < key->keyLen/8; i++) {
  65. int t, v;
  66. t = *keyMat++;
  67. if ((t >= '0') && (t <= '9')) v = (t - '0') << 4;
  68. else if ((t >= 'a') && (t <= 'f')) v = (t - 'a' + 10) << 4;
  69. else if ((t >= 'A') && (t <= 'F')) v = (t - 'A' + 10) << 4;
  70. else return BAD_KEY_MAT;
  71. t = *keyMat++;
  72. if ((t >= '0') && (t <= '9')) v ^= (t - '0');
  73. else if ((t >= 'a') && (t <= 'f')) v ^= (t - 'a' + 10);
  74. else if ((t >= 'A') && (t <= 'F')) v ^= (t - 'A' + 10);
  75. else return BAD_KEY_MAT;
  76. cipherKey[i] = (u8)v;
  77. }
  78. if (direction == DIR_ENCRYPT) {
  79. key->Nr = rijndaelKeySetupEnc(key->rk, cipherKey, keyLen);
  80. } else {
  81. key->Nr = rijndaelKeySetupDec(key->rk, cipherKey, keyLen);
  82. }
  83. rijndaelKeySetupEnc(key->ek, cipherKey, keyLen);
  84. return TRUE;
  85. }
  86. int cipherInit(cipherInstance *cipher, BYTE mode, char *IV) {
  87. if ((mode == MODE_ECB) || (mode == MODE_CBC) || (mode == MODE_CFB1)) {
  88. cipher->mode = mode;
  89. } else {
  90. return BAD_CIPHER_MODE;
  91. }
  92. if (IV != NULL) {
  93. int i;
  94.   for (i = 0; i < MAX_IV_SIZE; i++) {
  95. int t, j;
  96. t = IV[2*i];
  97. if ((t >= '0') && (t <= '9')) j = (t - '0') << 4;
  98. else if ((t >= 'a') && (t <= 'f')) j = (t - 'a' + 10) << 4;
  99. else if ((t >= 'A') && (t <= 'F')) j = (t - 'A' + 10) << 4;
  100. else return BAD_CIPHER_INSTANCE;
  101. t = IV[2*i+1];
  102. if ((t >= '0') && (t <= '9')) j ^= (t - '0');
  103. else if ((t >= 'a') && (t <= 'f')) j ^= (t - 'a' + 10);
  104. else if ((t >= 'A') && (t <= 'F')) j ^= (t - 'A' + 10);
  105. else return BAD_CIPHER_INSTANCE;
  106. cipher->IV[i] = (u8)j;
  107. }
  108. } else {
  109. memset(cipher->IV, 0, MAX_IV_SIZE);
  110. }
  111. return TRUE;
  112. }
  113. int blockEncrypt(cipherInstance *cipher, keyInstance *key,
  114. BYTE *input, int inputLen, BYTE *outBuffer) {
  115. int i, k, t, numBlocks;
  116. u8 block[16], *iv;
  117. if (cipher == NULL ||
  118. key == NULL ||
  119. key->direction == DIR_DECRYPT) {
  120. return BAD_CIPHER_STATE;
  121. }
  122. if (input == NULL || inputLen <= 0) {
  123. return 0; /* nothing to do */
  124. }
  125. numBlocks = inputLen/128;
  126. switch (cipher->mode) {
  127. case MODE_ECB:
  128. for (i = numBlocks; i > 0; i--) {
  129. rijndaelEncrypt(key->rk, key->Nr, input, outBuffer);
  130. input += 16;
  131. outBuffer += 16;
  132. }
  133. break;
  134. case MODE_CBC:
  135. iv = cipher->IV;
  136. for (i = numBlocks; i > 0; i--) {
  137. ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0];
  138. ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1];
  139. ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2];
  140. ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3];
  141. rijndaelEncrypt(key->rk, key->Nr, block, outBuffer);
  142. iv = outBuffer;
  143. input += 16;
  144. outBuffer += 16;
  145. }
  146. break;
  147.     case MODE_CFB1:
  148. iv = cipher->IV;
  149.         for (i = numBlocks; i > 0; i--) {
  150. memcpy(outBuffer, input, 16);
  151.             for (k = 0; k < 128; k++) {
  152. rijndaelEncrypt(key->ek, key->Nr, iv, block);
  153.                 outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
  154.                 for (t = 0; t < 15; t++) {
  155.                  iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
  156.                 }
  157.                 iv[15] = (iv[15] << 1) | ((outBuffer[k >> 3] >> (7 - (k & 7))) & 1);
  158.             }
  159.             outBuffer += 16;
  160.             input += 16;
  161.         }
  162.         break;
  163. default:
  164. return BAD_CIPHER_STATE;
  165. }
  166. return 128*numBlocks;
  167. }
  168. /**
  169.  * Encrypt data partitioned in octets, using RFC 2040-like padding.
  170.  *
  171.  * @param   input           data to be encrypted (octet sequence)
  172.  * @param   inputOctets input length in octets (not bits)
  173.  * @param   outBuffer       encrypted output data
  174.  *
  175.  * @return length in octets (not bits) of the encrypted output buffer.
  176.  */
  177. int padEncrypt(cipherInstance *cipher, keyInstance *key,
  178. BYTE *input, int inputOctets, BYTE *outBuffer) {
  179. int i, numBlocks, padLen;
  180. u8 block[16], *iv;
  181. if (cipher == NULL ||
  182. key == NULL ||
  183. key->direction == DIR_DECRYPT) {
  184. return BAD_CIPHER_STATE;
  185. }
  186. if (input == NULL || inputOctets <= 0) {
  187. return 0; /* nothing to do */
  188. }
  189. numBlocks = inputOctets/16;
  190. switch (cipher->mode) {
  191. case MODE_ECB:
  192. for (i = numBlocks; i > 0; i--) {
  193. rijndaelEncrypt(key->rk, key->Nr, input, outBuffer);
  194. input += 16;
  195. outBuffer += 16;
  196. }
  197. padLen = 16 - (inputOctets - 16*numBlocks);
  198. assert(padLen > 0 && padLen <= 16);
  199. memcpy(block, input, 16 - padLen);
  200. memset(block + 16 - padLen, padLen, padLen);
  201. rijndaelEncrypt(key->rk, key->Nr, block, outBuffer);
  202. break;
  203. case MODE_CBC:
  204. iv = cipher->IV;
  205. for (i = numBlocks; i > 0; i--) {
  206. ((u32*)block)[0] = ((u32*)input)[0] ^ ((u32*)iv)[0];
  207. ((u32*)block)[1] = ((u32*)input)[1] ^ ((u32*)iv)[1];
  208. ((u32*)block)[2] = ((u32*)input)[2] ^ ((u32*)iv)[2];
  209. ((u32*)block)[3] = ((u32*)input)[3] ^ ((u32*)iv)[3];
  210. rijndaelEncrypt(key->rk, key->Nr, block, outBuffer);
  211. iv = outBuffer;
  212. input += 16;
  213. outBuffer += 16;
  214. }
  215. padLen = 16 - (inputOctets - 16*numBlocks);
  216. assert(padLen > 0 && padLen <= 16);
  217. for (i = 0; i < 16 - padLen; i++) {
  218. block[i] = input[i] ^ iv[i];
  219. }
  220. for (i = 16 - padLen; i < 16; i++) {
  221. block[i] = (BYTE)padLen ^ iv[i];
  222. }
  223. rijndaelEncrypt(key->rk, key->Nr, block, outBuffer);
  224. break;
  225. default:
  226. return BAD_CIPHER_STATE;
  227. }
  228. return 16*(numBlocks + 1);
  229. }
  230. int blockDecrypt(cipherInstance *cipher, keyInstance *key,
  231. BYTE *input, int inputLen, BYTE *outBuffer) {
  232. int i, k, t, numBlocks;
  233. u8 block[16], *iv;
  234. if ((cipher == NULL) ||
  235.     (key == NULL) ||
  236.     (cipher->mode != MODE_CFB1 && key->direction == DIR_ENCRYPT)) {
  237. return BAD_CIPHER_STATE;
  238. }
  239. if (input == NULL || inputLen <= 0) {
  240. return 0; /* nothing to do */
  241. }
  242. numBlocks = inputLen/128;
  243. switch (cipher->mode) {
  244. case MODE_ECB:
  245. for (i = numBlocks; i > 0; i--) {
  246. rijndaelDecrypt(key->rk, key->Nr, input, outBuffer);
  247. input += 16;
  248. outBuffer += 16;
  249. }
  250. break;
  251. case MODE_CBC:
  252. iv = cipher->IV;
  253. for (i = numBlocks; i > 0; i--) {
  254. rijndaelDecrypt(key->rk, key->Nr, input, block);
  255. ((u32*)block)[0] ^= ((u32*)iv)[0];
  256. ((u32*)block)[1] ^= ((u32*)iv)[1];
  257. ((u32*)block)[2] ^= ((u32*)iv)[2];
  258. ((u32*)block)[3] ^= ((u32*)iv)[3];
  259. memcpy(cipher->IV, input, 16);
  260. memcpy(outBuffer, block, 16);
  261. input += 16;
  262. outBuffer += 16;
  263. }
  264. break;
  265.     case MODE_CFB1:
  266. iv = cipher->IV;
  267.         for (i = numBlocks; i > 0; i--) {
  268. memcpy(outBuffer, input, 16);
  269.             for (k = 0; k < 128; k++) {
  270. rijndaelEncrypt(key->ek, key->Nr, iv, block);
  271.                 for (t = 0; t < 15; t++) {
  272.                  iv[t] = (iv[t] << 1) | (iv[t + 1] >> 7);
  273.                 }
  274.                 iv[15] = (iv[15] << 1) | ((input[k >> 3] >> (7 - (k & 7))) & 1);
  275.                 outBuffer[k >> 3] ^= (block[0] & 0x80U) >> (k & 7);
  276.             }
  277.             outBuffer += 16;
  278.             input += 16;
  279.         }
  280.         break;
  281. default:
  282. return BAD_CIPHER_STATE;
  283. }
  284. return 128*numBlocks;
  285. }
  286. int padDecrypt(cipherInstance *cipher, keyInstance *key,
  287. BYTE *input, int inputOctets, BYTE *outBuffer) {
  288. int i, numBlocks, padLen;
  289. u8 block[16];
  290. if (cipher == NULL ||
  291. key == NULL ||
  292. key->direction == DIR_ENCRYPT) {
  293. return BAD_CIPHER_STATE;
  294. }
  295. if (input == NULL || inputOctets <= 0) {
  296. return 0; /* nothing to do */
  297. }
  298. if (inputOctets % 16 != 0) {
  299. return BAD_DATA;
  300. }
  301. numBlocks = inputOctets/16;
  302. switch (cipher->mode) {
  303. case MODE_ECB:
  304. /* all blocks but last */
  305. for (i = numBlocks - 1; i > 0; i--) {
  306. rijndaelDecrypt(key->rk, key->Nr, input, outBuffer);
  307. input += 16;
  308. outBuffer += 16;
  309. }
  310. /* last block */
  311. rijndaelDecrypt(key->rk, key->Nr, input, block);
  312. padLen = block[15];
  313. if (padLen >= 16) {
  314. return BAD_DATA;
  315. }
  316. for (i = 16 - padLen; i < 16; i++) {
  317. if (block[i] != padLen) {
  318. return BAD_DATA;
  319. }
  320. }
  321. memcpy(outBuffer, block, 16 - padLen);
  322. break;
  323. case MODE_CBC:
  324. /* all blocks but last */
  325. for (i = numBlocks - 1; i > 0; i--) {
  326. rijndaelDecrypt(key->rk, key->Nr, input, block);
  327. ((u32*)block)[0] ^= ((u32*)cipher->IV)[0];
  328. ((u32*)block)[1] ^= ((u32*)cipher->IV)[1];
  329. ((u32*)block)[2] ^= ((u32*)cipher->IV)[2];
  330. ((u32*)block)[3] ^= ((u32*)cipher->IV)[3];
  331. memcpy(cipher->IV, input, 16);
  332. memcpy(outBuffer, block, 16);
  333. input += 16;
  334. outBuffer += 16;
  335. }
  336. /* last block */
  337. rijndaelDecrypt(key->rk, key->Nr, input, block);
  338. ((u32*)block)[0] ^= ((u32*)cipher->IV)[0];
  339. ((u32*)block)[1] ^= ((u32*)cipher->IV)[1];
  340. ((u32*)block)[2] ^= ((u32*)cipher->IV)[2];
  341. ((u32*)block)[3] ^= ((u32*)cipher->IV)[3];
  342. padLen = block[15];
  343. if (padLen <= 0 || padLen > 16) {
  344. return BAD_DATA;
  345. }
  346. for (i = 16 - padLen; i < 16; i++) {
  347. if (block[i] != padLen) {
  348. return BAD_DATA;
  349. }
  350. }
  351. memcpy(outBuffer, block, 16 - padLen);
  352. break;
  353. default:
  354. return BAD_CIPHER_STATE;
  355. }
  356. return 16*numBlocks - padLen;
  357. }
  358. #ifdef INTERMEDIATE_VALUE_KAT
  359. /**
  360.  * cipherUpdateRounds:
  361.  *
  362.  * Encrypts/Decrypts exactly one full block a specified number of rounds.
  363.  * Only used in the Intermediate Value Known Answer Test.
  364.  *
  365.  * Returns:
  366.  * TRUE - on success
  367.  * BAD_CIPHER_STATE - cipher in bad state (e.g., not initialized)
  368.  */
  369. int cipherUpdateRounds(cipherInstance *cipher, keyInstance *key,
  370. BYTE *input, int inputLen, BYTE *outBuffer, int rounds) {
  371. u8 block[16];
  372. if (cipher == NULL || key == NULL) {
  373. return BAD_CIPHER_STATE;
  374. }
  375. memcpy(block, input, 16);
  376. switch (key->direction) {
  377. case DIR_ENCRYPT:
  378. rijndaelEncryptRound(key->rk, key->Nr, block, rounds);
  379. break;
  380. case DIR_DECRYPT:
  381. rijndaelDecryptRound(key->rk, key->Nr, block, rounds);
  382. break;
  383. default:
  384. return BAD_KEY_DIR;
  385. memcpy(outBuffer, block, 16);
  386. return TRUE;
  387. }
  388. #endif /* INTERMEDIATE_VALUE_KAT */