Changeset 9c7f833f2441b85d2d959b423f7de30ee59743ff
- 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
| r263b77a |
r9c7f833 |
|
| 231 | 231 | |
|---|
| 232 | 232 | /** |
|---|
| | 233 | * Counter Mode encryption/decryption (ctr length = 16 bytes) |
|---|
| | 234 | * with non-padded (truncated) text |
|---|
| | 235 | */ |
|---|
| | 236 | static int |
|---|
| | 237 | ctr_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 | /** |
|---|
| 233 | 264 | * AES-CM key derivation (saltlen = 14 bytes) |
|---|
| 234 | 265 | */ |
|---|
| … | … | |
| 248 | 279 | iv[sizeof (iv) - rlen + i] ^= r[i]; |
|---|
| 249 | 280 | |
|---|
| 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); |
|---|
| 273 | 283 | } |
|---|
| 274 | 284 | |
|---|
| … | … | |
| 306 | 316 | uint8_t r[6]; |
|---|
| 307 | 317 | |
|---|
| 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) |
|---|
| 310 | 319 | || gcry_cipher_setkey (prf, key, keylen)) |
|---|
| 311 | 320 | return -1; |
|---|
| … | … | |
| 381 | 390 | assert (rate != 0); |
|---|
| 382 | 391 | 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; |
|---|
| 416 | 392 | } |
|---|
| 417 | 393 | |
|---|
| re5c071a |
r9c7f833 |
|
| 64 | 64 | printhex (salt, sizeof (salt)); |
|---|
| 65 | 65 | |
|---|
| 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) |
|---|
| 67 | 67 | || gcry_cipher_setkey (prf, key, sizeof (key))) |
|---|
| 68 | 68 | fatal ("Internal PRF error"); |
|---|