| 111 | } |
| 112 | |
| 113 | void FileAccessEncryptedv3::_close() { |
| 114 | if (file.is_null()) { |
| 115 | return; |
| 116 | } |
| 117 | |
| 118 | if (writing) { |
| 119 | Vector<uint8_t> compressed; |
| 120 | uint64_t len = data.size(); |
| 121 | if (len % 16) { |
| 122 | len += 16 - (len % 16); |
| 123 | } |
| 124 | |
| 125 | unsigned char hash[16]; |
| 126 | ERR_FAIL_COND(CryptoCore::md5(data.ptr(), data.size(), hash) != OK); // Bug? |
| 127 | |
| 128 | compressed.resize(len); |
| 129 | memset(compressed.ptrw(), 0, len); |
| 130 | for (int i = 0; i < data.size(); i++) { |
| 131 | compressed.write[i] = data[i]; |
| 132 | } |
| 133 | |
| 134 | CryptoCore::AESContext ctx; |
| 135 | ctx.set_encode_key(key.ptrw(), 256); |
| 136 | |
| 137 | for (uint64_t i = 0; i < len; i += 16) { |
| 138 | ctx.encrypt_ecb(&compressed.write[i], &compressed.write[i]); |
| 139 | } |
| 140 | |
| 141 | file->store_32(ENCRYPTED_HEADER_MAGIC); |
| 142 | file->store_32(mode); |
| 143 | |
| 144 | file->store_buffer(hash, 16); |
| 145 | file->store_64(data.size()); |
| 146 | |
| 147 | file->store_buffer(compressed.ptr(), compressed.size()); |
| 148 | data.clear(); |
| 149 | } |
| 150 | |
| 151 | file.unref(); |
| 152 | } |
| 153 | |
| 154 | bool FileAccessEncryptedv3::is_open() const { |
| 155 | return file != nullptr; |
nothing calls this directly
no test coverage detected