1 #include <stdio.h>
2
3 #include "nx_secure_tls_api.h"
4
5 #include "tls_test_utility.h"
6
7 static TX_THREAD thread_0;
8
9 void NX_SECURE_X509_KeyUsageTest();
10
11 static void thread_0_entry(ULONG thread_input);
12
13 #define DEMO_STACK_SIZE 2048
14 static CHAR thread_stack[DEMO_STACK_SIZE];
15
16 #ifdef CTEST
17 void test_application_define(void *first_unused_memory);
test_application_define(void * first_unused_memory)18 void test_application_define(void *first_unused_memory)
19 #else
20 void nx_secure_x509_key_usage_test_application_define(void *first_unused_memory)
21 #endif
22 {
23
24 /* Create the main thread. */
25 tx_thread_create(&thread_0, "thread 0", thread_0_entry, 0,
26 thread_stack, DEMO_STACK_SIZE,
27 4, 4, TX_NO_TIME_SLICE, TX_AUTO_START);
28 }
29
thread_0_entry(ULONG thread_input)30 static void thread_0_entry(ULONG thread_input)
31 {
32 /* Print out test information banner. */
33 printf("NetX Secure Test: X509 Key Usage Test...............................");
34
35 #ifndef NX_SECURE_DISABLE_X509
36 NX_SECURE_X509_KeyUsageTest();
37
38 printf("SUCCESS!\n");
39 #else
40 printf("N/A\n");
41 #endif
42
43 test_control_return(0);
44 }
45
46 #ifndef NX_SECURE_DISABLE_X509
47
48 static UCHAR server_packet_buffer[2000];
49
50 static NX_PACKET_POOL pool_0;
51
52 #define NX_PACKET_POOL_SIZE ((1536 + sizeof(NX_PACKET)) * 32)
53
54
55 static ULONG packet_pool_area[NX_PACKET_POOL_SIZE/sizeof(ULONG) + 64 / sizeof(ULONG)];
56
57 #include "key_usage_certs.c"
58
59 static NX_SECURE_X509_CERT root_ca;
60 static NX_SECURE_X509_CERT ica_cert;
61 static NX_SECURE_X509_CERT revoked_cert;
62 static NX_SECURE_X509_CERT device_cert;
63
64 /* Cryptographic routines. */
65 static CHAR crypto_metadata[16000];
66 extern const NX_SECURE_TLS_CRYPTO nx_crypto_tls_ciphers;
67
68 /* Buffer space for certificate tests. */
69 static CHAR ica_buf1[8000];
70 static CHAR ica_buf2[3000];
71 static CHAR device_buf1[8000];
72 static CHAR device_buf2[3000];
73 static CHAR revoked_buf1[8000];
74 static CHAR revoked_buf2[3000];
75
TEST(NX_SECURE_X509,KeyUsageTest)76 TEST(NX_SECURE_X509, KeyUsageTest)
77 {
78
79 UINT status;
80 NX_PACKET *packet;
81 NX_SECURE_TLS_SESSION session;
82 UCHAR header_buffer[6];
83 UCHAR header_data[6];
84 USHORT header_size;
85 UINT message_length;
86 USHORT message_type;
87 const NX_SECURE_TLS_CIPHERSUITE_INFO *ciphersuite;
88 NX_SECURE_X509_CERTIFICATE_STORE *store;
89 NX_SECURE_X509_CERT **remote_certs;
90
91 memset(&session, 0, sizeof(NX_SECURE_TLS_SESSION));
92
93 status = nx_packet_pool_create(&pool_0, "NetX Main Packet Pool", 1536, (ULONG*)(((int)packet_pool_area + 64) & ~63) , NX_PACKET_POOL_SIZE);
94 EXPECT_EQ(NX_SUCCESS, status);
95
96 status = _nx_secure_tls_session_reset(&session);
97 EXPECT_EQ(NX_SUCCESS, status);
98
99 /* Initialize the server session. */
100 /* Create a TLS session. */
101 status = nx_secure_tls_session_create(&session,
102 &nx_crypto_tls_ciphers,
103 crypto_metadata,
104 sizeof(crypto_metadata));
105 EXPECT_EQ(NX_SUCCESS, status);
106
107 /* Setup our packet reassembly buffer. */
108 status = _nx_secure_tls_session_packet_buffer_set(&session, server_packet_buffer, sizeof(server_packet_buffer));
109 EXPECT_EQ(NX_SUCCESS, status);
110
111 /* Setup TLS session as if we were in the middle of a handshake. */
112 session.nx_secure_tls_protocol_version = NX_SECURE_TLS_VERSION_TLS_1_2;
113
114 /* Initialize our certificates - NOTE: We don't need private keys because we aren't doing anything but chain verification. */
115 status = _nx_secure_x509_certificate_initialize(&ica_cert, ica_cert_der, ica_cert_der_len, NX_NULL, 0, NX_NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
116 EXPECT_EQ(NX_SUCCESS, status);
117 status = _nx_secure_x509_certificate_initialize(&root_ca, root_ca_cert_der, root_ca_cert_der_len, NX_NULL, 0, NX_NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
118 EXPECT_EQ(NX_SUCCESS, status);
119 status = _nx_secure_x509_certificate_initialize(&device_cert, device_cert_der, device_cert_der_len, NX_NULL, 0, NX_NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
120 EXPECT_EQ(NX_SUCCESS, status);
121 status = _nx_secure_x509_certificate_initialize(&revoked_cert, revoked_cert_der, revoked_cert_der_len, NX_NULL, 0, NX_NULL, 0, NX_SECURE_X509_KEY_TYPE_NONE);
122 EXPECT_EQ(NX_SUCCESS, status);
123
124 /* Add certificates to session. */
125 status = _nx_secure_tls_trusted_certificate_add(&session, &root_ca);
126 EXPECT_EQ(NX_SUCCESS, status);
127
128 store = &session.nx_secure_tls_credentials.nx_secure_tls_certificate_store;
129 remote_certs = &session.nx_secure_tls_credentials.nx_secure_tls_certificate_store.nx_secure_x509_remote_certificates;
130
131 /* Add remote certificates as if we received a chain. */
132 status = _nx_secure_x509_certificate_list_add(remote_certs, &ica_cert, NX_TRUE);
133 EXPECT_EQ(NX_SUCCESS, status);
134 ica_cert.nx_secure_x509_public_cipher_metadata_area = ica_buf1;
135 ica_cert.nx_secure_x509_public_cipher_metadata_size = sizeof(ica_buf1);
136 ica_cert.nx_secure_x509_hash_metadata_area = ica_buf2;
137 ica_cert.nx_secure_x509_hash_metadata_size = sizeof(ica_buf2);
138 ica_cert.nx_secure_x509_cipher_table = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table;
139 ica_cert.nx_secure_x509_cipher_table_size = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table_size;
140
141 status = _nx_secure_x509_certificate_list_add(remote_certs, &device_cert, NX_TRUE);
142 EXPECT_EQ(NX_SUCCESS, status);
143 device_cert.nx_secure_x509_public_cipher_metadata_area = device_buf1;
144 device_cert.nx_secure_x509_public_cipher_metadata_size = sizeof(device_buf1);
145 device_cert.nx_secure_x509_hash_metadata_area = device_buf2;
146 device_cert.nx_secure_x509_hash_metadata_size = sizeof(device_buf2);
147 device_cert.nx_secure_x509_cipher_table = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table;
148 device_cert.nx_secure_x509_cipher_table_size = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table_size;
149
150
151 status = _nx_secure_x509_certificate_list_add(remote_certs, &revoked_cert, NX_TRUE);
152 EXPECT_EQ(NX_SUCCESS, status);
153 revoked_cert.nx_secure_x509_public_cipher_metadata_area = revoked_buf1;
154 revoked_cert.nx_secure_x509_public_cipher_metadata_size = sizeof(revoked_buf1);
155 revoked_cert.nx_secure_x509_hash_metadata_area = revoked_buf2;
156 revoked_cert.nx_secure_x509_hash_metadata_size = sizeof(revoked_buf2);
157 revoked_cert.nx_secure_x509_cipher_table = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table;
158 revoked_cert.nx_secure_x509_cipher_table_size = session.nx_secure_tls_crypto_table -> nx_secure_tls_x509_cipher_table_size;
159
160
161 /* Now do some chain verifications. */
162
163 /* Check "device cert" - should FAIL because ICA does not have proper KeyUsage. */
164 status = _nx_secure_x509_certificate_chain_verify(store, &device_cert, 0);
165 EXPECT_EQ(NX_SECURE_X509_KEY_USAGE_ERROR, status);
166
167 /* Check "revoked cert" - should PASS because root CA DOES have proper KeyUsage. */
168 status = _nx_secure_x509_certificate_chain_verify(store, &revoked_cert, 0);
169 EXPECT_EQ(NX_SUCCESS, status);
170
171 /* Check CRLs. */
172
173 #ifndef NX_SECURE_X509_DISABLE_CRL
174 /* Root CRL is good because root CA has proper KeyUsage, but revoked_cert is revoked. */
175 status = _nx_secure_x509_crl_revocation_check(root_crl_der, root_crl_der_len, store, &revoked_cert);
176 EXPECT_EQ(NX_SECURE_X509_CRL_CERTIFICATE_REVOKED, status);
177
178 /* The ICA CRL is no good because ICA has improper KeyUsage. device_cert is OK, but CRL should fail. */
179 status = nx_secure_x509_crl_revocation_check(ica_crl_der, ica_crl_der_len, store, &device_cert);
180 EXPECT_EQ(NX_SECURE_X509_KEY_USAGE_ERROR, status);
181 #endif
182
183 nx_secure_tls_session_delete(&session);
184
185 }
186 #endif
187