Mercurial > libavutil.hg
changeset 648:ed614f42a5d6 libavutil
Add support for 3DES to DES module
author | reimar |
---|---|
date | Tue, 03 Feb 2009 16:45:42 +0000 |
parents | 67fb0b442dd2 |
children | 9c0d8e9fe37b |
files | des.c des.h |
diffstat | 2 files changed, 15 insertions(+), 3 deletions(-) [+] |
line wrap: on
line diff
--- 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);
--- 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);