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}
59 rightNibble = input & 15;
60 leftNibble = input & 240;
61 leftNibble = leftNibble / 16;
62 rightNibble = lookUp[1][rightNibble];
63 leftNibble = lookUp[1][leftNibble];
64 leftNibble = leftNibble * 16;
66 return leftNibble + rightNibble;
79 unsigned char buffer[GWEN_PADD_ISO9796_KEYSIZE];
80 unsigned char hash[20];
104 memset(buffer, 0,
sizeof(buffer));
108 for (i=0; i<=47; i++) {
111 j1=1 +
sizeof(buffer) - (2*i);
113 j3=
sizeof(buffer) - (2*i);
115 if (j1>=0 && j1<(
int)
sizeof(buffer) && j2>=0) {
118 if (j3>=0 && j3<(
int)
sizeof(buffer) && j2>=0) {
124 memmove(buffer, buffer+(
sizeof(buffer)-16), 16);
128 c=p[
sizeof(buffer)-1];
131 p[
sizeof(buffer)-1]=c;
134 p[
sizeof(buffer) - 40] = p[
sizeof(buffer) - 40] ^ 1;
166 "Could not insert room for %d bytes",
176 for (i=0; i<diff; i++)
182 for (i=0; i<8; i++) {
229 unsigned char paddLength;
233 for (i=0; i<paddLength; i++)
242 unsigned int lastpos;
243 unsigned char paddLength;
254 if (paddLength<1 || paddLength>y) {
290 "Buffer contains too many bytes (diff is <11)");
305 memset(p, 0xff, diff-3);
329 "Buffer contains too many bytes (diff is <11)");
344 for (i=0; i<diff-3; i++) {
376 if (*p!=0x01 && *p!=0x02) {
385 while(*p!=0x00 && len) {
424 uint32_t lDestBuffer,
425 const uint8_t *pSeed,
428 uint32_t bytesLeft=lDestBuffer;
435 for (i=0; bytesLeft>0; i++) {
439 counter[0]= (uint8_t)((i>>24) & 0xff);
440 counter[1]= (uint8_t)((i>>16) & 0xff);
441 counter[2]= (uint8_t)((i>>8) & 0xff);
442 counter[3]= (uint8_t)(i & 0xff);
482 uint32_t lDestBuffer,
484 const uint8_t *pHash,
496 uint8_t hashMBar[64];
497 int numberOfBitsInByte0;
504 numberOfBitsInByte0=((nbits-1) & 0x07);
505 if (numberOfBitsInByte0==0) {
511 pSalt=(uint8_t*) malloc(lSalt);
557 pDB=(uint8_t*)malloc(emLen);
563 memmove(p, pSalt, lSalt);
568 pDbMask=(uint8_t*)malloc(x);
583 *(p++)=pDB[i] ^ pDbMask[i];
592 if (numberOfBitsInByte0)
593 pDestBuffer[0] &= 0xff >> (8-numberOfBitsInByte0);
607 const uint8_t *pHash,
612 const uint8_t *pSalt;
617 const uint8_t *hashMBar;
618 int numberOfBitsInByte0;
625 numberOfBitsInByte0=((nbits-1) & 0x07);
627 if (numberOfBitsInByte0==0) {
632 if (pSrcBuffer[0] & (0xff << numberOfBitsInByte0)) {
645 if (lSrcBuffer < emLen) {
654 pDB=(uint8_t*)malloc(x);
655 hashMBar=pSrcBuffer+x;
667 pDB[i] ^= pSrcBuffer[i];
670 if (numberOfBitsInByte0)
671 pDB[0] &= (0xff >> (8-numberOfBitsInByte0));
676 for (i=0; (i<(x-1) && pDB[i]==0); i++);
754 unsigned int dstSize;
755 unsigned int chunkSize;
762 if (aid==GWEN_Crypt_PaddAlgoId_None)
773 dstSize=bsize+(chunkSize-1);
774 dstSize=(dstSize/chunkSize)*chunkSize;
781 case GWEN_Crypt_PaddAlgoId_None:
785 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4:
788 "Padding size must be <=96 bytes (is %d)",
795 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
799 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
803 case GWEN_Crypt_PaddAlgoId_LeftZero:
807 case GWEN_Crypt_PaddAlgoId_RightZero:
811 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
814 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
817 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
847 case GWEN_Crypt_PaddAlgoId_None:
851 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
855 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
859 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
862 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
865 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
866 case GWEN_Crypt_PaddAlgoId_LeftZero:
867 case GWEN_Crypt_PaddAlgoId_RightZero:
868 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4:
int GWEN_Buffer_FillLeftWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
int GWEN_Crypt_PaddAlgo_GetPaddSize(const GWEN_CRYPT_PADDALGO *a)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Padd_PaddWithAnsiX9_23ToMultipleOf(GWEN_BUFFER *src, int y)
int GWEN_Padd_UnpaddWithPkcs1Bt2(GWEN_BUFFER *src)
int GWEN_Padd__UnpaddWithPkcs1Bt1Or2(GWEN_BUFFER *buf)
int GWEN_Padd_MGF1(uint8_t *pDestBuffer, uint32_t lDestBuffer, const uint8_t *pSeed, uint32_t lSeed, GWEN_MDIGEST *md)
#define GWEN_ERROR_INVALID
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
int GWEN_Padd_PaddWithISO9796(GWEN_BUFFER *src)
struct GWEN_CRYPT_PADDALGO GWEN_CRYPT_PADDALGO
int GWEN_Padd_PaddWithPkcs1Bt1(GWEN_BUFFER *buf, int dstSize)
int GWEN_Buffer_FillWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
int GWEN_Padd_UnapplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWEN_Padd_PaddWithPkcs1Bt2(GWEN_BUFFER *buf, int dstSize)
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
#define GWEN_ERROR_BAD_DATA
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
static uint8_t nullarray[]
int GWEN_Padd_UnpaddWithIso9796_2(GWEN_BUFFER *buf)
unsigned char GWEN_Padd_permutate(unsigned char input)
int GWEN_Padd_PaddWithAnsiX9_23(GWEN_BUFFER *src)
#define GWEN_ERROR_GENERIC
int GWEN_Padd_UnpaddWithAnsiX9_23FromMultipleOf(GWEN_BUFFER *src, int y)
int GWEN_Padd_ApplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
struct GWEN_MDIGEST GWEN_MDIGEST
const char * GWEN_Crypt_PaddAlgoId_toString(GWEN_CRYPT_PADDALGOID a)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
GWEN_CRYPT_PADDALGOID GWEN_Crypt_PaddAlgo_GetId(const GWEN_CRYPT_PADDALGO *a)
int GWEN_Padd_PaddWithIso9796_2(GWEN_BUFFER *buf, int dstSize)
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
void GWEN_Crypt_Random(int quality, uint8_t *buffer, uint32_t len)
int GWEN_MDigest_End(GWEN_MDIGEST *md)
#define DBG_ERROR(dbg_logger, format, args...)
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
int GWEN_Padd_AddPkcs1Pss(uint8_t *pDestBuffer, uint32_t lDestBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
int GWEN_Padd_UnpaddWithPkcs1Bt1(GWEN_BUFFER *src)
#define DBG_INFO(dbg_logger, format, args...)
int GWEN_Padd_VerifyPkcs1Pss(const uint8_t *pSrcBuffer, uint32_t lSrcBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
#define GWEN_ERROR_VERIFY
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
int GWEN_Buffer_InsertRoom(GWEN_BUFFER *bf, uint32_t size)
#define GWEN_ERROR_NOT_AVAILABLE
int GWEN_Padd_UnpaddWithAnsiX9_23(GWEN_BUFFER *src)