Commit bc17cc01 authored by Reimar Döffinger's avatar Reimar Döffinger

Add support for 3DES to DES module

Originally committed as revision 16971 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 1a534c7f
...@@ -293,10 +293,14 @@ uint64_t ff_des_encdec(uint64_t in, uint64_t key, int decrypt) { ...@@ -293,10 +293,14 @@ uint64_t ff_des_encdec(uint64_t in, uint64_t key, int decrypt) {
#endif #endif
int av_des_init(AVDES *d, const uint8_t *key, int key_bits, int decrypt) { 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; return -1;
d->triple_des = 0; d->triple_des = key_bits > 64;
gen_roundkeys(d->round_keys[0], AV_RB64(key)); 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; return 0;
} }
...@@ -306,10 +310,18 @@ void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t ...@@ -306,10 +310,18 @@ void av_des_crypt(AVDES *d, uint8_t *dst, const uint8_t *src, int count, uint8_t
uint64_t dst_val; uint64_t dst_val;
uint64_t src_val = src ? be2me_64(*(const uint64_t *)src) : 0; uint64_t src_val = src ? be2me_64(*(const uint64_t *)src) : 0;
if (decrypt) { 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; dst_val = des_encdec(src_val, d->round_keys[0], 1) ^ iv_val;
iv_val = iv ? src_val : 0; iv_val = iv ? src_val : 0;
} else { } else {
dst_val = des_encdec(src_val ^ iv_val, d->round_keys[0], 0); 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; iv_val = iv ? dst_val : 0;
} }
*(uint64_t *)dst = be2me_64(dst_val); *(uint64_t *)dst = be2me_64(dst_val);
......
...@@ -32,7 +32,7 @@ struct AVDES { ...@@ -32,7 +32,7 @@ struct AVDES {
/** /**
* \brief Initializes an AVDES context. * \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 * \param decrypt 0 for encryption, 1 for decryption
*/ */
int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt); int av_des_init(struct AVDES *d, const uint8_t *key, int key_bits, int decrypt);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment