fix some stream reading. all tests passing (very very slowly) so now it's time for optimization

This commit is contained in:
Thomas Fussell 2017-04-30 21:16:05 -04:00
parent ee642fc6c1
commit c677a14969

View File

@ -51,15 +51,12 @@ std::vector<std::uint8_t> decrypt_xlsx_standard(
{ {
const auto key = info.calculate_key(); const auto key = info.calculate_key();
auto decrypted_size = read<std::uint64_t>(encrypted_package_stream);
auto encrypted_package = std::vector<byte>( auto encrypted_package = std::vector<byte>(
std::istreambuf_iterator<char>(encrypted_package_stream), std::istreambuf_iterator<char>(encrypted_package_stream),
std::istreambuf_iterator<char>()); std::istreambuf_iterator<char>());
auto decrypted_size = read<std::uint64_t>(encrypted_package_stream);
auto decrypted = xlnt::detail::aes_ecb_decrypt( auto decrypted = xlnt::detail::aes_ecb_decrypt(encrypted_package, key);
encrypted_package,
key,
encrypted_package_stream.tellg());
decrypted.resize(static_cast<std::size_t>(decrypted_size)); decrypted.resize(static_cast<std::size_t>(decrypted_size));
@ -145,14 +142,14 @@ encryption_info::standard_encryption_info read_standard_encryption_info(std::ist
throw xlnt::exception("invalid header"); throw xlnt::exception("invalid header");
} }
const auto csp_name_length = (header_length - (info_stream.tellg() - index_at_start) - 1) / 2; const auto csp_name_length = (header_length - (info_stream.tellg() - index_at_start)) / 2;
auto csp_name = xlnt::detail::utf16_to_utf8(xlnt::detail::read_string<char16_t>(info_stream, csp_name_length)); auto csp_name = xlnt::detail::read_string<char16_t>(info_stream, csp_name_length);
if (csp_name != "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)" csp_name.pop_back(); // remove extraneous trailing null
&& csp_name != "Microsoft Enhanced RSA and AES Cryptographic Provider") if (csp_name != u"Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"
&& csp_name != u"Microsoft Enhanced RSA and AES Cryptographic Provider")
{ {
throw xlnt::exception("invalid cryptographic provider"); throw xlnt::exception("invalid cryptographic provider");
} }
//info_stream.seekg((csp_name_length + 1) * 2);
const auto salt_size = read<std::uint32_t>(info_stream); const auto salt_size = read<std::uint32_t>(info_stream);
result.salt = xlnt::detail::read_vector<byte>(info_stream, salt_size); result.salt = xlnt::detail::read_vector<byte>(info_stream, salt_size);