Coverage Report

Created: 2026-08-31 06:45

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/xpdf-4.06/xpdf/Decrypt.cc
Line
Count
Source
1
//========================================================================
2
//
3
// Decrypt.cc
4
//
5
// Copyright 1996-2003 Glyph & Cog, LLC
6
//
7
//========================================================================
8
9
#include <aconf.h>
10
11
#include <string.h>
12
#include "gmem.h"
13
#include "gmempp.h"
14
#include "Decrypt.h"
15
16
static void aes256KeyExpansion(DecryptAES256State *s,
17
             Guchar *objKey, int objKeyLen);
18
static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last);
19
static void sha256(Guchar *msg, int msgLen, Guchar *hash);
20
static void sha384(Guchar *msg, int msgLen, Guchar *hash);
21
static void sha512(Guchar *msg, int msgLen, Guchar *hash);
22
23
static Guchar passwordPad[32] = {
24
  0x28, 0xbf, 0x4e, 0x5e, 0x4e, 0x75, 0x8a, 0x41,
25
  0x64, 0x00, 0x4e, 0x56, 0xff, 0xfa, 0x01, 0x08, 
26
  0x2e, 0x2e, 0x00, 0xb6, 0xd0, 0x68, 0x3e, 0x80, 
27
  0x2f, 0x0c, 0xa9, 0xfe, 0x64, 0x53, 0x69, 0x7a
28
};
29
30
//------------------------------------------------------------------------
31
// Decrypt
32
//------------------------------------------------------------------------
33
34
GBool Decrypt::makeFileKey(int encVersion, int encRevision, int keyLength,
35
         GString *ownerKey, GString *userKey,
36
         GString *ownerEnc, GString *userEnc,
37
         int permissions, GString *fileID,
38
         GString *ownerPassword, GString *userPassword,
39
         Guchar *fileKey, GBool encryptMetadata,
40
1.48k
         GBool *ownerPasswordOk) {
41
1.48k
  DecryptAES256State state;
42
1.48k
  Guchar test[127 + 56], test2[32];
43
1.48k
  GString *userPassword2;
44
1.48k
  const char *userPW;
45
1.48k
  Guchar fState[256];
46
1.48k
  Guchar tmpKey[16];
47
1.48k
  Guchar fx, fy;
48
1.48k
  int len, i, j;
49
50
1.48k
  *ownerPasswordOk = gFalse;
51
52
1.48k
  if (encRevision == 5 || encRevision == 6) {
53
54
    // check the owner password
55
361
    if (ownerPassword) {
56
      //~ this is supposed to convert the password to UTF-8 using "SASLprep"
57
0
      len = ownerPassword->getLength();
58
0
      if (len > 127) {
59
0
  len = 127;
60
0
      }
61
0
      memcpy(test, ownerPassword->getCString(), len);
62
0
      memcpy(test + len, ownerKey->getCString() + 32, 8);
63
0
      memcpy(test + len + 8, userKey->getCString(), 48);
64
0
      sha256(test, len + 56, test);
65
0
      if (encRevision == 6) {
66
0
  r6Hash(test, 32, ownerPassword->getCString(), len,
67
0
         userKey->getCString());
68
0
      }
69
0
      if (!memcmp(test, ownerKey->getCString(), 32)) {
70
71
  // compute the file key from the owner password
72
0
  memcpy(test, ownerPassword->getCString(), len);
73
0
  memcpy(test + len, ownerKey->getCString() + 40, 8);
74
0
  memcpy(test + len + 8, userKey->getCString(), 48);
75
0
  sha256(test, len + 56, test);
76
0
  if (encRevision == 6) {
77
0
    r6Hash(test, 32, ownerPassword->getCString(), len,
78
0
     userKey->getCString());
79
0
  }
80
0
  aes256KeyExpansion(&state, test, 32);
81
0
  for (i = 0; i < 16; ++i) {
82
0
    state.cbc[i] = 0;
83
0
  }
84
0
  aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString(), gFalse);
85
0
  memcpy(fileKey, state.buf, 16);
86
0
  aes256DecryptBlock(&state, (Guchar *)ownerEnc->getCString() + 16,
87
0
         gFalse);
88
0
  memcpy(fileKey + 16, state.buf, 16);
89
90
0
  *ownerPasswordOk = gTrue;
91
0
  return gTrue;
92
0
      }
93
0
    }
94
95
    // check the user password
96
361
    if (userPassword) {
97
      //~ this is supposed to convert the password to UTF-8 using "SASLprep"
98
0
      userPW = userPassword->getCString();
99
0
      len = userPassword->getLength();
100
0
      if (len > 127) {
101
0
  len = 127;
102
0
      }
103
361
    } else {
104
361
      userPW = "";
105
361
      len = 0;
106
361
    }
107
361
    memcpy(test, userPW, len);
108
361
    memcpy(test + len, userKey->getCString() + 32, 8);
109
361
    sha256(test, len + 8, test);
110
361
    if (encRevision == 6) {
111
359
      r6Hash(test, 32, userPW, len, NULL);
112
359
    }
113
361
    if (!memcmp(test, userKey->getCString(), 32)) {
114
115
      // compute the file key from the user password
116
304
      memcpy(test, userPW, len);
117
304
      memcpy(test + len, userKey->getCString() + 40, 8);
118
304
      sha256(test, len + 8, test);
119
304
      if (encRevision == 6) {
120
304
  r6Hash(test, 32, userPW, len, NULL);
121
304
      }
122
304
      aes256KeyExpansion(&state, test, 32);
123
5.16k
      for (i = 0; i < 16; ++i) {
124
4.86k
  state.cbc[i] = 0;
125
4.86k
      }
126
304
      aes256DecryptBlock(&state, (Guchar *)userEnc->getCString(), gFalse);
127
304
      memcpy(fileKey, state.buf, 16);
128
304
      aes256DecryptBlock(&state, (Guchar *)userEnc->getCString() + 16,
129
304
       gFalse);
130
304
      memcpy(fileKey + 16, state.buf, 16);
131
132
304
      return gTrue; 
133
304
    }
134
135
57
    return gFalse;
136
137
1.11k
  } else {
138
139
    // try using the supplied owner password to generate the user password
140
1.11k
    if (ownerPassword) {
141
0
      len = ownerPassword->getLength();
142
0
      if (len < 32) {
143
0
  memcpy(test, ownerPassword->getCString(), len);
144
0
  memcpy(test + len, passwordPad, 32 - len);
145
0
      } else {
146
0
  memcpy(test, ownerPassword->getCString(), 32);
147
0
      }
148
0
      md5(test, 32, test);
149
0
      if (encRevision == 3) {
150
0
  for (i = 0; i < 50; ++i) {
151
0
    md5(test, keyLength, test);
152
0
  }
153
0
      }
154
0
      if (encRevision == 2) {
155
0
  rc4InitKey(test, keyLength, fState);
156
0
  fx = fy = 0;
157
0
  for (i = 0; i < 32; ++i) {
158
0
    test2[i] = rc4DecryptByte(fState, &fx, &fy, ownerKey->getChar(i));
159
0
  }
160
0
      } else {
161
0
  memcpy(test2, ownerKey->getCString(), 32);
162
0
  for (i = 19; i >= 0; --i) {
163
0
    for (j = 0; j < keyLength; ++j) {
164
0
      tmpKey[j] = (Guchar)(test[j] ^ i);
165
0
    }
166
0
    rc4InitKey(tmpKey, keyLength, fState);
167
0
    fx = fy = 0;
168
0
    for (j = 0; j < 32; ++j) {
169
0
      test2[j] = rc4DecryptByte(fState, &fx, &fy, test2[j]);
170
0
    }
171
0
  }
172
0
      }
173
0
      userPassword2 = new GString((char *)test2, 32);
174
0
      if (makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
175
0
           permissions, fileID, userPassword2, fileKey,
176
0
           encryptMetadata)) {
177
0
  *ownerPasswordOk = gTrue;
178
0
  delete userPassword2;
179
0
  return gTrue;
180
0
      }
181
0
      delete userPassword2;
182
0
    }
183
184
    // try using the supplied user password
185
1.11k
    return makeFileKey2(encVersion, encRevision, keyLength, ownerKey, userKey,
186
1.11k
      permissions, fileID, userPassword, fileKey,
187
1.11k
      encryptMetadata);
188
1.11k
  }
189
1.48k
}
190
191
void Decrypt::r6Hash(Guchar *key, int keyLen, const char *pwd, int pwdLen,
192
663
         char *userKey) {
193
663
  Guchar key1[64*(127+64+48)];
194
663
  DecryptAESState state128;
195
663
  int n, i, j, k;
196
197
663
  i = 0;
198
46.6k
  while (1) {
199
46.6k
    memcpy(key1, pwd, pwdLen);
200
46.6k
    memcpy(key1 + pwdLen, key, keyLen);
201
46.6k
    n = pwdLen + keyLen;
202
46.6k
    if (userKey) {
203
0
      memcpy(key1 + pwdLen + keyLen, userKey, 48);
204
0
      n += 48;
205
0
    }
206
2.98M
    for (j = 1; j < 64; ++j) {
207
2.94M
      memcpy(key1 + j * n, key1, n);
208
2.94M
    }
209
46.6k
    n *= 64;
210
46.6k
    aesKeyExpansion(&state128, key, 16, gFalse);
211
793k
    for (j = 0; j < 16; ++j) {
212
747k
      state128.cbc[j] = key[16+j];
213
747k
    }
214
8.91M
    for (j = 0; j < n; j += 16) {
215
8.86M
      aesEncryptBlock(&state128, key1 + j);
216
8.86M
      memcpy(key1 + j, state128.buf, 16);
217
8.86M
    }
218
46.6k
    k = 0;
219
793k
    for (j = 0; j < 16; ++j) {
220
747k
      k += key1[j] % 3;
221
747k
    }
222
46.6k
    k %= 3;
223
46.6k
    switch (k) {
224
15.3k
    case 0:
225
15.3k
      sha256(key1, n, key);
226
15.3k
      keyLen = 32;
227
15.3k
      break;
228
16.7k
    case 1:
229
16.7k
      sha384(key1, n, key);
230
16.7k
      keyLen = 48;
231
16.7k
      break;
232
14.5k
    case 2:
233
14.5k
      sha512(key1, n, key);
234
14.5k
      keyLen = 64;
235
14.5k
      break;
236
46.6k
    }
237
    // from the spec, it appears that i should be incremented after
238
    // the test, but that doesn't match what Adobe does
239
46.6k
    ++i;
240
46.6k
    if (i >= 64 && key1[n - 1] <= i - 32) {
241
663
      break;
242
663
    }
243
46.6k
  }
244
663
}
245
246
GBool Decrypt::makeFileKey2(int encVersion, int encRevision, int keyLength,
247
          GString *ownerKey, GString *userKey,
248
          int permissions, GString *fileID,
249
          GString *userPassword, Guchar *fileKey,
250
1.11k
          GBool encryptMetadata) {
251
1.11k
  Guchar *buf;
252
1.11k
  Guchar test[32];
253
1.11k
  Guchar fState[256];
254
1.11k
  Guchar tmpKey[16];
255
1.11k
  Guchar fx, fy;
256
1.11k
  int len, i, j;
257
1.11k
  GBool ok;
258
259
  // generate file key
260
1.11k
  buf = (Guchar *)gmalloc(72 + fileID->getLength());
261
1.11k
  if (userPassword) {
262
0
    len = userPassword->getLength();
263
0
    if (len < 32) {
264
0
      memcpy(buf, userPassword->getCString(), len);
265
0
      memcpy(buf + len, passwordPad, 32 - len);
266
0
    } else {
267
0
      memcpy(buf, userPassword->getCString(), 32);
268
0
    }
269
1.11k
  } else {
270
1.11k
    memcpy(buf, passwordPad, 32);
271
1.11k
  }
272
1.11k
  memcpy(buf + 32, ownerKey->getCString(), 32);
273
1.11k
  buf[64] = (Guchar)(permissions & 0xff);
274
1.11k
  buf[65] = (Guchar)((permissions >> 8) & 0xff);
275
1.11k
  buf[66] = (Guchar)((permissions >> 16) & 0xff);
276
1.11k
  buf[67] = (Guchar)((permissions >> 24) & 0xff);
277
1.11k
  memcpy(buf + 68, fileID->getCString(), fileID->getLength());
278
1.11k
  len = 68 + fileID->getLength();
279
1.11k
  if (!encryptMetadata) {
280
0
    buf[len++] = 0xff;
281
0
    buf[len++] = 0xff;
282
0
    buf[len++] = 0xff;
283
0
    buf[len++] = 0xff;
284
0
  }
285
1.11k
  md5(buf, len, fileKey);
286
1.11k
  if (encRevision == 3) {
287
9.69k
    for (i = 0; i < 50; ++i) {
288
9.50k
      md5(fileKey, keyLength, fileKey);
289
9.50k
    }
290
190
  }
291
292
  // test user password
293
1.11k
  if (encRevision == 2) {
294
929
    rc4InitKey(fileKey, keyLength, fState);
295
929
    fx = fy = 0;
296
30.6k
    for (i = 0; i < 32; ++i) {
297
29.7k
      test[i] = rc4DecryptByte(fState, &fx, &fy, userKey->getChar(i));
298
29.7k
    }
299
929
    ok = memcmp(test, passwordPad, 32) == 0;
300
929
  } else if (encRevision == 3) {
301
190
    memcpy(test, userKey->getCString(), 32);
302
3.99k
    for (i = 19; i >= 0; --i) {
303
62.3k
      for (j = 0; j < keyLength; ++j) {
304
58.5k
  tmpKey[j] = (Guchar)(fileKey[j] ^ i);
305
58.5k
      }
306
3.80k
      rc4InitKey(tmpKey, keyLength, fState);
307
3.80k
      fx = fy = 0;
308
125k
      for (j = 0; j < 32; ++j) {
309
121k
  test[j] = rc4DecryptByte(fState, &fx, &fy, test[j]);
310
121k
      }
311
3.80k
    }
312
190
    memcpy(buf, passwordPad, 32);
313
190
    memcpy(buf + 32, fileID->getCString(), fileID->getLength());
314
190
    md5(buf, 32 + fileID->getLength(), buf);
315
190
    ok = memcmp(test, buf, 16) == 0;
316
190
  } else {
317
0
    ok = gFalse;
318
0
  }
319
320
1.11k
  gfree(buf);
321
1.11k
  return ok;
322
1.11k
}
323
324
//------------------------------------------------------------------------
325
// DecryptStream
326
//------------------------------------------------------------------------
327
328
DecryptStream::DecryptStream(Stream *strA, Guchar *fileKeyA,
329
           CryptAlgorithm algoA, int keyLengthA,
330
           int objNumA, int objGenA):
331
36.8k
  FilterStream(strA)
332
36.8k
{
333
36.8k
  int i;
334
335
36.8k
  memcpy(fileKey, fileKeyA, keyLengthA);
336
36.8k
  algo = algoA;
337
36.8k
  keyLength = keyLengthA;
338
36.8k
  objNum = objNumA;
339
36.8k
  objGen = objGenA;
340
341
  // construct object key
342
512k
  for (i = 0; i < keyLength; ++i) {
343
475k
    objKey[i] = fileKey[i];
344
475k
  }
345
36.8k
  switch (algo) {
346
23.6k
  case cryptRC4:
347
23.6k
    objKey[keyLength] = (Guchar)(objNum & 0xff);
348
23.6k
    objKey[keyLength + 1] = (Guchar)((objNum >> 8) & 0xff);
349
23.6k
    objKey[keyLength + 2] = (Guchar)((objNum >> 16) & 0xff);
350
23.6k
    objKey[keyLength + 3] = (Guchar)(objGen & 0xff);
351
23.6k
    objKey[keyLength + 4] = (Guchar)((objGen >> 8) & 0xff);
352
23.6k
    md5(objKey, keyLength + 5, objKey);
353
23.6k
    if ((objKeyLength = keyLength + 5) > 16) {
354
1.62k
      objKeyLength = 16;
355
1.62k
    }
356
23.6k
    break;
357
6.18k
  case cryptAES:
358
6.18k
    objKey[keyLength] = (Guchar)(objNum & 0xff);
359
6.18k
    objKey[keyLength + 1] = (Guchar)((objNum >> 8) & 0xff);
360
6.18k
    objKey[keyLength + 2] = (Guchar)((objNum >> 16) & 0xff);
361
6.18k
    objKey[keyLength + 3] = (Guchar)(objGen & 0xff);
362
6.18k
    objKey[keyLength + 4] = (Guchar)((objGen >> 8) & 0xff);
363
6.18k
    objKey[keyLength + 5] = 0x73; // 's'
364
6.18k
    objKey[keyLength + 6] = 0x41; // 'A'
365
6.18k
    objKey[keyLength + 7] = 0x6c; // 'l'
366
6.18k
    objKey[keyLength + 8] = 0x54; // 'T'
367
6.18k
    md5(objKey, keyLength + 9, objKey);
368
6.18k
    if ((objKeyLength = keyLength + 5) > 16) {
369
6.18k
      objKeyLength = 16;
370
6.18k
    }
371
6.18k
    break;
372
7.02k
  case cryptAES256:
373
7.02k
    objKeyLength = keyLength;
374
7.02k
    break;
375
36.8k
  }
376
36.8k
}
377
378
36.8k
DecryptStream::~DecryptStream() {
379
36.8k
  delete str;
380
36.8k
}
381
382
8.24k
Stream *DecryptStream::copy() {
383
8.24k
  return new DecryptStream(str->copy(), fileKey, algo, keyLength,
384
8.24k
         objNum, objGen);
385
8.24k
}
386
387
27.0k
void DecryptStream::reset() {
388
27.0k
  str->reset();
389
27.0k
  switch (algo) {
390
15.6k
  case cryptRC4:
391
15.6k
    state.rc4.x = state.rc4.y = 0;
392
15.6k
    rc4InitKey(objKey, objKeyLength, state.rc4.state);
393
15.6k
    state.rc4.buf = EOF;
394
15.6k
    break;
395
4.70k
  case cryptAES:
396
4.70k
    aesKeyExpansion(&state.aes, objKey, objKeyLength, gTrue);
397
4.70k
    str->getBlock((char *)state.aes.cbc, 16);
398
4.70k
    state.aes.bufIdx = 16;
399
4.70k
    break;
400
6.68k
  case cryptAES256:
401
6.68k
    aes256KeyExpansion(&state.aes256, objKey, objKeyLength);
402
6.68k
    str->getBlock((char *)state.aes256.cbc, 16);
403
6.68k
    state.aes256.bufIdx = 16;
404
6.68k
    break;
405
27.0k
  }
406
27.0k
}
407
408
9.05M
int DecryptStream::getChar() {
409
9.05M
  Guchar in[16];
410
9.05M
  int c;
411
412
9.05M
  c = EOF; // make gcc happy
413
9.05M
  switch (algo) {
414
8.49M
  case cryptRC4:
415
8.49M
    if (state.rc4.buf == EOF) {
416
8.48M
      c = str->getChar();
417
8.48M
      if (c != EOF) {
418
8.47M
  state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x,
419
8.47M
               &state.rc4.y, (Guchar)c);
420
8.47M
      }
421
8.48M
    }
422
8.49M
    c = state.rc4.buf;
423
8.49M
    state.rc4.buf = EOF;
424
8.49M
    break;
425
146k
  case cryptAES:
426
146k
    if (state.aes.bufIdx == 16) {
427
13.4k
      if (str->getBlock((char *)in, 16) != 16) {
428
4.18k
  return EOF;
429
4.18k
      }
430
9.24k
      aesDecryptBlock(&state.aes, in, str->lookChar() == EOF);
431
9.24k
    }
432
141k
    if (state.aes.bufIdx == 16) {
433
487
      c = EOF;
434
141k
    } else {
435
141k
      c = state.aes.buf[state.aes.bufIdx++];
436
141k
    }
437
141k
    break;
438
410k
  case cryptAES256:
439
410k
    if (state.aes256.bufIdx == 16) {
440
31.4k
      if (str->getBlock((char *)in, 16) != 16) {
441
5.77k
  return EOF;
442
5.77k
      }
443
25.7k
      aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF);
444
25.7k
    }
445
404k
    if (state.aes256.bufIdx == 16) {
446
797
      c = EOF;
447
403k
    } else {
448
403k
      c = state.aes256.buf[state.aes256.bufIdx++];
449
403k
    }
450
404k
    break;
451
9.05M
  }
452
9.04M
  return c;
453
9.05M
}
454
455
27.5k
int DecryptStream::lookChar() {
456
27.5k
  Guchar in[16];
457
27.5k
  int c;
458
459
27.5k
  c = EOF; // make gcc happy
460
27.5k
  switch (algo) {
461
9.07k
  case cryptRC4:
462
9.07k
    if (state.rc4.buf == EOF) {
463
9.01k
      c = str->getChar();
464
9.01k
      if (c != EOF) {
465
9.00k
  state.rc4.buf = rc4DecryptByte(state.rc4.state, &state.rc4.x,
466
9.00k
               &state.rc4.y, (Guchar)c);
467
9.00k
      }
468
9.01k
    }
469
9.07k
    c = state.rc4.buf;
470
9.07k
    break;
471
5.71k
  case cryptAES:
472
5.71k
    if (state.aes.bufIdx == 16) {
473
353
      if (str->getBlock((char *)in, 16) != 16) {
474
5
  return EOF;
475
5
      }
476
348
      aesDecryptBlock(&state.aes, in, str->lookChar() == EOF);
477
348
    }
478
5.71k
    if (state.aes.bufIdx == 16) {
479
4
      c = EOF;
480
5.70k
    } else {
481
5.70k
      c = state.aes.buf[state.aes.bufIdx];
482
5.70k
    }
483
5.71k
    break;
484
12.7k
  case cryptAES256:
485
12.7k
    if (state.aes256.bufIdx == 16) {
486
820
      if (str->getBlock((char *)in, 16) != 16) {
487
12
  return EOF;
488
12
      }
489
808
      aes256DecryptBlock(&state.aes256, in, str->lookChar() == EOF);
490
808
    }
491
12.7k
    if (state.aes256.bufIdx == 16) {
492
6
      c = EOF;
493
12.7k
    } else {
494
12.7k
      c = state.aes256.buf[state.aes256.bufIdx];
495
12.7k
    }
496
12.7k
    break;
497
27.5k
  }
498
27.4k
  return c;
499
27.5k
}
500
501
0
GBool DecryptStream::isBinary(GBool last) {
502
0
  return str->isBinary(last);
503
0
}
504
505
//------------------------------------------------------------------------
506
// RC4-compatible decryption
507
//------------------------------------------------------------------------
508
509
20.3k
void rc4InitKey(Guchar *key, int keyLen, Guchar *state) {
510
20.3k
  Guchar index1, index2;
511
20.3k
  Guchar t;
512
20.3k
  int i;
513
514
5.23M
  for (i = 0; i < 256; ++i)
515
5.21M
    state[i] = (Guchar)i;
516
20.3k
  index1 = index2 = 0;
517
5.23M
  for (i = 0; i < 256; ++i) {
518
5.21M
    index2 = (Guchar)(key[index1] + state[i] + index2);
519
5.21M
    t = state[i];
520
5.21M
    state[i] = state[index2];
521
5.21M
    state[index2] = t;
522
5.21M
    index1 = (Guchar)((index1 + 1) % keyLen);
523
5.21M
  }
524
20.3k
}
525
526
8.63M
Guchar rc4DecryptByte(Guchar *state, Guchar *x, Guchar *y, Guchar c) {
527
8.63M
  Guchar x1, y1, tx, ty;
528
529
8.63M
  x1 = *x = (Guchar)(*x + 1);
530
8.63M
  y1 = *y = (Guchar)(state[*x] + *y);
531
8.63M
  tx = state[x1];
532
8.63M
  ty = state[y1];
533
8.63M
  state[x1] = ty;
534
8.63M
  state[y1] = tx;
535
8.63M
  return c ^ state[(tx + ty) % 256];
536
8.63M
}
537
538
//------------------------------------------------------------------------
539
// AES decryption
540
//------------------------------------------------------------------------
541
542
static Guchar sbox[256] = {
543
  0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
544
  0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
545
  0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
546
  0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
547
  0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
548
  0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
549
  0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
550
  0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
551
  0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
552
  0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
553
  0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
554
  0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
555
  0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
556
  0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
557
  0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
558
  0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16
559
};
560
561
static Guchar invSbox[256] = {
562
  0x52, 0x09, 0x6a, 0xd5, 0x30, 0x36, 0xa5, 0x38, 0xbf, 0x40, 0xa3, 0x9e, 0x81, 0xf3, 0xd7, 0xfb,
563
  0x7c, 0xe3, 0x39, 0x82, 0x9b, 0x2f, 0xff, 0x87, 0x34, 0x8e, 0x43, 0x44, 0xc4, 0xde, 0xe9, 0xcb,
564
  0x54, 0x7b, 0x94, 0x32, 0xa6, 0xc2, 0x23, 0x3d, 0xee, 0x4c, 0x95, 0x0b, 0x42, 0xfa, 0xc3, 0x4e,
565
  0x08, 0x2e, 0xa1, 0x66, 0x28, 0xd9, 0x24, 0xb2, 0x76, 0x5b, 0xa2, 0x49, 0x6d, 0x8b, 0xd1, 0x25,
566
  0x72, 0xf8, 0xf6, 0x64, 0x86, 0x68, 0x98, 0x16, 0xd4, 0xa4, 0x5c, 0xcc, 0x5d, 0x65, 0xb6, 0x92,
567
  0x6c, 0x70, 0x48, 0x50, 0xfd, 0xed, 0xb9, 0xda, 0x5e, 0x15, 0x46, 0x57, 0xa7, 0x8d, 0x9d, 0x84,
568
  0x90, 0xd8, 0xab, 0x00, 0x8c, 0xbc, 0xd3, 0x0a, 0xf7, 0xe4, 0x58, 0x05, 0xb8, 0xb3, 0x45, 0x06,
569
  0xd0, 0x2c, 0x1e, 0x8f, 0xca, 0x3f, 0x0f, 0x02, 0xc1, 0xaf, 0xbd, 0x03, 0x01, 0x13, 0x8a, 0x6b,
570
  0x3a, 0x91, 0x11, 0x41, 0x4f, 0x67, 0xdc, 0xea, 0x97, 0xf2, 0xcf, 0xce, 0xf0, 0xb4, 0xe6, 0x73,
571
  0x96, 0xac, 0x74, 0x22, 0xe7, 0xad, 0x35, 0x85, 0xe2, 0xf9, 0x37, 0xe8, 0x1c, 0x75, 0xdf, 0x6e,
572
  0x47, 0xf1, 0x1a, 0x71, 0x1d, 0x29, 0xc5, 0x89, 0x6f, 0xb7, 0x62, 0x0e, 0xaa, 0x18, 0xbe, 0x1b,
573
  0xfc, 0x56, 0x3e, 0x4b, 0xc6, 0xd2, 0x79, 0x20, 0x9a, 0xdb, 0xc0, 0xfe, 0x78, 0xcd, 0x5a, 0xf4,
574
  0x1f, 0xdd, 0xa8, 0x33, 0x88, 0x07, 0xc7, 0x31, 0xb1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xec, 0x5f,
575
  0x60, 0x51, 0x7f, 0xa9, 0x19, 0xb5, 0x4a, 0x0d, 0x2d, 0xe5, 0x7a, 0x9f, 0x93, 0xc9, 0x9c, 0xef,
576
  0xa0, 0xe0, 0x3b, 0x4d, 0xae, 0x2a, 0xf5, 0xb0, 0xc8, 0xeb, 0xbb, 0x3c, 0x83, 0x53, 0x99, 0x61,
577
  0x17, 0x2b, 0x04, 0x7e, 0xba, 0x77, 0xd6, 0x26, 0xe1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0c, 0x7d
578
};
579
580
static Guint rcon[11] = {
581
  0x00000000, // unused
582
  0x01000000,
583
  0x02000000,
584
  0x04000000,
585
  0x08000000,
586
  0x10000000,
587
  0x20000000,
588
  0x40000000,
589
  0x80000000,
590
  0x1b000000,
591
  0x36000000
592
};
593
594
604k
static inline Guint subWord(Guint x) {
595
604k
  return (sbox[x >> 24] << 24)
596
604k
         | (sbox[(x >> 16) & 0xff] << 16)
597
604k
         | (sbox[(x >> 8) & 0xff] << 8)
598
604k
         | sbox[x & 0xff];
599
604k
}
600
601
562k
static inline Guint rotWord(Guint x) {
602
562k
  return ((x << 8) & 0xffffffff) | (x >> 24);
603
562k
}
604
605
88.6M
static inline void subBytes(Guchar *state) {
606
88.6M
  int i;
607
608
1.50G
  for (i = 0; i < 16; ++i) {
609
1.41G
    state[i] = sbox[state[i]];
610
1.41G
  }
611
88.6M
}
612
613
475k
static inline void invSubBytes(Guchar *state) {
614
475k
  int i;
615
616
8.08M
  for (i = 0; i < 16; ++i) {
617
7.61M
    state[i] = invSbox[state[i]];
618
7.61M
  }
619
475k
}
620
621
88.6M
static inline void shiftRows(Guchar *state) {
622
88.6M
  Guchar t;
623
624
88.6M
  t = state[4];
625
88.6M
  state[4] = state[5];
626
88.6M
  state[5] = state[6];
627
88.6M
  state[6] = state[7];
628
88.6M
  state[7] = t;
629
630
88.6M
  t = state[8];
631
88.6M
  state[8] = state[10];
632
88.6M
  state[10] = t;
633
88.6M
  t = state[9];
634
88.6M
  state[9] = state[11];
635
88.6M
  state[11] = t;
636
637
88.6M
  t = state[15];
638
88.6M
  state[15] = state[14];
639
88.6M
  state[14] = state[13];
640
88.6M
  state[13] = state[12];
641
88.6M
  state[12] = t;
642
88.6M
}
643
644
475k
static inline void invShiftRows(Guchar *state) {
645
475k
  Guchar t;
646
647
475k
  t = state[7];
648
475k
  state[7] = state[6];
649
475k
  state[6] = state[5];
650
475k
  state[5] = state[4];
651
475k
  state[4] = t;
652
653
475k
  t = state[8];
654
475k
  state[8] = state[10];
655
475k
  state[10] = t;
656
475k
  t = state[9];
657
475k
  state[9] = state[11];
658
475k
  state[11] = t;
659
660
475k
  t = state[12];
661
475k
  state[12] = state[13];
662
475k
  state[13] = state[14];
663
475k
  state[14] = state[15];
664
475k
  state[15] = t;
665
475k
}
666
667
// {02} \cdot s
668
1.27G
static inline Guchar mul02(Guchar s) {
669
1.27G
  Guchar s2;
670
671
1.27G
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
672
1.27G
  return s2;
673
1.27G
}
674
675
// {03} \cdot s
676
1.27G
static inline Guchar mul03(Guchar s) {
677
1.27G
  Guchar s2;
678
679
1.27G
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
680
1.27G
  return s ^ s2;
681
1.27G
}
682
683
// {09} \cdot s
684
9.15M
static inline Guchar mul09(Guchar s) {
685
9.15M
  Guchar s2, s4, s8;
686
687
9.15M
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
688
9.15M
  s4 = (Guchar)((s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1));
689
9.15M
  s8 = (Guchar)((s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1));
690
9.15M
  return s ^ s8;
691
9.15M
}
692
693
// {0b} \cdot s
694
9.15M
static inline Guchar mul0b(Guchar s) {
695
9.15M
  Guchar s2, s4, s8;
696
697
9.15M
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
698
9.15M
  s4 = (Guchar)((s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1));
699
9.15M
  s8 = (Guchar)((s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1));
700
9.15M
  return s ^ s2 ^ s8;
701
9.15M
}
702
703
// {0d} \cdot s
704
9.15M
static inline Guchar mul0d(Guchar s) {
705
9.15M
  Guchar s2, s4, s8;
706
707
9.15M
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
708
9.15M
  s4 = (Guchar)((s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1));
709
9.15M
  s8 = (Guchar)((s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1));
710
9.15M
  return s ^ s4 ^ s8;
711
9.15M
}
712
713
// {0e} \cdot s
714
9.15M
static inline Guchar mul0e(Guchar s) {
715
9.15M
  Guchar s2, s4, s8;
716
717
9.15M
  s2 = (Guchar)((s & 0x80) ? ((s << 1) ^ 0x1b) : (s << 1));
718
9.15M
  s4 = (Guchar)((s2 & 0x80) ? ((s2 << 1) ^ 0x1b) : (s2 << 1));
719
9.15M
  s8 = (Guchar)((s4 & 0x80) ? ((s4 << 1) ^ 0x1b) : (s4 << 1));
720
9.15M
  return s2 ^ s4 ^ s8;
721
9.15M
}
722
723
79.7M
static inline void mixColumns(Guchar *state) {
724
79.7M
  int c;
725
79.7M
  Guchar s0, s1, s2, s3;
726
727
398M
  for (c = 0; c < 4; ++c) {
728
319M
    s0 = state[c];
729
319M
    s1 = state[4+c];
730
319M
    s2 = state[8+c];
731
319M
    s3 = state[12+c];
732
319M
    state[c] =    mul02(s0) ^ mul03(s1) ^       s2  ^       s3;
733
319M
    state[4+c] =        s0  ^ mul02(s1) ^ mul03(s2) ^       s3;
734
319M
    state[8+c] =        s0  ^       s1  ^ mul02(s2) ^ mul03(s3);
735
319M
    state[12+c] = mul03(s0) ^       s1  ^       s2  ^ mul02(s3);
736
319M
  }
737
79.7M
}
738
739
438k
static inline void invMixColumns(Guchar *state) {
740
438k
  int c;
741
438k
  Guchar s0, s1, s2, s3;
742
743
2.19M
  for (c = 0; c < 4; ++c) {
744
1.75M
    s0 = state[c];
745
1.75M
    s1 = state[4+c];
746
1.75M
    s2 = state[8+c];
747
1.75M
    s3 = state[12+c];
748
1.75M
    state[c] =    mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3);
749
1.75M
    state[4+c] =  mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3);
750
1.75M
    state[8+c] =  mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3);
751
1.75M
    state[12+c] = mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3);
752
1.75M
  }
753
438k
}
754
755
133k
static inline void invMixColumnsW(Guint *w) {
756
133k
  int c;
757
133k
  Guchar s0, s1, s2, s3;
758
759
665k
  for (c = 0; c < 4; ++c) {
760
532k
    s0 = (Guchar)(w[c] >> 24);
761
532k
    s1 = (Guchar)(w[c] >> 16);
762
532k
    s2 = (Guchar)(w[c] >> 8);
763
532k
    s3 = (Guchar)w[c];
764
532k
    w[c] = ((mul0e(s0) ^ mul0b(s1) ^ mul0d(s2) ^ mul09(s3)) << 24)
765
532k
           | ((mul09(s0) ^ mul0e(s1) ^ mul0b(s2) ^ mul0d(s3)) << 16)
766
532k
           | ((mul0d(s0) ^ mul09(s1) ^ mul0e(s2) ^ mul0b(s3)) << 8)
767
532k
           | (mul0b(s0) ^ mul0d(s1) ^ mul09(s2) ^ mul0e(s3));
768
532k
  }
769
133k
}
770
771
98.0M
static inline void addRoundKey(Guchar *state, Guint *w) {
772
98.0M
  int c;
773
774
490M
  for (c = 0; c < 4; ++c) {
775
392M
    state[c] ^= (Guchar)(w[c] >> 24);
776
392M
    state[4+c] ^= (Guchar)(w[c] >> 16);
777
392M
    state[8+c] ^= (Guchar)(w[c] >> 8);
778
392M
    state[12+c] ^= (Guchar)w[c];
779
392M
  }
780
98.0M
}
781
782
void aesKeyExpansion(DecryptAESState *s,
783
         Guchar *objKey, int objKeyLen,
784
51.3k
         GBool decrypt) {
785
51.3k
  Guint temp;
786
51.3k
  int i, round;
787
788
  //~ this assumes objKeyLen == 16
789
790
256k
  for (i = 0; i < 4; ++i) {
791
205k
    s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) +
792
205k
              (objKey[4*i+2] << 8) + objKey[4*i+3];
793
205k
  }
794
2.10M
  for (i = 4; i < 44; ++i) {
795
2.05M
    temp = s->w[i-1];
796
2.05M
    if (!(i & 3)) {
797
513k
      temp = subWord(rotWord(temp)) ^ rcon[i/4];
798
513k
    }
799
2.05M
    s->w[i] = s->w[i-4] ^ temp;
800
2.05M
  }
801
51.3k
  if (decrypt) {
802
47.0k
    for (round = 1; round <= 9; ++round) {
803
42.3k
      invMixColumnsW(&s->w[round * 4]);
804
42.3k
    }
805
4.70k
  }
806
51.3k
}
807
808
8.86M
void aesEncryptBlock(DecryptAESState *s, Guchar *in) {
809
8.86M
  int c, round;
810
811
  // initial state + CBC
812
44.3M
  for (c = 0; c < 4; ++c) {
813
35.4M
    s->state[c] = in[4*c] ^ s->cbc[4*c];
814
35.4M
    s->state[4+c] = in[4*c+1] ^ s->cbc[4*c+1];
815
35.4M
    s->state[8+c] = in[4*c+2] ^ s->cbc[4*c+2];
816
35.4M
    s->state[12+c] = in[4*c+3] ^ s->cbc[4*c+3];
817
35.4M
  }
818
819
  // round 0
820
8.86M
  addRoundKey(s->state, &s->w[0]);
821
822
  // rounds 1 .. 9
823
88.6M
  for (round = 1; round <= 9; ++round) {
824
79.7M
    subBytes(s->state);
825
79.7M
    shiftRows(s->state);
826
79.7M
    mixColumns(s->state);
827
79.7M
    addRoundKey(s->state, &s->w[round * 4]);
828
79.7M
  }
829
830
  // round 10
831
8.86M
  subBytes(s->state);
832
8.86M
  shiftRows(s->state);
833
8.86M
  addRoundKey(s->state, &s->w[10 * 4]);
834
835
  // output + save for next CBC
836
44.3M
  for (c = 0; c < 4; ++c) {
837
35.4M
    s->buf[4*c] = s->cbc[4*c] = s->state[c];
838
35.4M
    s->buf[4*c+1] = s->cbc[4*c+1] = s->state[4+c];
839
35.4M
    s->buf[4*c+2] = s->cbc[4*c+2] = s->state[8+c];
840
35.4M
    s->buf[4*c+3] = s->cbc[4*c+3] = s->state[12+c];
841
35.4M
  }
842
8.86M
}
843
844
9.59k
void aesDecryptBlock(DecryptAESState *s, Guchar *in, GBool last) {
845
9.59k
  int c, round, n, i;
846
847
  // initial state
848
47.9k
  for (c = 0; c < 4; ++c) {
849
38.3k
    s->state[c] = in[4*c];
850
38.3k
    s->state[4+c] = in[4*c+1];
851
38.3k
    s->state[8+c] = in[4*c+2];
852
38.3k
    s->state[12+c] = in[4*c+3];
853
38.3k
  }
854
855
  // round 0
856
9.59k
  addRoundKey(s->state, &s->w[10 * 4]);
857
858
  // rounds 1-9
859
95.9k
  for (round = 9; round >= 1; --round) {
860
86.3k
    invSubBytes(s->state);
861
86.3k
    invShiftRows(s->state);
862
86.3k
    invMixColumns(s->state);
863
86.3k
    addRoundKey(s->state, &s->w[round * 4]);
864
86.3k
  }
865
866
  // round 10
867
9.59k
  invSubBytes(s->state);
868
9.59k
  invShiftRows(s->state);
869
9.59k
  addRoundKey(s->state, &s->w[0]);
870
871
  // CBC
872
47.9k
  for (c = 0; c < 4; ++c) {
873
38.3k
    s->buf[4*c] = s->state[c] ^ s->cbc[4*c];
874
38.3k
    s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1];
875
38.3k
    s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2];
876
38.3k
    s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3];
877
38.3k
  }
878
879
  // save the input block for the next CBC
880
163k
  for (i = 0; i < 16; ++i) {
881
153k
    s->cbc[i] = in[i];
882
153k
  }
883
884
  // remove padding
885
9.59k
  s->bufIdx = 0;
886
9.59k
  if (last) {
887
919
    n = s->buf[15];
888
919
    if (n < 1 || n > 16) { // this should never happen
889
489
      n = 16;
890
489
    }
891
3.89k
    for (i = 15; i >= n; --i) {
892
2.98k
      s->buf[i] = s->buf[i-n];
893
2.98k
    }
894
919
    s->bufIdx = n;
895
919
  }
896
9.59k
}
897
898
//------------------------------------------------------------------------
899
// AES-256 decryption
900
//------------------------------------------------------------------------
901
902
static void aes256KeyExpansion(DecryptAES256State *s,
903
6.98k
             Guchar *objKey, int objKeyLen) {
904
6.98k
  Guint temp;
905
6.98k
  int i, round;
906
907
  //~ this assumes objKeyLen == 32
908
909
62.8k
  for (i = 0; i < 8; ++i) {
910
55.9k
    s->w[i] = (objKey[4*i] << 24) + (objKey[4*i+1] << 16) +
911
55.9k
              (objKey[4*i+2] << 8) + objKey[4*i+3];
912
55.9k
  }
913
370k
  for (i = 8; i < 60; ++i) {
914
363k
    temp = s->w[i-1];
915
363k
    if ((i & 7) == 0) {
916
48.9k
      temp = subWord(rotWord(temp)) ^ rcon[i/8];
917
314k
    } else if ((i & 7) == 4) {
918
41.9k
      temp = subWord(temp);
919
41.9k
    }
920
363k
    s->w[i] = s->w[i-8] ^ temp;
921
363k
  }
922
97.8k
  for (round = 1; round <= 13; ++round) {
923
90.8k
    invMixColumnsW(&s->w[round * 4]);
924
90.8k
  }
925
6.98k
}
926
927
27.1k
static void aes256DecryptBlock(DecryptAES256State *s, Guchar *in, GBool last) {
928
27.1k
  int c, round, n, i;
929
930
  // initial state
931
135k
  for (c = 0; c < 4; ++c) {
932
108k
    s->state[c] = in[4*c];
933
108k
    s->state[4+c] = in[4*c+1];
934
108k
    s->state[8+c] = in[4*c+2];
935
108k
    s->state[12+c] = in[4*c+3];
936
108k
  }
937
938
  // round 0
939
27.1k
  addRoundKey(s->state, &s->w[14 * 4]);
940
941
  // rounds 13-1
942
379k
  for (round = 13; round >= 1; --round) {
943
352k
    invSubBytes(s->state);
944
352k
    invShiftRows(s->state);
945
352k
    invMixColumns(s->state);
946
352k
    addRoundKey(s->state, &s->w[round * 4]);
947
352k
  }
948
949
  // round 14
950
27.1k
  invSubBytes(s->state);
951
27.1k
  invShiftRows(s->state);
952
27.1k
  addRoundKey(s->state, &s->w[0]);
953
954
  // CBC
955
135k
  for (c = 0; c < 4; ++c) {
956
108k
    s->buf[4*c] = s->state[c] ^ s->cbc[4*c];
957
108k
    s->buf[4*c+1] = s->state[4+c] ^ s->cbc[4*c+1];
958
108k
    s->buf[4*c+2] = s->state[8+c] ^ s->cbc[4*c+2];
959
108k
    s->buf[4*c+3] = s->state[12+c] ^ s->cbc[4*c+3];
960
108k
  }
961
962
  // save the input block for the next CBC
963
461k
  for (i = 0; i < 16; ++i) {
964
433k
    s->cbc[i] = in[i];
965
433k
  }
966
967
  // remove padding
968
27.1k
  s->bufIdx = 0;
969
27.1k
  if (last) {
970
1.58k
    n = s->buf[15];
971
1.58k
    if (n < 1 || n > 16) { // this should never happen
972
802
      n = 16;
973
802
    }
974
6.96k
    for (i = 15; i >= n; --i) {
975
5.38k
      s->buf[i] = s->buf[i-n];
976
5.38k
    }
977
1.58k
    s->bufIdx = n;
978
1.58k
  }
979
27.1k
}
980
981
//------------------------------------------------------------------------
982
// MD5 message digest
983
//------------------------------------------------------------------------
984
985
// this works around a bug in older Sun compilers
986
2.76M
static inline Gulong rotateLeft(Gulong x, int r) {
987
2.76M
  x &= 0xffffffff;
988
2.76M
  return ((x << r) | (x >> (32 - r))) & 0xffffffff;
989
2.76M
}
990
991
static inline Gulong md5Round1(Gulong a, Gulong b, Gulong c, Gulong d,
992
691k
             Gulong Xk, int s, Gulong Ti) {
993
691k
  return b + rotateLeft((a + ((b & c) | (~b & d)) + Xk + Ti), s);
994
691k
}
995
996
static inline Gulong md5Round2(Gulong a, Gulong b, Gulong c, Gulong d,
997
691k
             Gulong Xk, int s, Gulong Ti) {
998
691k
  return b + rotateLeft((a + ((b & d) | (c & ~d)) + Xk + Ti), s);
999
691k
}
1000
1001
static inline Gulong md5Round3(Gulong a, Gulong b, Gulong c, Gulong d,
1002
691k
             Gulong Xk, int s, Gulong Ti) {
1003
691k
  return b + rotateLeft((a + (b ^ c ^ d) + Xk + Ti), s);
1004
691k
}
1005
1006
static inline Gulong md5Round4(Gulong a, Gulong b, Gulong c, Gulong d,
1007
691k
             Gulong Xk, int s, Gulong Ti) {
1008
691k
  return b + rotateLeft((a + (c ^ (b | ~d)) + Xk + Ti), s);
1009
691k
}
1010
1011
40.6k
void md5Start(MD5State *state) {
1012
40.6k
  state->a = 0x67452301;
1013
40.6k
  state->b = 0xefcdab89;
1014
40.6k
  state->c = 0x98badcfe;
1015
40.6k
  state->d = 0x10325476;
1016
40.6k
  state->bufLen = 0;
1017
40.6k
  state->msgLen = 0;
1018
40.6k
}
1019
1020
43.1k
static void md5ProcessBlock(MD5State *state) {
1021
43.1k
  Gulong x[16];
1022
43.1k
  Gulong a, b, c, d;
1023
43.1k
  int i;
1024
1025
734k
  for (i = 0; i < 16; ++i) {
1026
691k
    x[i] = state->buf[4*i] | (state->buf[4*i+1] << 8) |
1027
691k
           (state->buf[4*i+2] << 16) | (state->buf[4*i+3] << 24);
1028
691k
  }
1029
1030
43.1k
  a = state->a;
1031
43.1k
  b = state->b;
1032
43.1k
  c = state->c;
1033
43.1k
  d = state->d;
1034
1035
  // round 1
1036
43.1k
  a = md5Round1(a, b, c, d, x[0],   7, 0xd76aa478);
1037
43.1k
  d = md5Round1(d, a, b, c, x[1],  12, 0xe8c7b756);
1038
43.1k
  c = md5Round1(c, d, a, b, x[2],  17, 0x242070db);
1039
43.1k
  b = md5Round1(b, c, d, a, x[3],  22, 0xc1bdceee);
1040
43.1k
  a = md5Round1(a, b, c, d, x[4],   7, 0xf57c0faf);
1041
43.1k
  d = md5Round1(d, a, b, c, x[5],  12, 0x4787c62a);
1042
43.1k
  c = md5Round1(c, d, a, b, x[6],  17, 0xa8304613);
1043
43.1k
  b = md5Round1(b, c, d, a, x[7],  22, 0xfd469501);
1044
43.1k
  a = md5Round1(a, b, c, d, x[8],   7, 0x698098d8);
1045
43.1k
  d = md5Round1(d, a, b, c, x[9],  12, 0x8b44f7af);
1046
43.1k
  c = md5Round1(c, d, a, b, x[10], 17, 0xffff5bb1);
1047
43.1k
  b = md5Round1(b, c, d, a, x[11], 22, 0x895cd7be);
1048
43.1k
  a = md5Round1(a, b, c, d, x[12],  7, 0x6b901122);
1049
43.1k
  d = md5Round1(d, a, b, c, x[13], 12, 0xfd987193);
1050
43.1k
  c = md5Round1(c, d, a, b, x[14], 17, 0xa679438e);
1051
43.1k
  b = md5Round1(b, c, d, a, x[15], 22, 0x49b40821);
1052
1053
  // round 2
1054
43.1k
  a = md5Round2(a, b, c, d, x[1],   5, 0xf61e2562);
1055
43.1k
  d = md5Round2(d, a, b, c, x[6],   9, 0xc040b340);
1056
43.1k
  c = md5Round2(c, d, a, b, x[11], 14, 0x265e5a51);
1057
43.1k
  b = md5Round2(b, c, d, a, x[0],  20, 0xe9b6c7aa);
1058
43.1k
  a = md5Round2(a, b, c, d, x[5],   5, 0xd62f105d);
1059
43.1k
  d = md5Round2(d, a, b, c, x[10],  9, 0x02441453);
1060
43.1k
  c = md5Round2(c, d, a, b, x[15], 14, 0xd8a1e681);
1061
43.1k
  b = md5Round2(b, c, d, a, x[4],  20, 0xe7d3fbc8);
1062
43.1k
  a = md5Round2(a, b, c, d, x[9],   5, 0x21e1cde6);
1063
43.1k
  d = md5Round2(d, a, b, c, x[14],  9, 0xc33707d6);
1064
43.1k
  c = md5Round2(c, d, a, b, x[3],  14, 0xf4d50d87);
1065
43.1k
  b = md5Round2(b, c, d, a, x[8],  20, 0x455a14ed);
1066
43.1k
  a = md5Round2(a, b, c, d, x[13],  5, 0xa9e3e905);
1067
43.1k
  d = md5Round2(d, a, b, c, x[2],   9, 0xfcefa3f8);
1068
43.1k
  c = md5Round2(c, d, a, b, x[7],  14, 0x676f02d9);
1069
43.1k
  b = md5Round2(b, c, d, a, x[12], 20, 0x8d2a4c8a);
1070
1071
  // round 3
1072
43.1k
  a = md5Round3(a, b, c, d, x[5],   4, 0xfffa3942);
1073
43.1k
  d = md5Round3(d, a, b, c, x[8],  11, 0x8771f681);
1074
43.1k
  c = md5Round3(c, d, a, b, x[11], 16, 0x6d9d6122);
1075
43.1k
  b = md5Round3(b, c, d, a, x[14], 23, 0xfde5380c);
1076
43.1k
  a = md5Round3(a, b, c, d, x[1],   4, 0xa4beea44);
1077
43.1k
  d = md5Round3(d, a, b, c, x[4],  11, 0x4bdecfa9);
1078
43.1k
  c = md5Round3(c, d, a, b, x[7],  16, 0xf6bb4b60);
1079
43.1k
  b = md5Round3(b, c, d, a, x[10], 23, 0xbebfbc70);
1080
43.1k
  a = md5Round3(a, b, c, d, x[13],  4, 0x289b7ec6);
1081
43.1k
  d = md5Round3(d, a, b, c, x[0],  11, 0xeaa127fa);
1082
43.1k
  c = md5Round3(c, d, a, b, x[3],  16, 0xd4ef3085);
1083
43.1k
  b = md5Round3(b, c, d, a, x[6],  23, 0x04881d05);
1084
43.1k
  a = md5Round3(a, b, c, d, x[9],   4, 0xd9d4d039);
1085
43.1k
  d = md5Round3(d, a, b, c, x[12], 11, 0xe6db99e5);
1086
43.1k
  c = md5Round3(c, d, a, b, x[15], 16, 0x1fa27cf8);
1087
43.1k
  b = md5Round3(b, c, d, a, x[2],  23, 0xc4ac5665);
1088
1089
  // round 4
1090
43.1k
  a = md5Round4(a, b, c, d, x[0],   6, 0xf4292244);
1091
43.1k
  d = md5Round4(d, a, b, c, x[7],  10, 0x432aff97);
1092
43.1k
  c = md5Round4(c, d, a, b, x[14], 15, 0xab9423a7);
1093
43.1k
  b = md5Round4(b, c, d, a, x[5],  21, 0xfc93a039);
1094
43.1k
  a = md5Round4(a, b, c, d, x[12],  6, 0x655b59c3);
1095
43.1k
  d = md5Round4(d, a, b, c, x[3],  10, 0x8f0ccc92);
1096
43.1k
  c = md5Round4(c, d, a, b, x[10], 15, 0xffeff47d);
1097
43.1k
  b = md5Round4(b, c, d, a, x[1],  21, 0x85845dd1);
1098
43.1k
  a = md5Round4(a, b, c, d, x[8],   6, 0x6fa87e4f);
1099
43.1k
  d = md5Round4(d, a, b, c, x[15], 10, 0xfe2ce6e0);
1100
43.1k
  c = md5Round4(c, d, a, b, x[6],  15, 0xa3014314);
1101
43.1k
  b = md5Round4(b, c, d, a, x[13], 21, 0x4e0811a1);
1102
43.1k
  a = md5Round4(a, b, c, d, x[4],   6, 0xf7537e82);
1103
43.1k
  d = md5Round4(d, a, b, c, x[11], 10, 0xbd3af235);
1104
43.1k
  c = md5Round4(c, d, a, b, x[2],  15, 0x2ad7d2bb);
1105
43.1k
  b = md5Round4(b, c, d, a, x[9],  21, 0xeb86d391);
1106
1107
  // increment a, b, c, d
1108
43.1k
  state->a += a;
1109
43.1k
  state->b += b;
1110
43.1k
  state->c += c;
1111
43.1k
  state->d += d;
1112
1113
43.1k
  state->bufLen = 0;
1114
43.1k
}
1115
1116
40.6k
void md5Append(MD5State *state, Guchar *data, int dataLen) {
1117
40.6k
  Guchar *p;
1118
40.6k
  int remain, k;
1119
1120
40.6k
  p = data;
1121
40.6k
  remain = dataLen;
1122
43.1k
  while (state->bufLen + remain >= 64) {
1123
2.52k
    k = 64 - state->bufLen;
1124
2.52k
    memcpy(state->buf + state->bufLen, p, k);
1125
2.52k
    state->bufLen = 64;
1126
2.52k
    md5ProcessBlock(state);
1127
2.52k
    p += k;
1128
2.52k
    remain -= k;
1129
2.52k
  }
1130
40.6k
  if (remain > 0) {
1131
40.6k
    memcpy(state->buf + state->bufLen, p, remain);
1132
40.6k
    state->bufLen += remain;
1133
40.6k
  }
1134
40.6k
  state->msgLen += dataLen;
1135
40.6k
}
1136
1137
40.6k
void md5Finish(MD5State *state) {
1138
  // padding and length
1139
40.6k
  state->buf[state->bufLen++] = 0x80;
1140
40.6k
  if (state->bufLen > 56) {
1141
38
    while (state->bufLen < 64) {
1142
28
      state->buf[state->bufLen++] = 0x00;
1143
28
    }
1144
10
    md5ProcessBlock(state);
1145
10
  }      
1146
1.65M
  while (state->bufLen < 56) {
1147
1.61M
    state->buf[state->bufLen++] = 0x00;
1148
1.61M
  }
1149
40.6k
  state->buf[56] = (Guchar)(state->msgLen << 3);
1150
40.6k
  state->buf[57] = (Guchar)(state->msgLen >> 5);
1151
40.6k
  state->buf[58] = (Guchar)(state->msgLen >> 13);
1152
40.6k
  state->buf[59] = (Guchar)(state->msgLen >> 21);
1153
40.6k
  state->buf[60] = (Guchar)(state->msgLen >> 29);
1154
40.6k
  state->buf[61] = (Guchar)0;
1155
40.6k
  state->buf[62] = (Guchar)0;
1156
40.6k
  state->buf[63] = (Guchar)0;
1157
40.6k
  state->bufLen = 64;
1158
40.6k
  md5ProcessBlock(state);
1159
1160
  // break digest into bytes
1161
40.6k
  state->digest[0] = (Guchar)state->a;
1162
40.6k
  state->digest[1] = (Guchar)(state->a >> 8);
1163
40.6k
  state->digest[2] = (Guchar)(state->a >> 16);
1164
40.6k
  state->digest[3] = (Guchar)(state->a >> 24);
1165
40.6k
  state->digest[4] = (Guchar)state->b;
1166
40.6k
  state->digest[5] = (Guchar)(state->b >> 8);
1167
40.6k
  state->digest[6] = (Guchar)(state->b >> 16);
1168
40.6k
  state->digest[7] = (Guchar)(state->b >> 24);
1169
40.6k
  state->digest[8] = (Guchar)state->c;
1170
40.6k
  state->digest[9] = (Guchar)(state->c >> 8);
1171
40.6k
  state->digest[10] = (Guchar)(state->c >> 16);
1172
40.6k
  state->digest[11] = (Guchar)(state->c >> 24);
1173
40.6k
  state->digest[12] = (Guchar)state->d;
1174
40.6k
  state->digest[13] = (Guchar)(state->d >> 8);
1175
40.6k
  state->digest[14] = (Guchar)(state->d >> 16);
1176
40.6k
  state->digest[15] = (Guchar)(state->d >> 24);
1177
40.6k
}
1178
1179
40.6k
void md5(Guchar *msg, int msgLen, Guchar *digest) {
1180
40.6k
  MD5State state;
1181
40.6k
  int i;
1182
1183
40.6k
  if (msgLen < 0) {
1184
0
    return;
1185
0
  }
1186
40.6k
  md5Start(&state);
1187
40.6k
  md5Append(&state, msg, msgLen);
1188
40.6k
  md5Finish(&state);
1189
691k
  for (i = 0; i < 16; ++i) {
1190
650k
    digest[i] = state.digest[i];
1191
650k
  }
1192
40.6k
}
1193
1194
//------------------------------------------------------------------------
1195
// SHA-256 hash
1196
//------------------------------------------------------------------------
1197
1198
static Guint sha256K[64] = {
1199
  0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
1200
  0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
1201
  0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
1202
  0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
1203
  0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
1204
  0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
1205
  0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
1206
  0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
1207
  0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
1208
  0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
1209
  0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
1210
  0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
1211
  0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
1212
  0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
1213
  0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
1214
  0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
1215
};
1216
1217
421M
static inline Guint rotr(Guint x, Guint n) {
1218
421M
  return (x >> n) | (x << (32 - n));
1219
421M
}
1220
1221
46.8M
static inline Guint sha256Ch(Guint x, Guint y, Guint z) {
1222
46.8M
  return (x & y) ^ (~x & z);
1223
46.8M
}
1224
1225
46.8M
static inline Guint sha256Maj(Guint x, Guint y, Guint z) {
1226
46.8M
  return (x & y) ^ (x & z) ^ (y & z);
1227
46.8M
}
1228
1229
46.8M
static inline Guint sha256Sigma0(Guint x) {
1230
46.8M
  return rotr(x, 2) ^ rotr(x, 13) ^ rotr(x, 22);
1231
46.8M
}
1232
1233
46.8M
static inline Guint sha256Sigma1(Guint x) {
1234
46.8M
  return rotr(x, 6) ^ rotr(x, 11) ^ rotr(x, 25);
1235
46.8M
}
1236
1237
35.1M
static inline Guint sha256sigma0(Guint x) {
1238
35.1M
  return rotr(x, 7) ^ rotr(x, 18) ^ (x >> 3);
1239
35.1M
}
1240
1241
35.1M
static inline Guint sha256sigma1(Guint x) {
1242
35.1M
  return rotr(x, 17) ^ rotr(x, 19) ^ (x >> 10);
1243
35.1M
}
1244
1245
732k
static void sha256HashBlock(Guchar *blk, Guint *H) {
1246
732k
  Guint W[64];
1247
732k
  Guint a, b, c, d, e, f, g, h;
1248
732k
  Guint T1, T2;
1249
732k
  Guint t;
1250
1251
  // 1. prepare the message schedule
1252
12.4M
  for (t = 0; t < 16; ++t) {
1253
11.7M
    W[t] = (blk[t*4] << 24) |
1254
11.7M
           (blk[t*4 + 1] << 16) |
1255
11.7M
           (blk[t*4 + 2] << 8) |
1256
11.7M
           blk[t*4 + 3];
1257
11.7M
  }
1258
35.8M
  for (t = 16; t < 64; ++t) {
1259
35.1M
    W[t] = sha256sigma1(W[t-2]) + W[t-7] + sha256sigma0(W[t-15]) + W[t-16];
1260
35.1M
  }
1261
1262
  // 2. initialize the eight working variables
1263
732k
  a = H[0];
1264
732k
  b = H[1];
1265
732k
  c = H[2];
1266
732k
  d = H[3];
1267
732k
  e = H[4];
1268
732k
  f = H[5];
1269
732k
  g = H[6];
1270
732k
  h = H[7];
1271
1272
  // 3.
1273
47.5M
  for (t = 0; t < 64; ++t) {
1274
46.8M
    T1 = h + sha256Sigma1(e) + sha256Ch(e,f,g) + sha256K[t] + W[t];
1275
46.8M
    T2 = sha256Sigma0(a) + sha256Maj(a,b,c);
1276
46.8M
    h = g;
1277
46.8M
    g = f;
1278
46.8M
    f = e;
1279
46.8M
    e = d + T1;
1280
46.8M
    d = c;
1281
46.8M
    c = b;
1282
46.8M
    b = a;
1283
46.8M
    a = T1 + T2;
1284
46.8M
  }
1285
1286
  // 4. compute the intermediate hash value
1287
732k
  H[0] += a;
1288
732k
  H[1] += b;
1289
732k
  H[2] += c;
1290
732k
  H[3] += d;
1291
732k
  H[4] += e;
1292
732k
  H[5] += f;
1293
732k
  H[6] += g;
1294
732k
  H[7] += h;
1295
732k
}
1296
1297
16.0k
static void sha256(Guchar *msg, int msgLen, Guchar *hash) {
1298
16.0k
  Guchar blk[64];
1299
16.0k
  Guint H[8];
1300
16.0k
  int blkLen, i;
1301
1302
16.0k
  H[0] = 0x6a09e667;
1303
16.0k
  H[1] = 0xbb67ae85;
1304
16.0k
  H[2] = 0x3c6ef372;
1305
16.0k
  H[3] = 0xa54ff53a;
1306
16.0k
  H[4] = 0x510e527f;
1307
16.0k
  H[5] = 0x9b05688c;
1308
16.0k
  H[6] = 0x1f83d9ab;
1309
16.0k
  H[7] = 0x5be0cd19;
1310
1311
16.0k
  blkLen = 0;
1312
732k
  for (i = 0; i + 64 <= msgLen; i += 64) {
1313
716k
    sha256HashBlock(msg + i, H);
1314
716k
  }
1315
16.0k
  blkLen = msgLen - i;
1316
16.0k
  if (blkLen > 0) {
1317
665
    memcpy(blk, msg + i, blkLen);
1318
665
  }
1319
1320
  // pad the message
1321
16.0k
  blk[blkLen++] = 0x80;
1322
16.0k
  if (blkLen > 56) {
1323
0
    while (blkLen < 64) {
1324
0
      blk[blkLen++] = 0;
1325
0
    }
1326
0
    sha256HashBlock(blk, H);
1327
0
    blkLen = 0;
1328
0
  }
1329
891k
  while (blkLen < 56) {
1330
875k
    blk[blkLen++] = 0;
1331
875k
  }
1332
16.0k
  blk[56] = 0;
1333
16.0k
  blk[57] = 0;
1334
16.0k
  blk[58] = 0;
1335
16.0k
  blk[59] = 0;
1336
16.0k
  blk[60] = (Guchar)(msgLen >> 21);
1337
16.0k
  blk[61] = (Guchar)(msgLen >> 13);
1338
16.0k
  blk[62] = (Guchar)(msgLen >> 5);
1339
16.0k
  blk[63] = (Guchar)(msgLen << 3);
1340
16.0k
  sha256HashBlock(blk, H);
1341
1342
  // copy the output into the buffer (convert words to bytes)
1343
144k
  for (i = 0; i < 8; ++i) {
1344
128k
    hash[i*4]     = (Guchar)(H[i] >> 24);
1345
128k
    hash[i*4 + 1] = (Guchar)(H[i] >> 16);
1346
128k
    hash[i*4 + 2] = (Guchar)(H[i] >> 8);
1347
128k
    hash[i*4 + 3] = (Guchar)H[i];
1348
128k
  }
1349
16.0k
}
1350
1351
//------------------------------------------------------------------------
1352
// SHA-384 and SHA-512 hashes
1353
//------------------------------------------------------------------------
1354
1355
typedef unsigned long long SHA512Uint64;
1356
1357
static SHA512Uint64 sha512K[80] = {
1358
  0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL,
1359
  0xb5c0fbcfec4d3b2fULL, 0xe9b5dba58189dbbcULL,
1360
  0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
1361
  0x923f82a4af194f9bULL, 0xab1c5ed5da6d8118ULL,
1362
  0xd807aa98a3030242ULL, 0x12835b0145706fbeULL,
1363
  0x243185be4ee4b28cULL, 0x550c7dc3d5ffb4e2ULL,
1364
  0x72be5d74f27b896fULL, 0x80deb1fe3b1696b1ULL,
1365
  0x9bdc06a725c71235ULL, 0xc19bf174cf692694ULL,
1366
  0xe49b69c19ef14ad2ULL, 0xefbe4786384f25e3ULL,
1367
  0x0fc19dc68b8cd5b5ULL, 0x240ca1cc77ac9c65ULL,
1368
  0x2de92c6f592b0275ULL, 0x4a7484aa6ea6e483ULL,
1369
  0x5cb0a9dcbd41fbd4ULL, 0x76f988da831153b5ULL,
1370
  0x983e5152ee66dfabULL, 0xa831c66d2db43210ULL,
1371
  0xb00327c898fb213fULL, 0xbf597fc7beef0ee4ULL,
1372
  0xc6e00bf33da88fc2ULL, 0xd5a79147930aa725ULL,
1373
  0x06ca6351e003826fULL, 0x142929670a0e6e70ULL,
1374
  0x27b70a8546d22ffcULL, 0x2e1b21385c26c926ULL,
1375
  0x4d2c6dfc5ac42aedULL, 0x53380d139d95b3dfULL,
1376
  0x650a73548baf63deULL, 0x766a0abb3c77b2a8ULL,
1377
  0x81c2c92e47edaee6ULL, 0x92722c851482353bULL,
1378
  0xa2bfe8a14cf10364ULL, 0xa81a664bbc423001ULL,
1379
  0xc24b8b70d0f89791ULL, 0xc76c51a30654be30ULL,
1380
  0xd192e819d6ef5218ULL, 0xd69906245565a910ULL,
1381
  0xf40e35855771202aULL, 0x106aa07032bbd1b8ULL,
1382
  0x19a4c116b8d2d0c8ULL, 0x1e376c085141ab53ULL,
1383
  0x2748774cdf8eeb99ULL, 0x34b0bcb5e19b48a8ULL,
1384
  0x391c0cb3c5c95a63ULL, 0x4ed8aa4ae3418acbULL,
1385
  0x5b9cca4f7763e373ULL, 0x682e6ff3d6b2b8a3ULL,
1386
  0x748f82ee5defb2fcULL, 0x78a5636f43172f60ULL,
1387
  0x84c87814a1f0ab72ULL, 0x8cc702081a6439ecULL,
1388
  0x90befffa23631e28ULL, 0xa4506cebde82bde9ULL,
1389
  0xbef9a3f7b2c67915ULL, 0xc67178f2e372532bULL,
1390
  0xca273eceea26619cULL, 0xd186b8c721c0c207ULL,
1391
  0xeada7dd6cde0eb1eULL, 0xf57d4f7fee6ed178ULL,
1392
  0x06f067aa72176fbaULL, 0x0a637dc5a2c898a6ULL,
1393
  0x113f9804bef90daeULL, 0x1b710b35131c471bULL,
1394
  0x28db77f523047d84ULL, 0x32caab7b40c72493ULL,
1395
  0x3c9ebe0a15c9bebcULL, 0x431d67c49c100d4cULL,
1396
  0x4cc5d4becb3e42b6ULL, 0x597f299cfc657e2aULL,
1397
  0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL
1398
};
1399
1400
575M
static inline SHA512Uint64 rotr64(SHA512Uint64 x, Guint n) {
1401
575M
  return (x >> n) | (x << (64 - n));
1402
575M
}
1403
1404
static inline SHA512Uint64 sha512Ch(SHA512Uint64 x, SHA512Uint64 y,
1405
62.5M
            SHA512Uint64 z) {
1406
62.5M
  return (x & y) ^ (~x & z);
1407
62.5M
}
1408
1409
static inline SHA512Uint64 sha512Maj(SHA512Uint64 x, SHA512Uint64 y,
1410
62.5M
             SHA512Uint64 z) {
1411
62.5M
  return (x & y) ^ (x & z) ^ (y & z);
1412
62.5M
}
1413
1414
62.5M
static inline SHA512Uint64 sha512Sigma0(SHA512Uint64 x) {
1415
62.5M
  return rotr64(x, 28) ^ rotr64(x, 34) ^ rotr64(x, 39);
1416
62.5M
}
1417
1418
62.5M
static inline SHA512Uint64 sha512Sigma1(SHA512Uint64 x) {
1419
62.5M
  return rotr64(x, 14) ^ rotr64(x, 18) ^ rotr64(x, 41);
1420
62.5M
}
1421
1422
50.0M
static inline SHA512Uint64 sha512sigma0(SHA512Uint64 x) {
1423
50.0M
  return rotr64(x, 1) ^ rotr64(x, 8) ^ (x >> 7);
1424
50.0M
}
1425
1426
50.0M
static inline SHA512Uint64 sha512sigma1(SHA512Uint64 x) {
1427
50.0M
  return rotr64(x, 19) ^ rotr64(x, 61) ^ (x >> 6);
1428
50.0M
}
1429
1430
781k
static void sha512HashBlock(Guchar *blk, SHA512Uint64 *H) {
1431
781k
  SHA512Uint64 W[80];
1432
781k
  SHA512Uint64 a, b, c, d, e, f, g, h;
1433
781k
  SHA512Uint64 T1, T2;
1434
781k
  Guint t;
1435
1436
  // 1. prepare the message schedule
1437
13.2M
  for (t = 0; t < 16; ++t) {
1438
12.5M
    W[t] = ((SHA512Uint64)blk[t*8] << 56) |
1439
12.5M
           ((SHA512Uint64)blk[t*8 + 1] << 48) |
1440
12.5M
           ((SHA512Uint64)blk[t*8 + 2] << 40) |
1441
12.5M
           ((SHA512Uint64)blk[t*8 + 3] << 32) |
1442
12.5M
           ((SHA512Uint64)blk[t*8 + 4] << 24) |
1443
12.5M
           ((SHA512Uint64)blk[t*8 + 5] << 16) |
1444
12.5M
           ((SHA512Uint64)blk[t*8 + 6] << 8) |
1445
12.5M
           (SHA512Uint64)blk[t*8 + 7];
1446
12.5M
  }
1447
50.7M
  for (t = 16; t < 80; ++t) {
1448
50.0M
    W[t] = sha512sigma1(W[t-2]) + W[t-7] + sha512sigma0(W[t-15]) + W[t-16];
1449
50.0M
  }
1450
1451
  // 2. initialize the eight working variables
1452
781k
  a = H[0];
1453
781k
  b = H[1];
1454
781k
  c = H[2];
1455
781k
  d = H[3];
1456
781k
  e = H[4];
1457
781k
  f = H[5];
1458
781k
  g = H[6];
1459
781k
  h = H[7];
1460
1461
  // 3.
1462
63.2M
  for (t = 0; t < 80; ++t) {
1463
62.5M
    T1 = h + sha512Sigma1(e) + sha512Ch(e,f,g) + sha512K[t] + W[t];
1464
62.5M
    T2 = sha512Sigma0(a) + sha512Maj(a,b,c);
1465
62.5M
    h = g;
1466
62.5M
    g = f;
1467
62.5M
    f = e;
1468
62.5M
    e = d + T1;
1469
62.5M
    d = c;
1470
62.5M
    c = b;
1471
62.5M
    b = a;
1472
62.5M
    a = T1 + T2;
1473
62.5M
  }
1474
1475
  // 4. compute the intermediate hash value
1476
781k
  H[0] += a;
1477
781k
  H[1] += b;
1478
781k
  H[2] += c;
1479
781k
  H[3] += d;
1480
781k
  H[4] += e;
1481
781k
  H[5] += f;
1482
781k
  H[6] += g;
1483
781k
  H[7] += h;
1484
781k
}
1485
1486
14.5k
static void sha512(Guchar *msg, int msgLen, Guchar *hash) {
1487
14.5k
  Guchar blk[128];
1488
14.5k
  SHA512Uint64 H[8];
1489
14.5k
  int blkLen, i;
1490
1491
14.5k
  H[0] = 0x6a09e667f3bcc908ULL;
1492
14.5k
  H[1] = 0xbb67ae8584caa73bULL;
1493
14.5k
  H[2] = 0x3c6ef372fe94f82bULL;
1494
14.5k
  H[3] = 0xa54ff53a5f1d36f1ULL;
1495
14.5k
  H[4] = 0x510e527fade682d1ULL;
1496
14.5k
  H[5] = 0x9b05688c2b3e6c1fULL;
1497
14.5k
  H[6] = 0x1f83d9abfb41bd6bULL;
1498
14.5k
  H[7] = 0x5be0cd19137e2179ULL;
1499
1500
14.5k
  blkLen = 0;
1501
357k
  for (i = 0; i + 128 <= msgLen; i += 128) {
1502
342k
    sha512HashBlock(msg + i, H);
1503
342k
  }
1504
14.5k
  blkLen = msgLen - i;
1505
14.5k
  if (blkLen > 0) {
1506
0
    memcpy(blk, msg + i, blkLen);
1507
0
  }
1508
1509
  // pad the message
1510
14.5k
  blk[blkLen++] = 0x80;
1511
14.5k
  if (blkLen > 112) {
1512
0
    while (blkLen < 128) {
1513
0
      blk[blkLen++] = 0;
1514
0
    }
1515
0
    sha512HashBlock(blk, H);
1516
0
    blkLen = 0;
1517
0
  }
1518
1.63M
  while (blkLen < 112) {
1519
1.61M
    blk[blkLen++] = 0;
1520
1.61M
  }
1521
14.5k
  blk[112] = 0;
1522
14.5k
  blk[113] = 0;
1523
14.5k
  blk[114] = 0;
1524
14.5k
  blk[115] = 0;
1525
14.5k
  blk[116] = 0;
1526
14.5k
  blk[117] = 0;
1527
14.5k
  blk[118] = 0;
1528
14.5k
  blk[119] = 0;
1529
14.5k
  blk[120] = 0;
1530
14.5k
  blk[121] = 0;
1531
14.5k
  blk[122] = 0;
1532
14.5k
  blk[123] = 0;
1533
14.5k
  blk[124] = (Guchar)(msgLen >> 21);
1534
14.5k
  blk[125] = (Guchar)(msgLen >> 13);
1535
14.5k
  blk[126] = (Guchar)(msgLen >> 5);
1536
14.5k
  blk[127] = (Guchar)(msgLen << 3);
1537
14.5k
  sha512HashBlock(blk, H);
1538
1539
  // copy the output into the buffer (convert words to bytes)
1540
131k
  for (i = 0; i < 8; ++i) {
1541
116k
    hash[i*8]     = (Guchar)(H[i] >> 56);
1542
116k
    hash[i*8 + 1] = (Guchar)(H[i] >> 48);
1543
116k
    hash[i*8 + 2] = (Guchar)(H[i] >> 40);
1544
116k
    hash[i*8 + 3] = (Guchar)(H[i] >> 32);
1545
116k
    hash[i*8 + 4] = (Guchar)(H[i] >> 24);
1546
116k
    hash[i*8 + 5] = (Guchar)(H[i] >> 16);
1547
116k
    hash[i*8 + 6] = (Guchar)(H[i] >> 8);
1548
116k
    hash[i*8 + 7] = (Guchar)H[i];
1549
116k
  }
1550
14.5k
}
1551
1552
16.7k
static void sha384(Guchar *msg, int msgLen, Guchar *hash) {
1553
16.7k
  Guchar blk[128];
1554
16.7k
  SHA512Uint64 H[8];
1555
16.7k
  int blkLen, i;
1556
1557
16.7k
  H[0] = 0xcbbb9d5dc1059ed8ULL;
1558
16.7k
  H[1] = 0x629a292a367cd507ULL;
1559
16.7k
  H[2] = 0x9159015a3070dd17ULL;
1560
16.7k
  H[3] = 0x152fecd8f70e5939ULL;
1561
16.7k
  H[4] = 0x67332667ffc00b31ULL;
1562
16.7k
  H[5] = 0x8eb44a8768581511ULL;
1563
16.7k
  H[6] = 0xdb0c2e0d64f98fa7ULL;
1564
16.7k
  H[7] = 0x47b5481dbefa4fa4ULL;
1565
1566
16.7k
  blkLen = 0;
1567
423k
  for (i = 0; i + 128 <= msgLen; i += 128) {
1568
406k
    sha512HashBlock(msg + i, H);
1569
406k
  }
1570
16.7k
  blkLen = msgLen - i;
1571
16.7k
  if (blkLen > 0) {
1572
0
    memcpy(blk, msg + i, blkLen);
1573
0
  }
1574
1575
  // pad the message
1576
16.7k
  blk[blkLen++] = 0x80;
1577
16.7k
  if (blkLen > 112) {
1578
0
    while (blkLen < 128) {
1579
0
      blk[blkLen++] = 0;
1580
0
    }
1581
0
    sha512HashBlock(blk, H);
1582
0
    blkLen = 0;
1583
0
  }
1584
1.88M
  while (blkLen < 112) {
1585
1.86M
    blk[blkLen++] = 0;
1586
1.86M
  }
1587
16.7k
  blk[112] = 0;
1588
16.7k
  blk[113] = 0;
1589
16.7k
  blk[114] = 0;
1590
16.7k
  blk[115] = 0;
1591
16.7k
  blk[116] = 0;
1592
16.7k
  blk[117] = 0;
1593
16.7k
  blk[118] = 0;
1594
16.7k
  blk[119] = 0;
1595
16.7k
  blk[120] = 0;
1596
16.7k
  blk[121] = 0;
1597
16.7k
  blk[122] = 0;
1598
16.7k
  blk[123] = 0;
1599
16.7k
  blk[124] = (Guchar)(msgLen >> 21);
1600
16.7k
  blk[125] = (Guchar)(msgLen >> 13);
1601
16.7k
  blk[126] = (Guchar)(msgLen >> 5);
1602
16.7k
  blk[127] = (Guchar)(msgLen << 3);
1603
16.7k
  sha512HashBlock(blk, H);
1604
1605
  // copy the output into the buffer (convert words to bytes)
1606
117k
  for (i = 0; i < 6; ++i) {
1607
100k
    hash[i*8]     = (Guchar)(H[i] >> 56);
1608
100k
    hash[i*8 + 1] = (Guchar)(H[i] >> 48);
1609
100k
    hash[i*8 + 2] = (Guchar)(H[i] >> 40);
1610
100k
    hash[i*8 + 3] = (Guchar)(H[i] >> 32);
1611
100k
    hash[i*8 + 4] = (Guchar)(H[i] >> 24);
1612
100k
    hash[i*8 + 5] = (Guchar)(H[i] >> 16);
1613
100k
    hash[i*8 + 6] = (Guchar)(H[i] >> 8);
1614
100k
    hash[i*8 + 7] = (Guchar)H[i];
1615
100k
  }
1616
16.7k
}