From: Ben Laurie Date: Sun, 3 Aug 2003 12:22:35 +0000 (+0000) Subject: Make tests work (CFB1 still doesn't produce the right answers, strangely). X-Git-Tag: OpenSSL_0_9_7c~37 X-Git-Url: https://git.librecmc.org/?a=commitdiff_plain;h=2541f58309ba8b06049c13b25b096b69baa2773b;p=oweals%2Fopenssl.git Make tests work (CFB1 still doesn't produce the right answers, strangely). --- diff --git a/fips/des/fips_desmovs.c b/fips/des/fips_desmovs.c index 77ee4f5d7d..e268aa0f76 100644 --- a/fips/des/fips_desmovs.c +++ b/fips/des/fips_desmovs.c @@ -31,7 +31,7 @@ int DESTest(EVP_CIPHER_CTX *ctx, char *amode, int akeysz, unsigned char *aKey, unsigned char *iVec, int dir, /* 0 = decrypt, 1 = encrypt */ - unsigned char *plaintext, unsigned char *ciphertext, int len) + unsigned char *out, unsigned char *in, int len) { const EVP_CIPHER *cipher = NULL; int ret = 1; @@ -91,25 +91,12 @@ int DESTest(EVP_CIPHER_CTX *ctx, printf("Didn't handle mode %d\n",kt); exit(1); } - if (dir) - { /* encrypt */ - if(!EVP_CipherInit(ctx, cipher, aKey, iVec, AES_ENCRYPT)) - { - ERR_print_errors_fp(stderr); - exit(1); - } - - EVP_Cipher(ctx, ciphertext, (unsigned char*)plaintext, len); - } - else - { /* decrypt */ - if(!EVP_CipherInit(ctx, cipher, aKey, iVec, AES_DECRYPT)) - { - ERR_print_errors_fp(stderr); - exit(1); - } - EVP_Cipher(ctx, (unsigned char*)plaintext, ciphertext, len); + if(!EVP_CipherInit(ctx, cipher, aKey, iVec, dir)) + { + ERR_print_errors_fp(stderr); + exit(1); } + EVP_Cipher(ctx, out, in, len); } } return ret; @@ -210,6 +197,14 @@ void PrintValue(char *tag, unsigned char *val, int len) #endif } +void DebugValue(char *tag, unsigned char *val, int len) + { + char obuf[2048]; + int olen; + olen = bin2hex(val, len, obuf); + printf("%s = %.*s\n", tag, olen, obuf); + } + void OutputValue(char *tag, unsigned char *val, int len, FILE *rfp,int bitmode) { char obuf[2048]; @@ -226,10 +221,25 @@ void OutputValue(char *tag, unsigned char *val, int len, FILE *rfp,int bitmode) #endif } +void shiftin(unsigned char *dst,unsigned char *src,int nbits) + { + int n; + + /* move the bytes... */ + memmove(dst,dst+nbits/8,8-nbits/8); + /* append new data */ + memcpy(dst+8-nbits/8,src,(nbits+7)/8); + /* left shift the bits */ + if(nbits%8) + for(n=0 ; n < 8 ; ++n) + dst[n]=(dst[n] << (nbits%8))|(dst[n+1] >> (8-nbits%8)); + } + /*-----------------------------------------------*/ char *t_tag[2] = {"PLAINTEXT", "CIPHERTEXT"}; char *t_mode[6] = {"CBC","ECB","OFB","CFB1","CFB8","CFB64"}; -enum Mode {CBC, ECB, OFB, CFB1, CFB8, CFB128}; +enum Mode {CBC, ECB, OFB, CFB1, CFB8, CFB64}; +int Sizes[6]={64,0,64,1,8,64}; enum XCrypt {XDECRYPT, XENCRYPT}; void do_mct(char *amode, @@ -238,6 +248,7 @@ void do_mct(char *amode, FILE *rfp) { int i,imode; + unsigned char nk[16]; // double size to make the bitshift easier for (imode=0 ; imode < 6 ; ++imode) if(!strcmp(amode,t_mode[imode])) @@ -253,6 +264,7 @@ void do_mct(char *amode, int j; int n; EVP_CIPHER_CTX ctx; + unsigned char old_iv[8]; fprintf(rfp,"\nCOUNT = %d\n",i); OutputValue("KEY",akey,akeysz/8,rfp,0); @@ -260,33 +272,37 @@ void do_mct(char *amode, OutputValue("IV",ivec,8,rfp,0); OutputValue(t_tag[dir^1],text,len,rfp,imode == CFB1); + /* compensate for endianness */ + if(imode == CFB1) + text[0]<<=7; for(j=0 ; j < 10000 ; ++j) { - unsigned char in[8]; - - if(imode == ECB) - memcpy(in,text,8); - else - for(n=0 ; n < 8 ; ++n) - in[n]=text[n]^ivec[n]; - if(j == 0) + { + memcpy(old_iv,ivec,8); DESTest(&ctx,amode,akeysz,akey,ivec,dir,text,text,len); + } else + { + memcpy(old_iv,ctx.iv,8); EVP_Cipher(&ctx,text,text,len); - if(imode != ECB) + } + if(j == 9999) { - unsigned char tmp[8]; - - memcpy(tmp,text,8); - memcpy(text,ivec,8); - memcpy(ivec,tmp,8); + OutputValue(t_tag[dir],text,len,rfp,imode == CFB1); + // memcpy(ivec,text,8); } + // DebugValue("iv",ctx.iv,8); + /* accumulate material for the next key */ + shiftin(nk,text,Sizes[imode]); + // DebugValue("nk",nk,8); + if(imode == CFB1 || imode == CFB8 || imode == CBC) + memcpy(text,old_iv,8); } - OutputValue(t_tag[dir],ivec,len,rfp,imode == CFB1); for(n=0 ; n < 8 ; ++n) - akey[n]^=ivec[n]; + akey[n]^=nk[n]; + memcpy(ivec,ctx.iv,8); } } @@ -512,9 +528,10 @@ int proc_file(char *rqfile) } else { + assert(dir == 1); ret = DESTest(&ctx, amode, akeysz, aKey, iVec, dir, /* 0 = decrypt, 1 = encrypt */ - plaintext, ciphertext, len); + ciphertext, plaintext, len); OutputValue("CIPHERTEXT",ciphertext,len,rfp, !strcmp(amode,"CFB1")); } @@ -550,6 +567,7 @@ int proc_file(char *rqfile) } else { + assert(dir == 0); ret = DESTest(&ctx, amode, akeysz, aKey, iVec, dir, /* 0 = decrypt, 1 = encrypt */ plaintext, ciphertext, len);