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:
@@ -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
|
||||
|
Reference in New Issue
Block a user