/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 | 9.07M | { |
10 | 9.07M | unsigned char t; |
11 | | |
12 | 9.07M | t = a; |
13 | 9.07M | a = b; |
14 | 9.07M | b = t; |
15 | 9.07M | } |
16 | | |
17 | | RC4_native::RC4_native(unsigned char const* key_data, int key_len) |
18 | 13.0k | { |
19 | 13.0k | if (key_len == -1) { |
20 | 0 | key_len = QIntC::to_int(strlen(reinterpret_cast<char const*>(key_data))); |
21 | 0 | } |
22 | | |
23 | 3.35M | for (int i = 0; i < 256; ++i) { |
24 | 3.34M | key.state[i] = static_cast<unsigned char>(i); |
25 | 3.34M | } |
26 | 13.0k | key.x = 0; |
27 | 13.0k | key.y = 0; |
28 | | |
29 | 13.0k | int i1 = 0; |
30 | 13.0k | int i2 = 0; |
31 | 3.35M | for (int i = 0; i < 256; ++i) { |
32 | 3.34M | i2 = (key_data[i1] + key.state[i] + i2) % 256; |
33 | 3.34M | swap_byte(key.state[i], key.state[i2]); |
34 | 3.34M | i1 = (i1 + 1) % key_len; |
35 | 3.34M | } |
36 | 13.0k | } |
37 | | |
38 | | void |
39 | | RC4_native::process(unsigned char const* in_data, size_t len, unsigned char* out_data) |
40 | 13.0k | { |
41 | 5.74M | for (size_t i = 0; i < len; ++i) { |
42 | 5.73M | key.x = static_cast<unsigned char>((key.x + 1) % 256); |
43 | 5.73M | key.y = static_cast<unsigned char>((key.state[key.x] + key.y) % 256); |
44 | 5.73M | swap_byte(key.state[key.x], key.state[key.y]); |
45 | 5.73M | int xor_index = (key.state[key.x] + key.state[key.y]) % 256; |
46 | 5.73M | out_data[i] = in_data[i] ^ key.state[xor_index]; |
47 | 5.73M | } |
48 | 13.0k | } |