check_securechannel.c 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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_policy.h"
  8. #include "ua_securechannel.h"
  9. #include "check.h"
  10. #define UA_BYTESTRING_STATIC(s) {sizeof(s)-1, (UA_Byte*)s}
  11. UA_SecureChannel testChannel;
  12. UA_ByteString dummyCertificate = UA_BYTESTRING_STATIC("DUMMY CERTIFICATE DUMMY CERTIFICATE DUMMY CERTIFICATE");
  13. UA_SecurityPolicy dummyPolicy;
  14. funcs_called fCalled;
  15. static void
  16. setup_secureChannel(void) {
  17. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  18. UA_SecureChannel_init(&testChannel, &dummyPolicy, &dummyCertificate);
  19. }
  20. static void
  21. teardown_secureChannel(void) {
  22. UA_SecureChannel_deleteMembersCleanup(&testChannel);
  23. dummyPolicy.deleteMembers(&dummyPolicy);
  24. }
  25. static void
  26. setup_funcs_called(void) {
  27. memset(&fCalled, 0, sizeof(struct funcs_called));
  28. }
  29. static void
  30. teardown_funcs_called(void) {
  31. memset(&fCalled, 0, sizeof(struct funcs_called));
  32. }
  33. /*
  34. static void
  35. setup_dummyPolicy(void) {
  36. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  37. }
  38. static void
  39. teardown_dummyPolicy(void) {
  40. dummyPolicy.deleteMembers(&dummyPolicy);
  41. }*/
  42. START_TEST(SecureChannel_initAndDelete)
  43. {
  44. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  45. UA_StatusCode retval;
  46. UA_SecureChannel channel;
  47. retval = UA_SecureChannel_init(&channel, &dummyPolicy, &dummyCertificate);
  48. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected StatusCode to be good");
  49. ck_assert_msg(channel.state == UA_SECURECHANNELSTATE_FRESH, "Expected state to be fresh");
  50. ck_assert_msg(fCalled.newContext, "Expected newContext to have been called");
  51. ck_assert_msg(fCalled.makeCertificateThumbprint, "Expected makeCertificateThumbprint to have been called");
  52. ck_assert_msg(channel.securityPolicy == &dummyPolicy, "SecurityPolicy not set correctly");
  53. UA_SecureChannel_deleteMembersCleanup(&channel);
  54. ck_assert_msg(fCalled.deleteContext, "Expected deleteContext to have been called");
  55. }
  56. END_TEST
  57. START_TEST(SecureChannel_initAndDelete_invalidParameters)
  58. {
  59. UA_StatusCode retval = UA_SecureChannel_init(NULL, NULL, NULL);
  60. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  61. UA_SecureChannel channel;
  62. retval = UA_SecureChannel_init(&channel, &dummyPolicy, NULL);
  63. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  64. retval = UA_SecureChannel_init(&channel, NULL, &dummyCertificate);
  65. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  66. retval = UA_SecureChannel_init(NULL, &dummyPolicy, &dummyCertificate);
  67. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  68. UA_SecureChannel_deleteMembersCleanup(NULL);
  69. }
  70. END_TEST
  71. START_TEST(SecureChannel_generateNewKeys)
  72. {
  73. UA_StatusCode retval = UA_SecureChannel_generateNewKeys(&testChannel);
  74. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected Statuscode to be good");
  75. ck_assert_msg(fCalled.generateKey, "Expected generateKey to have been called");
  76. ck_assert_msg(fCalled.setLocalSymEncryptingKey, "Expected setLocalSymEncryptingKey to have been called");
  77. ck_assert_msg(fCalled.setLocalSymSigningKey, "Expected setLocalSymSigningKey to have been called");
  78. ck_assert_msg(fCalled.setLocalSymIv, "Expected setLocalSymIv to have been called");
  79. ck_assert_msg(fCalled.setRemoteSymEncryptingKey, "Expected setRemoteSymEncryptingKey to have been called");
  80. ck_assert_msg(fCalled.setRemoteSymSigningKey, "Expected setRemoteSymSigningKey to have been called");
  81. ck_assert_msg(fCalled.setRemoteSymIv, "Expected setRemoteSymIv to have been called");
  82. retval = UA_SecureChannel_generateNewKeys(NULL);
  83. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure on NULL pointer");
  84. }
  85. END_TEST
  86. START_TEST(SecureChannel_revolveTokens)
  87. {
  88. // Fake that no token was issued by setting 0
  89. testChannel.nextSecurityToken.tokenId = 0;
  90. UA_StatusCode retval = UA_SecureChannel_revolveTokens(&testChannel);
  91. ck_assert_msg(retval == UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN,
  92. "Expected failure because tokenId 0 signifies that no token was issued");
  93. // Fake an issued token by setting an id
  94. testChannel.nextSecurityToken.tokenId = 10;
  95. retval = UA_SecureChannel_revolveTokens(&testChannel);
  96. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to return GOOD");
  97. ck_assert_msg(fCalled.generateKey,
  98. "Expected generateKey to be called because new keys need to be generated,"
  99. "when switching to the next token.");
  100. UA_ChannelSecurityToken testToken;
  101. UA_ChannelSecurityToken_init(&testToken);
  102. ck_assert_msg(memcmp(&testChannel.nextSecurityToken, &testToken, sizeof(UA_ChannelSecurityToken)) == 0,
  103. "Expected the next securityToken to be freshly initialized");
  104. ck_assert_msg(testChannel.securityToken.tokenId == 10, "Expected token to have been copied");
  105. }
  106. END_TEST
  107. static Suite *
  108. testSuite_SecureChannel(void) {
  109. Suite *s = suite_create("SecureChannel");
  110. TCase *tc_initAndDelete = tcase_create("Initialize and delete Securechannel");
  111. tcase_add_checked_fixture(tc_initAndDelete, setup_funcs_called, teardown_funcs_called);
  112. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete);
  113. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete_invalidParameters);
  114. suite_add_tcase(s, tc_initAndDelete);
  115. TCase *tc_generateNewKeys = tcase_create("Test generateNewKeys function");
  116. tcase_add_checked_fixture(tc_generateNewKeys, setup_funcs_called, teardown_funcs_called);
  117. tcase_add_checked_fixture(tc_generateNewKeys, setup_secureChannel, teardown_secureChannel);
  118. tcase_add_test(tc_generateNewKeys, SecureChannel_generateNewKeys);
  119. suite_add_tcase(s, tc_generateNewKeys);
  120. TCase *tc_revolveTokens = tcase_create("Test revolveTokens function");
  121. tcase_add_checked_fixture(tc_revolveTokens, setup_funcs_called, teardown_funcs_called);
  122. tcase_add_checked_fixture(tc_revolveTokens, setup_secureChannel, teardown_secureChannel);
  123. tcase_add_test(tc_revolveTokens, SecureChannel_revolveTokens);
  124. suite_add_tcase(s, tc_revolveTokens);
  125. return s;
  126. }
  127. int
  128. main(void) {
  129. Suite *s = testSuite_SecureChannel();
  130. SRunner *sr = srunner_create(s);
  131. srunner_set_fork_status(sr, CK_NOFORK);
  132. srunner_run_all(sr, CK_VERBOSE);
  133. int number_failed = srunner_ntests_failed(sr);
  134. srunner_free(sr);
  135. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  136. }