TTKMusicPlayer  3.7.0.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 void CRYPTO_cbc128_encrypt(const unsigned char *in, unsigned char *out,
9  size_t len, const void *key,
10  unsigned char ivec[16], block128_f block)
11 {
12  size_t n;
13  const unsigned char *iv = ivec;
14 
15  if (len == 0)
16  return;
17 
18 #if !defined(OPENSSL_SMALL_FOOTPRINT)
19  if (STRICT_ALIGNMENT &&
20  ((size_t) in | (size_t) out | (size_t) ivec) % sizeof(size_t) != 0) {
21  while (len >= 16) {
22  for (n = 0; n < 16; ++n)
23  out[n] = in[n] ^ iv[n];
24  (*block)(out, out, key);
25  iv = out;
26  len -= 16;
27  in += 16;
28  out += 16;
29  }
30  } else {
31  while (len >= 16) {
32  for (n = 0; n < 16; n += sizeof(size_t))
33  *(size_t *) (out + n) =
34  *(size_t *) (in + n) ^ *(size_t *) (iv + n);
35  (*block)(out, out, key);
36  iv = out;
37  len -= 16;
38  in += 16;
39  out += 16;
40  }
41  }
42 #endif
43  while (len) {
44  for (n = 0; n < 16 && n < len; ++n)
45  out[n] = in[n] ^ iv[n];
46  for (; n < 16; ++n)
47  out[n] = iv[n];
48  (*block)(out, out, key);
49  iv = out;
50  if (len <= 16)
51  break;
52  len -= 16;
53  in += 16;
54  out += 16;
55  }
56  memcpy(ivec, iv, 16);
57 }
58 
59 void CRYPTO_cbc128_decrypt(const unsigned char *in, unsigned char *out,
60  size_t len, const void *key,
61  unsigned char ivec[16], block128_f block)
62 {
63  size_t n;
64  union {
65  size_t t[16 / sizeof(size_t)];
66  unsigned char c[16];
67  } tmp;
68 
69  if (len == 0)
70  return;
71 
72 #if !defined(OPENSSL_SMALL_FOOTPRINT)
73  if (in != out) {
74  const unsigned char *iv = ivec;
75 
76  if (STRICT_ALIGNMENT &&
77  ((size_t) in | (size_t) out | (size_t) ivec) % sizeof(size_t) != 0) {
78  while (len >= 16) {
79  (*block)(in, out, key);
80  for (n = 0; n < 16; ++n)
81  out[n] ^= iv[n];
82  iv = in;
83  len -= 16;
84  in += 16;
85  out += 16;
86  }
87  } else if (16 % sizeof(size_t) == 0) { /* always true */
88  while (len >= 16) {
89  size_t *out_t = (size_t *) out, *iv_t = (size_t *) iv;
90 
91  (*block)(in, out, key);
92  for (n = 0; n < 16 / sizeof(size_t); n++)
93  out_t[n] ^= iv_t[n];
94  iv = in;
95  len -= 16;
96  in += 16;
97  out += 16;
98  }
99  }
100  memcpy(ivec, iv, 16);
101  } else {
102  if (STRICT_ALIGNMENT &&
103  ((size_t) in | (size_t) out | (size_t) ivec) % sizeof(size_t) != 0) {
104  unsigned char c;
105  while (len >= 16) {
106  (*block)(in, tmp.c, key);
107  for (n = 0; n < 16; ++n) {
108  c = in[n];
109  out[n] = tmp.c[n] ^ ivec[n];
110  ivec[n] = c;
111  }
112  len -= 16;
113  in += 16;
114  out += 16;
115  }
116  } else if (16 % sizeof(size_t) == 0) { /* always true */
117  while (len >= 16) {
118  size_t c, *out_t = (size_t *) out, *ivec_t = (size_t *) ivec;
119  const size_t *in_t = (const size_t *) in;
120 
121  (*block)(in, tmp.c, key);
122  for (n = 0; n < 16 / sizeof(size_t); n++) {
123  c = in_t[n];
124  out_t[n] = tmp.t[n] ^ ivec_t[n];
125  ivec_t[n] = c;
126  }
127  len -= 16;
128  in += 16;
129  out += 16;
130  }
131  }
132  }
133 #endif
134  while (len) {
135  unsigned char c;
136  (*block)(in, tmp.c, key);
137  for (n = 0; n < 16 && n < len; ++n) {
138  c = in[n];
139  out[n] = tmp.c[n] ^ ivec[n];
140  ivec[n] = c;
141  }
142  if (len <= 16) {
143  for (; n < 16; ++n)
144  ivec[n] = in[n];
145  break;
146  }
147  len -= 16;
148  in += 16;
149  out += 16;
150  }
151 }
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:59
#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:8