opcua_secureChannelLayer.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422
  1. /*
  2. * opcua_secureChannelLayer.c
  3. *
  4. * Created on: Jan 13, 2014
  5. * Author: opcua
  6. */
  7. #include "opcua_secureChannelLayer.h"
  8. #include <stdio.h>
  9. /*
  10. * opens a secureChannel (server side)
  11. */
  12. Int32 SL_secureChannel_open(const UA_connection *connection,
  13. const AD_RawMessage *secureChannelPacket,
  14. const SL_SecureConversationMessageHeader *SCMHeader,
  15. const SL_AsymmetricAlgorithmSecurityHeader *AASHeader,
  16. const SL_SequenceHeader *SequenceHeader) {
  17. UA_AD_ResponseHeader responseHeader;
  18. AD_RawMessage rawMessage;
  19. Int32 position = 0;
  20. //SL_secureChannel_ResponseHeader_get(connection,&responseHeader);
  21. Int32 size = responseHeader_calcSize(&responseHeader);
  22. rawMessage.message = (char*) opcua_malloc(size);
  23. encodeResponseHeader(&responseHeader, &position, &rawMessage);
  24. rawMessage.length = position;
  25. return UA_NO_ERROR;
  26. }
  27. Int32 SL_openSecureChannel_responseMessage_get(UA_connection *connection,
  28. SL_Response *response, Int32* sizeInOut) {
  29. response->ServerNonce.Length = 0; // TODO set a valid value for the Server Nonce
  30. response->ServerProtocolVersion = 0; //
  31. response->SecurityToken.createdAt = opcua_getTime(); //
  32. response->SecurityToken.revisedLifetime = 300000; //TODO set Lifetime of Security Token
  33. response->SecurityToken.secureChannelId =
  34. connection->secureLayer.UInt32_secureChannelId; //TODO set a valid value for secureChannel id
  35. return UA_NO_ERROR;
  36. }
  37. Int32 SL_openSecureChannel_responseMessage_calcSize(SL_Response *response,
  38. Int32* sizeInOut) {
  39. Int32 length = 0;
  40. length += sizeof(response->SecurityToken);
  41. length += UAString_calcSize(response->ServerNonce);
  42. length += sizeof(response->ServerProtocolVersion);
  43. return length;
  44. }
  45. /*
  46. * closes a secureChannel (server side)
  47. */
  48. void SL_secureChannel_close(UA_connection *connection) {
  49. }
  50. Int32 SL_check(UA_connection *connection, UA_ByteString secureChannelPacket) {
  51. return UA_NO_ERROR;
  52. }
  53. Int32 SL_createSecurityToken(UA_connection *connection, Int32 lifeTime) {
  54. return UA_NO_ERROR;
  55. }
  56. Int32 SL_processMessage(UA_connection *connection, UA_ByteString message) {
  57. Int32 pos = 0;
  58. UA_AD_RequestHeader requestHeader;
  59. UInt32 clientProtocolVersion;
  60. UA_NodeId serviceRequestType;
  61. Int32 requestType;
  62. Int32 securityMode;
  63. Int32 requestedLifetime;
  64. UA_ByteString clientNonce;
  65. // Every Message starts with a NodeID which names the serviceRequestType
  66. decoder_decodeBuiltInDatatype(message.Data, NODE_ID, &pos,
  67. &serviceRequestType);
  68. UA_NodeId_printf("SL_processMessage - serviceRequestType=",
  69. &serviceRequestType);
  70. if (serviceRequestType.EncodingByte == NIEVT_FOUR_BYTE
  71. && serviceRequestType.Identifier.Numeric == 446) {
  72. /* OpenSecureChannelService, defined in 62541-6 §6.4.4, Table 34.
  73. * Note that part 6 adds ClientProtocolVersion and ServerProtocolVersion
  74. * to the definition in part 4
  75. *
  76. * Request
  77. *
  78. * Req-1) RequestHeader requestHeader
  79. * Req-2) UInt32 ClientProtocolVersion
  80. * Req-3) Enum SecurityTokenRequestType requestType
  81. * Req-4) Enum MessageSecurityMode SecurityMode
  82. * Req-5) ByteString ClientNonce
  83. * Req-6) Int32 RequestLifetime
  84. *
  85. * Response
  86. *
  87. * Res-1) ResponseHeader responseHeader
  88. * Res-2) UInt32 ServerProtocolVersion
  89. * Res-3) SecurityToken channelSecurityToken
  90. * Res-5) ByteString ServerNonce
  91. */
  92. UA_ByteString_printx("SL_processMessage - message=", &message);
  93. // Req-1) RequestHeader requestHeader
  94. decoder_decodeRequestHeader(message.Data, &pos, &requestHeader);
  95. UA_String_printf("SL_processMessage - requestHeader.auditEntryId=",
  96. &requestHeader.auditEntryId);
  97. UA_NodeId_printf(
  98. "SL_processMessage - requestHeader.authenticationToken=",
  99. &requestHeader.authenticationToken);
  100. // Req-2) UInt32 ClientProtocolVersion
  101. decoder_decodeBuiltInDatatype(message.Data, UINT32, &pos,
  102. &clientProtocolVersion);
  103. printf("SL_processMessage - clientProtocolVersion=%d\n",clientProtocolVersion);
  104. if (clientProtocolVersion
  105. != connection->transportLayer.remoteConf.protocolVersion) {
  106. printf("SL_processMessage - error protocol version \n");
  107. //TODO error protocol version
  108. //TODO ERROR_Bad_ProtocolVersionUnsupported
  109. }
  110. // Req-3) SecurityTokenRequestType requestType
  111. decoder_decodeBuiltInDatatype(message.Data, INT32, &pos, &requestType);
  112. printf("SL_processMessage - requestType=%d\n",requestType);
  113. switch (requestType) {
  114. case securityToken_ISSUE:
  115. if (connection->secureLayer.connectionState
  116. == connectionState_ESTABLISHED) {
  117. printf("SL_processMessage - multiply security token request");
  118. //TODO return ERROR
  119. return UA_ERROR;
  120. }
  121. printf(
  122. "SL_processMessage - TODO: create new token for a new SecureChannel\n");
  123. // SL_createNewToken(connection);
  124. break;
  125. case securityToken_RENEW:
  126. if (connection->secureLayer.connectionState
  127. == connectionState_CLOSED) {
  128. printf(
  129. "SL_processMessage - renew token request received, but no secureChannel was established before");
  130. //TODO return ERROR
  131. return UA_ERROR;
  132. }
  133. printf("TODO: create new token for an existing SecureChannel\n");
  134. break;
  135. }
  136. // Req-4) MessageSecurityMode SecurityMode
  137. decoder_decodeBuiltInDatatype(message.Data, INT32, &pos, &securityMode);
  138. printf("SL_processMessage - securityMode=%d\n",securityMode);
  139. switch (securityMode) {
  140. case securityMode_INVALID:
  141. connection->secureLayer.clientNonce.Data = NULL;
  142. connection->secureLayer.clientNonce.Length = 0;
  143. printf("SL_processMessage - client demands no security \n");
  144. break;
  145. case securityMode_SIGN:
  146. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  147. break;
  148. case securityMode_SIGNANDENCRYPT:
  149. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  150. break;
  151. }
  152. // Req-5) ByteString ClientNonce
  153. decoder_decodeBuiltInDatatype(message.Data, BYTE_STRING, &pos, &clientNonce);
  154. UA_String_printf("SL_processMessage - clientNonce=",&clientNonce);
  155. // Req-6) Int32 RequestLifetime
  156. decoder_decodeBuiltInDatatype(message.Data, INT32, &pos,
  157. &requestedLifetime);
  158. printf("SL_processMessage - requestedLifeTime=%d\n",requestedLifetime);
  159. //TODO process requestedLifetime
  160. } else {
  161. printf("SL_processMessage - unknown service request");
  162. //TODO change error code
  163. return UA_ERROR;
  164. }
  165. return UA_NO_ERROR;
  166. }
  167. /*
  168. * receive and process data from underlying layer
  169. */
  170. void SL_receive(UA_connection *connection, UA_ByteString *serviceMessage) {
  171. UA_ByteString secureChannelPacket;
  172. UA_ByteString message;
  173. SL_SecureConversationMessageHeader SCM_Header;
  174. SL_AsymmetricAlgorithmSecurityHeader AAS_Header;
  175. SL_SequenceHeader SequenceHeader;
  176. Int32 packetType = 0;
  177. Int32 pos = 0;
  178. Int32 iTmp;
  179. //TODO Error Handling, length checking
  180. //get data from transport layer
  181. printf("SL_receive - entered \n");
  182. TL_receive(connection, &secureChannelPacket);
  183. if (secureChannelPacket.Length > 0 && secureChannelPacket.Data != NULL) {
  184. printf("SL_receive - data received \n");
  185. packetType = TL_getPacketType(&secureChannelPacket, &pos);
  186. decodeSCMHeader(&secureChannelPacket, &pos, &SCM_Header);
  187. switch (SCM_Header.MessageType) {
  188. case packetType_OPN: /* openSecureChannel Message received */
  189. decodeAASHeader(&secureChannelPacket, &pos, &AAS_Header);
  190. UA_String_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
  191. &(AAS_Header.ReceiverThumbprint));
  192. UA_String_printf("SL_receive - AAS_Header.SecurityPolicyUri=",
  193. &(AAS_Header.SecurityPolicyUri));
  194. UA_String_printf("SL_receive - AAS_Header.SenderCertificate=",
  195. &(AAS_Header.SenderCertificate));
  196. if (SCM_Header.SecureChannelId != 0) {
  197. iTmp = UA_ByteString_compare(
  198. &(connection->secureLayer.SenderCertificate),
  199. &(AAS_Header.SenderCertificate));
  200. if (iTmp != UA_EQUAL) {
  201. printf("SL_receive - UA_ERROR_BadSecureChannelUnknown \n");
  202. //TODO return UA_ERROR_BadSecureChannelUnknown
  203. }
  204. }
  205. decodeSequenceHeader(&secureChannelPacket, &pos, &SequenceHeader);
  206. printf("SL_receive - SequenceHeader.RequestId=%d\n",
  207. SequenceHeader.RequestId);
  208. printf("SL_receive - SequenceHeader.SequenceNr=%d\n",
  209. SequenceHeader.SequenceNumber);
  210. //TODO check that the sequence number is smaller than MaxUInt32 - 1024
  211. connection->secureLayer.sequenceNumber =
  212. SequenceHeader.SequenceNumber;
  213. //SL_decrypt(&secureChannelPacket);
  214. message.Data = &secureChannelPacket.Data[pos];
  215. message.Length = secureChannelPacket.Length - pos;
  216. SL_processMessage(connection, message);
  217. break;
  218. case packetType_MSG: /* secure Channel Message received */
  219. if (connection->secureLayer.connectionState
  220. == connectionState_ESTABLISHED) {
  221. if (SCM_Header.SecureChannelId
  222. == connection->secureLayer.UInt32_secureChannelId) {
  223. } else {
  224. //TODO generate ERROR_Bad_SecureChannelUnkown
  225. }
  226. }
  227. break;
  228. case packetType_CLO: /* closeSecureChannel Message received */
  229. if (SL_check(connection, secureChannelPacket) == UA_NO_ERROR) {
  230. }
  231. break;
  232. }
  233. } else {
  234. printf("SL_receive - no data received \n");
  235. }
  236. /*
  237. Int32 readPosition = 0;
  238. //get the Secure Channel Message Header
  239. decodeSCMHeader(secureChannelPacket,
  240. &readPosition, &SCM_Header);
  241. //get the Secure Channel Asymmetric Algorithm Security Header
  242. decodeAASHeader(secureChannelPacket,
  243. &readPosition, &AAS_Header);
  244. //get the Sequence Header
  245. decodeSequenceHeader(secureChannelPacket,
  246. &readPosition, &SequenceHeader);
  247. //get Secure Channel Message
  248. //SL_secureChannel_Message_get(connection, secureChannelPacket,
  249. // &readPosition,serviceMessage);
  250. if (secureChannelPacket->length > 0)
  251. {
  252. switch (SCM_Header.MessageType)
  253. {
  254. case packetType_MSG:
  255. if (connection->secureLayer.connectionState
  256. == connectionState_ESTABLISHED)
  257. {
  258. }
  259. else //receiving message, without secure channel
  260. {
  261. //TODO send back Error Message
  262. }
  263. break;
  264. case packetType_OPN:
  265. //Server Handling
  266. // if (openSecureChannelHeader_check(connection, secureChannelPacket))
  267. // {
  268. //check if the request is valid
  269. // SL_openSecureChannelRequest_check(connection, secureChannelPacket);
  270. // }
  271. // else
  272. // {
  273. // //TODO send back Error Message
  274. // }
  275. //Client Handling
  276. //TODO free memory for secureChannelPacket
  277. break;
  278. case packetType_CLO:
  279. //TODO free memory for secureChannelPacket
  280. break;
  281. }
  282. }
  283. */
  284. }
  285. /*
  286. * get the secure channel message header
  287. */
  288. Int32 decodeSCMHeader(UA_ByteString *rawMessage, Int32 *pos,
  289. SL_SecureConversationMessageHeader* SC_Header) {
  290. UInt32 err;
  291. printf("decodeSCMHeader - entered \n");
  292. // LU: wild guess - reset pos, we want to reread the message type again
  293. *pos = 0;
  294. SC_Header->MessageType = TL_getPacketType(rawMessage, pos);
  295. SC_Header->IsFinal = rawMessage->Data[*pos];
  296. *pos += 1;
  297. decodeUInt32(rawMessage->Data, pos, &(SC_Header->MessageSize));
  298. decodeUInt32(rawMessage->Data, pos, &(SC_Header->SecureChannelId));
  299. return UA_NO_ERROR;
  300. }
  301. Int32 encodeSCMHeader(SL_SecureConversationMessageHeader *SC_Header, Int32 *pos,
  302. AD_RawMessage *rawMessage) {
  303. const char *type = "ERR";
  304. switch (SC_Header->MessageType) {
  305. case packetType_ACK:
  306. type = "ACK";
  307. break;
  308. case packetType_CLO:
  309. type = "CLO";
  310. break;
  311. case packetType_ERR:
  312. type = "ERR";
  313. break;
  314. case packetType_HEL:
  315. type = "HEL";
  316. break;
  317. case packetType_MSG:
  318. type = "MSG";
  319. break;
  320. case packetType_OPN:
  321. type = "OPN";
  322. break;
  323. default:
  324. return UA_ERROR;
  325. }
  326. memcpy(&(rawMessage->message[*pos]), &type, 3);
  327. return UA_NO_ERROR;
  328. }
  329. Int32 decodeSequenceHeader(UA_ByteString *rawMessage, Int32 *pos,
  330. SL_SequenceHeader *SequenceHeader) {
  331. decodeUInt32(rawMessage->Data, pos, &(SequenceHeader->RequestId));
  332. decodeUInt32(rawMessage->Data, pos, &(SequenceHeader->SequenceNumber));
  333. return UA_NO_ERROR;
  334. }
  335. Int32 encodeSequenceHeader(SL_SequenceHeader *sequenceHeader, Int32 *pos,
  336. AD_RawMessage *dstRawMessage) {
  337. encodeUInt32(sequenceHeader->SequenceNumber, pos,
  338. &dstRawMessage->message[*pos]);
  339. return UA_NO_ERROR;
  340. }
  341. /*
  342. * get the asymmetric algorithm security header
  343. */
  344. Int32 decodeAASHeader(UA_ByteString *rawMessage, Int32 *pos,
  345. SL_AsymmetricAlgorithmSecurityHeader* AAS_Header) {
  346. Int32 err = 0;
  347. err += decodeUAByteString(rawMessage->Data, pos,
  348. &(AAS_Header->SecurityPolicyUri));
  349. err += decodeUAByteString(rawMessage->Data, pos,
  350. &(AAS_Header->SenderCertificate));
  351. err += decodeUAByteString(rawMessage->Data, pos,
  352. &(AAS_Header->ReceiverThumbprint));
  353. return err;
  354. }
  355. Int32 encodeAASHeader(SL_AsymmetricAlgorithmSecurityHeader *AAS_Header,
  356. Int32 *pos, AD_RawMessage* dstRawMessage) {
  357. encodeUAString(AAS_Header->SecurityPolicyUri, pos,
  358. &dstRawMessage->message[*pos]);
  359. encodeUAString(AAS_Header->SenderCertificate, pos,
  360. &dstRawMessage->message[*pos]);
  361. encodeUAString(AAS_Header->ReceiverThumbprint, pos,
  362. &dstRawMessage->message[*pos]);
  363. return UA_NO_ERROR;
  364. }