TTKMusicPlayer  4.1.3.0
TTKMusicPlayer imitates Kugou UI, the music player uses of qmmp core library based on Qt for windows and linux
cbc128.cpp
Go to the documentation of this file.
1 #include "cbc128.h"
2 #include <string.h>
3 
4 #if !defined(STRICT_ALIGNMENT) && !defined(PEDANTIC)
5 # define STRICT_ALIGNMENT 0
6 #endif
7 
8 #if defined(__GNUC__) && !STRICT_ALIGNMENT
9 typedef size_t size_t_aX __attribute((__aligned__(1)));
10 #else
11 typedef size_t size_t_aX;
12 #endif
13 
14 void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out,
15  size_t len, const void *key,
16  unsigned char ivec[16], block128_f block)
17 {
18  size_t n;
19  const unsigned char *iv = ivec;
20 
21  if (len == 0)
22  return;
23 
24 #if !defined(OPENSSL_SMALL_FOOTPRINT)
25  if (STRICT_ALIGNMENT &&
26  ((size_t)in | (size_t)out | (size_t)ivec) % sizeof(size_t) != 0) {
27  while (len >= 16) {
28  for (n = 0; n < 16; ++n)
29  out[n] = in[n] ^ iv[n];
30  (*block) (out, out, key);
31  iv = out;
32  len -= 16;
33  in += 16;
34  out += 16;
35  }
36  } else {
37  while (len >= 16) {
38  for (n = 0; n < 16; n += sizeof(size_t))
39  *(size_t_aX *)(out + n) =
40  *(size_t_aX *)(in + n) ^ *(size_t_aX *)(iv + n);
41  (*block) (out, out, key);
42  iv = out;
43  len -= 16;
44  in += 16;
45  out += 16;
46  }
47  }
48 #endif
49  while (len) {
50  for (n = 0; n < 16 && n < len; ++n)
51  out[n] = in[n] ^ iv[n];
52  for (; n < 16; ++n)
53  out[n] = iv[n];
54  (*block) (out, out, key);
55  iv = out;
56  if (len <= 16)
57  break;
58  len -= 16;
59  in += 16;
60  out += 16;
61  }
62  if (ivec != iv)
63  memcpy(ivec, iv, 16);
64 }
65 
66 void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out,
67  size_t len, const void *key,
68  unsigned char ivec[16], block128_f block)
69 {
70  size_t n;
71  union {
72  size_t t[16 / sizeof(size_t)];
73  unsigned char c[16];
74  } tmp;
75 
76  if (len == 0)
77  return;
78 
79 #if !defined(OPENSSL_SMALL_FOOTPRINT)
80  if (in != out) {
81  const unsigned char *iv = ivec;
82 
83  if (STRICT_ALIGNMENT &&
84  ((size_t)in | (size_t)out | (size_t)ivec) % sizeof(size_t) != 0) {
85  while (len >= 16) {
86  (*block) (in, out, key);
87  for (n = 0; n < 16; ++n)
88  out[n] ^= iv[n];
89  iv = in;
90  len -= 16;
91  in += 16;
92  out += 16;
93  }
94  } else if (16 % sizeof(size_t) == 0) { /* always true */
95  while (len >= 16) {
96  size_t_aX *out_t = (size_t_aX *)out;
97  size_t_aX *iv_t = (size_t_aX *)iv;
98 
99  (*block) (in, out, key);
100  for (n = 0; n < 16 / sizeof(size_t); n++)
101  out_t[n] ^= iv_t[n];
102  iv = in;
103  len -= 16;
104  in += 16;
105  out += 16;
106  }
107  }
108  if (ivec != iv)
109  memcpy(ivec, iv, 16);
110  } else {
111  if (STRICT_ALIGNMENT &&
112  ((size_t)in | (size_t)out | (size_t)ivec) % sizeof(size_t) != 0) {
113  unsigned char c;
114  while (len >= 16) {
115  (*block) (in, tmp.c, key);
116  for (n = 0; n < 16; ++n) {
117  c = in[n];
118  out[n] = tmp.c[n] ^ ivec[n];
119  ivec[n] = c;
120  }
121  len -= 16;
122  in += 16;
123  out += 16;
124  }
125  } else if (16 % sizeof(size_t) == 0) { /* always true */
126  while (len >= 16) {
127  size_t c;
128  size_t_aX *out_t = (size_t_aX *)out;
129  size_t_aX *ivec_t = (size_t_aX *)ivec;
130  const size_t_aX *in_t = (const size_t_aX *)in;
131 
132  (*block) (in, tmp.c, key);
133  for (n = 0; n < 16 / sizeof(size_t); n++) {
134  c = in_t[n];
135  out_t[n] = tmp.t[n] ^ ivec_t[n];
136  ivec_t[n] = c;
137  }
138  len -= 16;
139  in += 16;
140  out += 16;
141  }
142  }
143  }
144 #endif
145  while (len) {
146  unsigned char c;
147  (*block) (in, tmp.c, key);
148  for (n = 0; n < 16 && n < len; ++n) {
149  c = in[n];
150  out[n] = tmp.c[n] ^ ivec[n];
151  ivec[n] = c;
152  }
153  if (len <= 16) {
154  for (; n < 16; ++n)
155  ivec[n] = in[n];
156  break;
157  }
158  len -= 16;
159  in += 16;
160  out += 16;
161  }
162 }
static constexpr wchar_t key[]
void(* block128_f)(const unsigned char in[16], unsigned char out[16], const void *key)
Definition: cbc128.h:15
void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key, unsigned char ivec[16], block128_f block)
Definition: cbc128.cpp:66
#define STRICT_ALIGNMENT
Definition: cbc128.cpp:5
void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out, size_t len, const void *key, unsigned char ivec[16], block128_f block)
Definition: cbc128.cpp:14
size_t size_t_aX
Definition: cbc128.cpp:11