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>
44static uint8_t
nullarray[]= {0, 0, 0, 0, 0, 0, 0, 0};
53 unsigned char leftNibble;
54 unsigned char rightNibble;
55 static const unsigned char lookUp[2][16] = {
56 {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15},
57 {14, 3, 5, 8, 9, 4, 2, 15, 0, 13, 11, 6, 7, 10, 12, 1}
60 rightNibble = input & 15;
61 leftNibble = input & 240;
62 leftNibble = leftNibble / 16;
63 rightNibble = lookUp[1][rightNibble];
64 leftNibble = lookUp[1][leftNibble];
65 leftNibble = leftNibble * 16;
67 return leftNibble + rightNibble;
81 unsigned char buffer[GWEN_PADD_ISO9796_KEYSIZE];
82 unsigned char hash[20];
106 memset(buffer, 0,
sizeof(buffer));
110 for (i=0; i<=47; i++) {
113 j1=1 +
sizeof(buffer) - (2*i);
115 j3=
sizeof(buffer) - (2*i);
117 if (j1>=0 && j1<(
int)
sizeof(buffer) && j2>=0) {
120 if (j3>=0 && j3<(
int)
sizeof(buffer) && j2>=0) {
126 memmove(buffer, buffer+(
sizeof(buffer)-16), 16);
130 c=p[
sizeof(buffer)-1];
133 p[
sizeof(buffer)-1]=c;
136 p[
sizeof(buffer) - 40] = p[
sizeof(buffer) - 40] ^ 1;
169 "Could not insert room for %d bytes",
179 for (i=0; i<diff; i++)
185 for (i=0; i<8; i++) {
234 unsigned char paddLength;
238 for (i=0; i<paddLength; i++)
248 unsigned int lastpos;
249 unsigned char paddLength;
260 if (paddLength<1 || paddLength>y) {
299 "Buffer contains too many bytes (diff is <11)");
314 memset(p, 0xff, diff-3);
339 "Buffer contains too many bytes (diff is <11)");
354 for (i=0; i<diff-3; i++) {
387 if (*p!=0x01 && *p!=0x02) {
396 while (*p!=0x00 && len) {
437 uint32_t lDestBuffer,
438 const uint8_t *pSeed,
442 uint32_t bytesLeft=lDestBuffer;
449 for (i=0; bytesLeft>0; i++) {
453 counter[0]= (uint8_t)((i>>24) & 0xff);
454 counter[1]= (uint8_t)((i>>16) & 0xff);
455 counter[2]= (uint8_t)((i>>8) & 0xff);
456 counter[3]= (uint8_t)(i & 0xff);
498 const uint8_t *pHash,
511 uint8_t hashMBar[64];
512 int numberOfBitsInByte0;
519 numberOfBitsInByte0=((nbits-1) & 0x07);
520 if (numberOfBitsInByte0==0) {
526 pSalt=(uint8_t *) malloc(lSalt);
572 pDB=(uint8_t *)malloc(emLen);
578 memmove(p, pSalt, lSalt);
583 pDbMask=(uint8_t *)malloc(x);
598 *(p++)=pDB[i] ^ pDbMask[i];
607 if (numberOfBitsInByte0)
608 pDestBuffer[0] &= 0xff >> (8-numberOfBitsInByte0);
622 const uint8_t *pHash,
628 const uint8_t *pSalt;
633 const uint8_t *hashMBar;
634 int numberOfBitsInByte0;
641 numberOfBitsInByte0=((nbits-1) & 0x07);
643 if (numberOfBitsInByte0==0) {
648 if (pSrcBuffer[0] & (0xff << numberOfBitsInByte0)) {
661 if (lSrcBuffer < emLen) {
670 pDB=(uint8_t *)malloc(x);
671 hashMBar=pSrcBuffer+x;
683 pDB[i] ^= pSrcBuffer[i];
686 if (numberOfBitsInByte0)
687 pDB[0] &= (0xff >> (8-numberOfBitsInByte0));
692 for (i=0; (i<(x-1) && pDB[i]==0); i++);
771 unsigned int dstSize;
772 unsigned int chunkSize;
779 if (aid==GWEN_Crypt_PaddAlgoId_None)
790 dstSize=bsize+(chunkSize-1);
791 dstSize=(dstSize/chunkSize)*chunkSize;
798 case GWEN_Crypt_PaddAlgoId_None:
802 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4:
805 "Padding size must be <=96 bytes (is %d)",
812 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
816 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
820 case GWEN_Crypt_PaddAlgoId_LeftZero:
824 case GWEN_Crypt_PaddAlgoId_RightZero:
828 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
831 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
834 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
865 case GWEN_Crypt_PaddAlgoId_None:
869 case GWEN_Crypt_PaddAlgoId_Pkcs1_1:
873 case GWEN_Crypt_PaddAlgoId_Pkcs1_2:
877 case GWEN_Crypt_PaddAlgoId_AnsiX9_23:
880 case GWEN_Crypt_PaddAlgoId_Iso9796_2:
883 case GWEN_Crypt_PaddAlgoId_Iso9796_1:
884 case GWEN_Crypt_PaddAlgoId_LeftZero:
885 case GWEN_Crypt_PaddAlgoId_RightZero:
886 case GWEN_Crypt_PaddAlgoId_Iso9796_1A4:
913 unsigned char paddLength;
919 for (i=1; i<paddLength; i++)
930 unsigned int lastpos;
931 unsigned char paddLength;
952 else if (paddLength>0) {
957 if (paddLength<0 || paddLength>y) {
int GWEN_Buffer_FillWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
void GWEN_Buffer_Reset(GWEN_BUFFER *bf)
int GWEN_Buffer_SetPos(GWEN_BUFFER *bf, uint32_t i)
void GWEN_Buffer_Rewind(GWEN_BUFFER *bf)
int GWEN_Buffer_InsertRoom(GWEN_BUFFER *bf, uint32_t size)
int GWEN_Buffer_AppendBytes(GWEN_BUFFER *bf, const char *buffer, uint32_t size)
int GWEN_Buffer_FillLeftWithBytes(GWEN_BUFFER *bf, unsigned char c, uint32_t size)
uint32_t GWEN_Buffer_GetUsedBytes(const GWEN_BUFFER *bf)
char * GWEN_Buffer_GetStart(const GWEN_BUFFER *bf)
int GWEN_Buffer_Crop(GWEN_BUFFER *bf, uint32_t pos, uint32_t l)
int GWEN_Buffer_AppendByte(GWEN_BUFFER *bf, char c)
void GWEN_Crypt_Random(int quality, uint8_t *buffer, uint32_t len)
#define DBG_INFO(dbg_logger, format,...)
#define DBG_ERROR(dbg_logger, format,...)
#define GWEN_ERROR_VERIFY
#define GWEN_ERROR_INVALID
#define GWEN_ERROR_BAD_DATA
#define GWEN_ERROR_GENERIC
#define GWEN_ERROR_NOT_AVAILABLE
struct GWEN_BUFFER GWEN_BUFFER
A dynamically resizeable text buffer.
int GWEN_MDigest_Begin(GWEN_MDIGEST *md)
int GWEN_MDigest_End(GWEN_MDIGEST *md)
unsigned int GWEN_MDigest_GetDigestSize(GWEN_MDIGEST *md)
uint8_t * GWEN_MDigest_GetDigestPtr(GWEN_MDIGEST *md)
int GWEN_MDigest_Update(GWEN_MDIGEST *md, const uint8_t *buf, unsigned int l)
struct GWEN_MDIGEST GWEN_MDIGEST
int GWEN_Padd_PaddWithIso9796_2(GWEN_BUFFER *buf, int dstSize)
int GWEN_Padd_PaddWithPkcs1Bt1(GWEN_BUFFER *buf, int dstSize)
int GWEN_Padd_UnpaddWithZka(GWEN_BUFFER *buf)
int GWEN_Padd_PaddWithPkcs1Bt2(GWEN_BUFFER *buf, int dstSize)
int GWEN_Padd_PaddWithAnsiX9_23(GWEN_BUFFER *src)
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_Padd_PaddWithISO9796(GWEN_BUFFER *src)
int GWEN_Padd__UnpaddWithPkcs1Bt1Or2(GWEN_BUFFER *buf)
int GWEN_Padd_UnpaddWithPkcs1Bt2(GWEN_BUFFER *src)
int GWEN_Padd_UnpaddWithIso9796_2(GWEN_BUFFER *buf)
int GWEN_Padd_PaddWithZka(GWEN_BUFFER *src)
int GWEN_Padd_MGF1(uint8_t *pDestBuffer, uint32_t lDestBuffer, const uint8_t *pSeed, uint32_t lSeed, GWEN_MDIGEST *md)
int GWEN_Padd_UnpaddWithAnsiX9_23(GWEN_BUFFER *src)
int GWEN_Padd_UnapplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
unsigned char GWEN_Padd_permutate(unsigned char input)
int GWEN_Padd_PaddWithZkaToMultipleOf(GWEN_BUFFER *src, int y)
int GWEN_Padd_AddPkcs1Pss(uint8_t *pDestBuffer, GWEN_UNUSED uint32_t lDestBuffer, uint32_t nbits, const uint8_t *pHash, uint32_t lHash, uint32_t lSalt, GWEN_MDIGEST *md)
int GWEN_Padd_UnpaddWithAnsiX9_23FromMultipleOf(GWEN_BUFFER *src, int y)
int GWEN_Padd_UnpaddWithZkaFromMultipleOf(GWEN_BUFFER *buf, int y)
int GWEN_Padd_UnpaddWithPkcs1Bt1(GWEN_BUFFER *src)
static uint8_t nullarray[]
int GWEN_Padd_PaddWithAnsiX9_23ToMultipleOf(GWEN_BUFFER *src, int y)
int GWEN_Padd_ApplyPaddAlgo(const GWEN_CRYPT_PADDALGO *a, GWEN_BUFFER *buf)
const char * GWEN_Crypt_PaddAlgoId_toString(GWEN_CRYPT_PADDALGOID a)
int GWEN_Crypt_PaddAlgo_GetPaddSize(const GWEN_CRYPT_PADDALGO *a)
GWEN_CRYPT_PADDALGOID GWEN_Crypt_PaddAlgo_GetId(const GWEN_CRYPT_PADDALGO *a)
struct GWEN_CRYPT_PADDALGO GWEN_CRYPT_PADDALGO