瀏覽代碼

Client: Use new nonce from CreateSessionResponse

Julius Pfrommer 6 年之前
父節點
當前提交
2b4c01f71f
共有 1 個文件被更改,包括 23 次插入15 次删除
  1. 23 15
      src/client/ua_client_connect.c

+ 23 - 15
src/client/ua_client_connect.c

@@ -705,26 +705,34 @@ createSession(UA_Client *client) {
     __UA_Client_Service(client, &request, &UA_TYPES[UA_TYPES_CREATESESSIONREQUEST],
                         &response, &UA_TYPES[UA_TYPES_CREATESESSIONRESPONSE]);
 
-    if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD &&
-        (client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
-         client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT)) {
-        UA_ByteString_deleteMembers(&client->channel.remoteNonce);
-        UA_ByteString_copy(&response.serverNonce, &client->channel.remoteNonce);
-
-        if(!UA_ByteString_equal(&response.serverCertificate,
-                                &client->channel.remoteCertificate)) {
-            return UA_STATUSCODE_BADCERTIFICATEINVALID;
+    if(response.responseHeader.serviceResult == UA_STATUSCODE_GOOD) {
+        /* Verify the encrypted response */
+        if(client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGN ||
+           client->channel.securityMode == UA_MESSAGESECURITYMODE_SIGNANDENCRYPT) {
+
+            if(!UA_ByteString_equal(&response.serverCertificate,
+                                    &client->channel.remoteCertificate)) {
+                retval = UA_STATUSCODE_BADCERTIFICATEINVALID;
+                goto cleanup;
+            }
+
+            /* Verify the client signature */
+            retval = checkClientSignature(&client->channel, &response);
+            if(retval != UA_STATUSCODE_GOOD)
+                goto cleanup;
         }
 
-        /* Verify the client signature */
-        retval = checkClientSignature(&client->channel, &response);
-        if(retval != UA_STATUSCODE_GOOD)
-            return retval;
+        /* Copy nonce and and authenticationtoken */
+        UA_ByteString_deleteMembers(&client->channel.remoteNonce);
+        retval |= UA_ByteString_copy(&response.serverNonce, &client->channel.remoteNonce);
+
+        UA_NodeId_deleteMembers(&client->authenticationToken);
+        retval |= UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken);
     }
 
-    UA_NodeId_copy(&response.authenticationToken, &client->authenticationToken);
+    retval |= response.responseHeader.serviceResult;
 
-    retval = response.responseHeader.serviceResult;
+ cleanup:
     UA_CreateSessionRequest_deleteMembers(&request);
     UA_CreateSessionResponse_deleteMembers(&response);
     return retval;