Browse code

Add support for 3DES to DES module

Originally committed as revision 16971 to svn://svn.ffmpeg.org/ffmpeg/trunk

Reimar Döffinger authored on 2009/02/04 01:45:42
Showing 2 changed files
... ...
@@ -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);