/src/qpdf/libqpdf/RC4_native.cc
Line | Count | Source (jump to first uncovered line) |
1 | | #include <qpdf/RC4_native.hh> |
2 | | |
3 | | #include <qpdf/QIntC.hh> |
4 | | |
5 | | #include <string.h> |
6 | | |
7 | | static void |
8 | | swap_byte(unsigned char& a, unsigned char& b) |
9 | 21.0M | { |
10 | 21.0M | unsigned char t; |
11 | | |
12 | 21.0M | t = a; |
13 | 21.0M | a = b; |
14 | 21.0M | b = t; |
15 | 21.0M | } |
16 | | |
17 | | RC4_native::RC4_native(unsigned char const* key_data, int key_len) |
18 | 31.9k | { |
19 | 31.9k | if (key_len == -1) { |
20 | 0 | key_len = QIntC::to_int(strlen(reinterpret_cast<char const*>(key_data))); |
21 | 0 | } |
22 | | |
23 | 8.19M | for (int i = 0; i < 256; ++i) { |
24 | 8.16M | key.state[i] = static_cast<unsigned char>(i); |
25 | 8.16M | } |
26 | 31.9k | key.x = 0; |
27 | 31.9k | key.y = 0; |
28 | | |
29 | 31.9k | int i1 = 0; |
30 | 31.9k | int i2 = 0; |
31 | 8.19M | for (int i = 0; i < 256; ++i) { |
32 | 8.16M | i2 = (key_data[i1] + key.state[i] + i2) % 256; |
33 | 8.16M | swap_byte(key.state[i], key.state[i2]); |
34 | 8.16M | i1 = (i1 + 1) % key_len; |
35 | 8.16M | } |
36 | 31.9k | } |
37 | | |
38 | | void |
39 | | RC4_native::process(unsigned char const* in_data, size_t len, unsigned char* out_data) |
40 | 31.9k | { |
41 | 12.8M | for (size_t i = 0; i < len; ++i) { |
42 | 12.8M | key.x = static_cast<unsigned char>((key.x + 1) % 256); |
43 | 12.8M | key.y = static_cast<unsigned char>((key.state[key.x] + key.y) % 256); |
44 | 12.8M | swap_byte(key.state[key.x], key.state[key.y]); |
45 | 12.8M | int xor_index = (key.state[key.x] + key.state[key.y]) % 256; |
46 | 12.8M | out_data[i] = in_data[i] ^ key.state[xor_index]; |
47 | 12.8M | } |
48 | 31.9k | } |