check_securechannel.c 32 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661
  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 <ua_types_encoding_binary.h>
  9. #include <src_generated/ua_transport_generated_encoding_binary.h>
  10. #include <src_generated/ua_transport_generated.h>
  11. #include <ua_types.h>
  12. #include <src_generated/ua_types_generated_encoding_binary.h>
  13. #include <ua_plugin_securitypolicy.h>
  14. #include <src_generated/ua_transport_generated_handling.h>
  15. #include "testing_policy.h"
  16. #include "ua_securechannel.h"
  17. #include "check.h"
  18. #define UA_BYTESTRING_STATIC(s) {sizeof(s)-1, (UA_Byte*)(s)}
  19. // Some default testing sizes. Can be overwritten in testing functions.
  20. #define DEFAULT_SYM_ENCRYPTION_BLOCK_SIZE 2
  21. #define DEFAULT_SYM_SIGNING_KEY_LENGTH 3
  22. #define DEFAULT_SYM_ENCRYPTION_KEY_LENGTH 5
  23. #define DEFAULT_ASYM_REMOTE_SIGNATURE_SIZE 7
  24. #define DEFAULT_ASYM_LOCAL_SIGNATURE_SIZE 11
  25. #define DEFAULT_SYM_SIGNATURE_SIZE 13
  26. #define DEFAULT_ASYM_REMOTE_PLAINTEXT_BLOCKSIZE 256
  27. UA_SecureChannel testChannel;
  28. UA_ByteString dummyCertificate = UA_BYTESTRING_STATIC("DUMMY CERTIFICATE DUMMY CERTIFICATE DUMMY CERTIFICATE");
  29. UA_SecurityPolicy dummyPolicy;
  30. UA_Connection testingConnection;
  31. UA_ByteString sentData;
  32. static funcs_called fCalled;
  33. static key_sizes keySizes;
  34. static void
  35. setup_secureChannel(void) {
  36. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled, &keySizes);
  37. UA_SecureChannel_init(&testChannel, &dummyPolicy, &dummyCertificate);
  38. testingConnection = createDummyConnection(&sentData);
  39. UA_Connection_attachSecureChannel(&testingConnection, &testChannel);
  40. testChannel.connection = &testingConnection;
  41. }
  42. static void
  43. teardown_secureChannel(void) {
  44. UA_SecureChannel_deleteMembersCleanup(&testChannel);
  45. dummyPolicy.deleteMembers(&dummyPolicy);
  46. memset(&testingConnection, 0, sizeof(UA_Connection));
  47. }
  48. static void
  49. setup_funcs_called(void) {
  50. memset(&fCalled, 0, sizeof(struct funcs_called));
  51. }
  52. static void
  53. teardown_funcs_called(void) {
  54. memset(&fCalled, 0, sizeof(struct funcs_called));
  55. }
  56. static void
  57. setup_key_sizes(void) {
  58. memset(&keySizes, 0, sizeof(struct key_sizes));
  59. keySizes.sym_sig_keyLen = DEFAULT_SYM_SIGNING_KEY_LENGTH;
  60. keySizes.sym_enc_blockSize = DEFAULT_SYM_ENCRYPTION_BLOCK_SIZE;
  61. keySizes.sym_enc_keyLen = DEFAULT_SYM_ENCRYPTION_KEY_LENGTH;
  62. keySizes.sym_sig_size = DEFAULT_SYM_SIGNATURE_SIZE;
  63. keySizes.asym_lcl_sig_size = DEFAULT_ASYM_LOCAL_SIGNATURE_SIZE;
  64. keySizes.asym_rmt_sig_size = DEFAULT_ASYM_REMOTE_SIGNATURE_SIZE;
  65. keySizes.asym_rmt_ptext_blocksize = DEFAULT_ASYM_REMOTE_PLAINTEXT_BLOCKSIZE;
  66. keySizes.asym_rmt_enc_key_size = 2048;
  67. keySizes.asym_lcl_enc_key_size = 1024;
  68. }
  69. static void
  70. teardown_key_sizes(void) {
  71. memset(&keySizes, 0, sizeof(struct key_sizes));
  72. }
  73. /*
  74. static void
  75. setup_dummyPolicy(void) {
  76. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled);
  77. }
  78. static void
  79. teardown_dummyPolicy(void) {
  80. dummyPolicy.deleteMembers(&dummyPolicy);
  81. }*/
  82. START_TEST(SecureChannel_initAndDelete)
  83. {
  84. TestingPolicy(&dummyPolicy, dummyCertificate, &fCalled, &keySizes);
  85. UA_StatusCode retval;
  86. UA_SecureChannel channel;
  87. retval = UA_SecureChannel_init(&channel, &dummyPolicy, &dummyCertificate);
  88. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected StatusCode to be good");
  89. ck_assert_msg(channel.state == UA_SECURECHANNELSTATE_FRESH, "Expected state to be fresh");
  90. ck_assert_msg(fCalled.newContext, "Expected newContext to have been called");
  91. ck_assert_msg(fCalled.makeCertificateThumbprint, "Expected makeCertificateThumbprint to have been called");
  92. ck_assert_msg(channel.securityPolicy == &dummyPolicy, "SecurityPolicy not set correctly");
  93. UA_SecureChannel_deleteMembersCleanup(&channel);
  94. ck_assert_msg(fCalled.deleteContext, "Expected deleteContext to have been called");
  95. dummyPolicy.deleteMembers(&dummyPolicy);
  96. }
  97. END_TEST
  98. START_TEST(SecureChannel_initAndDelete_invalidParameters)
  99. {
  100. UA_StatusCode retval = UA_SecureChannel_init(NULL, NULL, NULL);
  101. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  102. UA_SecureChannel channel;
  103. retval = UA_SecureChannel_init(&channel, &dummyPolicy, NULL);
  104. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  105. retval = UA_SecureChannel_init(&channel, NULL, &dummyCertificate);
  106. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  107. retval = UA_SecureChannel_init(NULL, &dummyPolicy, &dummyCertificate);
  108. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected init to fail");
  109. UA_SecureChannel_deleteMembersCleanup(NULL);
  110. }
  111. END_TEST
  112. START_TEST(SecureChannel_generateNewKeys)
  113. {
  114. UA_StatusCode retval = UA_SecureChannel_generateNewKeys(&testChannel);
  115. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected Statuscode to be good");
  116. ck_assert_msg(fCalled.generateKey, "Expected generateKey to have been called");
  117. ck_assert_msg(fCalled.setLocalSymEncryptingKey, "Expected setLocalSymEncryptingKey to have been called");
  118. ck_assert_msg(fCalled.setLocalSymSigningKey, "Expected setLocalSymSigningKey to have been called");
  119. ck_assert_msg(fCalled.setLocalSymIv, "Expected setLocalSymIv to have been called");
  120. ck_assert_msg(fCalled.setRemoteSymEncryptingKey, "Expected setRemoteSymEncryptingKey to have been called");
  121. ck_assert_msg(fCalled.setRemoteSymSigningKey, "Expected setRemoteSymSigningKey to have been called");
  122. ck_assert_msg(fCalled.setRemoteSymIv, "Expected setRemoteSymIv to have been called");
  123. retval = UA_SecureChannel_generateNewKeys(NULL);
  124. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure on NULL pointer");
  125. }
  126. END_TEST
  127. START_TEST(SecureChannel_revolveTokens)
  128. {
  129. // Fake that no token was issued by setting 0
  130. testChannel.nextSecurityToken.tokenId = 0;
  131. UA_StatusCode retval = UA_SecureChannel_revolveTokens(&testChannel);
  132. ck_assert_msg(retval == UA_STATUSCODE_BADSECURECHANNELTOKENUNKNOWN,
  133. "Expected failure because tokenId 0 signifies that no token was issued");
  134. // Fake an issued token by setting an id
  135. testChannel.nextSecurityToken.tokenId = 10;
  136. retval = UA_SecureChannel_revolveTokens(&testChannel);
  137. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to return GOOD");
  138. ck_assert_msg(fCalled.generateKey,
  139. "Expected generateKey to be called because new keys need to be generated,"
  140. "when switching to the next token.");
  141. UA_ChannelSecurityToken testToken;
  142. UA_ChannelSecurityToken_init(&testToken);
  143. ck_assert_msg(memcmp(&testChannel.nextSecurityToken, &testToken, sizeof(UA_ChannelSecurityToken)) == 0,
  144. "Expected the next securityToken to be freshly initialized");
  145. ck_assert_msg(testChannel.securityToken.tokenId == 10, "Expected token to have been copied");
  146. }
  147. END_TEST
  148. static void
  149. createDummyResponse(UA_OpenSecureChannelResponse *response) {
  150. UA_OpenSecureChannelResponse_init(response);
  151. memset(response, 0, sizeof(UA_OpenSecureChannelResponse));
  152. }
  153. START_TEST(SecureChannel_sendAsymmetricOPNMessage_withoutConnection)
  154. {
  155. UA_OpenSecureChannelResponse dummyResponse;
  156. createDummyResponse(&dummyResponse);
  157. testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
  158. // Remove connection to provoke error
  159. UA_Connection_detachSecureChannel(testChannel.connection);
  160. testChannel.connection = NULL;
  161. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  162. 42,
  163. &dummyResponse,
  164. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  165. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure without a connection");
  166. }
  167. END_TEST
  168. START_TEST(SecureChannel_sendAsymmetricOPNMessage_invalidParameters)
  169. {
  170. UA_OpenSecureChannelResponse dummyResponse;
  171. createDummyResponse(&dummyResponse);
  172. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  173. 42,
  174. NULL,
  175. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  176. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  177. retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  178. 42,
  179. &dummyResponse,
  180. NULL);
  181. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  182. retval = UA_SecureChannel_sendAsymmetricOPNMessage(NULL,
  183. 42,
  184. &dummyResponse,
  185. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  186. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  187. }
  188. END_TEST
  189. START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeInvalid)
  190. {
  191. // Configure our channel correctly for OPN messages and setup dummy message
  192. UA_OpenSecureChannelResponse dummyResponse;
  193. createDummyResponse(&dummyResponse);
  194. testChannel.securityMode = UA_MESSAGESECURITYMODE_INVALID;
  195. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  196. 42,
  197. &dummyResponse,
  198. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  199. ck_assert_msg(retval == UA_STATUSCODE_BADSECURITYMODEREJECTED, "Expected SecurityMode rejected error");
  200. }
  201. END_TEST
  202. START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeNone)
  203. {
  204. // Configure our channel correctly for OPN messages and setup dummy message
  205. UA_OpenSecureChannelResponse dummyResponse;
  206. createDummyResponse(&dummyResponse);
  207. testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
  208. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  209. 42,
  210. &dummyResponse,
  211. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  212. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  213. ck_assert_msg(!fCalled.asym_enc, "Message encryption was called but should not have been");
  214. ck_assert_msg(!fCalled.asym_sign, "Message signing was called but should not have been");
  215. }
  216. END_TEST
  217. START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeSign)
  218. {
  219. // Configure our channel correctly for OPN messages and setup dummy message
  220. UA_OpenSecureChannelResponse dummyResponse;
  221. createDummyResponse(&dummyResponse);
  222. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGN;
  223. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  224. 42,
  225. &dummyResponse,
  226. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  227. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  228. ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
  229. ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
  230. }
  231. END_TEST
  232. START_TEST(SecureChannel_sendAsymmetricOPNMessage_SecurityModeSignAndEncrypt)
  233. {
  234. // Configure our channel correctly for OPN messages and setup dummy message
  235. UA_OpenSecureChannelResponse dummyResponse;
  236. createDummyResponse(&dummyResponse);
  237. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
  238. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  239. 42,
  240. &dummyResponse,
  241. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  242. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  243. ck_assert_msg(fCalled.asym_enc, "Expected message to have been encrypted but it was not");
  244. ck_assert_msg(fCalled.asym_sign, "Expected message to have been signed but it was not");
  245. }
  246. END_TEST
  247. START_TEST(SecureChannel_sendAsymmetricOPNMessage_sentDataIsValid)
  248. {
  249. UA_OpenSecureChannelResponse dummyResponse;
  250. createDummyResponse(&dummyResponse);
  251. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
  252. UA_UInt32 requestId = UA_UInt32_random();
  253. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  254. requestId,
  255. &dummyResponse,
  256. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  257. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  258. size_t offset = 0;
  259. UA_SecureConversationMessageHeader header;
  260. UA_SecureConversationMessageHeader_decodeBinary(&sentData, &offset, &header);
  261. UA_AsymmetricAlgorithmSecurityHeader asymSecurityHeader;
  262. UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(&sentData, &offset, &asymSecurityHeader);
  263. ck_assert_msg(UA_ByteString_equal(&dummyCertificate, &asymSecurityHeader.senderCertificate),
  264. "Expected the certificate to be equal to the one used by the secureChannel");
  265. ck_assert_msg(UA_ByteString_equal(&testChannel.securityPolicy->policyUri,
  266. &asymSecurityHeader.securityPolicyUri),
  267. "Expected securityPolicyUri to be equal to the one used by the secureChannel");
  268. UA_ByteString thumbPrint = {20, testChannel.remoteCertificateThumbprint};
  269. ck_assert_msg(UA_ByteString_equal(&thumbPrint,
  270. &asymSecurityHeader.receiverCertificateThumbprint),
  271. "Expected receiverCertificateThumbprint to be equal to the one set in the secureChannel");
  272. for(size_t i = offset; i < header.messageHeader.messageSize; ++i) {
  273. sentData.data[i] = (UA_Byte) ((sentData.data[i] - 1) % (UA_BYTE_MAX + 1));
  274. }
  275. UA_SequenceHeader sequenceHeader;
  276. UA_SequenceHeader_decodeBinary(&sentData, &offset, &sequenceHeader);
  277. ck_assert_msg(sequenceHeader.requestId == requestId, "Expected requestId to be %i but was %i",
  278. requestId,
  279. sequenceHeader.requestId);
  280. UA_NodeId original = UA_NODEID_NUMERIC(0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId);
  281. UA_NodeId requestTypeId;
  282. UA_NodeId_decodeBinary(&sentData, &offset, &requestTypeId);
  283. ck_assert_msg(UA_NodeId_equal(&original, &requestTypeId), "Expected nodeIds to be equal");
  284. UA_OpenSecureChannelResponse sentResponse;
  285. UA_OpenSecureChannelResponse_decodeBinary(&sentData, &offset, &sentResponse);
  286. ck_assert_msg(memcmp(&sentResponse, &dummyResponse, sizeof(UA_OpenSecureChannelResponse)) == 0,
  287. "Expected the sent response to be equal to the one supplied to the send function");
  288. UA_Byte paddingByte = sentData.data[offset];
  289. size_t paddingSize = (size_t) paddingByte;
  290. for(size_t i = 0; i <= paddingSize; ++i) {
  291. ck_assert_msg(sentData.data[offset + i] == paddingByte,
  292. "Expected padding byte %i to be %i but got value %i",
  293. i,
  294. paddingByte,
  295. sentData.data[offset + i]);
  296. }
  297. ck_assert_msg(sentData.data[offset + paddingSize + 1] == '*', "Expected first byte of signature");
  298. UA_SecureConversationMessageHeader_deleteMembers(&header);
  299. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymSecurityHeader);
  300. UA_SequenceHeader_deleteMembers(&sequenceHeader);
  301. UA_OpenSecureChannelResponse_deleteMembers(&sentResponse);
  302. }
  303. END_TEST
  304. START_TEST(Securechannel_sendAsymmetricOPNMessage_extraPaddingPresentWhenKeyLargerThan2048Bits)
  305. {
  306. keySizes.asym_rmt_enc_key_size = 4096;
  307. keySizes.asym_rmt_ptext_blocksize = 4096;
  308. UA_OpenSecureChannelResponse dummyResponse;
  309. createDummyResponse(&dummyResponse);
  310. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
  311. UA_UInt32 requestId = UA_UInt32_random();
  312. UA_StatusCode retval = UA_SecureChannel_sendAsymmetricOPNMessage(&testChannel,
  313. requestId,
  314. &dummyResponse,
  315. &UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE]);
  316. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected function to succeed");
  317. size_t offset = 0;
  318. UA_SecureConversationMessageHeader header;
  319. UA_SecureConversationMessageHeader_decodeBinary(&sentData, &offset, &header);
  320. UA_AsymmetricAlgorithmSecurityHeader asymSecurityHeader;
  321. UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(&sentData, &offset, &asymSecurityHeader);
  322. ck_assert_msg(UA_ByteString_equal(&dummyCertificate, &asymSecurityHeader.senderCertificate),
  323. "Expected the certificate to be equal to the one used by the secureChannel");
  324. ck_assert_msg(UA_ByteString_equal(&testChannel.securityPolicy->policyUri,
  325. &asymSecurityHeader.securityPolicyUri),
  326. "Expected securityPolicyUri to be equal to the one used by the secureChannel");
  327. UA_ByteString thumbPrint = {20, testChannel.remoteCertificateThumbprint};
  328. ck_assert_msg(UA_ByteString_equal(&thumbPrint,
  329. &asymSecurityHeader.receiverCertificateThumbprint),
  330. "Expected receiverCertificateThumbprint to be equal to the one set in the secureChannel");
  331. for(size_t i = offset; i < header.messageHeader.messageSize; ++i) {
  332. sentData.data[i] = (UA_Byte) ((sentData.data[i] - 1) % (UA_BYTE_MAX + 1));
  333. }
  334. UA_SequenceHeader sequenceHeader;
  335. UA_SequenceHeader_decodeBinary(&sentData, &offset, &sequenceHeader);
  336. ck_assert_msg(sequenceHeader.requestId == requestId, "Expected requestId to be %i but was %i",
  337. requestId,
  338. sequenceHeader.requestId);
  339. UA_NodeId original = UA_NODEID_NUMERIC(0, UA_TYPES[UA_TYPES_OPENSECURECHANNELRESPONSE].binaryEncodingId);
  340. UA_NodeId requestTypeId;
  341. UA_NodeId_decodeBinary(&sentData, &offset, &requestTypeId);
  342. ck_assert_msg(UA_NodeId_equal(&original, &requestTypeId), "Expected nodeIds to be equal");
  343. UA_OpenSecureChannelResponse sentResponse;
  344. UA_OpenSecureChannelResponse_decodeBinary(&sentData, &offset, &sentResponse);
  345. ck_assert_msg(memcmp(&sentResponse, &dummyResponse, sizeof(UA_OpenSecureChannelResponse)) == 0,
  346. "Expected the sent response to be equal to the one supplied to the send function");
  347. UA_Byte paddingByte = sentData.data[offset];
  348. UA_Byte extraPaddingByte = sentData.data[sentData.length - keySizes.asym_lcl_sig_size - 1];
  349. size_t paddingSize = (size_t) paddingByte;
  350. paddingSize |= extraPaddingByte << 8;
  351. for(size_t i = 0; i <= paddingSize; ++i) {
  352. ck_assert_msg(sentData.data[offset + i] == paddingByte,
  353. "Expected padding byte %i to be %i but got value %i",
  354. i,
  355. paddingByte,
  356. sentData.data[offset + i]);
  357. }
  358. ck_assert_msg(sentData.data[offset + paddingSize + 1] == extraPaddingByte, "Expected extra padding byte to be "
  359. "%i but got %i",
  360. extraPaddingByte, sentData.data[offset + paddingSize + 1]);
  361. ck_assert_msg(sentData.data[offset + paddingSize + 2] == '*', "Expected first byte 42 of signature but got %i",
  362. sentData.data[offset + paddingSize + 2]);
  363. UA_SecureConversationMessageHeader_deleteMembers(&header);
  364. UA_AsymmetricAlgorithmSecurityHeader_deleteMembers(&asymSecurityHeader);
  365. UA_SequenceHeader_deleteMembers(&sequenceHeader);
  366. UA_OpenSecureChannelResponse_deleteMembers(&sentResponse);
  367. }
  368. END_TEST
  369. START_TEST(SecureChannel_generateNonce)
  370. {
  371. UA_ByteString myNonce;
  372. UA_ByteString_init(&myNonce);
  373. for(size_t i = 0; i < 129; ++i) {
  374. i = (i == 128) ? 65536 : i; // large edge case
  375. UA_StatusCode retval = UA_SecureChannel_generateNonce(&testChannel, i, &myNonce);
  376. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected retval to be good");
  377. ck_assert_msg(myNonce.length == i, "Expected nonce length to be %i but was %i", i, myNonce.length);
  378. ck_assert_msg(fCalled.generateNonce, "Expected generateNonce to have been called");
  379. }
  380. UA_ByteString_deleteMembers(&myNonce);
  381. }
  382. END_TEST
  383. START_TEST(SecureChannel_generateNonce_invalidParameters)
  384. {
  385. UA_ByteString myNonce;
  386. UA_ByteString_init(&myNonce);
  387. UA_StatusCode retval = UA_SecureChannel_generateNonce(NULL, 42, NULL);
  388. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  389. retval = UA_SecureChannel_generateNonce(NULL, 42, &myNonce);
  390. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  391. retval = UA_SecureChannel_generateNonce(&testChannel, 42, NULL);
  392. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  393. }
  394. END_TEST
  395. START_TEST(SecureChannel_sendSymmetricMessage)
  396. {
  397. // initialize dummy message
  398. UA_ReadRequest dummyMessage;
  399. UA_ReadRequest_init(&dummyMessage);
  400. UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
  401. UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
  402. &dummyMessage, &dummyType);
  403. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
  404. // TODO: expand test
  405. }
  406. END_TEST
  407. START_TEST(SecureChannel_sendSymmetricMessage_modeNone)
  408. {
  409. // initialize dummy message
  410. UA_ReadRequest dummyMessage;
  411. UA_ReadRequest_init(&dummyMessage);
  412. UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
  413. testChannel.securityMode = UA_MESSAGESECURITYMODE_NONE;
  414. UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
  415. &dummyMessage, &dummyType);
  416. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
  417. ck_assert_msg(!fCalled.sym_sign, "Expected message to not have been signed");
  418. ck_assert_msg(!fCalled.sym_enc, "Expected message to not have been encrypted");
  419. }
  420. END_TEST
  421. START_TEST(SecureChannel_sendSymmetricMessage_modeSign)
  422. {
  423. // initialize dummy message
  424. UA_ReadRequest dummyMessage;
  425. UA_ReadRequest_init(&dummyMessage);
  426. UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
  427. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGN;
  428. UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
  429. &dummyMessage, &dummyType);
  430. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
  431. ck_assert_msg(fCalled.sym_sign, "Expected message to have been signed");
  432. ck_assert_msg(!fCalled.sym_enc, "Expected message to not have been encrypted");
  433. }
  434. END_TEST
  435. START_TEST(SecureChannel_sendSymmetricMessage_modeSignAndEncrypt)
  436. {
  437. // initialize dummy message
  438. UA_ReadRequest dummyMessage;
  439. UA_ReadRequest_init(&dummyMessage);
  440. UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
  441. testChannel.securityMode = UA_MESSAGESECURITYMODE_SIGNANDENCRYPT;
  442. UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG,
  443. &dummyMessage, &dummyType);
  444. ck_assert_msg(retval == UA_STATUSCODE_GOOD, "Expected success");
  445. ck_assert_msg(fCalled.sym_sign, "Expected message to have been signed");
  446. ck_assert_msg(fCalled.sym_enc, "Expected message to have been encrypted");
  447. }
  448. END_TEST
  449. START_TEST(SecureChannel_sendSymmetricMessage_invalidParameters)
  450. {
  451. // initialize dummy message
  452. UA_ReadRequest dummyMessage;
  453. UA_ReadRequest_init(&dummyMessage);
  454. UA_DataType dummyType = UA_TYPES[UA_TYPES_READREQUEST];
  455. UA_StatusCode retval = UA_SecureChannel_sendSymmetricMessage(NULL, 42, UA_MESSAGETYPE_MSG,
  456. &dummyMessage, &dummyType);
  457. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  458. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_HEL, &dummyMessage, &dummyType);
  459. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  460. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_ACK, &dummyMessage, &dummyType);
  461. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  462. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_ERR, &dummyMessage, &dummyType);
  463. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  464. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_OPN, &dummyMessage, &dummyType);
  465. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  466. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG, NULL, &dummyType);
  467. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  468. retval = UA_SecureChannel_sendSymmetricMessage(&testChannel, 42, UA_MESSAGETYPE_MSG, &dummyMessage, NULL);
  469. ck_assert_msg(retval != UA_STATUSCODE_GOOD, "Expected failure");
  470. }
  471. END_TEST
  472. static Suite *
  473. testSuite_SecureChannel(void) {
  474. Suite *s = suite_create("SecureChannel");
  475. TCase *tc_initAndDelete = tcase_create("Initialize and delete Securechannel");
  476. tcase_add_checked_fixture(tc_initAndDelete, setup_funcs_called, teardown_funcs_called);
  477. tcase_add_checked_fixture(tc_initAndDelete, setup_key_sizes, teardown_key_sizes);
  478. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete);
  479. tcase_add_test(tc_initAndDelete, SecureChannel_initAndDelete_invalidParameters);
  480. suite_add_tcase(s, tc_initAndDelete);
  481. TCase *tc_generateNewKeys = tcase_create("Test generateNewKeys function");
  482. tcase_add_checked_fixture(tc_generateNewKeys, setup_funcs_called, teardown_funcs_called);
  483. tcase_add_checked_fixture(tc_generateNewKeys, setup_key_sizes, teardown_key_sizes);
  484. tcase_add_checked_fixture(tc_generateNewKeys, setup_secureChannel, teardown_secureChannel);
  485. tcase_add_test(tc_generateNewKeys, SecureChannel_generateNewKeys);
  486. suite_add_tcase(s, tc_generateNewKeys);
  487. TCase *tc_revolveTokens = tcase_create("Test revolveTokens function");
  488. tcase_add_checked_fixture(tc_revolveTokens, setup_funcs_called, teardown_funcs_called);
  489. tcase_add_checked_fixture(tc_revolveTokens, setup_key_sizes, teardown_key_sizes);
  490. tcase_add_checked_fixture(tc_revolveTokens, setup_secureChannel, teardown_secureChannel);
  491. tcase_add_test(tc_revolveTokens, SecureChannel_revolveTokens);
  492. suite_add_tcase(s, tc_revolveTokens);
  493. TCase *tc_sendAsymmetricOPNMessage = tcase_create("Test sendAsymmetricOPNMessage function");
  494. tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_funcs_called, teardown_funcs_called);
  495. tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_key_sizes, teardown_key_sizes);
  496. tcase_add_checked_fixture(tc_sendAsymmetricOPNMessage, setup_secureChannel, teardown_secureChannel);
  497. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_withoutConnection);
  498. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_invalidParameters);
  499. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeInvalid);
  500. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeNone);
  501. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeSign);
  502. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_SecurityModeSignAndEncrypt);
  503. tcase_add_test(tc_sendAsymmetricOPNMessage, SecureChannel_sendAsymmetricOPNMessage_sentDataIsValid);
  504. tcase_add_test(tc_sendAsymmetricOPNMessage,
  505. Securechannel_sendAsymmetricOPNMessage_extraPaddingPresentWhenKeyLargerThan2048Bits);
  506. suite_add_tcase(s, tc_sendAsymmetricOPNMessage);
  507. TCase *tc_generateNonce = tcase_create("Test generateNonce function");
  508. tcase_add_checked_fixture(tc_generateNonce, setup_funcs_called, teardown_funcs_called);
  509. tcase_add_checked_fixture(tc_generateNonce, setup_key_sizes, teardown_key_sizes);
  510. tcase_add_checked_fixture(tc_generateNonce, setup_secureChannel, teardown_secureChannel);
  511. tcase_add_test(tc_generateNonce, SecureChannel_generateNonce);
  512. tcase_add_test(tc_generateNonce, SecureChannel_generateNonce_invalidParameters);
  513. suite_add_tcase(s, tc_generateNonce);
  514. TCase *tc_sendSymmetricMessage = tcase_create("Test sendSymmetricMessage function");
  515. tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_funcs_called, teardown_funcs_called);
  516. tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_key_sizes, teardown_key_sizes);
  517. tcase_add_checked_fixture(tc_sendSymmetricMessage, setup_secureChannel, teardown_secureChannel);
  518. tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage);
  519. tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_invalidParameters);
  520. tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeNone);
  521. tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeSign);
  522. tcase_add_test(tc_sendSymmetricMessage, SecureChannel_sendSymmetricMessage_modeSignAndEncrypt);
  523. suite_add_tcase(s, tc_sendSymmetricMessage);
  524. return s;
  525. }
  526. int
  527. main(void) {
  528. Suite *s = testSuite_SecureChannel();
  529. SRunner *sr = srunner_create(s);
  530. srunner_set_fork_status(sr, CK_NOFORK);
  531. srunner_run_all(sr, CK_NORMAL);
  532. int number_failed = srunner_ntests_failed(sr);
  533. srunner_free(sr);
  534. return (number_failed == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
  535. }