# HG changeset patch # User reimar # Date 1233679542 0 # Node ID ed614f42a5d685ca3b9c1389a69d446e1b020783 # Parent 67fb0b442dd287f73b214d60dcaaaad1d4830edf Add support for 3DES to DES module diff -r 67fb0b442dd2 -r ed614f42a5d6 des.c --- a/des.c Tue Feb 03 14:20:55 2009 +0000 +++ b/des.c Tue Feb 03 16:45:42 2009 +0000 @@ -293,10 +293,14 @@ #endif int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) { - if (key_bits != 64) + if (key_bits != 64 && key_bits != 192) return -1; - d->triple_des = 0; + d->triple_des = key_bits > 64; gen_roundkeys(d->round_keys[0], AV_RB64(key)); + if (d->triple_des) { + gen_roundkeys(d->round_keys[1], AV_RB64(key + 8)); + gen_roundkeys(d->round_keys[2], AV_RB64(key + 16)); + } return 0; } @@ -306,10 +310,18 @@ uint64_t dst_val; uint64_t src_val = src ? be2me_64(*(const uint64_t *)src) : 0; if (decrypt) { + if (d->triple_des) { + src_val = des_encdec(src_val, d->round_keys[2], 1); + src_val = des_encdec(src_val, d->round_keys[1], 0); + } dst_val = des_encdec(src_val, d->round_keys[0], 1) ^ iv_val; iv_val = iv ? src_val : 0; } else { dst_val = des_encdec(src_val ^ iv_val, d->round_keys[0], 0); + if (d->triple_des) { + dst_val = des_encdec(dst_val, d->round_keys[1], 1); + dst_val = des_encdec(dst_val, d->round_keys[2], 0); + } iv_val = iv ? dst_val : 0; } *(uint64_t *)dst = be2me_64(dst_val); diff -r 67fb0b442dd2 -r ed614f42a5d6 des.h --- a/des.h Tue Feb 03 14:20:55 2009 +0000 +++ b/des.h Tue Feb 03 16:45:42 2009 +0000 @@ -32,7 +32,7 @@ /** * \brief Initializes an AVDES context. * - * \param key_bits must be 64 + * \param key_bits must be 64 or 192 * \param decrypt 0 for encryption, 1 for decryption */ int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt);