Originally committed as revision 16971 to svn://svn.ffmpeg.org/ffmpeg/trunk
| ... | ... |
@@ -293,10 +293,14 @@ uint64_t ff_des_encdec(uint64_t in, uint64_t key, int decrypt) {
|
| 293 | 293 |
#endif |
| 294 | 294 |
|
| 295 | 295 |
int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) {
|
| 296 |
- if (key_bits != 64) |
|
| 296 |
+ if (key_bits != 64 && key_bits != 192) |
|
| 297 | 297 |
return -1; |
| 298 |
- d->triple_des = 0; |
|
| 298 |
+ d->triple_des = key_bits > 64; |
|
| 299 | 299 |
gen_roundkeys(d->round_keys[0], AV_RB64(key)); |
| 300 |
+ if (d->triple_des) {
|
|
| 301 |
+ gen_roundkeys(d->round_keys[1], AV_RB64(key + 8)); |
|
| 302 |
+ gen_roundkeys(d->round_keys[2], AV_RB64(key + 16)); |
|
| 303 |
+ } |
|
| 300 | 304 |
return 0; |
| 301 | 305 |
} |
| 302 | 306 |
|
| ... | ... |
@@ -306,10 +310,18 @@ void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t |
| 306 | 306 |
uint64_t dst_val; |
| 307 | 307 |
uint64_t src_val = src ? be2me_64(*(const uint64_t *)src) : 0; |
| 308 | 308 |
if (decrypt) {
|
| 309 |
+ if (d->triple_des) {
|
|
| 310 |
+ src_val = des_encdec(src_val, d->round_keys[2], 1); |
|
| 311 |
+ src_val = des_encdec(src_val, d->round_keys[1], 0); |
|
| 312 |
+ } |
|
| 309 | 313 |
dst_val = des_encdec(src_val, d->round_keys[0], 1) ^ iv_val; |
| 310 | 314 |
iv_val = iv ? src_val : 0; |
| 311 | 315 |
} else {
|
| 312 | 316 |
dst_val = des_encdec(src_val ^ iv_val, d->round_keys[0], 0); |
| 317 |
+ if (d->triple_des) {
|
|
| 318 |
+ dst_val = des_encdec(dst_val, d->round_keys[1], 1); |
|
| 319 |
+ dst_val = des_encdec(dst_val, d->round_keys[2], 0); |
|
| 320 |
+ } |
|
| 313 | 321 |
iv_val = iv ? dst_val : 0; |
| 314 | 322 |
} |
| 315 | 323 |
*(uint64_t *)dst = be2me_64(dst_val); |
| ... | ... |
@@ -32,7 +32,7 @@ struct AVDES {
|
| 32 | 32 |
/** |
| 33 | 33 |
* \brief Initializes an AVDES context. |
| 34 | 34 |
* |
| 35 |
- * \param key_bits must be 64 |
|
| 35 |
+ * \param key_bits must be 64 or 192 |
|
| 36 | 36 |
* \param decrypt 0 for encryption, 1 for decryption |
| 37 | 37 |
*/ |
| 38 | 38 |
int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); |