Coverage Report

Created: 2025-07-11 06:29

/src/S2OPC/src/Common/sks/sopc_sk_manager.c
Line
Count
Source (jump to first uncovered line)
1
/*
2
 * Licensed to Systerel under one or more contributor license
3
 * agreements. See the NOTICE file distributed with this work
4
 * for additional information regarding copyright ownership.
5
 * Systerel licenses this file to you under the Apache
6
 * License, Version 2.0 (the "License"); you may not use this
7
 * file except in compliance with the License. You may obtain
8
 * a copy of the License at
9
 *
10
 *   http://www.apache.org/licenses/LICENSE-2.0
11
 *
12
 * Unless required by applicable law or agreed to in writing,
13
 * software distributed under the License is distributed on an
14
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15
 * KIND, either express or implied.  See the License for the
16
 * specific language governing permissions and limitations
17
 * under the License.
18
 */
19
20
#include <stdio.h>
21
#include <string.h>
22
23
#include "sopc_array.h"
24
#include "sopc_assert.h"
25
#include "sopc_helper_string.h"
26
#include "sopc_mem_alloc.h"
27
#include "sopc_mutexes.h"
28
#include "sopc_sk_manager.h"
29
#include "sopc_time_reference.h"
30
31
/*** DEFAULT IMPLEMENTATION FUNCTIONS ***/
32
33
typedef struct SOPC_SKManager_DefaultData
34
{
35
    SOPC_Mutex mutex;
36
    /* Current token id. To be update in getter
37
       This 3 values are linked and should be changed together.
38
    */
39
    uint32_t CurrentTokenId;
40
    SOPC_TimeReference CurrentTokenTime; /* Time when current token was set */
41
    uint32_t CurrentTokenRemainingTime;  /* remaining time for current token */
42
43
    SOPC_Array* Keys; // array of SOPC_ByteString
44
45
    SOPC_String* SecurityPolicyUri;
46
    uint32_t FirstTokenId;
47
48
    uint32_t TimeToNextKey;
49
    uint32_t KeyLifetime;
50
51
} SOPC_SKManager_DefaultData;
52
53
static uint32_t SOPC_SKManager_Size_Default(SOPC_SKManager* skm)
54
0
{
55
0
    if (NULL == skm || NULL == skm->data)
56
0
    {
57
0
        return 0;
58
0
    }
59
60
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
61
0
    SOPC_Mutex_Lock(&data->mutex);
62
63
0
    if (NULL == data->Keys)
64
0
    {
65
0
        SOPC_Mutex_Unlock(&data->mutex);
66
0
        return 0;
67
0
    }
68
69
0
    size_t size = SOPC_Array_Size(data->Keys);
70
71
0
    SOPC_Mutex_Unlock(&data->mutex);
72
73
0
    SOPC_ASSERT(size <= UINT32_MAX); /* TODO check when add keys */
74
0
    return (uint32_t) size;
75
0
}
76
77
static SOPC_ReturnStatus SOPC_SKManager_SetSecurityPolicyUri_Default(SOPC_SKManager* skm,
78
                                                                     SOPC_String* SecurityPolicyUri)
79
0
{
80
    /* Check Parameter */
81
0
    if (NULL == skm || NULL == skm->data || NULL == SecurityPolicyUri)
82
0
    {
83
0
        return SOPC_STATUS_INVALID_PARAMETERS;
84
0
    }
85
86
0
    SOPC_ReturnStatus status;
87
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
88
0
    SOPC_Mutex_Lock(&data->mutex);
89
0
    data->SecurityPolicyUri = SOPC_Calloc(1, sizeof(SOPC_String));
90
0
    if (NULL == data->SecurityPolicyUri)
91
0
    {
92
0
        status = SOPC_STATUS_OUT_OF_MEMORY;
93
0
    }
94
0
    else
95
0
    {
96
0
        SOPC_String_Initialize(data->SecurityPolicyUri);
97
0
        status = SOPC_String_Copy(data->SecurityPolicyUri, SecurityPolicyUri);
98
0
    }
99
100
0
    SOPC_Mutex_Unlock(&data->mutex);
101
0
    return status;
102
0
}
103
104
static void SOPC_SKManager_InitKeys_Default(SOPC_SKManager_DefaultData* data, uint32_t initialSize)
105
0
{
106
0
    if (NULL == data)
107
0
    {
108
0
        return;
109
0
    }
110
111
0
    SOPC_Array_Delete(data->Keys);
112
0
    data->Keys = SOPC_Array_Create(sizeof(SOPC_ByteString), initialSize, SOPC_ByteString_ClearAux);
113
0
    data->FirstTokenId = 0;
114
0
    data->TimeToNextKey = 0;
115
0
    data->KeyLifetime = SOPC_SK_MANAGER_DEFAULT_KEYLIFETIME;
116
0
    data->CurrentTokenId = 0;
117
0
    data->CurrentTokenTime = 0;
118
0
    data->CurrentTokenRemainingTime = 0;
119
0
}
120
121
static SOPC_ReturnStatus SOPC_SKManager_SetKeys_Default(SOPC_SKManager* skm,
122
                                                        const SOPC_String* SecurityPolicyUri,
123
                                                        uint32_t FirstTokenId,
124
                                                        const SOPC_ByteString* Keys,
125
                                                        uint32_t NbToken,
126
                                                        uint32_t TimeToNextKey,
127
                                                        uint32_t KeyLifetime)
128
0
{
129
0
    SOPC_ReturnStatus status = SOPC_STATUS_OK;
130
131
0
    if (NULL == skm || NULL == skm->data || NULL == SecurityPolicyUri || NULL == Keys || NbToken <= 0 ||
132
0
        SOPC_SK_MANAGER_CURRENT_TOKEN_ID == FirstTokenId || 0 == KeyLifetime)
133
0
    {
134
0
        return SOPC_STATUS_INVALID_PARAMETERS;
135
0
    }
136
137
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
138
0
    SOPC_Mutex_Lock(&data->mutex);
139
140
    /* Do not keep old keys */
141
0
    SOPC_SKManager_InitKeys_Default(data, NbToken * 2);
142
0
    SOPC_String_Delete(data->SecurityPolicyUri);
143
0
    data->SecurityPolicyUri = NULL;
144
145
0
    if (NULL == data->Keys)
146
0
    {
147
0
        SOPC_Mutex_Unlock(&data->mutex);
148
0
        return SOPC_STATUS_OUT_OF_MEMORY;
149
0
    }
150
151
0
    for (size_t i = 0; i < NbToken && SOPC_STATUS_OK == status; i++)
152
0
    {
153
0
        SOPC_ByteString byteString;
154
0
        SOPC_ByteString_Initialize(&byteString);
155
0
        status = SOPC_ByteString_Copy(&byteString, &Keys[i]);
156
0
        if (SOPC_STATUS_OK == status)
157
0
        {
158
0
            bool success = SOPC_Array_Append(data->Keys, byteString);
159
0
            status = success ? status : SOPC_STATUS_OUT_OF_MEMORY;
160
0
        }
161
0
    }
162
163
0
    if (SOPC_STATUS_OK == status)
164
0
    {
165
0
        data->SecurityPolicyUri = SOPC_Calloc(1, sizeof(SOPC_String));
166
0
        if (NULL == data->SecurityPolicyUri)
167
0
        {
168
0
            status = SOPC_STATUS_OUT_OF_MEMORY;
169
0
        }
170
0
        else
171
0
        {
172
0
            SOPC_String_Initialize(data->SecurityPolicyUri);
173
0
            status = SOPC_String_Copy(data->SecurityPolicyUri, SecurityPolicyUri);
174
0
        }
175
0
    }
176
177
    /* Delete allocated data if bad status */
178
0
    if (SOPC_STATUS_OK != status)
179
0
    {
180
0
        SOPC_Array_Delete(data->Keys);
181
0
        SOPC_String_Delete(data->SecurityPolicyUri);
182
0
        data->SecurityPolicyUri = NULL;
183
0
    }
184
185
    /* Otherwise fill data object */
186
0
    if (SOPC_STATUS_OK == status)
187
0
    {
188
0
        data->FirstTokenId = FirstTokenId;
189
0
        data->TimeToNextKey = TimeToNextKey;
190
0
        data->KeyLifetime = KeyLifetime;
191
192
0
        data->CurrentTokenId = FirstTokenId;
193
0
        data->CurrentTokenTime = SOPC_TimeReference_GetCurrent();
194
0
        data->CurrentTokenRemainingTime = TimeToNextKey;
195
0
    }
196
197
0
    SOPC_Mutex_Unlock(&data->mutex);
198
0
    return status;
199
0
}
200
201
static uint32_t SOPC_SKManager_AddKeys_Default(SOPC_SKManager* skm, SOPC_ByteString* Keys, uint32_t NbToken)
202
0
{
203
    /* Check Parameter */
204
0
    if (NULL == skm || NULL == skm->data || NbToken <= 0)
205
0
    {
206
0
        return 0;
207
0
    }
208
209
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
210
0
    SOPC_Mutex_Lock(&data->mutex);
211
0
    uint32_t nbAdded = 0;
212
0
    SOPC_ReturnStatus status = SOPC_STATUS_OK;
213
0
    for (size_t i = 0; i < NbToken && SOPC_STATUS_OK == status; i++)
214
0
    {
215
0
        SOPC_ByteString byteString;
216
0
        SOPC_ByteString_Initialize(&byteString);
217
0
        status = SOPC_ByteString_Copy(&byteString, &Keys[i]);
218
0
        if (SOPC_STATUS_OK == status)
219
0
        {
220
0
            bool bres = SOPC_Array_Append(data->Keys, byteString);
221
0
            if (bres)
222
0
            {
223
0
                nbAdded++;
224
0
            }
225
0
            else
226
0
            {
227
0
                status = SOPC_STATUS_NOK;
228
0
            }
229
0
        }
230
0
    }
231
232
    // If there was no token before this call, set First Token
233
0
    if (0 < nbAdded && 0 == data->FirstTokenId)
234
0
    {
235
0
        data->FirstTokenId = 1;
236
0
        data->CurrentTokenId = 1;
237
0
        data->CurrentTokenTime = SOPC_TimeReference_GetCurrent();
238
0
        data->CurrentTokenRemainingTime = data->KeyLifetime;
239
0
        data->TimeToNextKey = data->CurrentTokenRemainingTime;
240
0
    }
241
242
0
    SOPC_Mutex_Unlock(&data->mutex);
243
0
    return nbAdded;
244
0
}
245
246
static void SOPC_SKManager_UpdateCurrentToken_Default(SOPC_SKManager_DefaultData* data)
247
0
{
248
0
    SOPC_ASSERT(NULL != data);
249
0
    if (0 == data->CurrentTokenId)
250
0
    {
251
0
        return;
252
0
    }
253
254
0
    SOPC_TimeReference currentTime = SOPC_TimeReference_GetCurrent();
255
0
    SOPC_TimeReference timeElapsed = currentTime - data->CurrentTokenTime;
256
0
    SOPC_TimeReference overrunTime = 0;
257
258
0
    if (timeElapsed < data->CurrentTokenRemainingTime)
259
0
    {
260
        // current token is still the one to use
261
0
        data->CurrentTokenRemainingTime = data->CurrentTokenRemainingTime - (uint32_t) timeElapsed;
262
0
        data->CurrentTokenTime = currentTime;
263
0
    }
264
0
    else
265
0
    {
266
        // current token is obsolete. Find the next to use
267
268
        // compute overrun time for the current token after its remaining time
269
0
        overrunTime = timeElapsed - data->CurrentTokenRemainingTime;
270
271
        // Number of Next Token Id obsolete
272
0
        SOPC_ASSERT(0 < data->KeyLifetime);
273
0
        uint64_t nbRenewedTokenMissed = overrunTime / data->KeyLifetime;
274
        // Token Id are incremented by 1.
275
276
0
        SOPC_TimeReference newCurrentTokenId = (data->CurrentTokenId + nbRenewedTokenMissed + 1) % UINT32_MAX;
277
        // If the CurrentTokenId increments past the maximum value of UInt32 it restarts a 1.
278
0
        newCurrentTokenId = (0 == newCurrentTokenId ? 1 : newCurrentTokenId);
279
0
        data->CurrentTokenId = (uint32_t) newCurrentTokenId;
280
0
        data->CurrentTokenTime = currentTime;
281
        /* Substract overrun time from next remaining time */
282
0
        data->CurrentTokenRemainingTime = (uint32_t)(data->KeyLifetime - (overrunTime % data->KeyLifetime));
283
0
        SOPC_ASSERT(data->CurrentTokenRemainingTime <= data->KeyLifetime);
284
0
    }
285
0
}
286
287
static uint32_t SOPC_SKManager_GetAllKeysLifeTime_Default(SOPC_SKManager* skm)
288
0
{
289
0
    if (NULL == skm || NULL == skm->data)
290
0
    {
291
0
        return 0;
292
0
    }
293
294
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
295
0
    SOPC_Mutex_Lock(&data->mutex);
296
297
0
    if (NULL == data->Keys)
298
0
    {
299
0
        SOPC_Mutex_Unlock(&data->mutex);
300
0
        return 0;
301
0
    }
302
303
0
    SOPC_SKManager_UpdateCurrentToken_Default(data);
304
0
    if (SOPC_SK_MANAGER_CURRENT_TOKEN_ID == data->CurrentTokenId)
305
0
    {
306
0
        SOPC_Mutex_Unlock(&data->mutex);
307
0
        return 0;
308
0
    }
309
310
    // Nb available = Number of stored keys - already used keys
311
0
    uint32_t nbAvailable = SOPC_SKManager_Size(skm) - (data->CurrentTokenId - data->FirstTokenId);
312
313
0
    uint32_t result = UINT32_MAX;
314
0
    if (data->CurrentTokenRemainingTime <= UINT32_MAX - (data->KeyLifetime * (nbAvailable - 1)))
315
0
    {
316
        // Current key remaining time + next available keys lifetime
317
0
        result = data->CurrentTokenRemainingTime + (data->KeyLifetime * (nbAvailable - 1));
318
0
    } // else: available lifetime > UINT32_MAX => return UINT32_MAX
319
320
0
    SOPC_Mutex_Unlock(&data->mutex);
321
322
0
    return result;
323
0
}
324
325
static SOPC_ReturnStatus SOPC_SKManager_SetKeyLifetime_Default(SOPC_SKManager* skm, uint32_t KeyLifetime)
326
0
{
327
    /* Check Parameter */
328
0
    if (NULL == skm || NULL == skm->data || 0 == KeyLifetime)
329
0
    {
330
0
        return SOPC_STATUS_INVALID_PARAMETERS;
331
0
    }
332
333
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
334
0
    SOPC_Mutex_Lock(&data->mutex);
335
0
    data->KeyLifetime = KeyLifetime;
336
0
    SOPC_Mutex_Unlock(&data->mutex);
337
0
    return SOPC_STATUS_OK;
338
0
}
339
340
/**
341
 * \brief GetKeys function for SK Manager default implementation
342
 *
343
 */
344
static SOPC_ReturnStatus SOPC_SKManager_GetKeys_Default(SOPC_SKManager* skm,
345
                                                        uint32_t StartingTokenId,
346
                                                        uint32_t NbRequestedToken,
347
                                                        SOPC_String** SecurityPolicyUri,
348
                                                        uint32_t* FirstTokenId,
349
                                                        SOPC_ByteString** Keys,
350
                                                        uint32_t* NbToken,
351
                                                        uint32_t* TimeToNextKey,
352
                                                        uint32_t* KeyLifetime)
353
0
{
354
0
    SOPC_ReturnStatus status = SOPC_STATUS_OK;
355
356
    /* Check Parameter */
357
0
    if (NULL == skm || NULL == skm->data || NULL == SecurityPolicyUri || NULL == FirstTokenId || NULL == Keys ||
358
0
        NULL == NbToken || NULL == TimeToNextKey || NULL == KeyLifetime || 0 == NbRequestedToken)
359
0
    {
360
0
        return SOPC_STATUS_INVALID_PARAMETERS;
361
0
    }
362
363
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
364
0
    SOPC_Mutex_Lock(&data->mutex);
365
0
    if (NULL == data->Keys)
366
0
    {
367
        /* Keys array should be initialized */
368
0
        SOPC_Mutex_Unlock(&data->mutex);
369
0
        return SOPC_STATUS_INVALID_PARAMETERS;
370
0
    }
371
372
0
    if (SOPC_SK_MANAGER_CURRENT_TOKEN_ID == data->FirstTokenId)
373
0
    {
374
        /* Return empty if no keys are managed */
375
0
        SOPC_Mutex_Unlock(&data->mutex);
376
0
        *SecurityPolicyUri = NULL;
377
0
        *FirstTokenId = 0;
378
0
        *Keys = NULL;
379
0
        *NbToken = 0;
380
0
        *TimeToNextKey = 0;
381
0
        *KeyLifetime = 0;
382
0
        return SOPC_STATUS_OK;
383
0
    }
384
385
0
    size_t size = SOPC_Array_Size(data->Keys);
386
0
    SOPC_ASSERT(size <= UINT32_MAX); /* TODO check when add keys */
387
388
0
    uint32_t nbManagedKeys = (uint32_t) size;
389
390
0
    SOPC_SKManager_UpdateCurrentToken_Default(data);
391
392
    /* Requested Token Id is the current Token Id */
393
0
    if (SOPC_SK_MANAGER_CURRENT_TOKEN_ID == StartingTokenId || data->CurrentTokenId == StartingTokenId)
394
0
    {
395
        // Return the current Token ID
396
0
        *FirstTokenId = data->CurrentTokenId;
397
0
        *TimeToNextKey = data->CurrentTokenRemainingTime;
398
0
        *KeyLifetime = data->KeyLifetime;
399
0
    }
400
0
    else if (data->FirstTokenId > StartingTokenId || StartingTokenId - data->FirstTokenId > nbManagedKeys)
401
0
    {
402
        /* Requested Token Id is before the first managed Token Id or after the last managed Token Id */
403
        // Requested Token id is unkown. Get Current Token ID
404
0
        *FirstTokenId = data->CurrentTokenId;
405
0
        *TimeToNextKey = data->CurrentTokenRemainingTime;
406
0
        *KeyLifetime = data->KeyLifetime;
407
0
    }
408
0
    else
409
0
    {
410
        // Requested Token id is after managed Starting Token ID. Take requested Token ID
411
0
        *FirstTokenId = StartingTokenId;
412
0
        *TimeToNextKey = 0;
413
0
        *KeyLifetime = data->KeyLifetime;
414
0
    }
415
416
0
    if (*FirstTokenId < data->FirstTokenId /* Token ID goes to the limit. This case is not managed */
417
0
        || *FirstTokenId - data->FirstTokenId > nbManagedKeys /* There is not enough keys */)
418
0
    {
419
0
        status = SOPC_STATUS_NOK;
420
0
    }
421
422
    // Copy SecurityPolicyUri
423
0
    if (SOPC_STATUS_OK == status)
424
0
    {
425
0
        *SecurityPolicyUri = SOPC_String_Create();
426
0
        if (NULL != *SecurityPolicyUri)
427
0
        {
428
0
            SOPC_String_Initialize(*SecurityPolicyUri);
429
0
            status = SOPC_String_Copy(*SecurityPolicyUri, data->SecurityPolicyUri);
430
0
        }
431
0
        else
432
0
        {
433
0
            status = SOPC_STATUS_OUT_OF_MEMORY;
434
0
        }
435
0
    }
436
437
0
    if (SOPC_STATUS_OK == status)
438
0
    {
439
        // *FirstTokenId is already set;
440
441
        // index of the first token to return in keys array
442
        // Token Id are increased by 1
443
0
        uint32_t indexOfFirstToken = *FirstTokenId - data->FirstTokenId;
444
445
0
        *NbToken = nbManagedKeys - indexOfFirstToken;
446
0
        if (*NbToken > NbRequestedToken)
447
0
        {
448
0
            *NbToken = NbRequestedToken;
449
0
        }
450
451
0
        if (0 < *NbToken)
452
0
        {
453
0
            *Keys = SOPC_Calloc(*NbToken, sizeof(SOPC_ByteString));
454
0
            if (NULL == *Keys)
455
0
            {
456
0
                status = SOPC_STATUS_OUT_OF_MEMORY;
457
0
            }
458
459
            // Copy Keys
460
0
            for (size_t i = 0; i < *NbToken && SOPC_STATUS_OK == status; i++)
461
0
            {
462
0
                size_t indexInManaged = i + indexOfFirstToken;
463
0
                void* byteString = SOPC_Array_Get_Ptr(data->Keys, indexInManaged);
464
0
                SOPC_ASSERT(NULL != byteString);
465
0
                SOPC_ByteString_Initialize(&(*Keys)[i]);
466
0
                status = SOPC_ByteString_CopyAux(&(*Keys)[i], byteString);
467
0
            }
468
0
        }
469
0
        else
470
0
        {
471
0
            *Keys = NULL;
472
0
        }
473
0
    }
474
475
0
    if (SOPC_STATUS_OK != status)
476
0
    {
477
0
        SOPC_String_Delete(*SecurityPolicyUri);
478
0
        *SecurityPolicyUri = NULL;
479
480
0
        for (size_t i = 0; i < *NbToken; i++)
481
0
        {
482
0
            SOPC_ByteString_Clear(&(*Keys)[i]);
483
0
        }
484
0
        SOPC_Free(*Keys);
485
0
        *Keys = NULL;
486
487
0
        *FirstTokenId = 0;
488
0
        *NbToken = 0;
489
0
        *TimeToNextKey = 0;
490
0
        *KeyLifetime = 0;
491
0
    }
492
493
0
    SOPC_Mutex_Unlock(&data->mutex);
494
0
    return status;
495
0
}
496
497
static void SOPC_SKManager_Clear_Default(SOPC_SKManager* skm)
498
0
{
499
0
    if (NULL == skm || NULL == skm->data)
500
0
    {
501
0
        return;
502
0
    }
503
504
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
505
506
0
    SOPC_Array_Delete(data->Keys);
507
0
    data->Keys = NULL;
508
0
    SOPC_String_Delete(data->SecurityPolicyUri);
509
0
    data->SecurityPolicyUri = NULL;
510
0
    data->FirstTokenId = 0;
511
0
    data->TimeToNextKey = 0;
512
0
    data->KeyLifetime = SOPC_SK_MANAGER_DEFAULT_KEYLIFETIME;
513
0
    data->CurrentTokenId = 0;
514
0
    data->CurrentTokenTime = 0;
515
516
0
    SOPC_Mutex_Clear(&data->mutex);
517
518
0
    SOPC_Free(skm->data);
519
0
    skm->data = NULL;
520
0
}
521
522
/*** API FUNCTIONS ***/
523
524
SOPC_SKManager* SOPC_SKManager_Create(const char* securityGroupId, uintptr_t userData)
525
0
{
526
0
    SOPC_SKManager* skm = SOPC_Malloc(sizeof(SOPC_SKManager));
527
0
    if (NULL == skm)
528
0
    {
529
0
        return NULL;
530
0
    }
531
532
0
    skm->securityGroupId = SOPC_strdup(securityGroupId);
533
0
    skm->userData = userData;
534
0
    skm->data = SOPC_Calloc(1, sizeof(SOPC_SKManager_DefaultData));
535
0
    SOPC_Array* keys =
536
0
        SOPC_Array_Create(sizeof(SOPC_ByteString), SOPC_SK_MANAGER_DEFAULT_INITIAL_SIZE, SOPC_ByteString_ClearAux);
537
538
0
    if (NULL == skm->securityGroupId || NULL == skm->data || NULL == keys)
539
0
    {
540
0
        SOPC_Free(skm->securityGroupId);
541
0
        SOPC_Free(skm->data);
542
0
        SOPC_Free(skm);
543
0
        SOPC_Array_Delete(keys);
544
0
        return NULL;
545
0
    }
546
547
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
548
0
    data->Keys = keys;
549
550
0
    SOPC_Mutex_Initialization(&data->mutex);
551
0
    data->CurrentTokenId = 0;
552
0
    data->CurrentTokenTime = 0;
553
0
    data->CurrentTokenRemainingTime = 0;
554
0
    data->SecurityPolicyUri = NULL;
555
0
    data->FirstTokenId = 0;
556
0
    data->TimeToNextKey = 0;
557
0
    data->KeyLifetime = SOPC_SK_MANAGER_DEFAULT_KEYLIFETIME;
558
559
0
    skm->ptrSize = SOPC_SKManager_Size_Default;
560
0
    skm->ptrSetKeyLifetime = SOPC_SKManager_SetKeyLifetime_Default;
561
0
    skm->ptrSetPolicy = SOPC_SKManager_SetSecurityPolicyUri_Default;
562
0
    skm->ptrSetKeys = SOPC_SKManager_SetKeys_Default;
563
0
    skm->ptrAddKeys = SOPC_SKManager_AddKeys_Default;
564
0
    skm->ptrGetKeys = SOPC_SKManager_GetKeys_Default;
565
0
    skm->ptrGetAllKeysLifeTime = SOPC_SKManager_GetAllKeysLifeTime_Default;
566
0
    skm->ptrClear = SOPC_SKManager_Clear_Default;
567
568
0
    return skm;
569
0
}
570
571
uint32_t SOPC_SKManager_Size(SOPC_SKManager* skm)
572
0
{
573
0
    if (NULL == skm)
574
0
    {
575
0
        return 0;
576
0
    }
577
0
    return skm->ptrSize(skm);
578
0
}
579
580
SOPC_ReturnStatus SOPC_SKManager_SetKeyLifetime(SOPC_SKManager* skm, uint32_t KeyLifetime)
581
0
{
582
0
    if (NULL == skm)
583
0
    {
584
0
        return SOPC_STATUS_INVALID_PARAMETERS;
585
0
    }
586
0
    return skm->ptrSetKeyLifetime(skm, KeyLifetime);
587
0
}
588
589
SOPC_ReturnStatus SOPC_SKManager_SetSecurityPolicyUri(SOPC_SKManager* skm, SOPC_String* SecurityPolicyUri)
590
0
{
591
0
    if (NULL == skm)
592
0
    {
593
0
        return SOPC_STATUS_INVALID_PARAMETERS;
594
0
    }
595
0
    return skm->ptrSetPolicy(skm, SecurityPolicyUri);
596
0
}
597
598
SOPC_ReturnStatus SOPC_SKManager_SetKeys(SOPC_SKManager* skm,
599
                                         const SOPC_String* SecurityPolicyUri,
600
                                         uint32_t FirstTokenId,
601
                                         const SOPC_ByteString* Keys,
602
                                         uint32_t NbKeys,
603
                                         uint32_t TimeToNextKey,
604
                                         uint32_t KeyLifetime)
605
0
{
606
0
    if (NULL == skm)
607
0
    {
608
0
        return SOPC_STATUS_INVALID_PARAMETERS;
609
0
    }
610
0
    return skm->ptrSetKeys(skm, SecurityPolicyUri, FirstTokenId, Keys, NbKeys, TimeToNextKey, KeyLifetime);
611
0
}
612
613
uint32_t SOPC_SKManager_AddKeys(SOPC_SKManager* skm, SOPC_ByteString* Keys, uint32_t NbToken)
614
0
{
615
0
    if (NULL == skm)
616
0
    {
617
0
        return SOPC_STATUS_INVALID_PARAMETERS;
618
0
    }
619
0
    return skm->ptrAddKeys(skm, Keys, NbToken);
620
0
}
621
622
SOPC_ReturnStatus SOPC_SKManager_GetKeys(SOPC_SKManager* skm,
623
                                         uint32_t StartingTokenId,
624
                                         uint32_t NbRequestedToken,
625
                                         SOPC_String** SecurityPolicyUri,
626
                                         uint32_t* FirstTokenId,
627
                                         SOPC_ByteString** Keys,
628
                                         uint32_t* NbKeys,
629
                                         uint32_t* TimeToNextKey,
630
                                         uint32_t* KeyLifetime)
631
0
{
632
0
    if (NULL == skm)
633
0
    {
634
0
        return SOPC_STATUS_INVALID_PARAMETERS;
635
0
    }
636
0
    return skm->ptrGetKeys(skm, StartingTokenId, NbRequestedToken, SecurityPolicyUri, FirstTokenId, Keys, NbKeys,
637
0
                           TimeToNextKey, KeyLifetime);
638
0
}
639
640
uint32_t SOPC_SKManager_GetAllKeysLifeTime(SOPC_SKManager* skm)
641
0
{
642
0
    if (NULL == skm)
643
0
    {
644
0
        return 0;
645
0
    }
646
0
    return skm->ptrGetAllKeysLifeTime(skm);
647
0
}
648
649
void SOPC_SKManager_Clear(SOPC_SKManager* skm)
650
0
{
651
0
    if (NULL != skm && NULL != skm->ptrClear)
652
0
    {
653
0
        skm->ptrClear(skm);
654
0
        SOPC_Free(skm->securityGroupId);
655
0
        skm->securityGroupId = NULL;
656
0
    }
657
0
}