Browse Source

getting back to the old interface of UA_Guid_random(*seed)

old interface hides pcg32 functionality and preserves amalgation
However, now a new RNG is generated with every call of UA_Guid_random()
Markus Graube 9 years ago
parent
commit
3114492366

+ 1 - 1
include/ua_types.h

@@ -361,7 +361,7 @@ void UA_EXPORT UA_Guid_delete(UA_Guid *p);
 static UA_INLINE void UA_Guid_deleteMembers(UA_Guid *p) { }
 static UA_INLINE UA_StatusCode UA_Guid_copy(const UA_Guid *src, UA_Guid *dst) { *dst = *src; return UA_STATUSCODE_GOOD; }
 UA_Boolean UA_EXPORT UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2);
-UA_Guid UA_EXPORT UA_Guid_random(pcg32_random_t* rngptr); ///> Do not use for security-critical entropy!
+UA_Guid UA_EXPORT UA_Guid_random(UA_UInt32 *seed); ///> Do not use for security-critical entropy!
 
 /* ByteString */
 static UA_INLINE UA_ByteString * UA_ByteString_new(void) { return UA_String_new(); }

+ 2 - 2
src/server/ua_server.c

@@ -338,8 +338,8 @@ UA_Server * UA_Server_new(UA_ServerConfig config) {
     // logger
     server->logger = UA_NULL;
 
-    // initialize random number generator
-    pcg32_srandom_r(&server->rng, (UA_UInt64)&server, (UA_UInt64) UA_DateTime_now());
+    // random seed
+    server->random_seed = (UA_UInt32)UA_DateTime_now();
 
     // networklayers
     server->networkLayers = UA_NULL;

+ 1 - 1
src/server/ua_server_internal.h

@@ -27,7 +27,7 @@ struct UA_Server {
     /* Config */
     UA_ServerConfig config;
     UA_Logger logger;
-    pcg32_random_t rng;  // random number generator from pcg32
+    UA_UInt32 random_seed;
 
     /* Meta */
     UA_DateTime startTime;

+ 2 - 2
src/server/ua_server_worker.c

@@ -282,7 +282,7 @@ UA_StatusCode UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32
     arw->interval = interval;
     arw->job.job = job;
     if(jobId) {
-        arw->job.id = UA_Guid_random(&server->rng);
+        arw->job.id = UA_Guid_random(&server->random_seed);
         *jobId = arw->job.id;
     } else
         UA_Guid_init(&arw->job.id);
@@ -301,7 +301,7 @@ UA_StatusCode UA_Server_addRepeatedJob(UA_Server *server, UA_Job job, UA_UInt32
     arw.interval = interval;
     arw.job.job = job;
     if(jobId) {
-        arw.job.id = UA_Guid_random(&server->rng);
+        arw.job.id = UA_Guid_random(&server->random_seed);
         *jobId = arw.job.id;
     } else
         UA_Guid_init(&arw.job.id);

+ 2 - 3
src/server/ua_services_view.c

@@ -378,9 +378,8 @@ static void browse(UA_Server *server, UA_Session *session, UA_NodeStore *ns, str
         cp->maxReferences = maxrefs;
         cp->continuationIndex = referencesCount;
         UA_Guid *ident = UA_Guid_new();
-        pcg32_random_t rng;
-        pcg32_srandom_r(&rng, (uintptr_t)cp, UA_DateTime_now());
-        *ident = UA_Guid_random(&rng);
+        UA_UInt32 seed = (uintptr_t)cp;
+        *ident = UA_Guid_random(&seed);
         cp->identifier.data = (UA_Byte*)ident;
         cp->identifier.length = sizeof(UA_Guid);
         UA_ByteString_copy(&cp->identifier, &result->continuationPoint);

+ 2 - 3
src/server/ua_session_manager.c

@@ -61,9 +61,8 @@ UA_StatusCode UA_SessionManager_createSession(UA_SessionManager *sessionManager,
     sessionManager->currentSessionCount++;
     UA_Session_init(&newentry->session);
     newentry->session.sessionId = UA_NODEID_NUMERIC(1, sessionManager->lastSessionId++);
-    pcg32_random_t rng;
-    pcg32_srandom_r(&rng, sessionManager->lastSessionId, UA_DateTime_now());
-    newentry->session.authenticationToken = UA_NODEID_GUID(1, UA_Guid_random(&rng));
+    UA_UInt32 randSeed = (UA_UInt32)(sessionManager->lastSessionId + UA_DateTime_now());
+    newentry->session.authenticationToken = UA_NODEID_GUID(1, UA_Guid_random(&randSeed));
     if(request->requestedSessionTimeout <= sessionManager->maxSessionLifeTime &&
        request->requestedSessionTimeout > 0)
         newentry->session.timeout = request->requestedSessionTimeout;

+ 7 - 5
src/ua_types.c

@@ -225,18 +225,20 @@ UA_Boolean UA_Guid_equal(const UA_Guid *g1, const UA_Guid *g2) {
     return UA_FALSE;
 }
 
-UA_Guid UA_Guid_random(pcg32_random_t* rngptr) {
+UA_Guid UA_Guid_random(UA_UInt32 *seed) {
+    pcg32_random_t rng;
+    pcg32_srandom_r(&rng, *seed, UA_DateTime_now());
     UA_Guid result;
-    result.data1 = (UA_UInt32)pcg32_random_r(rngptr);
-    UA_UInt32 r = (UA_UInt32)pcg32_random_r(rngptr);
+    result.data1 = (UA_UInt32)pcg32_random_r(&rng);
+    UA_UInt32 r = (UA_UInt32)pcg32_random_r(&rng);
     result.data2 = (UA_UInt16) r;
     result.data3 = (UA_UInt16) (r >> 16);
-    r = (UA_UInt32)pcg32_random_r(rngptr);
+    r = (UA_UInt32)pcg32_random_r(&rng);
     result.data4[0] = (UA_Byte)r;
     result.data4[1] = (UA_Byte)(r >> 4);
     result.data4[2] = (UA_Byte)(r >> 8);
     result.data4[3] = (UA_Byte)(r >> 12);
-    r = (UA_UInt32)pcg32_random_r(rngptr);
+    r = (UA_UInt32)pcg32_random_r(&rng);
     result.data4[4] = (UA_Byte)r;
     result.data4[5] = (UA_Byte)(r >> 4);
     result.data4[6] = (UA_Byte)(r >> 8);