opcua_secureChannelLayer.c 12 KB

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