aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJack Lloyd <[email protected]>2017-01-04 15:57:30 -0500
committerJack Lloyd <[email protected]>2017-01-04 15:57:30 -0500
commit8285fe04ae8a5c41ae2606bd08aed9aa1bd3126f (patch)
treed9ded2b0899d0270d0f747c8ef1032c567c92b85
parent51b83c2f3807cfd36744b94dfe337a6d31f00847 (diff)
Add tests for certificate status message
Currently untested by TLS crosstalk tests because it is not supported on the server side. Exposes the rest of TLS message types to application.
-rw-r--r--src/lib/tls/tls_messages.h16
-rw-r--r--src/tests/data/tls/cert_status.vec17
-rw-r--r--src/tests/data/tls/cert_verify.vec2
-rw-r--r--src/tests/test_tls_messages.cpp40
4 files changed, 62 insertions, 13 deletions
diff --git a/src/lib/tls/tls_messages.h b/src/lib/tls/tls_messages.h
index 8e08b6e87..5a1f03a06 100644
--- a/src/lib/tls/tls_messages.h
+++ b/src/lib/tls/tls_messages.h
@@ -394,7 +394,7 @@ class BOTAN_DLL Server_Hello final : public Handshake_Message
/**
* Client Key Exchange Message
*/
-class Client_Key_Exchange final : public Handshake_Message
+class BOTAN_DLL Client_Key_Exchange final : public Handshake_Message
{
public:
Handshake_Type type() const override { return CLIENT_KEX; }
@@ -428,7 +428,7 @@ class Client_Key_Exchange final : public Handshake_Message
/**
* Certificate Message
*/
-class Certificate final : public Handshake_Message
+class BOTAN_DLL Certificate final : public Handshake_Message
{
public:
Handshake_Type type() const override { return CERTIFICATE; }
@@ -451,7 +451,7 @@ class Certificate final : public Handshake_Message
/**
* Certificate Status (RFC 6066)
*/
-class Certificate_Status final : public Handshake_Message
+class BOTAN_DLL Certificate_Status final : public Handshake_Message
{
public:
Handshake_Type type() const override { return CERTIFICATE_STATUS; }
@@ -472,7 +472,7 @@ class Certificate_Status final : public Handshake_Message
/**
* Certificate Request Message
*/
-class Certificate_Req final : public Handshake_Message
+class BOTAN_DLL Certificate_Req final : public Handshake_Message
{
public:
Handshake_Type type() const override { return CERTIFICATE_REQUEST; }
@@ -539,7 +539,7 @@ class BOTAN_DLL Certificate_Verify final : public Handshake_Message
/**
* Finished Message
*/
-class Finished final : public Handshake_Message
+class BOTAN_DLL Finished final : public Handshake_Message
{
public:
Handshake_Type type() const override { return FINISHED; }
@@ -578,7 +578,7 @@ class BOTAN_DLL Hello_Request final : public Handshake_Message
/**
* Server Key Exchange Message
*/
-class Server_Key_Exchange final : public Handshake_Message
+class BOTAN_DLL Server_Key_Exchange final : public Handshake_Message
{
public:
Handshake_Type type() const override { return SERVER_KEX; }
@@ -646,7 +646,7 @@ class Server_Key_Exchange final : public Handshake_Message
/**
* Server Hello Done Message
*/
-class Server_Hello_Done final : public Handshake_Message
+class BOTAN_DLL Server_Hello_Done final : public Handshake_Message
{
public:
Handshake_Type type() const override { return SERVER_HELLO_DONE; }
@@ -687,7 +687,7 @@ class BOTAN_DLL New_Session_Ticket final : public Handshake_Message
/**
* Change Cipher Spec
*/
-class Change_Cipher_Spec final : public Handshake_Message
+class BOTAN_DLL Change_Cipher_Spec final : public Handshake_Message
{
public:
Handshake_Type type() const override { return HANDSHAKE_CCS; }
diff --git a/src/tests/data/tls/cert_status.vec b/src/tests/data/tls/cert_status.vec
new file mode 100644
index 000000000..d93f800ab
--- /dev/null
+++ b/src/tests/data/tls/cert_status.vec
@@ -0,0 +1,17 @@
+
+[cert_status]
+Buffer = 00
+Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small
+
+Buffer = 01
+Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small
+
+Buffer = 01000000
+Exception = Invalid argument Decoding error: Invalid Certificate_Status message: too small
+
+Buffer = 010FFFF000
+Exception = Invalid argument Decoding error: Invalid Certificate_Status: invalid length field
+
+Buffer = 0100020F3082020B0A0100A08202043082020006092B0601050507300101048201F1308201ED3081D6A14C304A310B300906035504061302555331163014060355040A130D4C6574277320456E6372797074312330210603550403131A4C6574277320456E637279707420417574686F72697479205833180F32303136313131383132313630305A30753073304B300906052B0E03021A050004147EE66AE7729AB3FCF8A220646C16A12D6071085D0414A84A6A63047DDDBAE6D139B7A64565EFF3A8ECA1021203E89ED07A424B72A35FAD167F48A4F25AD28000180F32303136313131383132303030305AA011180F32303136313132353132303030305A300D06092A864886F70D01010B050003820101007CB8774D813E6E0FBFA816BE53F5F3131EF9DED7B0928BBE50AC628C90C811DBBFE0E43A98BF3FB608CC230EFE31FE98BE99016D98DE73028F6C1AE8C34B0F20DD7E688604322538E721EF9D0D353EADE8818BFB63DA8078A7E2BF9E637282DE6C79B2289F0C13807A9D3B7532970FF0AA77CE06A06299B02274ED6C62DFC672485405C1859FEBDFC3B5B2D81A0A45382FFABBF75D6EAC1AD1AF12701DCDF87F0EFEB41933AED08EF78B35F48362A792E55027F00B3EE4571F30212A3EB7BE4B934F67685A4AF2BBF428280BC20D1A42E75DBE42C459541B4E1EE5BB99E0CCA166C2E9C2E6054F147F2FDF33F104E9076061640EDDB12B62BEAA82E0D60ED128
+Name = Let's Encrypt Authority X3
+Exception =
diff --git a/src/tests/data/tls/cert_verify.vec b/src/tests/data/tls/cert_verify.vec
index f812d1c6a..7f09002ce 100644
--- a/src/tests/data/tls/cert_verify.vec
+++ b/src/tests/data/tls/cert_verify.vec
@@ -37,4 +37,4 @@ Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected
Buffer = 000200
Protocol = 0301
-Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 2 bytes remaining, only 1 left \ No newline at end of file
+Exception = Invalid argument Decoding error: Invalid CertificateVerify: Expected 2 bytes remaining, only 1 left
diff --git a/src/tests/test_tls_messages.cpp b/src/tests/test_tls_messages.cpp
index d4a9a27fd..d04bea8a0 100644
--- a/src/tests/test_tls_messages.cpp
+++ b/src/tests/test_tls_messages.cpp
@@ -47,7 +47,7 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
{
public:
TLS_Message_Parsing_Test() :
- Text_Based_Test("tls", "Buffer,Protocol,Ciphersuite,AdditionalData,Exception")
+ Text_Based_Test("tls", "Buffer,Protocol,Ciphersuite,AdditionalData,Name,Exception")
{}
Test::Result run_one_test(const std::string& algo, const VarMap& vars) override
@@ -56,6 +56,7 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
const std::vector<uint8_t> protocol = get_opt_bin(vars, "Protocol");
const std::vector<uint8_t> ciphersuite = get_opt_bin(vars, "Ciphersuite");
const std::string exception = get_req_str(vars, "Exception");
+ const std::string expected_name = get_opt_str(vars, "Name", "");
const bool is_positive_test = exception.empty();
Test::Result result(algo + " parsing");
@@ -69,7 +70,7 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]);
Botan::TLS::Certificate_Verify message(buffer, pv);
}
- if(algo == "client_hello")
+ else if(algo == "client_hello")
{
const std::string extensions = get_req_str(vars, "AdditionalData");
Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]);
@@ -96,7 +97,7 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
{
Botan::TLS::New_Session_Ticket message(buffer);
}
- if(algo == "server_hello")
+ else if(algo == "server_hello")
{
const std::string extensions = get_req_str(vars, "AdditionalData");
Botan::TLS::Protocol_Version pv(protocol[0], protocol[1]);
@@ -120,6 +121,26 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
result.test_lt("Alert type vectors result to UNKNOWN_CA or ACCESS_DENIED, which is shorter than 15",
message.type_string().size(), 15);
}
+ else if(algo == "cert_status")
+ {
+ Botan::TLS::Certificate_Status message(buffer);
+ std::shared_ptr<const Botan::OCSP::Response> resp = message.response();
+
+ if(result.confirm("Decoded response", resp != nullptr))
+ {
+ const std::vector<std::string> CNs = resp->signer_name().get_attribute("CN");
+
+ // This is not requird by OCSP protocol, we are just using it as a test here
+ if(result.test_eq("OCSP response has signer name", CNs.size(), 1))
+ {
+ result.test_eq("Expected name", CNs[0], expected_name);
+ }
+ }
+ }
+ else
+ {
+ throw Test_Error("Unknown message type " + algo + " in TLS parsing tests");
+ }
result.test_success("Correct parsing");
}
catch(std::exception& e)
@@ -158,6 +179,13 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
Botan::TLS::Hello_Request message(buffer);
});
}
+ else if(algo == "cert_status")
+ {
+ result.test_throws("invalid cert_status input", exception, [&buffer]()
+ {
+ Botan::TLS::Certificate_Status message(buffer);
+ });
+ }
else if(algo == "new_session_ticket")
{
result.test_throws("invalid new_session_ticket input", exception, [&buffer]()
@@ -180,11 +208,15 @@ class TLS_Message_Parsing_Test : public Text_Based_Test
Botan::TLS::Alert message(sb);
});
}
+ else
+ {
+ throw Test_Error("Unknown message type " + algo + " in TLS parsing tests");
+ }
}
return result;
}
-
+
std::vector<Test::Result> run_final_tests() override
{
std::vector<Test::Result> results;