| 98 | } |
| 99 | |
| 100 | void codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, char *pszPassword) |
| 101 | { |
| 102 | char buf[128]; |
| 103 | char tmp[SHA1HashSize]; |
| 104 | char dst[SHA1HashSize]; |
| 105 | DWORD chunk; |
| 106 | WORD last_chunk; |
| 107 | CodecSignature *sig; |
| 108 | |
| 109 | if (size_64 != codec_get_encoded_len(size)) |
| 110 | app_fatal("Invalid encode parameters"); |
| 111 | codec_init_key(1, pszPassword); |
| 112 | |
| 113 | last_chunk = 0; |
| 114 | while (size != 0) { |
| 115 | chunk = size < 64 ? size : 64; |
| 116 | memcpy(buf, pbSrcDst, chunk); |
| 117 | if (chunk < 64) |
| 118 | memset(buf + chunk, 0, 64 - chunk); |
| 119 | SHA1Result(0, dst); |
| 120 | SHA1Calculate(0, buf, NULL); |
| 121 | for (int j = 0; j < 64; j++) { |
| 122 | buf[j] ^= dst[j % SHA1HashSize]; |
| 123 | } |
| 124 | memset(dst, 0, sizeof(dst)); |
| 125 | memcpy(pbSrcDst, buf, 64); |
| 126 | last_chunk = chunk; |
| 127 | pbSrcDst += 64; |
| 128 | size -= chunk; |
| 129 | } |
| 130 | memset(buf, 0, sizeof(buf)); |
| 131 | SHA1Result(0, tmp); |
| 132 | sig = (CodecSignature *)pbSrcDst; |
| 133 | sig->error = 0; |
| 134 | sig->unused = 0; |
| 135 | sig->checksum = *(DWORD *)tmp; |
| 136 | sig->last_chunk_size = last_chunk; |
| 137 | SHA1Clear(); |
| 138 | } |
| 139 | |
| 140 | DEVILUTION_END_NAMESPACE |
| 141 |
no test coverage detected