| 54 | } |
| 55 | |
| 56 | void codec_init_key(int unused, char *pszPassword) |
| 57 | { |
| 58 | int i, ch, n; |
| 59 | char key[136]; // last 64 bytes are the SHA1 |
| 60 | char pw[64]; |
| 61 | char digest[SHA1HashSize]; |
| 62 | char *keyInit; |
| 63 | |
| 64 | uint32_t rand_state = 0x7058; |
| 65 | |
| 66 | keyInit = key; |
| 67 | for (i = 0; i < 136; i++) { |
| 68 | rand_state = rand_state * 214013 + 2531011; |
| 69 | *keyInit = (rand_state >> 16) & 0x7FFF; |
| 70 | keyInit++; |
| 71 | } |
| 72 | ch = 0; |
| 73 | for (i = 0; i < 64; i++) { |
| 74 | if (!pszPassword[ch]) |
| 75 | ch = 0; |
| 76 | pw[i] = pszPassword[ch]; |
| 77 | ch++; |
| 78 | } |
| 79 | SHA1Reset(0); |
| 80 | SHA1Calculate(0, pw, digest); |
| 81 | SHA1Clear(); |
| 82 | for (i = 0; (DWORD)i < 136; i++) |
| 83 | key[i] ^= digest[i % SHA1HashSize]; |
| 84 | memset(pw, 0, sizeof(pw)); |
| 85 | memset(digest, 0, sizeof(digest)); |
| 86 | for (n = 0; n < 3; n++) { |
| 87 | SHA1Reset(n); |
| 88 | SHA1Calculate(n, &key[72], NULL); |
| 89 | } |
| 90 | memset(key, 0, sizeof(key)); |
| 91 | } |
| 92 | |
| 93 | DWORD codec_get_encoded_len(DWORD dwSrcBytes) |
| 94 | { |
no test coverage detected