Test::Result run_one_test(const std::string&, const VarMap& vars) override { const std::vector<uint8_t> record = vars.get_req_bin("Record"); const size_t output = vars.get_req_sz("Output"); uint16_t res = Botan::TLS::check_tls_cbc_padding(record.data(), record.size()); Test::Result result("TLS CBC padding check"); result.test_eq("Expected", res, output); return result; }
Test::Result run_one_test(const std::string&, const VarMap& vars) override { Test::Result result("TLS CBC"); const size_t block_size = vars.get_req_sz("Blocksize"); const size_t mac_len = vars.get_req_sz("MACsize"); const std::vector<uint8_t> record = vars.get_req_bin("Record"); const bool is_valid = vars.get_req_sz("Valid") == 1; // todo test permutations bool encrypt_then_mac = false; Botan::TLS::TLS_CBC_HMAC_AEAD_Decryption tls_cbc( std::unique_ptr<Botan::BlockCipher>(new Noop_Block_Cipher(block_size)), std::unique_ptr<Botan::MessageAuthenticationCode>(new ZeroMac(mac_len)), 0, 0, Botan::TLS::Protocol_Version::TLS_V11, encrypt_then_mac); tls_cbc.set_key(std::vector<uint8_t>(0)); std::vector<uint8_t> ad(13); tls_cbc.set_associated_data(ad.data(), ad.size()); Botan::secure_vector<uint8_t> vec(record.begin(), record.end()); try { tls_cbc.finish(vec, 0); if(is_valid) result.test_success("Accepted valid TLS-CBC ciphertext"); else result.test_failure("Accepted invalid TLS-CBC ciphertext"); } catch(std::exception&) { if(is_valid) result.test_failure("Rejected valid TLS-CBC ciphertext"); else result.test_success("Accepted invalid TLS-CBC ciphertext"); } return result; }
Test::Result run_one_test(const std::string&, const VarMap& vars) override { const size_t keylen = vars.get_req_sz("Keylen"); const size_t taglen = vars.get_req_sz("Taglen"); const std::vector<uint8_t> expected = vars.get_req_bin("Output"); // Test from RFC 7253 Appendix A const std::string algo = "AES-" + std::to_string(keylen); Test::Result result("OCB long"); std::unique_ptr<Botan::BlockCipher> aes(Botan::BlockCipher::create(algo)); if(!aes) { result.note_missing(algo); return result; } Botan::OCB_Encryption enc(aes->clone(), taglen / 8); Botan::OCB_Decryption dec(aes->clone(), taglen / 8); std::vector<uint8_t> key(keylen / 8); key[keylen / 8 - 1] = static_cast<uint8_t>(taglen); enc.set_key(key); dec.set_key(key); const std::vector<uint8_t> empty; std::vector<uint8_t> N(12); std::vector<uint8_t> C; for(size_t i = 0; i != 128; ++i) { const std::vector<uint8_t> S(i); Botan::store_be(static_cast<uint32_t>(3 * i + 1), &N[8]); ocb_encrypt(result, C, enc, dec, N, S, S); Botan::store_be(static_cast<uint32_t>(3 * i + 2), &N[8]); ocb_encrypt(result, C, enc, dec, N, S, empty); Botan::store_be(static_cast<uint32_t>(3 * i + 3), &N[8]); ocb_encrypt(result, C, enc, dec, N, empty, S); } Botan::store_be(static_cast<uint32_t>(385), &N[8]); std::vector<uint8_t> final_result; ocb_encrypt(result, final_result, enc, dec, N, empty, C); result.test_eq("correct value", final_result, expected); return result; }