Skip to content
Snippets Groups Projects
Commit bc17cc01 authored by Reimar Döffinger's avatar Reimar Döffinger
Browse files

Add support for 3DES to DES module

Originally committed as revision 16971 to svn://svn.ffmpeg.org/ffmpeg/trunk
parent 1a534c7f
No related branches found
No related tags found
No related merge requests found
...@@ -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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment