/src/ffmpeg/libavutil/rc4.c
Line | Count | Source (jump to first uncovered line) |
1 | | /* |
2 | | * RC4 encryption/decryption/pseudo-random number generator |
3 | | * Copyright (c) 2007 Reimar Doeffinger |
4 | | * |
5 | | * loosely based on LibTomCrypt by Tom St Denis |
6 | | * |
7 | | * This file is part of FFmpeg. |
8 | | * |
9 | | * FFmpeg is free software; you can redistribute it and/or |
10 | | * modify it under the terms of the GNU Lesser General Public |
11 | | * License as published by the Free Software Foundation; either |
12 | | * version 2.1 of the License, or (at your option) any later version. |
13 | | * |
14 | | * FFmpeg is distributed in the hope that it will be useful, |
15 | | * but WITHOUT ANY WARRANTY; without even the implied warranty of |
16 | | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU |
17 | | * Lesser General Public License for more details. |
18 | | * |
19 | | * You should have received a copy of the GNU Lesser General Public |
20 | | * License along with FFmpeg; if not, write to the Free Software |
21 | | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA |
22 | | */ |
23 | | |
24 | | #include "error.h" |
25 | | #include "macros.h" |
26 | | #include "mem.h" |
27 | | #include "rc4.h" |
28 | | |
29 | | AVRC4 *av_rc4_alloc(void) |
30 | 0 | { |
31 | 0 | return av_mallocz(sizeof(struct AVRC4)); |
32 | 0 | } |
33 | | |
34 | 0 | int av_rc4_init(AVRC4 *r, const uint8_t *key, int key_bits, int decrypt) { |
35 | 0 | int i, j; |
36 | 0 | uint8_t y; |
37 | 0 | uint8_t *state = r->state; |
38 | 0 | int keylen = key_bits >> 3; |
39 | 0 | if (key_bits & 7) |
40 | 0 | return AVERROR(EINVAL); |
41 | 0 | for (i = 0; i < 256; i++) |
42 | 0 | state[i] = i; |
43 | 0 | y = 0; |
44 | | // j is i % keylen |
45 | 0 | for (j = 0, i = 0; i < 256; i++, j++) { |
46 | 0 | if (j == keylen) j = 0; |
47 | 0 | y += state[i] + key[j]; |
48 | 0 | FFSWAP(uint8_t, state[i], state[y]); |
49 | 0 | } |
50 | 0 | r->x = 1; |
51 | 0 | r->y = state[1]; |
52 | 0 | return 0; |
53 | 0 | } |
54 | | |
55 | 0 | void av_rc4_crypt(AVRC4 *r, uint8_t *dst, const uint8_t *src, int count, uint8_t *iv, int decrypt) { |
56 | 0 | uint8_t x = r->x, y = r->y; |
57 | 0 | uint8_t *state = r->state; |
58 | 0 | while (count-- > 0) { |
59 | 0 | uint8_t sum = state[x] + state[y]; |
60 | 0 | FFSWAP(uint8_t, state[x], state[y]); |
61 | 0 | *dst++ = src ? *src++ ^ state[sum] : state[sum]; |
62 | 0 | x++; |
63 | 0 | y += state[x]; |
64 | 0 | } |
65 | 0 | r->x = x; r->y = y; |
66 | 0 | } |