Add and use a public API for RC4 and DES, analogous to the AES API.

Originally committed as revision 16970 to svn://svn.ffmpeg.org/ffmpeg/trunk
This commit is contained in:
Reimar Döffinger
2009-02-03 14:20:55 +00:00
parent 88297e80aa
commit 1a534c7f1e
5 changed files with 125 additions and 24 deletions

View File

@@ -20,13 +20,19 @@
* License along with FFmpeg; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include "avutil.h"
#include "common.h"
#include "rc4.h"
void ff_rc4_enc(const uint8_t *key, int keylen, uint8_t *data, int datalen) {
typedef struct AVRC4 AVRC4;
int av_rc4_init(AVRC4 *r, const uint8_t *key, int key_bits, int decrypt) {
int i, j;
uint8_t x, y;
uint8_t state[256];
uint8_t y;
uint8_t *state = r->state;
int keylen = key_bits >> 3;
if (key_bits & 7)
return -1;
for (i = 0; i < 256; i++)
state[i] = i;
y = 0;
@@ -36,13 +42,28 @@ void ff_rc4_enc(const uint8_t *key, int keylen, uint8_t *data, int datalen) {
y += state[i] + key[j];
FFSWAP(uint8_t, state[i], state[y]);
}
// state initialized, now do the real encryption
x = 1; y = state[1];
while (datalen-- > 0) {
r->x = 1;
r->y = state[1];
return 0;
}
void av_rc4_crypt(AVRC4 *r, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt) {
uint8_t x = r->x, y = r->y;
uint8_t *state = r->state;
while (count-- > 0) {
uint8_t sum = state[x] + state[y];
FFSWAP(uint8_t, state[x], state[y]);
*data++ ^= state[sum];
*dst++ = src ? *src++ ^ state[sum] : state[sum];
x++;
y += state[x];
}
r->x = x; r->y = y;
}
#if LIBAVUTIL_VERSION_MAJOR < 50
void ff_rc4_enc(const uint8_t *key, int keylen, uint8_t *data, int datalen) {
AVRC4 r;
av_rc4_init(&r, key, keylen * 8, 0);
av_rc4_crypt(&r, data, data, datalen, NULL, 0);
}
#endif