ua_secureLayer.c 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. #include <stdio.h>
  2. #include <memory.h> // memcpy
  3. #include "opcua.h"
  4. #include "ua_transportLayer.h"
  5. #include "ua_secureLayer.h"
  6. #include "ua_stackInternalTypes.h"
  7. #include "ua_statuscodes.h"
  8. #define SIZE_SECURECHANNEL_HEADER 12
  9. #define SIZE_SEQHEADER_HEADER 8
  10. UA_Int32 SL_send(UA_SL_Channel* channel, UA_ByteString const * responseMessage, UA_Int32 type) {
  11. UA_UInt32 sequenceNumber;
  12. UA_UInt32 requestId;
  13. UA_Int32 pos;
  14. UA_ByteString responsePacket;
  15. UA_Int32 packetSize;
  16. UA_Int32 sizePadding;
  17. UA_Int32 sizeSignature;
  18. // FIXME: this is a to dumb method to determine asymmetric algorithm setting
  19. UA_Int32 isAsym = (type == 449);
  20. pos = 0;
  21. //sequence header
  22. sequenceNumber = channel->sequenceHeader.sequenceNumber;
  23. requestId = channel->sequenceHeader.requestId;
  24. sizePadding = 0;
  25. sizeSignature = 0;
  26. packetSize = SIZE_SECURECHANNEL_HEADER + SIZE_SEQHEADER_HEADER
  27. + (isAsym ?
  28. UA_AsymmetricAlgorithmSecurityHeader_calcSize(
  29. &(channel->localAsymAlgSettings)) :
  30. UA_SymmetricAlgorithmSecurityHeader_calcSize(
  31. &(channel->securityToken.tokenId)))
  32. + responseMessage->length + sizePadding + sizeSignature;
  33. //get memory for response
  34. UA_alloc((void**)&(responsePacket.data), packetSize);
  35. responsePacket.length = packetSize;
  36. /*---encode Secure Conversation Message Header ---*/
  37. if (isAsym) {
  38. //encode MessageType - OPN message
  39. responsePacket.data[0] = 'O';
  40. responsePacket.data[1] = 'P';
  41. responsePacket.data[2] = 'N';
  42. } else {
  43. //encode MessageType - MSG message
  44. responsePacket.data[0] = 'M';
  45. responsePacket.data[1] = 'S';
  46. responsePacket.data[2] = 'G';
  47. }
  48. pos += 3;
  49. responsePacket.data[3] = 'F';
  50. pos += 1;
  51. UA_Int32_encodeBinary(&packetSize, &pos, &responsePacket);
  52. UA_UInt32_encodeBinary(&(channel->securityToken.secureChannelId),
  53. &pos, &responsePacket);
  54. /*---encode Algorithm Security Header ---*/
  55. if (isAsym) {
  56. UA_AsymmetricAlgorithmSecurityHeader_encodeBinary(
  57. &(channel->localAsymAlgSettings), &pos,
  58. &responsePacket);
  59. } else {
  60. UA_SymmetricAlgorithmSecurityHeader_encodeBinary(
  61. &(channel->securityToken.tokenId), &pos,
  62. &responsePacket);
  63. }
  64. /*---encode Sequence Header ---*/
  65. UA_UInt32_encodeBinary(&sequenceNumber, &pos, &responsePacket);
  66. UA_UInt32_encodeBinary(&requestId, &pos, &responsePacket);
  67. /*---add encoded Message ---*/
  68. UA_memcpy(&(responsePacket.data[pos]), responseMessage->data,
  69. responseMessage->length);
  70. /* sign Data*/
  71. /* encrypt Data*/
  72. /* send Data */
  73. TL_send(channel->tlConnection, &responsePacket);
  74. UA_ByteString_deleteMembers(&responsePacket);
  75. return UA_SUCCESS;
  76. }
  77. UA_Int32 SL_check(UA_SL_Channel* channel, UA_ByteString* msg) {
  78. return UA_NO_ERROR;
  79. }
  80. UA_Int32 SL_createSecurityToken(UA_SL_Channel* channel, UA_Int32 lifeTime) {
  81. return UA_NO_ERROR;
  82. }
  83. #define START_HANDLER(TYPE) \
  84. UA_Int32 UA_SL_handle##TYPE##Request(UA_SL_Channel *channel, void const* request, void* response) { \
  85. UA_Int32 retval = UA_SUCCESS; \
  86. printf("UA_SL_handle%sRequest\n",#TYPE ); \
  87. UA_##TYPE##Request* p = (UA_##TYPE##Request*) request; \
  88. UA_##TYPE##Response* r = (UA_##TYPE##Response*) response; \
  89. #define END_HANDLER \
  90. return retval; \
  91. } \
  92. START_HANDLER(GetEndpoints)
  93. UA_String_printx("endpointUrl=", &(p->endpointUrl));
  94. r->endpointsSize = 1;
  95. UA_Array_new((void**) &(r->endpoints),r->endpointsSize,UA_ENDPOINTDESCRIPTION);
  96. UA_String_copy(&(channel->tlConnection->localEndpointUrl),&(r->endpoints[0]->endpointUrl));
  97. UA_String_copycstring("http://open62541.info/product/release",&(r->endpoints[0]->server.productUri));
  98. // FIXME: This information should be provided by the application, preferably in the address space
  99. UA_String_copycstring("http://open62541.info/applications/4711",&(r->endpoints[0]->server.applicationUri));
  100. UA_LocalizedText_copycstring("The open62541 application",&(r->endpoints[0]->server.applicationName));
  101. // FIXME: This should be a feature of the application and an enum
  102. r->endpoints[0]->server.applicationType = 0; // Server
  103. // all the other strings are empty by initialization
  104. END_HANDLER
  105. START_HANDLER(CreateSession)
  106. UA_String_printf("CreateSession Service - endpointUrl=", &(p->endpointUrl));
  107. // FIXME: create session
  108. r->sessionId.encodingByte = UA_NODEIDTYPE_FOURBYTE;
  109. r->sessionId.namespace = 1;
  110. r->sessionId.identifier.numeric = 666;
  111. END_HANDLER
  112. START_HANDLER(ActivateSession)
  113. #pragma GCC diagnostic ignored "-Wunused-variable"
  114. // FIXME: activate session
  115. UA_NodeId_printf("ActivateSession - authToken=", &(p->requestHeader.authenticationToken));
  116. // 321 == AnonymousIdentityToken_Encoding_DefaultBinary
  117. UA_NodeId_printf("ActivateSession - uIdToken.type=", &(p->userIdentityToken.typeId));
  118. UA_ByteString_printx_hex("ActivateSession - uIdToken.body=", &(p->userIdentityToken.body));
  119. END_HANDLER
  120. START_HANDLER(CloseSession)
  121. #pragma GCC diagnostic ignored "-Wunused-variable"
  122. // FIXME: close session
  123. END_HANDLER
  124. START_HANDLER(Browse)
  125. #pragma GCC diagnostic ignored "-Wunused-variable"
  126. UA_NodeId_printf("BrowseService - view=",&(p->view.viewId));
  127. UA_Int32 i = 0;
  128. for (i=0;p->nodesToBrowseSize > 0 && i<p->nodesToBrowseSize;i++) {
  129. UA_NodeId_printf("BrowseService - nodesToBrowse=", &(p->nodesToBrowse[i]->nodeId));
  130. }
  131. END_HANDLER
  132. START_HANDLER(Read)
  133. #pragma GCC diagnostic ignored "-Wunused-variable"
  134. UA_Int32 i = 0;
  135. r->resultsSize = p->nodesToReadSize;
  136. if (r->resultsSize > 0) {
  137. UA_Array_new((void**)&(r->results),r->resultsSize,UA_DATAVALUE);
  138. for (i=0;i < r->resultsSize; i++) {
  139. UA_NodeId_printf("ReadService - nodesToRead=", &(p->nodesToRead[i]->nodeId));
  140. //FIXME: search the object in the namespace
  141. if (p->nodesToRead[i]->nodeId.identifier.numeric == 2255) { // Server_NameSpaceArray alias namespace table
  142. r->results[i]->encodingMask = UA_DATAVALUE_ENCODINGMASK_VARIANT & UA_DATAVALUE_ENCODINGMASK_STATUSCODE;
  143. r->results[i]->status = UA_STATUSCODE_GOOD;
  144. r->results[i]->value.encodingMask = UA_INT32_NS0;
  145. r->results[i]->value.vt = &UA_[UA_INT32];
  146. r->results[i]->value.arrayLength = 1;
  147. UA_Array_new((void**)&(r->results[i]->value.data),1,UA_INT32);
  148. *(UA_Int32*) (r->results[i]->value.data[0]) = 1;
  149. } else {
  150. // FIXME: Status Codes
  151. // r->results[i]->statusCode = UA_STATUSCODE_BAD_NODEIDUNKNOWN;
  152. r->results[i]->status = -1;
  153. }
  154. }
  155. }
  156. END_HANDLER
  157. START_HANDLER(CreateSubscription)
  158. // FIXME: Subscription
  159. #pragma GCC diagnostic ignored "-Wunused-variable"
  160. END_HANDLER
  161. START_HANDLER(CreateMonitoredItems)
  162. UA_Int32 i;
  163. if (p->itemsToCreateSize > 0) {
  164. r->resultsSize = p->itemsToCreateSize;
  165. UA_Array_new((void**)&(r->results),r->resultsSize,UA_MONITOREDITEMCREATERESULT);
  166. for (i=0;p->itemsToCreateSize > 0 && i < p->itemsToCreateSize;i++) {
  167. UA_NodeId_printf("CreateMonitoredItems - itemToCreate=",&(p->itemsToCreate[i]->itemToMonitor.nodeId));
  168. //FIXME: search the object in the namespace
  169. if (p->itemsToCreate[i]->itemToMonitor.nodeId.identifier.numeric == 2253) { // server
  170. r->results[i]->statusCode = UA_STATUSCODE_GOOD;
  171. r->results[i]->monitoredItemId = 1024;
  172. } else {
  173. // r->results[i]->statusCode = UA_STATUSCODE_BAD_NODEIDUNKNOWN;
  174. r->results[i]->statusCode = -1;
  175. }
  176. }
  177. }
  178. END_HANDLER
  179. START_HANDLER(SetPublishingMode)
  180. // FIXME: SetPublishingMode
  181. #pragma GCC diagnostic ignored "-Wunused-variable"
  182. END_HANDLER
  183. START_HANDLER(Publish)
  184. // FIXME: Publish
  185. #pragma GCC diagnostic ignored "-Wunused-variable"
  186. UA_Int32 i;
  187. for (i = 0; p->subscriptionAcknowledgementsSize >0 && i < p->subscriptionAcknowledgementsSize; i++) {
  188. printf("UA_handlePublishRequest - subsAck[%d]={sequence=%d,is=%d}\n", i,
  189. p->subscriptionAcknowledgements[i]->sequenceNumber,
  190. p->subscriptionAcknowledgements[i]->subscriptionId);
  191. }
  192. END_HANDLER
  193. UA_Int32 UA_SL_handleCloseSecureChannelRequest(UA_SL_Channel *channel, void const * request, void* response) {
  194. UA_Int32 retval = UA_SUCCESS;
  195. // 62451 Part 6 Chapter 7.1.4 - The server does not send a CloseSecureChannel response
  196. channel->connectionState = connectionState_CLOSE;
  197. return retval;
  198. }
  199. START_HANDLER(OpenSecureChannel)
  200. if (p->clientProtocolVersion != channel->tlConnection->remoteConf.protocolVersion) {
  201. printf("SL_processMessage - error protocol version \n");
  202. //TODO ERROR_Bad_ProtocolVersionUnsupported
  203. }
  204. switch (p->requestType) {
  205. case UA_SECURITYTOKEN_ISSUE:
  206. if (channel->connectionState == connectionState_ESTABLISHED) {
  207. printf("SL_processMessage - multiple security token request");
  208. //TODO return ERROR
  209. retval = UA_ERROR;
  210. break;
  211. }
  212. printf("SL_processMessage - TODO: create new token for a new SecureChannel\n");
  213. // SL_createNewToken(connection);
  214. break;
  215. case UA_SECURITYTOKEN_RENEW:
  216. if (channel->connectionState == connectionState_CLOSED) {
  217. printf("SL_processMessage - renew token request received, but no secureChannel was established before");
  218. //TODO return ERROR
  219. retval = UA_ERROR;
  220. break;
  221. }
  222. printf("TODO: create new token for an existing SecureChannel\n");
  223. break;
  224. }
  225. switch (p->securityMode) {
  226. case UA_SECURITYMODE_INVALID:
  227. channel->remoteNonce.data = UA_NULL;
  228. channel->remoteNonce.length = -1;
  229. printf("SL_processMessage - client demands no security \n");
  230. break;
  231. case UA_SECURITYMODE_SIGN:
  232. printf("SL_processMessage - client demands signed \n");
  233. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  234. break;
  235. case UA_SECURITYMODE_SIGNANDENCRYPT:
  236. printf("SL_processMessage - client demands signed & encrypted \n");
  237. //TODO check if senderCertificate and ReceiverCertificateThumbprint are present
  238. break;
  239. }
  240. channel->connectionState = connectionState_ESTABLISHED;
  241. if (p->requestHeader.returnDiagnostics != 0) {
  242. printf("SL_openSecureChannel - diagnostics demanded by the client\n");
  243. printf("SL_openSecureChannel - retrieving diagnostics not implemented!\n");
  244. //TODO fill with demanded information part 4, 7.8 - Table 123
  245. r->responseHeader.serviceDiagnostics.encodingMask = 0;
  246. } else {
  247. r->responseHeader.serviceDiagnostics.encodingMask = 0;
  248. }
  249. r->serverProtocolVersion = channel->tlConnection->localConf.protocolVersion;
  250. r->securityToken.channelId = channel->securityToken.secureChannelId;
  251. r->securityToken.tokenId = channel->securityToken.tokenId;
  252. r->securityToken.revisedLifetime = channel->securityToken.revisedLifetime;
  253. UA_ByteString_copy(&(channel->localNonce), &(r->serverNonce));
  254. END_HANDLER
  255. typedef struct T_UA_SL_handleRequestTableEntry {
  256. UA_Int32 requestNodeId;
  257. UA_Int32 requestDataTypeId;
  258. UA_Int32 responseNodeId;
  259. UA_Int32 responseDataTypeId;
  260. UA_Int32 (*handleRequest)(UA_SL_Channel*,void const*,void*);
  261. } UA_SL_handleRequestTableEntry;
  262. UA_SL_handleRequestTableEntry hrt[] = {
  263. {452, UA_CLOSESECURECHANNELREQUEST, 0, 0 , UA_SL_handleCloseSecureChannelRequest},
  264. {446, UA_OPENSECURECHANNELREQUEST , 449, UA_OPENSECURECHANNELRESPONSE , UA_SL_handleOpenSecureChannelRequest},
  265. {428, UA_GETENDPOINTSREQUEST , 431, UA_GETENDPOINTSRESPONSE , UA_SL_handleGetEndpointsRequest},
  266. {461, UA_CREATESESSIONREQUEST , 464, UA_CREATESESSIONRESPONSE , UA_SL_handleCreateSessionRequest},
  267. {467, UA_ACTIVATESESSIONREQUEST , 470, UA_ACTIVATESESSIONRESPONSE , UA_SL_handleActivateSessionRequest},
  268. {473, UA_CLOSESESSIONREQUEST , 476, UA_CLOSESESSIONRESPONSE , UA_SL_handleCloseSessionRequest},
  269. {527, UA_BROWSEREQUEST , 530, UA_BROWSERESPONSE , UA_SL_handleBrowseRequest},
  270. {631, UA_READREQUEST , 634, UA_READRESPONSE , UA_SL_handleReadRequest},
  271. {787, UA_CREATESUBSCRIPTIONREQUEST, 790, UA_CREATESUBSCRIPTIONRESPONSE, UA_SL_handleCreateSubscriptionRequest},
  272. {751, UA_CREATEMONITOREDITEMSREQUEST,754,UA_CREATEMONITOREDITEMSRESPONSE, UA_SL_handleCreateMonitoredItemsRequest},
  273. {799, UA_SETPUBLISHINGMODEREQUEST , 802, UA_SETPUBLISHINGMODERESPONSE , UA_SL_handleSetPublishingModeRequest},
  274. {826, UA_PUBLISHREQUEST , 829, UA_PUBLISHRESPONSE , UA_SL_handlePublishRequest}
  275. };
  276. UA_SL_handleRequestTableEntry* getHRTEntry(UA_Int32 methodNodeId) {
  277. UA_UInt32 i = 0;
  278. for (i=0;i< sizeof(hrt)/sizeof(UA_SL_handleRequestTableEntry);i++) {
  279. if (methodNodeId == hrt[i].requestNodeId) {
  280. return &hrt[i];
  281. }
  282. }
  283. return UA_NULL;
  284. }
  285. UA_Int32 UA_ResponseHeader_initFromRequest(UA_RequestHeader const * p, UA_ResponseHeader * r) {
  286. r->requestHandle = p->requestHandle;
  287. r->serviceResult = UA_STATUSCODE_GOOD;
  288. r->stringTableSize = 0;
  289. r->timestamp = UA_DateTime_now();
  290. return UA_SUCCESS;
  291. }
  292. /** this function manages all the generic stuff for the request-response game */
  293. UA_Int32 UA_SL_handleRequest(UA_SL_Channel *channel, UA_ByteString* msg) {
  294. UA_Int32 retval = UA_SUCCESS;
  295. UA_Int32 pos = 0;
  296. // Every Message starts with a NodeID which names the serviceRequestType
  297. UA_NodeId serviceRequestType;
  298. UA_NodeId_decodeBinary(msg, &pos, &serviceRequestType);
  299. UA_NodeId_printf("SL_processMessage - serviceRequestType=", &serviceRequestType);
  300. UA_SL_handleRequestTableEntry* hrte = getHRTEntry(serviceRequestType.identifier.numeric);
  301. if (hrte == UA_NULL) {
  302. printf("SL_processMessage - unknown request, namespace=%d, request=%d\n",
  303. serviceRequestType.namespace,serviceRequestType.identifier.numeric);
  304. retval = UA_ERROR;
  305. } else {
  306. void * requestObj = UA_NULL;
  307. void * responseObj = UA_NULL;
  308. UA_[hrte->requestDataTypeId].new(&requestObj);
  309. UA_[hrte->requestDataTypeId].decodeBinary(msg, &pos, requestObj);
  310. if (hrte->responseDataTypeId > 0) {
  311. UA_[hrte->responseDataTypeId].new(&responseObj);
  312. UA_ResponseHeader_initFromRequest((UA_RequestHeader*)requestObj, (UA_ResponseHeader*)responseObj);
  313. }
  314. if ((retval = hrte->handleRequest(channel, requestObj, responseObj)) == UA_SUCCESS) {
  315. if (hrte->responseDataTypeId > 0) {
  316. UA_NodeId responseType;
  317. responseType.encodingByte = UA_NODEIDTYPE_FOURBYTE;
  318. responseType.namespace = 0;
  319. responseType.identifier.numeric = hrte->responseNodeId;
  320. UA_ByteString response;
  321. UA_ByteString_newMembers(&response, UA_NodeId_calcSize(&responseType) + UA_[hrte->responseDataTypeId].calcSize(responseObj));
  322. UA_Int32 pos = 0;
  323. UA_NodeId_encodeBinary(&responseType, &pos, &response);
  324. UA_[hrte->responseDataTypeId].encodeBinary(responseObj, &pos, &response);
  325. SL_send(channel, &response, responseType.identifier.numeric);
  326. UA_NodeId_deleteMembers(&responseType);
  327. UA_ByteString_deleteMembers(&response);
  328. }
  329. } else {
  330. // FIXME: send error message
  331. }
  332. // finally
  333. retval |= UA_[hrte->requestDataTypeId].delete(requestObj);
  334. if (hrte->responseDataTypeId > 0) {
  335. UA_[hrte->responseDataTypeId].delete(responseObj);
  336. }
  337. }
  338. return retval;
  339. }
  340. // FIXME: we need to associate secure channels with the connection
  341. UA_SL_Channel slc;
  342. /* inits a connection object for secure channel layer */
  343. UA_Int32 UA_SL_Channel_init(UA_SL_Channel *channel) {
  344. UA_AsymmetricAlgorithmSecurityHeader_init(
  345. &(channel->localAsymAlgSettings));
  346. UA_ByteString_copy(&UA_ByteString_securityPoliceNone,
  347. &(channel->localAsymAlgSettings.securityPolicyUri));
  348. UA_alloc((void**)&(channel->localNonce.data),
  349. sizeof(UA_Byte));
  350. channel->localNonce.length = 1;
  351. channel->connectionState = connectionState_CLOSED;
  352. channel->sequenceHeader.requestId = 0;
  353. channel->sequenceHeader.sequenceNumber = 1;
  354. UA_String_init(&(channel->secureChannelId));
  355. channel->securityMode = UA_SECURITYMODE_INVALID;
  356. //TODO set a valid start secureChannelId number
  357. channel->securityToken.secureChannelId = 25;
  358. //TODO set a valid start TokenId
  359. channel->securityToken.tokenId = 1;
  360. return UA_SUCCESS;
  361. }
  362. UA_Int32 UA_SL_Channel_new(UA_TL_connection *connection, UA_ByteString* msg, UA_Int32* pos) {
  363. UA_Int32 retval = UA_SUCCESS;
  364. UA_SecureConversationMessageHeader secureConvHeader;
  365. DBG_VERBOSE(printf("UA_SL_Channel_new - entered\n"));
  366. // FIXME: generate new secure channel
  367. UA_SL_Channel_init(&slc);
  368. connection->secureChannel = &slc;
  369. connection->secureChannel->tlConnection = connection;
  370. UA_SecureConversationMessageHeader_decodeBinary(msg, pos, &secureConvHeader);
  371. // connection->secureChannel->secureChannelId = secureConvHeader.secureChannelId;
  372. UA_AsymmetricAlgorithmSecurityHeader_decodeBinary(msg, pos, &(connection->secureChannel->remoteAsymAlgSettings));
  373. //TODO check that the sequence number is smaller than MaxUInt32 - 1024
  374. UA_SequenceHeader_decodeBinary(msg, pos, &(connection->secureChannel->sequenceHeader));
  375. connection->secureChannel->securityToken.tokenId = 4711;
  376. UA_ByteString_printf("SL_receive - AAS_Header.ReceiverThumbprint=",
  377. &(connection->secureChannel->remoteAsymAlgSettings.receiverCertificateThumbprint));
  378. UA_ByteString_printf("SL_receive - AAS_Header.SecurityPolicyUri=",
  379. &(connection->secureChannel->remoteAsymAlgSettings.securityPolicyUri));
  380. UA_ByteString_printf("SL_receive - AAS_Header.SenderCertificate=",
  381. &(connection->secureChannel->remoteAsymAlgSettings.senderCertificate));
  382. printf("UA_SL_Channel_new - SequenceHeader.RequestId=%d\n",connection->secureChannel->sequenceHeader.requestId);
  383. printf("UA_SL_Channel_new - SequenceHeader.SequenceNr=%d\n",connection->secureChannel->sequenceHeader.sequenceNumber);
  384. printf("UA_SL_Channel_new - SecurityToken.tokenID=%d\n",connection->secureChannel->securityToken.tokenId);
  385. // FIXME: reject
  386. // if (secureConvHeader.secureChannelId != 0) {
  387. // UA_Int32 iTmp = UA_ByteString_compare(
  388. // &(connection->secureLayer.remoteAsymAlgSettings.senderCertificate),
  389. // &(asymAlgSecHeader.senderCertificate));
  390. // if (iTmp != UA_EQUAL) {
  391. // printf("SL_receive - UA_ERROR_BadSecureChannelUnknown \n");
  392. // //TODO return UA_ERROR_BadSecureChannelUnknown
  393. // }
  394. // } else {
  395. // //TODO invalid securechannelId
  396. // }
  397. UA_ByteString slMessage;
  398. slMessage.data = &(msg->data[*pos]);
  399. slMessage.length = msg->length - *pos;
  400. retval |= UA_SL_handleRequest(connection->secureChannel, &slMessage);
  401. return retval;
  402. }
  403. /**
  404. * process the rest of the header. TL already processed
  405. * MessageType (OPN,MSG,...), isFinal and MessageSize.
  406. * UA_SL_process cares for secureChannelId, XASHeader and sequenceHeader
  407. *
  408. * */
  409. UA_Int32 UA_SL_process(UA_SL_Channel* connection, UA_ByteString* msg, UA_Int32* pos) {
  410. DBG_VERBOSE(printf("UA_SL_process - entered \n"));
  411. UA_UInt32 secureChannelId;
  412. if (connection->connectionState == connectionState_ESTABLISHED) {
  413. UA_UInt32_decodeBinary(msg,pos,&secureChannelId);
  414. //FIXME: we assume SAS, need to check if AAS or SAS
  415. UA_SymmetricAlgorithmSecurityHeader symAlgSecHeader;
  416. // if (connection->securityMode == UA_MESSAGESECURITYMODE_NONE) {
  417. UA_SymmetricAlgorithmSecurityHeader_decodeBinary(msg, pos, &symAlgSecHeader);
  418. // } else {
  419. // // FIXME:
  420. // }
  421. printf("UA_SL_process - securityToken received=%d, expected=%d\n",secureChannelId,connection->securityToken.secureChannelId);
  422. if (secureChannelId == connection->securityToken.secureChannelId) {
  423. UA_SequenceHeader_decodeBinary(msg, pos, &(connection->sequenceHeader));
  424. // process message
  425. UA_ByteString slMessage;
  426. slMessage.data = &(msg->data[*pos]);
  427. slMessage.length = msg->length - *pos;
  428. UA_SL_handleRequest(&slc, &slMessage);
  429. } else {
  430. //TODO generate ERROR_Bad_SecureChannelUnkown
  431. }
  432. }
  433. return UA_SUCCESS;
  434. }