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

Diff for /src/usr.bin/ssh/mac.c between version 1.12 and 1.13

version 1.12, 2006/08/03 03:34:42 version 1.13, 2007/06/05 06:52:37
Line 54 
Line 54 
 };  };
   
 int  int
 mac_init(Mac *mac, char *name)  mac_setup(Mac *mac, char *name)
 {  {
         int i, evp_len;          int i, evp_len;
   
Line 68 
Line 68 
                                 if (macs[i].truncatebits != 0)                                  if (macs[i].truncatebits != 0)
                                         mac->mac_len = macs[i].truncatebits/8;                                          mac->mac_len = macs[i].truncatebits/8;
                         }                          }
                         debug2("mac_init: found %s", name);                          debug2("mac_setup: found %s", name);
                         return (0);                          return (0);
                 }                  }
         }          }
         debug2("mac_init: unknown %s", name);          debug2("mac_setup: unknown %s", name);
         return (-1);          return (-1);
 }  }
   
   void
   mac_init(Mac *mac)
   {
           if (mac->key == NULL)
                   fatal("mac_init: no key");
           HMAC_Init(&mac->ctx, mac->key, mac->key_len, mac->md);
   }
   
 u_char *  u_char *
 mac_compute(Mac *mac, u_int32_t seqno, u_char *data, int datalen)  mac_compute(Mac *mac, u_int32_t seqno, u_char *data, int datalen)
 {  {
         HMAC_CTX c;  
         static u_char m[EVP_MAX_MD_SIZE];          static u_char m[EVP_MAX_MD_SIZE];
         u_char b[4];          u_char b[4];
   
         if (mac->key == NULL)  
                 fatal("mac_compute: no key");  
         if (mac->mac_len > sizeof(m))          if (mac->mac_len > sizeof(m))
                 fatal("mac_compute: mac too long");                  fatal("mac_compute: mac too long");
         HMAC_Init(&c, mac->key, mac->key_len, mac->md);  
         put_u32(b, seqno);          put_u32(b, seqno);
         HMAC_Update(&c, b, sizeof(b));          HMAC_Init(&mac->ctx, NULL, 0, NULL);    /* reset HMAC context */
         HMAC_Update(&c, data, datalen);          HMAC_Update(&mac->ctx, b, sizeof(b));
         HMAC_Final(&c, m, NULL);          HMAC_Update(&mac->ctx, data, datalen);
         HMAC_cleanup(&c);          HMAC_Final(&mac->ctx, m, NULL);
         return (m);          return (m);
 }  }
   
   void
   mac_clear(Mac *mac)
   {
           HMAC_cleanup(&mac->ctx);
   }
   
 /* XXX copied from ciphers_valid */  /* XXX copied from ciphers_valid */
 #define MAC_SEP ","  #define MAC_SEP ","
 int  int
Line 108 
Line 118 
         maclist = cp = xstrdup(names);          maclist = cp = xstrdup(names);
         for ((p = strsep(&cp, MAC_SEP)); p && *p != '\0';          for ((p = strsep(&cp, MAC_SEP)); p && *p != '\0';
             (p = strsep(&cp, MAC_SEP))) {              (p = strsep(&cp, MAC_SEP))) {
                 if (mac_init(NULL, p) < 0) {                  if (mac_setup(NULL, p) < 0) {
                         debug("bad mac %s [%s]", p, names);                          debug("bad mac %s [%s]", p, names);
                         xfree(maclist);                          xfree(maclist);
                         return (0);                          return (0);

Legend:
Removed from v.1.12  
changed lines
  Added in v.1.13