ua_services_session.c 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
  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. *
  5. * Copyright 2014-2018 (c) Julius Pfrommer, Fraunhofer IOSB
  6. * Copyright 2014, 2017 (c) Florian Palm
  7. * Copyright 2014-2016 (c) Sten Grüner
  8. * Copyright 2015 (c) Chris Iatrou
  9. * Copyright 2015 (c) Oleksiy Vasylyev
  10. * Copyright 2017 (c) Stefan Profanter, fortiss GmbH
  11. * Copyright 2017 (c) Mark Giraud, Fraunhofer IOSB
  12. */
  13. #include "ua_services.h"
  14. #include "ua_server_internal.h"
  15. #include "ua_session_manager.h"
  16. #include "ua_types_generated_handling.h"
  17. /* Create a signed nonce */
  18. static UA_StatusCode
  19. nonceAndSignCreateSessionResponse(UA_Server *server, UA_SecureChannel *channel,
  20. UA_Session *session,
  21. const UA_CreateSessionRequest *request,
  22. UA_CreateSessionResponse *response) {
  23. if(channel->securityMode != UA_MESSAGESECURITYMODE_SIGN &&
  24. channel->securityMode != UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)
  25. return UA_STATUSCODE_GOOD;
  26. const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
  27. UA_SignatureData *signatureData = &response->serverSignature;
  28. const UA_NodeId *authenticationToken = &session->header.authenticationToken;
  29. /* Generate Nonce
  30. * FIXME: remove magic number??? */
  31. UA_StatusCode retval = UA_SecureChannel_generateNonce(channel, 32, &response->serverNonce);
  32. UA_ByteString_deleteMembers(&session->serverNonce);
  33. retval |= UA_ByteString_copy(&response->serverNonce, &session->serverNonce);
  34. if(retval != UA_STATUSCODE_GOOD) {
  35. UA_SessionManager_removeSession(&server->sessionManager, authenticationToken);
  36. return retval;
  37. }
  38. size_t signatureSize = securityPolicy->asymmetricModule.cryptoModule.
  39. getLocalSignatureSize(securityPolicy, channel->channelContext);
  40. retval |= UA_ByteString_allocBuffer(&signatureData->signature, signatureSize);
  41. if(retval != UA_STATUSCODE_GOOD) {
  42. UA_SessionManager_removeSession(&server->sessionManager, authenticationToken);
  43. return retval;
  44. }
  45. UA_ByteString dataToSign;
  46. retval |= UA_ByteString_allocBuffer(&dataToSign,
  47. request->clientCertificate.length +
  48. request->clientNonce.length);
  49. if(retval != UA_STATUSCODE_GOOD) {
  50. UA_SignatureData_deleteMembers(signatureData);
  51. UA_SessionManager_removeSession(&server->sessionManager, authenticationToken);
  52. return retval;
  53. }
  54. memcpy(dataToSign.data, request->clientCertificate.data, request->clientCertificate.length);
  55. memcpy(dataToSign.data + request->clientCertificate.length,
  56. request->clientNonce.data, request->clientNonce.length);
  57. retval |= UA_String_copy(&securityPolicy->asymmetricModule.cryptoModule.
  58. signatureAlgorithmUri, &signatureData->algorithm);
  59. retval |= securityPolicy->asymmetricModule.cryptoModule.
  60. sign(securityPolicy, channel->channelContext, &dataToSign, &signatureData->signature);
  61. UA_ByteString_deleteMembers(&dataToSign);
  62. if(retval != UA_STATUSCODE_GOOD) {
  63. UA_SignatureData_deleteMembers(signatureData);
  64. UA_SessionManager_removeSession(&server->sessionManager, authenticationToken);
  65. }
  66. return retval;
  67. }
  68. void Service_CreateSession(UA_Server *server, UA_SecureChannel *channel,
  69. const UA_CreateSessionRequest *request,
  70. UA_CreateSessionResponse *response) {
  71. if(channel == NULL) {
  72. response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
  73. return;
  74. }
  75. if(channel->connection == NULL) {
  76. response->responseHeader.serviceResult = UA_STATUSCODE_BADINTERNALERROR;
  77. return;
  78. }
  79. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel, "Trying to create session");
  80. if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
  81. channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
  82. if(!UA_ByteString_equal(&request->clientCertificate,
  83. &channel->remoteCertificate)) {
  84. response->responseHeader.serviceResult = UA_STATUSCODE_BADCERTIFICATEINVALID;
  85. return;
  86. }
  87. }
  88. if(channel->securityToken.channelId == 0) {
  89. response->responseHeader.serviceResult =
  90. UA_STATUSCODE_BADSECURECHANNELIDINVALID;
  91. return;
  92. }
  93. if(!UA_ByteString_equal(&channel->securityPolicy->policyUri,
  94. &UA_SECURITY_POLICY_NONE_URI) &&
  95. request->clientNonce.length < 32) {
  96. response->responseHeader.serviceResult = UA_STATUSCODE_BADNONCEINVALID;
  97. return;
  98. }
  99. ////////////////////// TODO: Compare application URI with certificate uri (decode certificate)
  100. /* Allocate the response */
  101. response->serverEndpoints = (UA_EndpointDescription*)
  102. UA_Array_new(server->config.endpointsSize,
  103. &UA_TYPES[UA_TYPES_ENDPOINTDESCRIPTION]);
  104. if(!response->serverEndpoints) {
  105. response->responseHeader.serviceResult = UA_STATUSCODE_BADOUTOFMEMORY;
  106. return;
  107. }
  108. response->serverEndpointsSize = server->config.endpointsSize;
  109. /* Copy the server's endpointdescriptions into the response */
  110. for(size_t i = 0; i < server->config.endpointsSize; ++i)
  111. response->responseHeader.serviceResult |=
  112. UA_EndpointDescription_copy(&server->config.endpoints[i].endpointDescription,
  113. &response->serverEndpoints[i]);
  114. if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD)
  115. return;
  116. /* Mirror back the endpointUrl */
  117. for(size_t i = 0; i < response->serverEndpointsSize; ++i) {
  118. UA_String_deleteMembers(&response->serverEndpoints[i].endpointUrl);
  119. UA_String_copy(&request->endpointUrl,
  120. &response->serverEndpoints[i].endpointUrl);
  121. }
  122. UA_Session *newSession;
  123. response->responseHeader.serviceResult =
  124. UA_SessionManager_createSession(&server->sessionManager,
  125. channel, request, &newSession);
  126. if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
  127. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel,
  128. "Processing CreateSessionRequest failed");
  129. return;
  130. }
  131. /* Fill the session with more information */
  132. newSession->maxResponseMessageSize = request->maxResponseMessageSize;
  133. newSession->maxRequestMessageSize =
  134. channel->connection->localConf.maxMessageSize;
  135. response->responseHeader.serviceResult |=
  136. UA_ApplicationDescription_copy(&request->clientDescription,
  137. &newSession->clientDescription);
  138. /* Prepare the response */
  139. response->sessionId = newSession->sessionId;
  140. response->revisedSessionTimeout = (UA_Double)newSession->timeout;
  141. response->authenticationToken = newSession->header.authenticationToken;
  142. response->responseHeader.serviceResult =
  143. UA_String_copy(&request->sessionName, &newSession->sessionName);
  144. if(server->config.endpointsSize > 0)
  145. response->responseHeader.serviceResult |=
  146. UA_ByteString_copy(&channel->securityPolicy->localCertificate,
  147. &response->serverCertificate);
  148. /* Create a signed nonce */
  149. response->responseHeader.serviceResult =
  150. nonceAndSignCreateSessionResponse(server, channel, newSession, request, response);
  151. /* Failure -> remove the session */
  152. if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD) {
  153. UA_SessionManager_removeSession(&server->sessionManager,
  154. &newSession->header.authenticationToken);
  155. return;
  156. }
  157. UA_LOG_DEBUG_CHANNEL(server->config.logger, channel,
  158. "Session " UA_PRINTF_GUID_FORMAT " created",
  159. UA_PRINTF_GUID_DATA(newSession->sessionId.identifier.guid));
  160. }
  161. static void
  162. checkSignature(const UA_Server *server,
  163. const UA_SecureChannel *channel,
  164. UA_Session *session,
  165. const UA_ActivateSessionRequest *request,
  166. UA_ActivateSessionResponse *response) {
  167. if(channel->securityMode == UA_MESSAGESECURITYMODE_SIGN ||
  168. channel->securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
  169. const UA_SecurityPolicy *const securityPolicy = channel->securityPolicy;
  170. const UA_ByteString *const localCertificate = &securityPolicy->localCertificate;
  171. UA_ByteString dataToVerify;
  172. UA_StatusCode retval = UA_ByteString_allocBuffer(&dataToVerify,
  173. localCertificate->length + session->serverNonce.length);
  174. if(retval != UA_STATUSCODE_GOOD) {
  175. response->responseHeader.serviceResult = retval;
  176. UA_LOG_DEBUG_SESSION(server->config.logger, session,
  177. "Failed to allocate buffer for signature verification! %#10x", retval);
  178. return;
  179. }
  180. memcpy(dataToVerify.data, localCertificate->data, localCertificate->length);
  181. memcpy(dataToVerify.data + localCertificate->length,
  182. session->serverNonce.data, session->serverNonce.length);
  183. retval = securityPolicy->asymmetricModule.cryptoModule.
  184. verify(securityPolicy, channel->channelContext, &dataToVerify,
  185. &request->clientSignature.signature);
  186. if(retval != UA_STATUSCODE_GOOD) {
  187. response->responseHeader.serviceResult = retval;
  188. UA_LOG_DEBUG_SESSION(server->config.logger, session,
  189. "Failed to verify the client signature! %#10x", retval);
  190. UA_ByteString_deleteMembers(&dataToVerify);
  191. return;
  192. }
  193. retval = UA_SecureChannel_generateNonce(channel, 32, &response->serverNonce);
  194. UA_ByteString_deleteMembers(&session->serverNonce);
  195. retval |= UA_ByteString_copy(&response->serverNonce, &session->serverNonce);
  196. if(retval != UA_STATUSCODE_GOOD) {
  197. response->responseHeader.serviceResult = retval;
  198. UA_LOG_DEBUG_SESSION(server->config.logger, session,
  199. "Failed to generate a new nonce! %#10x", retval);
  200. UA_ByteString_deleteMembers(&dataToVerify);
  201. return;
  202. }
  203. UA_ByteString_deleteMembers(&dataToVerify);
  204. }
  205. }
  206. void
  207. Service_ActivateSession(UA_Server *server, UA_SecureChannel *channel,
  208. UA_Session *session, const UA_ActivateSessionRequest *request,
  209. UA_ActivateSessionResponse *response) {
  210. if(session->validTill < UA_DateTime_nowMonotonic()) {
  211. UA_LOG_INFO_SESSION(server->config.logger, session,
  212. "ActivateSession: SecureChannel %i wants "
  213. "to activate, but the session has timed out",
  214. channel->securityToken.channelId);
  215. response->responseHeader.serviceResult =
  216. UA_STATUSCODE_BADSESSIONIDINVALID;
  217. return;
  218. }
  219. checkSignature(server, channel, session, request, response);
  220. if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD)
  221. return;
  222. /* Callback into userland access control */
  223. response->responseHeader.serviceResult =
  224. server->config.accessControl.activateSession(&session->sessionId,
  225. &request->userIdentityToken,
  226. &session->sessionHandle);
  227. if(response->responseHeader.serviceResult != UA_STATUSCODE_GOOD)
  228. return;
  229. /* Detach the old SecureChannel */
  230. if(session->header.channel && session->header.channel != channel) {
  231. UA_LOG_INFO_SESSION(server->config.logger, session,
  232. "ActivateSession: Detach from old channel");
  233. UA_Session_detachFromSecureChannel(session);
  234. session->activated = false;
  235. }
  236. if (session->activated) {
  237. UA_LOG_INFO_SESSION(server->config.logger, session,
  238. "ActivateSession: SecureChannel %i wants "
  239. "to activate, but the session is already activated",
  240. channel->securityToken.channelId);
  241. response->responseHeader.serviceResult =
  242. UA_STATUSCODE_BADSESSIONIDINVALID;
  243. return;
  244. }
  245. /* Attach to the SecureChannel and activate */
  246. UA_Session_attachToSecureChannel(session, channel);
  247. session->activated = true;
  248. UA_Session_updateLifetime(session);
  249. UA_LOG_INFO_SESSION(server->config.logger, session,
  250. "ActivateSession: Session activated");
  251. }
  252. void
  253. Service_CloseSession(UA_Server *server, UA_Session *session,
  254. const UA_CloseSessionRequest *request,
  255. UA_CloseSessionResponse *response) {
  256. UA_LOG_INFO_SESSION(server->config.logger, session, "CloseSession");
  257. /* Callback into userland access control */
  258. server->config.accessControl.closeSession(&session->sessionId,
  259. session->sessionHandle);
  260. response->responseHeader.serviceResult =
  261. UA_SessionManager_removeSession(&server->sessionManager,
  262. &session->header.authenticationToken);
  263. }