opcua_secureChannelLayer.c 11 KB

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