Coverage Report

Created: 2026-04-06 06:51

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/S2OPC/src/Common/sks/sopc_sk_manager.c
Line
Count
Source
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
    uint64_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
    uint64_t TimeToNextKey;
49
    uint64_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
                                                        uint64_t TimeToNextKey,
127
                                                        uint64_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 - (uint64_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 = (uint64_t)(data->KeyLifetime - (overrunTime % data->KeyLifetime));
283
0
        SOPC_ASSERT(data->CurrentTokenRemainingTime <= data->KeyLifetime);
284
0
    }
285
0
}
286
287
static uint64_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
    uint64_t result = UINT64_MAX;
314
0
    if (data->CurrentTokenRemainingTime <= UINT64_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 > UINT64_MAX => return UINT64_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, uint64_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
                                                        uint64_t* TimeToNextKey,
352
                                                        uint64_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 == FirstTokenId || NULL == Keys || NULL == NbToken ||
358
0
        NULL == TimeToNextKey || NULL == KeyLifetime)
359
0
    {
360
0
        return SOPC_STATUS_INVALID_PARAMETERS;
361
0
    }
362
0
    else if (NULL != SecurityPolicyUri)
363
0
    {
364
0
        *SecurityPolicyUri = NULL;
365
0
    }
366
367
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
368
0
    SOPC_Mutex_Lock(&data->mutex);
369
0
    if (NULL == data->Keys)
370
0
    {
371
        /* Keys array should be initialized */
372
0
        SOPC_Mutex_Unlock(&data->mutex);
373
0
        return SOPC_STATUS_INVALID_PARAMETERS;
374
0
    }
375
376
0
    if (SOPC_SK_MANAGER_CURRENT_TOKEN_ID == data->FirstTokenId)
377
0
    {
378
        /* Return empty if no keys are managed */
379
0
        SOPC_Mutex_Unlock(&data->mutex);
380
0
        *FirstTokenId = 0;
381
0
        *Keys = NULL;
382
0
        *NbToken = 0;
383
0
        *TimeToNextKey = 0;
384
0
        *KeyLifetime = 0;
385
0
        return SOPC_STATUS_OK;
386
0
    }
387
388
0
    size_t size = SOPC_Array_Size(data->Keys);
389
0
    SOPC_ASSERT(size <= UINT32_MAX); /* TODO check when add keys */
390
391
0
    uint32_t nbManagedKeys = (uint32_t) size;
392
393
0
    SOPC_SKManager_UpdateCurrentToken_Default(data);
394
395
    /* Requested Token Id is the current Token Id */
396
0
    if (SOPC_SK_MANAGER_CURRENT_TOKEN_ID == StartingTokenId || data->CurrentTokenId == StartingTokenId)
397
0
    {
398
        // Return the current Token ID
399
0
        *FirstTokenId = data->CurrentTokenId;
400
0
        *TimeToNextKey = data->CurrentTokenRemainingTime;
401
0
        *KeyLifetime = data->KeyLifetime;
402
0
    }
403
0
    else if (data->FirstTokenId > StartingTokenId || StartingTokenId - data->FirstTokenId > nbManagedKeys)
404
0
    {
405
        /* Requested Token Id is before the first managed Token Id or after the last managed Token Id */
406
        // Requested Token id is unkown. Get Current Token ID
407
0
        *FirstTokenId = data->CurrentTokenId;
408
0
        *TimeToNextKey = data->CurrentTokenRemainingTime;
409
0
        *KeyLifetime = data->KeyLifetime;
410
0
    }
411
0
    else
412
0
    {
413
        // Requested Token id is after managed Starting Token ID. Take requested Token ID
414
0
        *FirstTokenId = StartingTokenId;
415
0
        *TimeToNextKey = 0;
416
0
        *KeyLifetime = data->KeyLifetime;
417
0
    }
418
419
0
    if (*FirstTokenId < data->FirstTokenId /* Token ID goes to the limit. This case is not managed */
420
0
        || *FirstTokenId - data->FirstTokenId > nbManagedKeys /* There is not enough keys */)
421
0
    {
422
0
        status = SOPC_STATUS_NOK;
423
0
    }
424
425
    // Copy SecurityPolicyUri
426
0
    if (SOPC_STATUS_OK == status && NULL != SecurityPolicyUri)
427
0
    {
428
0
        *SecurityPolicyUri = SOPC_String_Create();
429
0
        if (NULL != *SecurityPolicyUri)
430
0
        {
431
0
            SOPC_String_Initialize(*SecurityPolicyUri);
432
0
            status = SOPC_String_Copy(*SecurityPolicyUri, data->SecurityPolicyUri);
433
0
        }
434
0
        else
435
0
        {
436
0
            status = SOPC_STATUS_OUT_OF_MEMORY;
437
0
        }
438
0
    }
439
440
0
    if (SOPC_STATUS_OK == status)
441
0
    {
442
        // *FirstTokenId is already set;
443
444
        // index of the first token to return in keys array
445
        // Token Id are increased by 1
446
0
        uint32_t indexOfFirstToken = *FirstTokenId - data->FirstTokenId;
447
448
0
        *NbToken = nbManagedKeys - indexOfFirstToken;
449
0
        if (*NbToken > NbRequestedToken)
450
0
        {
451
0
            *NbToken = NbRequestedToken;
452
0
        }
453
454
0
        if (0 < *NbToken)
455
0
        {
456
0
            *Keys = SOPC_Calloc(*NbToken, sizeof(SOPC_ByteString));
457
0
            if (NULL == *Keys)
458
0
            {
459
0
                status = SOPC_STATUS_OUT_OF_MEMORY;
460
0
            }
461
462
            // Copy Keys
463
0
            for (size_t i = 0; i < *NbToken && SOPC_STATUS_OK == status; i++)
464
0
            {
465
0
                size_t indexInManaged = i + indexOfFirstToken;
466
0
                void* byteString = SOPC_Array_Get_Ptr(data->Keys, indexInManaged);
467
0
                SOPC_ASSERT(NULL != byteString);
468
0
                SOPC_ByteString_Initialize(&(*Keys)[i]);
469
0
                status = SOPC_ByteString_CopyAux(&(*Keys)[i], byteString);
470
0
            }
471
0
        }
472
0
        else
473
0
        {
474
0
            *Keys = NULL;
475
0
        }
476
0
    }
477
478
0
    if (SOPC_STATUS_OK != status)
479
0
    {
480
0
        if (NULL != SecurityPolicyUri)
481
0
        {
482
0
            SOPC_String_Delete(*SecurityPolicyUri);
483
0
            *SecurityPolicyUri = NULL;
484
0
        }
485
486
0
        for (size_t i = 0; i < *NbToken; i++)
487
0
        {
488
0
            SOPC_ByteString_Clear(&(*Keys)[i]);
489
0
        }
490
0
        SOPC_Free(*Keys);
491
0
        *Keys = NULL;
492
493
0
        *FirstTokenId = 0;
494
0
        *NbToken = 0;
495
0
        *TimeToNextKey = 0;
496
0
        *KeyLifetime = 0;
497
0
    }
498
499
0
    SOPC_Mutex_Unlock(&data->mutex);
500
0
    return status;
501
0
}
502
503
static void SOPC_SKManager_Clear_Default(SOPC_SKManager* skm)
504
0
{
505
0
    if (NULL == skm || NULL == skm->data)
506
0
    {
507
0
        return;
508
0
    }
509
510
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
511
512
0
    SOPC_Array_Delete(data->Keys);
513
0
    data->Keys = NULL;
514
0
    SOPC_String_Delete(data->SecurityPolicyUri);
515
0
    data->SecurityPolicyUri = NULL;
516
0
    data->FirstTokenId = 0;
517
0
    data->TimeToNextKey = 0;
518
0
    data->KeyLifetime = SOPC_SK_MANAGER_DEFAULT_KEYLIFETIME;
519
0
    data->CurrentTokenId = 0;
520
0
    data->CurrentTokenTime = 0;
521
522
0
    SOPC_Mutex_Clear(&data->mutex);
523
524
0
    SOPC_Free(skm->data);
525
0
    skm->data = NULL;
526
0
}
527
528
/*** API FUNCTIONS ***/
529
530
SOPC_SKManager* SOPC_SKManager_Create(const char* securityGroupId, uintptr_t userData)
531
0
{
532
0
    SOPC_SKManager* skm = SOPC_Malloc(sizeof(SOPC_SKManager));
533
0
    if (NULL == skm)
534
0
    {
535
0
        return NULL;
536
0
    }
537
538
0
    skm->securityGroupId = SOPC_strdup(securityGroupId);
539
0
    skm->userData = userData;
540
0
    skm->data = SOPC_Calloc(1, sizeof(SOPC_SKManager_DefaultData));
541
0
    SOPC_Array* keys =
542
0
        SOPC_Array_Create(sizeof(SOPC_ByteString), SOPC_SK_MANAGER_DEFAULT_INITIAL_SIZE, SOPC_ByteString_ClearAux);
543
544
0
    if (NULL == skm->securityGroupId || NULL == skm->data || NULL == keys)
545
0
    {
546
0
        SOPC_Free(skm->securityGroupId);
547
0
        SOPC_Free(skm->data);
548
0
        SOPC_Free(skm);
549
0
        SOPC_Array_Delete(keys);
550
0
        return NULL;
551
0
    }
552
553
0
    SOPC_SKManager_DefaultData* data = (SOPC_SKManager_DefaultData*) skm->data;
554
0
    data->Keys = keys;
555
556
0
    SOPC_Mutex_Initialization(&data->mutex);
557
0
    data->CurrentTokenId = 0;
558
0
    data->CurrentTokenTime = 0;
559
0
    data->CurrentTokenRemainingTime = 0;
560
0
    data->SecurityPolicyUri = NULL;
561
0
    data->FirstTokenId = 0;
562
0
    data->TimeToNextKey = 0;
563
0
    data->KeyLifetime = SOPC_SK_MANAGER_DEFAULT_KEYLIFETIME;
564
565
0
    skm->ptrSize = SOPC_SKManager_Size_Default;
566
0
    skm->ptrSetKeyLifetime = SOPC_SKManager_SetKeyLifetime_Default;
567
0
    skm->ptrSetPolicy = SOPC_SKManager_SetSecurityPolicyUri_Default;
568
0
    skm->ptrSetKeys = SOPC_SKManager_SetKeys_Default;
569
0
    skm->ptrAddKeys = SOPC_SKManager_AddKeys_Default;
570
0
    skm->ptrGetKeys = SOPC_SKManager_GetKeys_Default;
571
0
    skm->ptrGetAllKeysLifeTime = SOPC_SKManager_GetAllKeysLifeTime_Default;
572
0
    skm->ptrClear = SOPC_SKManager_Clear_Default;
573
574
0
    return skm;
575
0
}
576
577
uint32_t SOPC_SKManager_Size(SOPC_SKManager* skm)
578
0
{
579
0
    if (NULL == skm)
580
0
    {
581
0
        return 0;
582
0
    }
583
0
    return skm->ptrSize(skm);
584
0
}
585
586
SOPC_ReturnStatus SOPC_SKManager_SetKeyLifetime(SOPC_SKManager* skm, uint64_t KeyLifetime)
587
0
{
588
0
    if (NULL == skm)
589
0
    {
590
0
        return SOPC_STATUS_INVALID_PARAMETERS;
591
0
    }
592
0
    return skm->ptrSetKeyLifetime(skm, KeyLifetime);
593
0
}
594
595
SOPC_ReturnStatus SOPC_SKManager_SetSecurityPolicyUri(SOPC_SKManager* skm, SOPC_String* SecurityPolicyUri)
596
0
{
597
0
    if (NULL == skm)
598
0
    {
599
0
        return SOPC_STATUS_INVALID_PARAMETERS;
600
0
    }
601
0
    return skm->ptrSetPolicy(skm, SecurityPolicyUri);
602
0
}
603
604
SOPC_ReturnStatus SOPC_SKManager_SetKeys(SOPC_SKManager* skm,
605
                                         const SOPC_String* SecurityPolicyUri,
606
                                         uint32_t FirstTokenId,
607
                                         const SOPC_ByteString* Keys,
608
                                         uint32_t NbKeys,
609
                                         uint64_t TimeToNextKey,
610
                                         uint64_t KeyLifetime)
611
0
{
612
0
    if (NULL == skm)
613
0
    {
614
0
        return SOPC_STATUS_INVALID_PARAMETERS;
615
0
    }
616
0
    return skm->ptrSetKeys(skm, SecurityPolicyUri, FirstTokenId, Keys, NbKeys, TimeToNextKey, KeyLifetime);
617
0
}
618
619
uint32_t SOPC_SKManager_AddKeys(SOPC_SKManager* skm, SOPC_ByteString* Keys, uint32_t NbToken)
620
0
{
621
0
    if (NULL == skm)
622
0
    {
623
0
        return SOPC_STATUS_INVALID_PARAMETERS;
624
0
    }
625
0
    return skm->ptrAddKeys(skm, Keys, NbToken);
626
0
}
627
628
SOPC_ReturnStatus SOPC_SKManager_GetKeys(SOPC_SKManager* skm,
629
                                         uint32_t StartingTokenId,
630
                                         uint32_t NbRequestedToken,
631
                                         SOPC_String** SecurityPolicyUri,
632
                                         uint32_t* FirstTokenId,
633
                                         SOPC_ByteString** Keys,
634
                                         uint32_t* NbKeys,
635
                                         uint64_t* TimeToNextKey,
636
                                         uint64_t* KeyLifetime)
637
0
{
638
0
    if (NULL == skm)
639
0
    {
640
0
        return SOPC_STATUS_INVALID_PARAMETERS;
641
0
    }
642
0
    return skm->ptrGetKeys(skm, StartingTokenId, NbRequestedToken, SecurityPolicyUri, FirstTokenId, Keys, NbKeys,
643
0
                           TimeToNextKey, KeyLifetime);
644
0
}
645
646
uint64_t SOPC_SKManager_GetAllKeysLifeTime(SOPC_SKManager* skm)
647
0
{
648
0
    if (NULL == skm)
649
0
    {
650
0
        return 0;
651
0
    }
652
0
    return skm->ptrGetAllKeysLifeTime(skm);
653
0
}
654
655
void SOPC_SKManager_Clear(SOPC_SKManager* skm)
656
0
{
657
0
    if (NULL != skm && NULL != skm->ptrClear)
658
0
    {
659
0
        skm->ptrClear(skm);
660
0
        SOPC_Free(skm->securityGroupId);
661
        skm->securityGroupId = NULL;
662
0
    }
663
0
}