[BACK]Return to cipher.c CVS log [TXT][DIR] Up to [local] / src / usr.bin / ssh

Diff for /src/usr.bin/ssh/cipher.c between version 1.39 and 1.40

version 1.39, 2000/12/06 23:05:42 version 1.40, 2000/12/09 13:41:52
Line 285 
Line 285 
 /* RIJNDAEL */  /* RIJNDAEL */
   
 #define RIJNDAEL_BLOCKSIZE 16  #define RIJNDAEL_BLOCKSIZE 16
   
 void  void
 rijndael_setkey(CipherContext *cc, const u_char *key, u_int keylen)  rijndael_setkey(CipherContext *cc, const u_char *key, u_int keylen)
 {  {
         if (rijndael_makekey(&cc->u.rijndael.enc, RIJNDAEL_ENCRYPT,          rijndael_set_key(&cc->u.rijndael.enc, (u4byte *)key, 8*keylen, 1);
                     8*keylen, (char *)key) == -1)          rijndael_set_key(&cc->u.rijndael.dec, (u4byte *)key, 8*keylen, 0);
                 fatal("rijndael_setkey: RIJNDAEL_ENCRYPT");  
         if (rijndael_makekey(&cc->u.rijndael.dec, RIJNDAEL_DECRYPT,  
                     8*keylen, (char *)key) == -1)  
                 fatal("rijndael_setkey: RIJNDAEL_DECRYPT");  
 }  }
 void  void
 rijndael_setiv(CipherContext *cc, const u_char *iv, u_int ivlen)  rijndael_setiv(CipherContext *cc, const u_char *iv, u_int ivlen)
 {  {
         if (iv == NULL || ivlen != RIJNDAEL_BLOCKSIZE)          if (iv == NULL)
                 fatal("bad/no IV for %s.", cc->cipher->name);                  fatal("no IV for %s.", cc->cipher->name);
         memcpy(cc->u.rijndael.iv, iv, RIJNDAEL_BLOCKSIZE);          memcpy((u_char *)cc->u.rijndael.iv, iv, RIJNDAEL_BLOCKSIZE);
 }  }
   
 void  void
 rijndael_cbc_encrypt(CipherContext *cc, u_char *dest, const u_char *src,  rijndael_cbc_encrypt(CipherContext *cc, u_char *dest, const u_char *src,
     u_int len)      u_int len)
 {  {
         rijndael_key *ctx = &cc->u.rijndael.enc;          rijndael_ctx *ctx = &cc->u.rijndael.enc;
         u_char *iv = cc->u.rijndael.iv;          u4byte *iv = cc->u.rijndael.iv;
         u_char in[RIJNDAEL_BLOCKSIZE];          u4byte in[4];
         u_char *cprev, *cnow, *plain;          u4byte *cprev, *cnow, *plain;
         int i, j, blocks = len / RIJNDAEL_BLOCKSIZE;          int i, blocks = len / RIJNDAEL_BLOCKSIZE;
         if (len == 0)          if (len == 0)
                 return;                  return;
         if (len % RIJNDAEL_BLOCKSIZE)          if (len % RIJNDAEL_BLOCKSIZE)
                 fatal("rijndael_cbc_encrypt: bad len %d", len);                  fatal("rijndael_cbc_encrypt: bad len %d", len);
         cnow  = dest;          cnow  = (u4byte*) dest;
         plain = (u_char *) src;          plain = (u4byte*) src;
         cprev = iv;          cprev = iv;
         for(i = 0; i < blocks; i++, plain+=RIJNDAEL_BLOCKSIZE,          for(i = 0; i < blocks; i++, plain+=4, cnow+=4) {
             cnow+=RIJNDAEL_BLOCKSIZE) {                  in[0] = plain[0] ^ cprev[0];
                 for (j = 0; j < RIJNDAEL_BLOCKSIZE; j++)                  in[1] = plain[1] ^ cprev[1];
                         in[j] = plain[j] ^ cprev[j];                  in[2] = plain[2] ^ cprev[2];
                   in[3] = plain[3] ^ cprev[3];
                 rijndael_encrypt(ctx, in, cnow);                  rijndael_encrypt(ctx, in, cnow);
                 cprev = cnow;                  cprev = cnow;
         }          }
Line 334 
Line 329 
 rijndael_cbc_decrypt(CipherContext *cc, u_char *dest, const u_char *src,  rijndael_cbc_decrypt(CipherContext *cc, u_char *dest, const u_char *src,
     u_int len)      u_int len)
 {  {
         rijndael_key *ctx = &cc->u.rijndael.dec;          rijndael_ctx *ctx = &cc->u.rijndael.dec;
         u_char *iv = cc->u.rijndael.iv;          u4byte *iv = cc->u.rijndael.iv;
         u_char ivsaved[RIJNDAEL_BLOCKSIZE];          u4byte ivsaved[4];
         u_char *cnow  = (u_char *) (src+len-RIJNDAEL_BLOCKSIZE);          u4byte *cnow =  (u4byte*) (src+len-RIJNDAEL_BLOCKSIZE);
         u_char *plain = dest+len-RIJNDAEL_BLOCKSIZE;          u4byte *plain = (u4byte*) (dest+len-RIJNDAEL_BLOCKSIZE);
         u_char *ivp;          u4byte *ivp;
         int i, j, blocks = len / RIJNDAEL_BLOCKSIZE;          int i, blocks = len / RIJNDAEL_BLOCKSIZE;
         if (len == 0)          if (len == 0)
                 return;                  return;
         if (len % RIJNDAEL_BLOCKSIZE)          if (len % RIJNDAEL_BLOCKSIZE)
                 fatal("rijndael_cbc_decrypt: bad len %d", len);                  fatal("rijndael_cbc_decrypt: bad len %d", len);
         memcpy(ivsaved, cnow, RIJNDAEL_BLOCKSIZE);          memcpy(ivsaved, cnow, RIJNDAEL_BLOCKSIZE);
         for(i = blocks; i > 0; i--, cnow-=RIJNDAEL_BLOCKSIZE,          for(i = blocks; i > 0; i--, cnow-=4, plain-=4) {
             plain-=RIJNDAEL_BLOCKSIZE) {  
                 rijndael_decrypt(ctx, cnow, plain);                  rijndael_decrypt(ctx, cnow, plain);
                 //rijndael_decrypt(cnow, plain, ctx->keySched, ctx->ROUNDS);                  ivp =  (i == 1) ? iv : cnow-4;
                 ivp = (i == 1) ? iv : cnow-RIJNDAEL_BLOCKSIZE;                  plain[0] ^= ivp[0];
                 for (j = 0; j < RIJNDAEL_BLOCKSIZE; j++)                  plain[1] ^= ivp[1];
                         plain[j] ^= ivp[j];                  plain[2] ^= ivp[2];
                   plain[3] ^= ivp[3];
         }          }
         memcpy(iv, ivsaved, RIJNDAEL_BLOCKSIZE);          memcpy(iv, ivsaved, RIJNDAEL_BLOCKSIZE);
 }  }

Legend:
Removed from v.1.39  
changed lines
  Added in v.1.40