Browse Source

create clientNonce on each SecureChannel renew (#3084)

client is disconnected by server on second renew SecureChannel #3024
OPC Unified Architecture, Part 4 (Table 7 defines the parameters for the Service)
clientNonce:
A random number that shall not be used in any other request. A new clientNonce shall be generated for each time a SecureChannel is renewed.
HuberHans 4 years ago
parent
commit
040671530c
1 changed files with 10 additions and 9 deletions
  1. 10 9
      src/client/ua_client_connect.c

+ 10 - 9
src/client/ua_client_connect.c

@@ -200,6 +200,14 @@ openSecureChannel(UA_Client *client, UA_Boolean renew) {
     if(conn->state != UA_CONNECTION_ESTABLISHED)
         return UA_STATUSCODE_BADSERVERNOTCONNECTED;
 
+    /* Generate clientNonce. */
+    UA_StatusCode retval = UA_SecureChannel_generateLocalNonce(&client->channel);
+    if(retval != UA_STATUSCODE_GOOD) {
+      UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
+        "Generating a local nonce failed");
+      return retval;
+    }
+
     /* Prepare the OpenSecureChannelRequest */
     UA_OpenSecureChannelRequest opnSecRq;
     UA_OpenSecureChannelRequest_init(&opnSecRq);
@@ -223,9 +231,8 @@ openSecureChannel(UA_Client *client, UA_Boolean renew) {
 
     /* Send the OPN message */
     UA_UInt32 requestId = ++client->requestId;
-    UA_StatusCode retval =
-        UA_SecureChannel_sendAsymmetricOPNMessage(&client->channel, requestId, &opnSecRq,
-                                                  &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]);
+    retval = UA_SecureChannel_sendAsymmetricOPNMessage(&client->channel, requestId, &opnSecRq,
+                                                       &UA_TYPES[UA_TYPES_OPENSECURECHANNELREQUEST]);
     if(retval != UA_STATUSCODE_GOOD) {
         UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_SECURECHANNEL,
                      "Sending OPN message failed with error %s", UA_StatusCode_name(retval));
@@ -847,12 +854,6 @@ UA_Client_connectTCPSecureChannel(UA_Client *client, const UA_String endpointUrl
     setClientState(client, UA_CLIENTSTATE_CONNECTED);
 
     /* Open a SecureChannel. */
-    retval = UA_SecureChannel_generateLocalNonce(&client->channel);
-    if(retval != UA_STATUSCODE_GOOD) {
-        UA_LOG_ERROR(&client->config.logger, UA_LOGCATEGORY_CLIENT,
-                     "Generating a local nonce failed");
-        goto cleanup;
-    }
     client->channel.connection = &client->connection;
     retval = openSecureChannel(client, false);
     if(retval != UA_STATUSCODE_GOOD) {