check_securechannel.c 12 KB

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