Changeset 9c7f833f2441b85d2d959b423f7de30ee59743ff

Show
Ignore:
Timestamp:
03/11/07 15:58:40 (1 year ago)
Author:
Rémi Denis-Courmont <rem@videolan.org>
git-committer:
Rémi Denis-Courmont <rem@videolan.org> 1173625120 +0000
git-parent:

[263b77a37a173ae8ed008b959ae54d1d48f09f77]

git-author:
Rémi Denis-Courmont <rem@videolan.org> 1173625120 +0000
Message:

Leverage libgcrypt CounTeR mode implementation to simplify our code

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • libs/srtp/srtp.c

    r263b77a r9c7f833  
    231231 
    232232/** 
     233 * Counter Mode encryption/decryption (ctr length = 16 bytes) 
     234 * with non-padded (truncated) text 
     235 */ 
     236static int 
     237ctr_crypt (gcry_cipher_hd_t hd, const void *ctr, uint8_t *data, size_t len) 
     238{ 
     239    const size_t ctrlen = 16; 
     240    div_t d = div (len, ctrlen); 
     241 
     242    if (gcry_cipher_setctr (hd, ctr, ctrlen) 
     243     || gcry_cipher_encrypt (hd, data, d.quot * ctrlen, NULL, 0)) 
     244        return -1; 
     245 
     246    if (d.rem) 
     247    { 
     248        /* Truncated last block */ 
     249        uint8_t dummy[ctrlen]; 
     250        data += d.quot * ctrlen; 
     251        memcpy (dummy, data, d.rem); 
     252        memset (dummy + d.rem, 0, ctrlen - d.rem); 
     253 
     254        if (gcry_cipher_encrypt (hd, dummy, ctrlen, data, ctrlen)) 
     255            return -1; 
     256        memcpy (data, dummy, d.rem); 
     257    } 
     258 
     259    return 0; 
     260} 
     261 
     262 
     263/** 
    233264 * AES-CM key derivation (saltlen = 14 bytes) 
    234265 */ 
     
    248279        iv[sizeof (iv) - rlen + i] ^= r[i]; 
    249280 
    250     /* TODO: retry with CTR mode */ 
    251     while (outlen >= sizeof (iv)) 
    252     { 
    253         /* AES */ 
    254         if (gcry_cipher_encrypt (prf, out, sizeof (iv), iv, sizeof (iv))) 
    255             return EINVAL; 
    256         outlen -= sizeof (iv); 
    257         out = ((uint8_t *)out) + sizeof (iv); 
    258  
    259         /* Increment IV in network byte order */ 
    260         if (++iv[sizeof (iv) - 1] == 0) 
    261             ++iv[sizeof (iv) -2]; 
    262     } 
    263  
    264     if (outlen > 0) 
    265     { 
    266         /* Truncated last AES output block */ 
    267         if (gcry_cipher_encrypt (prf, iv, sizeof (iv), NULL, 0)) 
    268             return -1; 
    269         memcpy (out, iv, outlen); 
    270     } 
    271  
    272     return 0; 
     281    memset (out, 0, outlen); 
     282    return ctr_crypt (prf, iv, out, outlen); 
    273283} 
    274284 
     
    306316    uint8_t r[6]; 
    307317 
    308     /* TODO: retry with CTR mode */ 
    309     if (gcry_cipher_open (&prf, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 0) 
     318    if (gcry_cipher_open (&prf, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR, 0) 
    310319     || gcry_cipher_setkey (prf, key, keylen)) 
    311320        return -1; 
     
    381390    assert (rate != 0); 
    382391    s->rtp_rcc = rate; 
    383 } 
    384  
    385  
    386 /** AES-CM encryption/decryption (ctr length = 16 bytes) */ 
    387 static int 
    388 ctr_crypt (gcry_cipher_hd_t hd, uint32_t *ctr, uint8_t *data, size_t len) 
    389 { 
    390     const size_t ctrlen = 16; 
    391     while (len >= ctrlen) 
    392     { 
    393         if (gcry_cipher_setctr (hd, ctr, ctrlen) 
    394          || gcry_cipher_encrypt (hd, data, ctrlen, NULL, 0)) 
    395             return -1; 
    396  
    397         data += ctrlen; 
    398         len -= ctrlen; 
    399         ctr[3] = htonl (ntohl (ctr[3]) + 1); 
    400     } 
    401  
    402     if (len > 0) 
    403     { 
    404         /* Truncated last block */ 
    405         uint8_t dummy[ctrlen]; 
    406         memcpy (dummy, data, len); 
    407         memset (dummy + len, 0, ctrlen - len); 
    408  
    409         if (gcry_cipher_setctr (hd, ctr, ctrlen) 
    410          || gcry_cipher_encrypt (hd, dummy, ctrlen, data, ctrlen)) 
    411             return -1; 
    412         memcpy (data, dummy, len); 
    413     } 
    414  
    415     return 0; 
    416392} 
    417393 
  • libs/srtp/test-aes.c

    re5c071a r9c7f833  
    6464    printhex (salt, sizeof (salt)); 
    6565 
    66     if (gcry_cipher_open (&prf, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_ECB, 0) 
     66    if (gcry_cipher_open (&prf, GCRY_CIPHER_AES, GCRY_CIPHER_MODE_CTR, 0) 
    6767     || gcry_cipher_setkey (prf, key, sizeof (key))) 
    6868        fatal ("Internal PRF error");