check_securechannel.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279
  1. /* This Source Code Form is subject to the terms of the Mozilla Public
  2. * License, v. 2.0. If a copy of the MPL was not distributed with this
  3. * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <src_generated/ua_types_generated.h>
  7. #include <testing_networklayers.h>
  8. #include "testing_policy.h"
  9. #include "ua_securechannel.h"
  10. #include "check.h"
  11. #define UA_BYTESTRING_STATIC(s) {sizeof(s)-1, (UA_Byte*)s}
  12. UA_SecureChannel testChannel;
  13. UA_ByteString dummyCertificate = UA_BYTESTRING_STATIC("DUMMY CERTIFICATE DUMMY CERTIFICATE DUMMY CERTIFICATE");
  14. UA_SecurityPolicy dummyPolicy;
  15. UA_Connection testingConnection;
  16. funcs_called fCalled;
  17. static void
  18. setup_secureChannel(void) {
  19. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  20. UA_SecureChannel_init(&testChannel, &dummyPolicy, &dummyCertificate);
  21. testingConnection = createDummyConnection();
  22. UA_Connection_attachSecureChannel(&testingConnection, &testChannel);
  23. testChannel.connection = &testingConnection;
  24. }
  25. static void
  26. teardown_secureChannel(void) {
  27. UA_SecureChannel_deleteMembersCleanup(&testChannel);
  28. dummyPolicy.deleteMembers(&dummyPolicy);
  29. memset(&testingConnection, 0, sizeof(UA_Connection));
  30. }
  31. static void
  32. setup_funcs_called(void) {
  33. memset(&fCalled, 0, sizeof(struct funcs_called));
  34. }
  35. static void
  36. teardown_funcs_called(void) {
  37. memset(&fCalled, 0, sizeof(struct funcs_called));
  38. }
  39. /*
  40. static void
  41. setup_dummyPolicy(void) {
  42. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  43. }
  44. static void
  45. teardown_dummyPolicy(void) {
  46. dummyPolicy.deleteMembers(&dummyPolicy);
  47. }*/
  48. START_TEST(SecureChannel_initAndDelete)
  49. {
  50. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  51. UA_StatusCode retval;
  52. UA_SecureChannel channel;
  53. retval = UA_SecureChannel_init(&channel, &dummyPolicy, &dummyCertificate);
  54. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected StatusCode to be good");
  55. ck_assert_msg(channel.state == UA_SECURECHANNELSTATE_FRESH, "Expected state to be fresh");
  56. ck_assert_msg(fCalled.newContext, "Expected newContext to have been called");
  57. ck_assert_msg(fCalled.makeCertificateThumbprint, "Expected makeCertificateThumbprint to have been called");
  58. ck_assert_msg(channel.securityPolicy == &dummyPolicy, "SecurityPolicy not set correctly");
  59. UA_SecureChannel_deleteMembersCleanup(&channel);
  60. ck_assert_msg(fCalled.deleteContext, "Expected deleteContext to have been called");
  61. dummyPolicy.deleteMembers(&dummyPolicy);
  62. }
  63. END_TEST
  64. START_TEST(SecureChannel_initAndDelete_invalidParameters)
  65. {
  66. UA_StatusCode retval = UA_SecureChannel_init(NULL, NULL, NULL);
  67. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  68. UA_SecureChannel channel;
  69. retval = UA_SecureChannel_init(&channel, &dummyPolicy, NULL);
  70. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  71. retval = UA_SecureChannel_init(&channel, NULL, &dummyCertificate);
  72. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  73. retval = UA_SecureChannel_init(NULL, &dummyPolicy, &dummyCertificate);
  74. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  75. UA_SecureChannel_deleteMembersCleanup(NULL);
  76. }
  77. END_TEST
  78. START_TEST(SecureChannel_generateNewKeys)
  79. {
  80. UA_StatusCode retval = UA_SecureChannel_generateNewKeys(&testChannel);
  81. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected Statuscode to be good");
  82. ck_assert_msg(fCalled.generateKey, "Expected generateKey to have been called");
  83. ck_assert_msg(fCalled.setLocalSymEncryptingKey, "Expected setLocalSymEncryptingKey to have been called");
  84. ck_assert_msg(fCalled.setLocalSymSigningKey, "Expected setLocalSymSigningKey to have been called");
  85. ck_assert_msg(fCalled.setLocalSymIv, "Expected setLocalSymIv to have been called");
  86. ck_assert_msg(fCalled.setRemoteSymEncryptingKey, "Expected setRemoteSymEncryptingKey to have been called");
  87. ck_assert_msg(fCalled.setRemoteSymSigningKey, "Expected setRemoteSymSigningKey to have been called");
  88. ck_assert_msg(fCalled.setRemoteSymIv, "Expected setRemoteSymIv to have been called");
  89. retval = UA_SecureChannel_generateNewKeys(NULL);
  90. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure on NULL pointer");
  91. }
  92. END_TEST
  93. START_TEST(SecureChannel_revolveTokens)
  94. {
  95. // Fake that no token was issued by setting 0
  96. testChannel.nextSecurityToken.tokenId = 0;
  97. UA_StatusCode retval = UA_SecureChannel_revolveTokens(&testChannel);
  98. ck_assert_msg(retval == UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN,
  99. "Expected failure because tokenId 0 signifies that no token was issued");
  100. // Fake an issued token by setting an id
  101. testChannel.nextSecurityToken.tokenId = 10;
  102. retval = UA_SecureChannel_revolveTokens(&testChannel);
  103. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to return GOOD");
  104. ck_assert_msg(fCalled.generateKey,
  105. "Expected generateKey to be called because new keys need to be generated,"
  106. "when switching to the next token.");
  107. UA_ChannelSecurityToken testToken;
  108. UA_ChannelSecurityToken_init(&testToken);
  109. ck_assert_msg(memcmp(&testChannel.nextSecurityToken, &testToken, sizeof(UA_ChannelSecurityToken)) == 0,
  110. "Expected the next securityToken to be freshly initialized");
  111. ck_assert_msg(testChannel.securityToken.tokenId == 10, "Expected token to have been copied");
  112. }
  113. END_TEST
  114. START_TEST(SecureChannel_sendAsymmetricOPNMessage_withoutConnection)
  115. {
  116. UA_OpenSecureChannelResponse dummyResponse;
  117. UA_OpenSecureChannelResponse_init(&dummyResponse);
  118. testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
  119. // Remove connection to provoke error
  120. UA_Connection_detachSecureChannel(testChannel.connection);
  121. testChannel.connection = NULL;
  122. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  123. 42,
  124. &dummyResponse,
  125. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  126. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure without a connection");
  127. }
  128. END_TEST
  129. START_TEST(SecureChannel_sendAsymmetricOPNMessage_invalidParameters)
  130. {
  131. UA_OpenSecureChannelResponse dummyResponse;
  132. UA_OpenSecureChannelResponse_init(&dummyResponse);
  133. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  134. 42,
  135. NULL,
  136. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  137. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  138. retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  139. 42,
  140. &dummyResponse,
  141. NULL);
  142. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  143. retval = UA_SecureChannel_sendAsymmetricOPNMessage(NULL,
  144. 42,
  145. &dummyResponse,
  146. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  147. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  148. }
  149. END_TEST
  150. START_TEST(SecureChannel_sendAsymmetricOPNMessage)
  151. {
  152. // Configure our channel correctly for OPN messages and setup dummy message
  153. UA_OpenSecureChannelResponse dummyResponse;
  154. UA_OpenSecureChannelResponse_init(&dummyResponse);
  155. testChannel.securityMode = UA_MESSAGESECURITYMODE_INVALID;
  156. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  157. 42,
  158. &dummyResponse,
  159. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  160. ck_assert_msg(retval == UA_STATUSCODE_BADSECURITYMODEREJECTED, "Expected SecurityMode rejected error");
  161. testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
  162. retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  163. 42,
  164. &dummyResponse,
  165. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  166. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  167. ck_assert_msg(!fCalled.asym_enc, "Message encryption was called but should not have been");
  168. ck_assert_msg(!fCalled.asym_sign, "Message signing was called but should not have been");
  169. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGN;
  170. retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  171. 42,
  172. &dummyResponse,
  173. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  174. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  175. ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
  176. ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
  177. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
  178. retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  179. 42,
  180. &dummyResponse,
  181. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  182. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  183. ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
  184. ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
  185. }
  186. END_TEST
  187. static Suite *
  188. testSuite_SecureChannel(void) {
  189. Suite *s = suite_create("SecureChannel");
  190. TCase *tc_initAndDelete = tcase_create("Initialize and delete Securechannel");
  191. tcase_add_checked_fixture(tc_initAndDelete, setup_funcs_called, teardown_funcs_called);
  192. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete);
  193. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete_invalidParameters);
  194. suite_add_tcase(s, tc_initAndDelete);
  195. TCase *tc_generateNewKeys = tcase_create("Test generateNewKeys function");
  196. tcase_add_checked_fixture(tc_generateNewKeys, setup_funcs_called, teardown_funcs_called);
  197. tcase_add_checked_fixture(tc_generateNewKeys, setup_secureChannel, teardown_secureChannel);
  198. tcase_add_test(tc_generateNewKeys, SecureChannel_generateNewKeys);
  199. suite_add_tcase(s, tc_generateNewKeys);
  200. TCase *tc_revolveTokens = tcase_create("Test revolveTokens function");
  201. tcase_add_checked_fixture(tc_revolveTokens, setup_funcs_called, teardown_funcs_called);
  202. tcase_add_checked_fixture(tc_revolveTokens, setup_secureChannel, teardown_secureChannel);
  203. tcase_add_test(tc_revolveTokens, SecureChannel_revolveTokens);
  204. suite_add_tcase(s, tc_revolveTokens);
  205. TCase *tc_sendAsymmetricOPNMessage = tcase_create("Test sendAsymmetricOPNMessage function");
  206. tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_funcs_called, teardown_funcs_called);
  207. tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_secureChannel, teardown_secureChannel);
  208. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_withoutConnection);
  209. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_invalidParameters);
  210. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage);
  211. suite_add_tcase(s, tc_sendAsymmetricOPNMessage);
  212. return s;
  213. }
  214. int
  215. main(void) {
  216. Suite *s = testSuite_SecureChannel();
  217. SRunner *sr = srunner_create(s);
  218. srunner_set_fork_status(sr, CK_NOFORK);
  219. srunner_run_all(sr, CK_NORMAL);
  220. int number_failed = srunner_ntests_failed(sr);
  221. srunner_free(sr);
  222. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  223. }