30 #define DISABLE_DEBUGLOG
34 #include <gwenhywfar/misc.h>
35 #include <gwenhywfar/debug.h>
36 #include <gwenhywfar/error.h>
37 #include <gwenhywfar/cryptdefs.h>
38 #include <gwenhywfar/text.h>
44 static uint8_t
nullarray[]={0, 0, 0, 0, 0, 0, 0, 0};
52 unsigned char leftNibble;
53 unsigned char rightNibble;
54 static const unsigned char lookUp[2][16] =
55 {{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15},
56 {14,3,5,8,9,4,2,15,0,13,11,6,7,10,12,1}};
58 rightNibble = input & 15;
59 leftNibble = input & 240;
60 leftNibble = leftNibble / 16;
61 rightNibble = lookUp[1][rightNibble];
62 leftNibble = lookUp[1][leftNibble];
63 leftNibble = leftNibble * 16;
65 return leftNibble + rightNibble;
78 unsigned char buffer[GWEN_PADD_ISO9796_KEYSIZE];
79 unsigned char hash[20];
103 memset(buffer, 0,
sizeof(buffer));
107 for (i=0; i<=47; i++) {
110 j1=1 +
sizeof(buffer) - (2*i);
112 j3=
sizeof(buffer) - (2*i);
114 if (j1>=0 && j1<(
int)
sizeof(buffer) && j2>=0) {
117 if (j3>=0 && j3<(
int)
sizeof(buffer) && j2>=0) {
123 memmove(buffer, buffer+(
sizeof(buffer)-16), 16);
127 c=p[
sizeof(buffer)-1];
130 p[
sizeof(buffer)-1]=c;
133 p[
sizeof(buffer) - 40] = p[
sizeof(buffer) - 40] ^ 1;
165 "Could not insert room for %d bytes",
175 for (i=0; i<diff; i++)
181 for (i=0; i<8; i++) {
228 unsigned char paddLength;
232 for (i=0; i<paddLength; i++)
241 unsigned int lastpos;
242 unsigned char paddLength;
253 if (paddLength<1 || paddLength>y) {
289 "Buffer contains too many bytes (diff is <11)");
304 memset(p, 0xff, diff-3);
328 "Buffer contains too many bytes (diff is <11)");
343 for (i=0; i<diff-3; i++) {
375 if (*p!=0x01 && *p!=0x02) {
383 while(*p!=0x00 && len) {
420 uint32_t lDestBuffer,
421 const uint8_t *pSeed,
424 uint32_t bytesLeft=lDestBuffer;
431 for (i=0; bytesLeft>0; i++) {
435 counter[0]= (uint8_t)((i>>24) & 0xff);
436 counter[1]= (uint8_t)((i>>16) & 0xff);
437 counter[2]= (uint8_t)((i>>8) & 0xff);
438 counter[3]= (uint8_t)(i & 0xff);
478 uint32_t lDestBuffer,
480 const uint8_t *pHash,
492 uint8_t hashMBar[64];
493 int numberOfBitsInByte0;
500 numberOfBitsInByte0=((nbits-1) & 0x07);
501 if (numberOfBitsInByte0==0) {
507 pSalt=(uint8_t*) malloc(lSalt);
553 pDB=(uint8_t*)malloc(emLen);
559 memmove(p, pSalt, lSalt);
564 pDbMask=(uint8_t*)malloc(x);
579 *(p++)=pDB[i] ^ pDbMask[i];
588 if (numberOfBitsInByte0)
589 pDestBuffer[0] &= 0xff >> (8-numberOfBitsInByte0);
603 const uint8_t *pHash,
608 const uint8_t *pSalt;
613 const uint8_t *hashMBar;
614 int numberOfBitsInByte0;
621 numberOfBitsInByte0=((nbits-1) & 0x07);
623 if (numberOfBitsInByte0==0) {
628 if (pSrcBuffer[0] & (0xff << numberOfBitsInByte0)) {
641 if (lSrcBuffer < emLen) {
650 pDB=(uint8_t*)malloc(x);
651 hashMBar=pSrcBuffer+x;
663 pDB[i] ^= pSrcBuffer[i];
666 if (numberOfBitsInByte0)
667 pDB[0] &= (0xff >> (8-numberOfBitsInByte0));
672 for (i=0; (i<(x-1) && pDB[i]==0); i++);
750 unsigned int dstSize;
751 unsigned int chunkSize;
758 if (aid==GWEN_Crypt_PaddAlgoId_None)
769 dstSize=bsize+(chunkSize-1);
770 dstSize=(dstSize/chunkSize)*chunkSize;
777 case GWEN_Crypt_PaddAlgoId_None:
781 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4:
784 "Padding size must be <=96 bytes (is %d)",
791 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
795 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
799 case GWEN_Crypt_PaddAlgoId_LeftZero:
803 case GWEN_Crypt_PaddAlgoId_RightZero:
807 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
810 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
813 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
843 case GWEN_Crypt_PaddAlgoId_None:
847 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
851 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
855 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
858 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
861 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
862 case GWEN_Crypt_PaddAlgoId_LeftZero:
863 case GWEN_Crypt_PaddAlgoId_RightZero:
864 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4: