1 /*
2  * Copyright 2018-2021 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 #include "fsl_sss_sscp.h"
8 #include <string.h>
9 #include "fsl_sss_api.h"
10 #include "fsl_sscp.h"
11 #include "fsl_sscp_commands.h"
12 
13 #define NUMBER_OF_BITS_IN_BYTE                  (8u)
14 #define MAX_SUPPORTED_COORDINATE_LENGTH_IN_BITS (1024u)
15 #define NUMBER_OF_COORDINATES_PER_EC_KEY_SLOT   (3u)
16 #define SSS_SSCP_TUNNEL_HAVE_BUFFER_MASK        (0x80000000u)
17 
sss_sscp_open_session(sss_sscp_session_t * session,uint32_t sessionId,sss_type_t subsystem,sscp_context_t * sscpctx)18 sss_status_t sss_sscp_open_session(sss_sscp_session_t *session,
19                                    uint32_t sessionId,
20                                    sss_type_t subsystem,
21                                    sscp_context_t *sscpctx)
22 
23 {
24     SSCP_BUILD_ASSURE(sizeof(sss_session_t) >= sizeof(sss_sscp_session_t), _sss_sscp_session_size);
25     sscp_operation_t op  = {0};
26     sscp_status_t status = kStatus_SSCP_Fail;
27     uint32_t ret         = 0u;
28 
29     session->subsystem = subsystem;
30     session->sscp      = sscpctx;
31     op.paramTypes =
32         SSCP_OP_SET_PARAM(kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
33                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
34 
35     op.params[0].value.a = (uint32_t)subsystem;
36     op.params[0].value.b = sessionId;
37 
38     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
39     op.resultCount            = 1u;
40     op.result[0].context.ptr  = session;
41     op.result[0].context.type = kSSCP_ParamContextType_SSS_Session;
42 
43     status = sscpctx->invoke(sscpctx, kSSCP_CMD_SSS_OpenSession, &op, &ret);
44     if (status != kStatus_SSCP_Success)
45     {
46         return kStatus_SSS_Fail;
47     }
48 
49     return (sss_status_t)ret;
50 }
51 
sss_sscp_close_session(sss_sscp_session_t * session)52 sss_status_t sss_sscp_close_session(sss_sscp_session_t *session)
53 {
54     sscp_operation_t op  = {0};
55     sscp_status_t status = kStatus_SSCP_Fail;
56     uint32_t ret         = 0u;
57 
58     op.paramTypes =
59         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
60                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
61 
62     op.params[0].context.ptr  = session;
63     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
64 
65     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
66     op.resultCount = 0u;
67 
68     sscp_context_t *sscpCtx = session->sscp;
69     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_CloseSession, &op, &ret);
70     if (status != kStatus_SSCP_Success)
71     {
72         return kStatus_SSS_Fail;
73     }
74     return (sss_status_t)ret;
75 }
76 
77 /*******************************SYMETRIC***************************************/
sss_sscp_symmetric_context_init(sss_sscp_symmetric_t * context,sss_sscp_session_t * session,sss_sscp_object_t * keyObject,sss_algorithm_t algorithm,sss_mode_t mode)78 sss_status_t sss_sscp_symmetric_context_init(sss_sscp_symmetric_t *context,
79                                              sss_sscp_session_t *session,
80                                              sss_sscp_object_t *keyObject,
81                                              sss_algorithm_t algorithm,
82                                              sss_mode_t mode)
83 {
84     SSCP_BUILD_ASSURE(sizeof(sss_symmetric_t) >= sizeof(sss_sscp_symmetric_t), _sss_sscp_symmetric_size);
85     sscp_operation_t op  = {0};
86     sscp_status_t status = kStatus_SSCP_Fail;
87     uint32_t ret         = 0u;
88 
89     context->session   = session;
90     context->keyObject = keyObject;
91     context->algorithm = algorithm;
92     context->mode      = mode;
93 
94     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
95                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
96                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
97 
98     op.params[0].context.ptr  = session;
99     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
100 
101     op.params[1].context.ptr  = keyObject;
102     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
103 
104     op.params[2].value.a = (uint32_t)algorithm;
105     op.params[2].value.b = (uint32_t)mode;
106 
107     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
108     op.resultCount            = 1u;
109     op.result[0].context.ptr  = context;
110     op.result[0].context.type = kSSCP_ParamContextType_SSS_Symmetric;
111 
112     sscp_context_t *sscpCtx = session->sscp;
113     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricContextInit, &op, &ret);
114     if (status != kStatus_SSCP_Success)
115     {
116         return kStatus_SSS_Fail;
117     }
118 
119     return (sss_status_t)ret;
120 }
121 
sss_sscp_cipher_one_go(sss_sscp_symmetric_t * context,uint8_t * iv,size_t ivLen,const uint8_t * srcData,uint8_t * destData,size_t dataLen)122 sss_status_t sss_sscp_cipher_one_go(
123     sss_sscp_symmetric_t *context, uint8_t *iv, size_t ivLen, const uint8_t *srcData, uint8_t *destData, size_t dataLen)
124 {
125     SSCP_BUILD_ASSURE(sizeof(sss_symmetric_t) >= sizeof(sss_sscp_symmetric_t), _sss_sscp_symmetric_size);
126     sscp_operation_t op  = {0};
127     sscp_status_t status = kStatus_SSCP_Fail;
128     uint32_t ret         = 0u;
129 
130     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput,
131                                       kSSCP_ParamType_MemrefInputNoSize, kSSCP_ParamType_MemrefInOut,
132                                       kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
133 
134     op.params[0].context.ptr  = context;
135     op.params[0].context.type = kSSCP_ParamContextType_SSS_Symmetric;
136 
137     op.params[1].memref.buffer = (uintptr_t)iv;
138     op.params[1].memref.size   = ivLen;
139     op.params[2].memref.buffer = (uintptr_t)srcData;
140     op.params[2].memref.size   = dataLen;
141     op.params[3].memref.buffer = (uintptr_t)destData;
142     op.params[3].memref.size   = dataLen;
143 
144     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
145     op.resultCount = 0u;
146 
147     sscp_context_t *sscpCtx = context->session->sscp;
148     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricCipherOneGo, &op, &ret);
149     if (status != kStatus_SSCP_Success)
150     {
151         return kStatus_SSS_Fail;
152     }
153 
154     return (sss_status_t)ret;
155 }
156 
sss_sscp_cipher_init(sss_sscp_symmetric_t * context,uint8_t * iv,size_t ivLen)157 sss_status_t sss_sscp_cipher_init(sss_sscp_symmetric_t *context, uint8_t *iv, size_t ivLen)
158 {
159     sscp_operation_t op  = {0};
160     sscp_status_t status = kStatus_SSCP_Fail;
161     uint32_t ret         = 0u;
162 
163     op.paramTypes =
164         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_None,
165                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
166 
167     op.params[0].context.ptr   = context;
168     op.params[0].context.type  = (uint32_t)kSSCP_ParamContextType_SSS_Symmetric;
169     op.params[1].memref.buffer = (uintptr_t)iv;
170     op.params[1].memref.size   = ivLen;
171 
172     sscp_context_t *sscpCtx = context->session->sscp;
173     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricCipherInit, &op, &ret);
174     if (status != kStatus_SSCP_Success)
175     {
176         return kStatus_SSS_Fail;
177     }
178 
179     return (sss_status_t)ret;
180 }
181 
sss_sscp_cipher_update(sss_sscp_symmetric_t * context,const uint8_t * srcData,size_t srcLen,uint8_t * destData,size_t * destLen)182 sss_status_t sss_sscp_cipher_update(
183     sss_sscp_symmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen)
184 {
185     sscp_operation_t op  = {0};
186     sscp_status_t status = kStatus_SSCP_Fail;
187     uint32_t ret         = 0u;
188 
189     size_t len = (destLen != NULL) ? *destLen : srcLen;
190 
191     op.paramTypes =
192         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput,
193                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
194 
195     op.params[0].context.ptr   = context;
196     op.params[0].context.type  = (uint32_t)kSSCP_ParamContextType_SSS_Symmetric;
197     op.params[1].memref.buffer = (uintptr_t)srcData;
198     op.params[1].memref.size   = srcLen;
199     op.params[2].memref.buffer = (uintptr_t)destData;
200     op.params[2].memref.size   = len;
201 
202     sscp_context_t *sscpCtx = context->session->sscp;
203     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricCipherUpdate, &op, &ret);
204     if (status != kStatus_SSCP_Success)
205     {
206         if (destLen != NULL)
207         {
208             *destLen = 0u;
209         }
210         return kStatus_SSS_Fail;
211     }
212 
213     /* update the size member of kSSCP_ParamType_MemrefOutput param with the actual byte length written to output buffer
214      */
215     if (destLen != NULL)
216     {
217         *destLen = op.params[2].memref.size;
218     }
219     return kStatus_SSS_Success;
220 }
221 
sss_sscp_cipher_finish(sss_sscp_symmetric_t * context,const uint8_t * srcData,size_t srcLen,uint8_t * destData,size_t * destLen)222 sss_status_t sss_sscp_cipher_finish(
223     sss_sscp_symmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen)
224 {
225     sscp_operation_t op  = {0};
226     sscp_status_t status = kStatus_SSCP_Fail;
227     uint32_t ret         = 0u;
228 
229     size_t len = (destLen != NULL) ? *destLen : srcLen;
230 
231     op.paramTypes =
232         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput,
233                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
234 
235     op.params[0].context.ptr   = context;
236     op.params[0].context.type  = (uint32_t)kSSCP_ParamContextType_SSS_Symmetric;
237     op.params[1].memref.buffer = (uintptr_t)srcData;
238     op.params[1].memref.size   = srcLen;
239     op.params[2].memref.buffer = (uintptr_t)destData;
240     op.params[2].memref.size   = len;
241 
242     sscp_context_t *sscpCtx = context->session->sscp;
243     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricCipherFinish, &op, &ret);
244     if (status != kStatus_SSCP_Success)
245     {
246         if (destLen != NULL)
247         {
248             *destLen = 0u;
249         }
250         return kStatus_SSS_Fail;
251     }
252 
253     /* update the size member of kSSCP_ParamType_MemrefOutput param with the actual byte length written to output buffer
254      */
255     if (destLen != NULL)
256     {
257         *destLen = op.params[2].memref.size;
258     }
259     return kStatus_SSS_Success;
260 }
261 
sss_sscp_cipher_crypt_ctr(sss_sscp_symmetric_t * context,const uint8_t * srcData,uint8_t * destData,size_t size,uint8_t * initialCounter,uint8_t * lastEncryptedCounter,size_t * szLeft)262 sss_status_t sss_sscp_cipher_crypt_ctr(sss_sscp_symmetric_t *context,
263                                        const uint8_t *srcData,
264                                        uint8_t *destData,
265                                        size_t size,
266                                        uint8_t *initialCounter,
267                                        uint8_t *lastEncryptedCounter,
268                                        size_t *szLeft)
269 {
270     SSCP_BUILD_ASSURE(sizeof(sss_symmetric_t) >= sizeof(sss_sscp_symmetric_t), _sss_sscp_symmetric_size);
271     sscp_operation_t op  = {0};
272     sscp_status_t status = kStatus_SSCP_Fail;
273     uint32_t ret         = 0u;
274 
275     /* this func specific for AES CTR */
276     /* don't consider DES at the moment for the CTR mode */
277     if (context->algorithm != kAlgorithm_SSS_AES_CTR)
278     {
279         return kStatus_SSS_InvalidArgument;
280     }
281 
282     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput,
283                                       kSSCP_ParamType_MemrefOutput, kSSCP_ParamType_MemrefInOut,
284                                       kSSCP_ParamType_MemrefInOut, kSSCP_ParamType_MemrefInOut, kSSCP_ParamType_None);
285 
286     op.params[0].context.ptr  = context;
287     op.params[0].context.type = kSSCP_ParamContextType_SSS_Symmetric;
288 
289     op.params[1].memref.buffer = (uintptr_t)srcData;
290     op.params[1].memref.size   = size;
291     op.params[2].memref.buffer = (uintptr_t)destData;
292     op.params[2].memref.size   = size;
293     op.params[3].memref.buffer = (uintptr_t)initialCounter;
294     op.params[3].memref.size   = SSS_AES_BLOCK_SIZE;
295     op.params[4].memref.buffer = (uintptr_t)lastEncryptedCounter;
296     op.params[4].memref.size   = SSS_AES_BLOCK_SIZE;
297     op.params[5].memref.buffer = (uintptr_t)szLeft;
298     op.params[5].memref.size   = sizeof(*szLeft);
299 
300     sscp_context_t *sscpCtx = context->session->sscp;
301     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_SymmetricCryptCtr, &op, &ret);
302     if (status != kStatus_SSCP_Success)
303     {
304         return kStatus_SSS_Fail;
305     }
306 
307     return (sss_status_t)ret;
308 }
sss_sscp_symmetric_context_free(sss_sscp_symmetric_t * context)309 sss_status_t sss_sscp_symmetric_context_free(sss_sscp_symmetric_t *context)
310 {
311     sscp_operation_t op  = {0};
312     sscp_status_t status = kStatus_SSCP_Fail;
313     uint32_t ret         = 0u;
314 
315     op.paramTypes =
316         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
317                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
318 
319     op.params[0].context.ptr  = context;
320     op.params[0].context.type = kSSCP_ParamContextType_SSS_Symmetric;
321 
322     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
323     op.resultCount = 0u;
324 
325     sscp_context_t *sscpCtx = context->session->sscp;
326     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
327     if (status != kStatus_SSCP_Success)
328     {
329         return kStatus_SSS_Fail;
330     }
331     return (sss_status_t)ret;
332 }
333 /**********************************AEAD****************************************/
334 
sss_sscp_aead_context_init(sss_sscp_aead_t * context,sss_sscp_session_t * session,sss_sscp_object_t * keyObject,sss_algorithm_t algorithm,sss_mode_t mode)335 sss_status_t sss_sscp_aead_context_init(sss_sscp_aead_t *context,
336                                         sss_sscp_session_t *session,
337                                         sss_sscp_object_t *keyObject,
338                                         sss_algorithm_t algorithm,
339                                         sss_mode_t mode)
340 {
341     SSCP_BUILD_ASSURE(sizeof(sss_aead_t) >= sizeof(sss_sscp_aead_t), _sss_sscp_aead_size);
342     sscp_operation_t op  = {0};
343     sscp_status_t status = kStatus_SSCP_Fail;
344     uint32_t ret         = 0u;
345 
346     context->session   = session;
347     context->keyObject = keyObject;
348     context->algorithm = algorithm;
349     context->mode      = mode;
350 
351     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
352                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
353                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
354 
355     op.params[0].context.ptr  = session;
356     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
357 
358     op.params[1].context.ptr  = keyObject;
359     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
360 
361     op.params[2].value.a = (uint32_t)algorithm;
362     op.params[2].value.b = (uint32_t)mode;
363 
364     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
365     op.resultCount            = 1u;
366     op.result[0].context.ptr  = context;
367     op.result[0].context.type = kSSCP_ParamContextType_SSS_Aead;
368 
369     sscp_context_t *sscpCtx = session->sscp;
370     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AeadContextInit, &op, &ret);
371     if (status != kStatus_SSCP_Success)
372     {
373         return kStatus_SSS_Fail;
374     }
375 
376     return (sss_status_t)ret;
377 }
378 
sss_sscp_aead_one_go(sss_sscp_aead_t * context,const uint8_t * srcData,uint8_t * destData,size_t size,uint8_t * nonce,size_t nonceLen,const uint8_t * aad,size_t aadLen,uint8_t * tag,size_t * tagLen)379 sss_status_t sss_sscp_aead_one_go(sss_sscp_aead_t *context,
380                                   const uint8_t *srcData,
381                                   uint8_t *destData,
382                                   size_t size,
383                                   uint8_t *nonce,
384                                   size_t nonceLen,
385                                   const uint8_t *aad,
386                                   size_t aadLen,
387                                   uint8_t *tag,
388                                   size_t *tagLen)
389 {
390     SSCP_BUILD_ASSURE(sizeof(sss_aead_t) >= sizeof(sss_sscp_aead_t), _sss_sscp_aead_size);
391     sscp_operation_t op  = {0};
392     sscp_status_t status = kStatus_SSCP_Fail;
393     uint32_t ret         = 0u;
394 
395     /* set paramTypes for the tag[] buffer according to mode
396      * for encrypt (and authenticate) mode, the tag[] is output, written by invoked function,
397      * for decrypt (and verify) mode, the tag[] is input, to be verified by invoked function
398      */
399     if (context->mode == kMode_SSS_Encrypt)
400     {
401         op.paramTypes =
402             SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInputNoSize,
403                               kSSCP_ParamType_MemrefOutputNoSize, kSSCP_ParamType_ValueInputSingle,
404                               kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput);
405     }
406     else
407     {
408         op.paramTypes =
409             SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInputNoSize,
410                               kSSCP_ParamType_MemrefOutputNoSize, kSSCP_ParamType_ValueInputSingle,
411                               kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInput);
412     }
413 
414     op.params[0].context.ptr  = context;
415     op.params[0].context.type = kSSCP_ParamContextType_SSS_Aead;
416 
417     op.params[1].memref.buffer = (uintptr_t)srcData;
418     op.params[2].memref.buffer = (uintptr_t)destData;
419     op.params[3].value.a       = size;
420     op.params[4].memref.buffer = (uintptr_t)nonce;
421     op.params[4].memref.size   = nonceLen;
422     op.params[5].memref.buffer = (uintptr_t)aad;
423     op.params[5].memref.size   = aadLen;
424     op.params[6].memref.buffer = (uintptr_t)tag;
425     op.params[6].memref.size   = *tagLen;
426     op.resultTypes             = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
427     op.resultCount             = 1u;
428     op.result[0].value.a       = (uint32_t)tagLen;
429     sscp_context_t *sscpCtx    = context->session->sscp;
430     status                     = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AeadOneGo, &op, &ret);
431     if (status != kStatus_SSCP_Success)
432     {
433         return kStatus_SSS_Fail;
434     }
435     return (sss_status_t)ret;
436 }
437 
sss_sscp_aead_context_free(sss_sscp_aead_t * context)438 sss_status_t sss_sscp_aead_context_free(sss_sscp_aead_t *context)
439 {
440     sscp_operation_t op  = {0};
441     sscp_status_t status = kStatus_SSCP_Fail;
442     uint32_t ret;
443 
444     op.paramTypes =
445         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
446                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
447 
448     op.params[0].context.ptr  = context;
449     op.params[0].context.type = kSSCP_ParamContextType_SSS_Aead;
450 
451     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
452     op.resultCount = 0u;
453 
454     sscp_context_t *sscpCtx = context->session->sscp;
455     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
456     if (status != kStatus_SSCP_Success)
457     {
458         ret = kStatus_SSS_Fail;
459     }
460 
461     return (sss_status_t)ret;
462 }
463 
sss_sscp_aead_init(sss_sscp_aead_t * context,uint8_t * nonce,size_t nonceLen,size_t tagLen,size_t aadLen,size_t payloadLen)464 sss_status_t sss_sscp_aead_init(
465     sss_sscp_aead_t *context, uint8_t *nonce, size_t nonceLen, size_t tagLen, size_t aadLen, size_t payloadLen)
466 {
467     return kStatus_SSS_Fail;
468 }
469 
sss_sscp_aead_update_aad(sss_sscp_aead_t * context,const uint8_t * aadData,size_t aadDataLen)470 sss_status_t sss_sscp_aead_update_aad(sss_sscp_aead_t *context, const uint8_t *aadData, size_t aadDataLen)
471 {
472     return kStatus_SSS_Fail;
473 }
474 
sss_sscp_aead_update(sss_sscp_aead_t * context,const uint8_t * srcData,size_t srcLen,uint8_t destData,size_t * destLen)475 sss_status_t sss_sscp_aead_update(
476     sss_sscp_aead_t *context, const uint8_t *srcData, size_t srcLen, uint8_t destData, size_t *destLen)
477 {
478     return kStatus_SSS_Fail;
479 }
480 
sss_sscp_aead_finish(sss_sscp_aead_t * context,const uint8_t * srcData,size_t srcLen,uint8_t destData,size_t * destLen,uint8_t * tag,size_t * tagLen)481 sss_status_t sss_sscp_aead_finish(sss_sscp_aead_t *context,
482                                   const uint8_t *srcData,
483                                   size_t srcLen,
484                                   uint8_t destData,
485                                   size_t *destLen,
486                                   uint8_t *tag,
487                                   size_t *tagLen)
488 {
489     return kStatus_SSS_Fail;
490 }
491 
492 /********************************DIGEST****************************************/
sss_sscp_digest_context_init(sss_sscp_digest_t * context,sss_sscp_session_t * session,sss_algorithm_t algorithm,sss_mode_t mode)493 sss_status_t sss_sscp_digest_context_init(sss_sscp_digest_t *context,
494                                           sss_sscp_session_t *session,
495                                           sss_algorithm_t algorithm,
496                                           sss_mode_t mode)
497 {
498     SSCP_BUILD_ASSURE(sizeof(sss_digest_t) >= sizeof(sss_sscp_digest_t), _sss_sscp_digest_size);
499     sscp_operation_t op  = {0};
500     sscp_status_t status = kStatus_SSCP_Fail;
501     uint32_t ret         = 0u;
502     sss_status_t tmpStat = kStatus_SSS_Success;
503 
504     context->algorithm = algorithm;
505     context->mode      = mode;
506     context->session   = session;
507     switch (algorithm)
508     {
509         case kAlgorithm_SSS_SHA1:
510             context->digestFullLen = 20u;
511             break;
512         case kAlgorithm_SSS_SHA224:
513             context->digestFullLen = 28u;
514             break;
515         case kAlgorithm_SSS_SHA256:
516             context->digestFullLen = 32u;
517             break;
518         case kAlgorithm_SSS_SHA384:
519             context->digestFullLen = 48u;
520             break;
521         case kAlgorithm_SSS_SHA512:
522             context->digestFullLen = 64u;
523             break;
524         default:
525             tmpStat = kStatus_SSS_Fail;
526             break;
527     }
528 
529     if (tmpStat == kStatus_SSS_Fail)
530     {
531         return kStatus_SSS_Fail;
532     }
533 
534     op.paramTypes =
535         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None,
536                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
537 
538     op.params[0].context.ptr  = session;
539     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
540 
541     op.params[1].value.a = (uint32_t)algorithm;
542     op.params[1].value.b = (uint32_t)mode;
543 
544     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
545     op.resultCount            = 1u;
546     op.result[0].context.ptr  = context;
547     op.result[0].context.type = kSSCP_ParamContextType_SSS_Digest;
548 
549     sscp_context_t *sscpCtx = session->sscp;
550     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DigestContextInit, &op, &ret);
551 
552     if (status != kStatus_SSCP_Success)
553     {
554         ret = kStatus_SSS_Fail;
555     }
556     return (sss_status_t)ret;
557 }
558 
sss_sscp_digest_one_go(sss_sscp_digest_t * context,const uint8_t * message,size_t messageLen,uint8_t * digest,size_t * digestLen)559 sss_status_t sss_sscp_digest_one_go(
560     sss_sscp_digest_t *context, const uint8_t *message, size_t messageLen, uint8_t *digest, size_t *digestLen)
561 {
562     SSCP_BUILD_ASSURE(sizeof(sss_digest_t) >= sizeof(sss_sscp_digest_t), _sss_sscp_digest_size);
563     sscp_operation_t op  = {0};
564     sscp_status_t status = kStatus_SSCP_Fail;
565     uint32_t ret         = 0u;
566 
567     /* if the caller gives NULL pointer to digestLen, it is assumed that digest[] buffer is big enough to hold full
568      * digest */
569     size_t len = (digestLen != NULL) ? *digestLen : context->digestFullLen;
570 
571     /* if the *digestLen cannot hold full digest (per algorithm spec) return error */
572     if (len < context->digestFullLen)
573     {
574         return kStatus_SSS_Fail;
575     }
576 
577     op.paramTypes =
578         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInput,
579                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
580 
581     op.params[0].context.ptr  = context;
582     op.params[0].context.type = kSSCP_ParamContextType_SSS_Digest;
583 
584     op.params[1].memref.buffer = (uintptr_t)message;
585     op.params[1].memref.size   = messageLen;
586     op.params[2].memref.buffer = (uintptr_t)digest;
587     op.params[2].memref.size   = len;
588 
589     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
590     op.resultCount       = 1u;
591     op.result[0].value.a = (uint32_t)digestLen;
592 
593     sscp_context_t *sscpCtx = context->session->sscp;
594     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DigestOneGo, &op, &ret);
595     if (status != kStatus_SSCP_Success)
596     {
597         ret = kStatus_SSS_Fail;
598     }
599 
600     return (sss_status_t)ret;
601 }
602 
sss_sscp_digest_init(sss_sscp_digest_t * context)603 sss_status_t sss_sscp_digest_init(sss_sscp_digest_t *context)
604 {
605     sscp_operation_t op  = {0};
606     sscp_status_t status = kStatus_SSCP_Fail;
607     uint32_t ret         = 0u;
608 
609     op.paramTypes =
610         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
611                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
612 
613     op.params[0].context.ptr  = context;
614     op.params[0].context.type = kSSCP_ParamContextType_SSS_Digest;
615 
616     sscp_context_t *sscpCtx = context->session->sscp;
617     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DigestInit, &op, &ret);
618     if (status != kStatus_SSCP_Success)
619     {
620         ret = kStatus_SSS_Fail;
621     }
622 
623     return (sss_status_t)ret;
624 }
625 
sss_sscp_digest_update(sss_sscp_digest_t * context,uint8_t * message,size_t messageLen)626 sss_status_t sss_sscp_digest_update(sss_sscp_digest_t *context, uint8_t *message, size_t messageLen)
627 {
628     sscp_operation_t op  = {0};
629     sscp_status_t status = kStatus_SSCP_Fail;
630     uint32_t ret         = 0u;
631 
632     op.paramTypes =
633         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_None,
634                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
635 
636     op.params[0].context.ptr  = context;
637     op.params[0].context.type = kSSCP_ParamContextType_SSS_Digest;
638 
639     op.params[1].memref.buffer = (uintptr_t)message;
640     op.params[1].memref.size   = messageLen;
641 
642     sscp_context_t *sscpCtx = context->session->sscp;
643     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DigestUpdate, &op, &ret);
644     if (status != kStatus_SSCP_Success)
645     {
646         ret = kStatus_SSS_Fail;
647     }
648 
649     return (sss_status_t)ret;
650 }
651 
sss_sscp_digest_finish(sss_sscp_digest_t * context,uint8_t * digest,size_t * digestLen)652 sss_status_t sss_sscp_digest_finish(sss_sscp_digest_t *context, uint8_t *digest, size_t *digestLen)
653 {
654     sscp_operation_t op  = {0};
655     sscp_status_t status = kStatus_SSCP_Fail;
656     uint32_t ret         = 0u;
657 
658     /* if the caller gives NULL pointer to digestLen, it is assumed that digest[] buffer is big enough to hold full
659      * digest */
660     size_t len = (digestLen != NULL) ? *digestLen : context->digestFullLen;
661 
662     /* if the *digestLen cannot hold full digest (per algorithm spec) return error */
663     if (len < context->digestFullLen)
664     {
665         return kStatus_SSS_Fail;
666     }
667 
668     op.paramTypes =
669         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefOutput, kSSCP_ParamType_None,
670                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
671 
672     op.params[0].context.ptr  = context;
673     op.params[0].context.type = kSSCP_ParamContextType_SSS_Digest;
674 
675     op.params[1].memref.buffer = (uintptr_t)digest;
676     op.params[1].memref.size   = len;
677 
678     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
679     op.resultCount       = 1u;
680     op.result[0].value.a = (uint32_t)digestLen;
681 
682     sscp_context_t *sscpCtx = context->session->sscp;
683     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DigestFinish, &op, &ret);
684     if (status != kStatus_SSCP_Success)
685     {
686         if (digestLen != NULL)
687         {
688             *digestLen = 0u;
689         }
690         return kStatus_SSS_Fail;
691     }
692 
693     /* the size member of kSSCP_ParamType_MemrefOutput param is updated with the actual byte length written to output
694      * buffer
695      */
696     if (digestLen != NULL)
697     {
698         *digestLen = op.params[1].memref.size;
699     }
700 
701     return (sss_status_t)ret;
702 }
703 
sss_sscp_digest_context_free(sss_sscp_digest_t * context)704 sss_status_t sss_sscp_digest_context_free(sss_sscp_digest_t *context)
705 {
706     sscp_operation_t op  = {0};
707     sscp_status_t status = kStatus_SSCP_Fail;
708     uint32_t ret         = 0u;
709 
710     op.paramTypes =
711         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
712                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
713 
714     op.params[0].context.ptr  = context;
715     op.params[0].context.type = kSSCP_ParamContextType_SSS_Digest;
716 
717     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
718     op.resultCount = 0u;
719 
720     sscp_context_t *sscpCtx = context->session->sscp;
721     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
722     if (status != kStatus_SSCP_Success)
723     {
724         ret = kStatus_SSS_Fail;
725     }
726     return (sss_status_t)ret;
727 }
728 
729 /***********************************MAC****************************************/
sss_sscp_mac_context_init(sss_sscp_mac_t * context,sss_sscp_session_t * session,sss_sscp_object_t * keyObject,sss_algorithm_t algorithm,sss_mode_t mode)730 sss_status_t sss_sscp_mac_context_init(sss_sscp_mac_t *context,
731                                        sss_sscp_session_t *session,
732                                        sss_sscp_object_t *keyObject,
733                                        sss_algorithm_t algorithm,
734                                        sss_mode_t mode)
735 {
736     SSCP_BUILD_ASSURE(sizeof(sss_mac_t) >= sizeof(sss_sscp_mac_t), _sss_sscp_mac_size);
737     sscp_operation_t op  = {0};
738     sscp_status_t status = kStatus_SSCP_Fail;
739     uint32_t ret         = 0u;
740 
741     context->algorithm = algorithm;
742     context->mode      = mode;
743     context->session   = session;
744     context->keyObject = keyObject;
745 
746     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
747                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
748                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
749 
750     op.params[0].context.ptr  = session;
751     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
752 
753     op.params[1].context.ptr  = keyObject;
754     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
755 
756     op.params[2].value.a = (uint32_t)algorithm;
757     op.params[2].value.b = (uint32_t)mode;
758 
759     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
760     op.resultCount            = 1u;
761     op.result[0].context.ptr  = context;
762     op.result[0].context.type = kSSCP_ParamContextType_SSS_Mac;
763 
764     sscp_context_t *sscpCtx = session->sscp;
765     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_MacContextInit, &op, &ret);
766     if (status != kStatus_SSCP_Success)
767     {
768         ret = kStatus_SSS_Fail;
769     }
770     return (sss_status_t)ret;
771 }
772 
sss_sscp_mac_one_go(sss_sscp_mac_t * context,const uint8_t * message,size_t messageLen,uint8_t * mac,size_t * macLen)773 sss_status_t sss_sscp_mac_one_go(
774     sss_sscp_mac_t *context, const uint8_t *message, size_t messageLen, uint8_t *mac, size_t *macLen)
775 {
776     SSCP_BUILD_ASSURE(sizeof(sss_mac_t) >= sizeof(sss_sscp_mac_t), _sss_sscp_mac_size);
777     sscp_operation_t op  = {0};
778     sscp_status_t status = kStatus_SSCP_Fail;
779     uint32_t ret         = 0u;
780     size_t macSize       = (macLen != NULL) ? *macLen : 0u;
781 
782     op.paramTypes =
783         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInOut,
784                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
785 
786     op.params[0].context.ptr  = context;
787     op.params[0].context.type = kSSCP_ParamContextType_SSS_Mac;
788 
789     op.params[1].memref.buffer = (uintptr_t)message;
790     op.params[1].memref.size   = messageLen;
791     op.params[2].memref.buffer = (uintptr_t)mac;
792     op.params[2].memref.size   = macSize;
793 
794     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
795     op.resultCount       = 1u;
796     op.result[0].value.a = (uint32_t)macLen;
797 
798     sscp_context_t *sscpCtx = context->session->sscp;
799     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_MacOneGo, &op, &ret);
800     if (status != kStatus_SSCP_Success)
801     {
802         if (macLen != NULL)
803         {
804             *macLen = 0u;
805         }
806         ret = kStatus_SSS_Fail;
807     }
808     return (sss_status_t)ret;
809 }
810 
sss_sscp_mac_init(sss_sscp_mac_t * context)811 sss_status_t sss_sscp_mac_init(sss_sscp_mac_t *context)
812 {
813     sscp_operation_t op  = {0};
814     sscp_status_t status = kStatus_SSCP_Fail;
815     uint32_t ret         = 0u;
816 
817     op.paramTypes =
818         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
819                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
820 
821     op.params[0].context.ptr  = context;
822     op.params[0].context.type = kSSCP_ParamContextType_SSS_Mac;
823 
824     sscp_context_t *sscpCtx = context->session->sscp;
825     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_MacInit, &op, &ret);
826     if (status != kStatus_SSCP_Success)
827     {
828         ret = kStatus_SSS_Fail;
829     }
830 
831     return (sss_status_t)ret;
832 }
833 
sss_sscp_mac_update(sss_sscp_mac_t * context,const uint8_t * message,size_t messageLen)834 sss_status_t sss_sscp_mac_update(sss_sscp_mac_t *context, const uint8_t *message, size_t messageLen)
835 {
836     sscp_operation_t op  = {0};
837     sscp_status_t status = kStatus_SSCP_Fail;
838     uint32_t ret         = 0u;
839 
840     op.paramTypes =
841         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_None,
842                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
843 
844     op.params[0].context.ptr  = context;
845     op.params[0].context.type = kSSCP_ParamContextType_SSS_Mac;
846 
847     op.params[1].memref.buffer = (uintptr_t)message;
848     op.params[1].memref.size   = messageLen;
849 
850     sscp_context_t *sscpCtx = context->session->sscp;
851     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_MacUpdate, &op, &ret);
852     if (status != kStatus_SSCP_Success)
853     {
854         ret = kStatus_SSS_Fail;
855     }
856 
857     return (sss_status_t)ret;
858 }
859 
sss_sscp_mac_finish(sss_sscp_mac_t * context,uint8_t * mac,size_t * macLen)860 sss_status_t sss_sscp_mac_finish(sss_sscp_mac_t *context, uint8_t *mac, size_t *macLen)
861 {
862     sscp_operation_t op  = {0};
863     sscp_status_t status = kStatus_SSCP_Fail;
864     uint32_t ret         = 0u;
865     size_t macSize       = (macLen != NULL) ? *macLen : 0u;
866 
867     op.paramTypes =
868         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefOutput, kSSCP_ParamType_None,
869                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
870 
871     op.params[0].context.ptr  = context;
872     op.params[0].context.type = kSSCP_ParamContextType_SSS_Mac;
873 
874     op.params[1].memref.buffer = (uintptr_t)mac;
875     op.params[1].memref.size   = macSize;
876 
877     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
878     op.resultCount       = 1u;
879     op.result[0].value.a = (uint32_t)macLen;
880 
881     sscp_context_t *sscpCtx = context->session->sscp;
882     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_MacFinish, &op, &ret);
883     if (status != kStatus_SSCP_Success)
884     {
885         if (macLen != NULL)
886         {
887             *macLen = 0u;
888         }
889         ret = kStatus_SSS_Fail;
890     }
891     return (sss_status_t)ret;
892 }
893 
sss_sscp_mac_context_free(sss_sscp_mac_t * context)894 sss_status_t sss_sscp_mac_context_free(sss_sscp_mac_t *context)
895 {
896     sscp_operation_t op  = {0};
897     sscp_status_t status = kStatus_SSCP_Fail;
898     uint32_t ret         = 0u;
899 
900     op.paramTypes =
901         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
902                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
903 
904     op.params[0].context.ptr  = context;
905     op.params[0].context.type = kSSCP_ParamContextType_SSS_Mac;
906 
907     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
908     op.resultCount = 0u;
909 
910     sscp_context_t *sscpCtx = context->session->sscp;
911     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
912     if (status != kStatus_SSCP_Success)
913     {
914         ret = kStatus_SSS_Fail;
915     }
916     return (sss_status_t)ret;
917 }
918 
919 /*******************************ASYMETRIC**************************************/
sss_sscp_asymmetric_context_init(sss_sscp_asymmetric_t * context,sss_sscp_session_t * session,sss_sscp_object_t * keyObject,sss_algorithm_t algorithm,sss_mode_t mode)920 sss_status_t sss_sscp_asymmetric_context_init(sss_sscp_asymmetric_t *context,
921                                               sss_sscp_session_t *session,
922                                               sss_sscp_object_t *keyObject,
923                                               sss_algorithm_t algorithm,
924                                               sss_mode_t mode)
925 {
926     SSCP_BUILD_ASSURE(sizeof(sss_digest_t) >= sizeof(sss_sscp_digest_t), _sss_sscp_digest_size);
927     sscp_operation_t op  = {0};
928     sscp_status_t status = kStatus_SSCP_Fail;
929     uint32_t ret         = 0u;
930 
931     context->session   = session;
932     context->keyObject = keyObject;
933     context->mode      = mode;
934     context->algorithm = algorithm;
935 
936     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
937                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
938                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
939 
940     op.params[0].context.ptr  = session;
941     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
942 
943     op.params[1].context.ptr  = keyObject;
944     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
945 
946     op.params[2].value.a = (uint32_t)algorithm;
947     op.params[2].value.b = (uint32_t)mode;
948 
949     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
950     op.resultCount            = 1u;
951     op.result[0].context.ptr  = context;
952     op.result[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
953 
954     sscp_context_t *sscpCtx = session->sscp;
955     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymetricContextInit, &op, &ret);
956     if (status != kStatus_SSCP_Success)
957     {
958         ret = kStatus_SSS_Fail;
959     }
960     return (sss_status_t)ret;
961 }
962 
sss_sscp_asymmetric_encrypt(sss_sscp_asymmetric_t * context,const uint8_t * srcData,size_t srcLen,uint8_t * destData,size_t * destLen)963 sss_status_t sss_sscp_asymmetric_encrypt(
964     sss_sscp_asymmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen)
965 {
966     SSCP_BUILD_ASSURE(sizeof(sss_asymmetric_t) >= sizeof(sss_sscp_asymmetric_t), _sss_sscp_asymmetric_size);
967     sscp_operation_t op  = {0};
968     sscp_status_t status = kStatus_SSCP_Fail;
969     uint32_t ret         = 0u;
970 
971     /* if the caller gives NULL pointer to signatureLen, it is assumed that signature[] buffer is big enough to hold
972      * full
973      * signature */
974     size_t len = (destLen != NULL) ? *destLen : 0u;
975 
976     /* if the *signatureLen cannot hold full signature (per algorithm spec) return error */
977     if (len < context->signatureFullLen)
978     {
979         return kStatus_SSS_Fail;
980     }
981 
982     op.paramTypes =
983         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput,
984                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
985 
986     op.params[0].context.ptr  = context;
987     op.params[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
988 
989     op.params[1].memref.buffer = (uintptr_t)srcData;
990     op.params[1].memref.size   = srcLen;
991     op.params[2].memref.buffer = (uintptr_t)destData;
992     op.params[2].memref.size   = len;
993 
994     sscp_context_t *sscpCtx = context->session->sscp;
995     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymmetricEncrypt, &op, &ret);
996     if (status != kStatus_SSCP_Success)
997     {
998         return kStatus_SSS_Fail;
999     }
1000 
1001     /* the size member of kSSCP_ParamType_MemrefOutput param is updated with the actual byte length written to output
1002      * buffer
1003      */
1004     if (destLen != NULL)
1005     {
1006         *destLen = op.params[2].memref.size;
1007     }
1008 
1009     return (sss_status_t)ret;
1010 }
1011 
sss_sscp_asymmetric_decrypt(sss_sscp_asymmetric_t * context,const uint8_t * srcData,size_t srcLen,uint8_t * destData,size_t * destLen)1012 sss_status_t sss_sscp_asymmetric_decrypt(
1013     sss_sscp_asymmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen)
1014 {
1015     SSCP_BUILD_ASSURE(sizeof(sss_asymmetric_t) >= sizeof(sss_sscp_asymmetric_t), _sss_sscp_asymmetric_size);
1016     sscp_operation_t op  = {0};
1017     sscp_status_t status = kStatus_SSCP_Fail;
1018     uint32_t ret         = 0u;
1019 
1020     /* if the caller gives NULL pointer to signatureLen, it is assumed that signature[] buffer is big enough to hold
1021      * full
1022      * signature */
1023     size_t len = (destLen != NULL) ? *destLen : 0u;
1024 
1025     /* if the *signatureLen cannot hold full signature (per algorithm spec) return error */
1026     if (len < context->signatureFullLen)
1027     {
1028         return kStatus_SSS_Fail;
1029     }
1030 
1031     op.paramTypes =
1032         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput,
1033                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1034 
1035     op.params[0].context.ptr  = context;
1036     op.params[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
1037 
1038     op.params[1].memref.buffer = (uintptr_t)srcData;
1039     op.params[1].memref.size   = srcLen;
1040     op.params[2].memref.buffer = (uintptr_t)destData;
1041     op.params[2].memref.size   = len;
1042 
1043     sscp_context_t *sscpCtx = context->session->sscp;
1044     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymmetricDecrypt, &op, &ret);
1045     if (status != kStatus_SSCP_Success)
1046     {
1047         return kStatus_SSS_Fail;
1048     }
1049 
1050     /* the size member of kSSCP_ParamType_MemrefOutput param is updated with the actual byte length written to output
1051      * buffer
1052      */
1053     if (destLen != NULL)
1054     {
1055         *destLen = op.params[2].memref.size;
1056     }
1057 
1058     return (sss_status_t)ret;
1059 }
1060 
sss_sscp_asymmetric_sign_digest(sss_sscp_asymmetric_t * context,uint8_t * digest,size_t digestLen,uint8_t * signature,size_t * signatureLen)1061 sss_status_t sss_sscp_asymmetric_sign_digest(
1062     sss_sscp_asymmetric_t *context, uint8_t *digest, size_t digestLen, uint8_t *signature, size_t *signatureLen)
1063 {
1064     SSCP_BUILD_ASSURE(sizeof(sss_asymmetric_t) >= sizeof(sss_sscp_asymmetric_t), _sss_sscp_asymmetric_size);
1065     sscp_operation_t op  = {0};
1066     sscp_status_t status = kStatus_SSCP_Fail;
1067     uint32_t ret         = 0u;
1068 
1069     /* if the caller gives NULL pointer to signatureLen, it is assumed that signature[] buffer is big enough to hold
1070      * full
1071      * signature */
1072     /*size_t len = (signatureLen != NULL) ? *signatureLen : context->signatureFullLen;*/
1073 
1074     /* if the *signatureLen cannot hold full signature (per algorithm spec) return error */
1075     /*if (len < context->signatureFullLen)
1076     {
1077         return kStatus_SSS_Fail;
1078     }*/
1079 
1080     op.paramTypes =
1081         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefOutput,
1082                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1083 
1084     op.params[0].context.ptr  = context;
1085     op.params[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
1086 
1087     op.params[1].memref.buffer = (uintptr_t)digest;
1088     op.params[1].memref.size   = digestLen;
1089     op.params[2].memref.buffer = (uintptr_t)signature;
1090     op.params[2].memref.size   = *signatureLen;
1091 
1092     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
1093     op.resultCount       = 1u;
1094     op.result[0].value.a = (uint32_t)signatureLen;
1095 
1096     sscp_context_t *sscpCtx = context->session->sscp;
1097     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymmetricSignDigest, &op, &ret);
1098     if (status != kStatus_SSCP_Success)
1099     {
1100         ret = kStatus_SSS_Fail;
1101     }
1102     return (sss_status_t)ret;
1103 }
1104 
sss_sscp_asymmetric_verify_digest(sss_sscp_asymmetric_t * context,uint8_t * digest,size_t digestLen,uint8_t * signature,size_t signatureLen)1105 sss_status_t sss_sscp_asymmetric_verify_digest(
1106     sss_sscp_asymmetric_t *context, uint8_t *digest, size_t digestLen, uint8_t *signature, size_t signatureLen)
1107 {
1108     sscp_operation_t op  = {0};
1109     sscp_status_t status = kStatus_SSCP_Fail;
1110     uint32_t ret         = 0u;
1111 
1112     op.paramTypes =
1113         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_MemrefInput,
1114                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1115 
1116     op.params[0].context.ptr  = context;
1117     op.params[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
1118 
1119     /* common function parameters */
1120     op.params[1].memref.buffer = (uintptr_t)digest;
1121     op.params[1].memref.size   = digestLen;
1122     op.params[2].memref.buffer = (uintptr_t)signature;
1123     op.params[2].memref.size   = signatureLen;
1124 
1125     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1126     op.resultCount = 0u;
1127 
1128     sscp_context_t *sscpCtx = context->session->sscp;
1129     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymmetricVerifyDigest, &op, &ret);
1130     if (status != kStatus_SSCP_Success)
1131     {
1132         return kStatus_SSS_Fail;
1133     }
1134 
1135     return (sss_status_t)ret;
1136 }
1137 
sss_sscp_asymmetric_context_free(sss_sscp_asymmetric_t * context)1138 sss_status_t sss_sscp_asymmetric_context_free(sss_sscp_asymmetric_t *context)
1139 {
1140     sscp_operation_t op  = {0};
1141     sscp_status_t status = kStatus_SSCP_Fail;
1142     uint32_t ret         = 0u;
1143 
1144     op.paramTypes =
1145         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1146                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1147 
1148     op.params[0].context.ptr  = context;
1149     op.params[0].context.type = kSSCP_ParamContextType_SSS_Asymmetric;
1150 
1151     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1152     op.resultCount = 0u;
1153 
1154     sscp_context_t *sscpCtx = context->session->sscp;
1155     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
1156     if (status != kStatus_SSCP_Success)
1157     {
1158         return kStatus_SSS_Fail;
1159     }
1160     return (sss_status_t)ret;
1161 }
1162 
1163 /********************************TUNNEL****************************************/
sss_sscp_tunnel_context_init(sss_sscp_tunnel_t * context,sss_sscp_session_t * session,uint32_t tunnelType)1164 sss_status_t sss_sscp_tunnel_context_init(sss_sscp_tunnel_t *context, sss_sscp_session_t *session, uint32_t tunnelType)
1165 {
1166     SSCP_BUILD_ASSURE(sizeof(sss_tunnel_t) >= sizeof(sss_sscp_tunnel_t), _sss_sscp_tunnel_size);
1167     sscp_operation_t op  = {0};
1168     sscp_status_t status = kStatus_SSCP_Fail;
1169     uint32_t ret         = 0u;
1170 
1171     context->session    = session;
1172     context->tunnelType = tunnelType;
1173 
1174     op.paramTypes =
1175         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
1176                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1177 
1178     op.params[0].context.ptr  = session;
1179     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
1180 
1181     op.params[1].value.a = tunnelType;
1182 
1183     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
1184     op.resultCount            = 1u;
1185     op.result[0].context.ptr  = context;
1186     op.result[0].context.type = kSSCP_ParamContextType_SSS_Tunnel;
1187 
1188     sscp_context_t *sscpCtx = context->session->sscp;
1189     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_TunnelContextInit, &op, &ret);
1190 
1191     if (status != kStatus_SSCP_Success)
1192     {
1193         return kStatus_SSS_Fail;
1194     }
1195 
1196     return (sss_status_t)ret;
1197 }
1198 
sss_sscp_tunnel(sss_sscp_tunnel_t * context,uint8_t * data,size_t dataLen,uint32_t * resultState)1199 sss_status_t sss_sscp_tunnel(sss_sscp_tunnel_t *context, uint8_t *data, size_t dataLen, uint32_t *resultState)
1200 {
1201     SSCP_BUILD_ASSURE(sizeof(sss_tunnel_t) >= sizeof(sss_sscp_tunnel_t), _sss_sscp_tunnel_size);
1202     sscp_operation_t op  = {0};
1203     sscp_status_t status = kStatus_SSCP_Fail;
1204     uint32_t ret         = 0u;
1205 
1206     if ((context->tunnelType & SSS_SSCP_TUNNEL_HAVE_BUFFER_MASK) == SSS_SSCP_TUNNEL_HAVE_BUFFER_MASK)
1207     {
1208         op.paramTypes              = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput,
1209                                                        kSSCP_ParamType_MemrefInput, kSSCP_ParamType_None, kSSCP_ParamType_None,
1210                                                        kSSCP_ParamType_None, kSSCP_ParamType_None);
1211         op.params[2].memref.buffer = (uintptr_t)context->buffer;
1212         op.params[2].memref.size   = context->bufferSize;
1213     }
1214     else
1215     {
1216         op.paramTypes =
1217             SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput, kSSCP_ParamType_None,
1218                               kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1219     }
1220 
1221     op.params[0].context.ptr  = context;
1222     op.params[0].context.type = kSSCP_ParamContextType_SSS_Tunnel;
1223 
1224     op.params[1].memref.buffer = (uintptr_t)data;
1225     op.params[1].memref.size   = dataLen;
1226 
1227     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
1228     op.resultCount       = 1u;
1229     op.result[0].value.a = (uint32_t)resultState;
1230 
1231     sscp_context_t *sscpCtx = context->session->sscp;
1232     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_Tunnel, &op, &ret);
1233     if (status != kStatus_SSCP_Success)
1234     {
1235         return kStatus_SSS_Fail;
1236     }
1237 
1238     return (sss_status_t)ret;
1239 }
1240 
sss_sscp_tunnel_context_free(sss_sscp_tunnel_t * context)1241 sss_status_t sss_sscp_tunnel_context_free(sss_sscp_tunnel_t *context)
1242 {
1243     sscp_operation_t op  = {0};
1244     sscp_status_t status = kStatus_SSCP_Fail;
1245     uint32_t ret         = 0u;
1246 
1247     op.paramTypes =
1248         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1249                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1250 
1251     op.params[0].context.ptr  = context;
1252     op.params[0].context.type = kSSCP_ParamContextType_SSS_Tunnel;
1253 
1254     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1255     op.resultCount = 0u;
1256 
1257     sscp_context_t *sscpCtx = context->session->sscp;
1258     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
1259     if (status != kStatus_SSCP_Success)
1260     {
1261         return kStatus_SSS_Fail;
1262     }
1263     return (sss_status_t)ret;
1264 }
1265 
1266 /*******************************DERIVEKEY**************************************/
sss_sscp_derive_key_context_init(sss_sscp_derive_key_t * context,sss_sscp_session_t * session,sss_sscp_object_t * keyObject,sss_algorithm_t algorithm,sss_mode_t mode)1267 sss_status_t sss_sscp_derive_key_context_init(sss_sscp_derive_key_t *context,
1268                                               sss_sscp_session_t *session,
1269                                               sss_sscp_object_t *keyObject,
1270                                               sss_algorithm_t algorithm,
1271                                               sss_mode_t mode)
1272 {
1273     sscp_operation_t op  = {0};
1274     sscp_status_t status = kStatus_SSCP_Fail;
1275     uint32_t ret         = 0u;
1276 
1277     context->algorithm = algorithm;
1278     context->mode      = mode;
1279     context->session   = session;
1280     context->keyObject = keyObject;
1281 
1282     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1283                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_None, kSSCP_ParamType_None,
1284                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
1285 
1286     op.params[0].context.ptr  = session;
1287     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
1288 
1289     op.params[1].context.ptr  = keyObject;
1290     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1291 
1292     op.params[2].value.a = (uint32_t)algorithm;
1293     op.params[2].value.b = (uint32_t)mode;
1294 
1295     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
1296     op.resultCount            = 1u;
1297     op.result[0].context.ptr  = context;
1298     op.result[0].context.type = kSSCP_ParamContextType_SSS_DeriveKey;
1299 
1300     sscp_context_t *sscpCtx = context->session->sscp;
1301     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DeriveKeyContextInit, &op, &ret);
1302     if (status != kStatus_SSCP_Success)
1303     {
1304         return kStatus_SSS_Fail;
1305     }
1306 
1307     return (sss_status_t)ret;
1308 }
1309 
sss_sscp_derive_key(sss_sscp_derive_key_t * context,const uint8_t * saltData,size_t saltLen,sss_sscp_object_t * derivedKeyObject)1310 sss_status_t sss_sscp_derive_key(sss_sscp_derive_key_t *context,
1311                                  const uint8_t *saltData,
1312                                  size_t saltLen,
1313                                  sss_sscp_object_t *derivedKeyObject)
1314 {
1315     sscp_operation_t op  = {0};
1316     sscp_status_t status = kStatus_SSCP_Fail;
1317     uint32_t ret         = 0u;
1318 
1319     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInput,
1320                                       kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1321                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
1322 
1323     op.params[0].context.ptr  = context;
1324     op.params[0].context.type = kSSCP_ParamContextType_SSS_DeriveKey;
1325 
1326     op.params[1].memref.buffer = (uintptr_t)saltData;
1327     op.params[1].memref.size   = saltLen;
1328 
1329     op.params[2].context.ptr  = derivedKeyObject;
1330     op.params[2].context.type = kSSCP_ParamContextType_SSS_Object;
1331 
1332     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1333     op.resultCount = 1u;
1334 
1335     sscp_context_t *sscpCtx = context->session->sscp;
1336     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_DeriveKey, &op, &ret);
1337     if (status != kStatus_SSCP_Success)
1338     {
1339         return kStatus_SSS_Fail;
1340     }
1341 
1342     return (sss_status_t)ret;
1343 }
1344 
sss_sscp_asymmetric_dh_derive_key(sss_sscp_derive_key_t * context,sss_sscp_object_t * otherPartyKeyObject,sss_sscp_object_t * derivedKeyObject)1345 sss_status_t sss_sscp_asymmetric_dh_derive_key(sss_sscp_derive_key_t *context,
1346                                                sss_sscp_object_t *otherPartyKeyObject,
1347                                                sss_sscp_object_t *derivedKeyObject)
1348 {
1349     SSCP_BUILD_ASSURE(sizeof(sss_derive_key_t) >= sizeof(sss_sscp_derive_key_t), _sss_sscp_derive_key_size);
1350     sscp_operation_t op  = {0};
1351     sscp_status_t status = kStatus_SSCP_Fail;
1352     uint32_t ret         = 0u;
1353 
1354     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1355                                       kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1356                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
1357 
1358     op.params[0].context.ptr  = context;
1359     op.params[0].context.type = kSSCP_ParamContextType_SSS_DeriveKey;
1360 
1361     op.params[1].context.ptr  = otherPartyKeyObject;
1362     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1363 
1364     op.params[2].context.ptr  = derivedKeyObject;
1365     op.params[2].context.type = kSSCP_ParamContextType_SSS_Object;
1366 
1367     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1368     op.resultCount = 1u;
1369 
1370     sscp_context_t *sscpCtx = context->session->sscp;
1371     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_AsymmetricDeriveKey, &op, &ret);
1372     if (status != kStatus_SSCP_Success)
1373     {
1374         return kStatus_SSS_Fail;
1375     }
1376 
1377     return (sss_status_t)ret;
1378 }
1379 
sss_sscp_derive_key_context_free(sss_sscp_derive_key_t * context)1380 sss_status_t sss_sscp_derive_key_context_free(sss_sscp_derive_key_t *context)
1381 {
1382     sscp_operation_t op  = {0};
1383     sscp_status_t status = kStatus_SSCP_Fail;
1384     uint32_t ret         = 0u;
1385 
1386     op.paramTypes =
1387         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1388                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1389 
1390     op.params[0].context.ptr  = context;
1391     op.params[0].context.type = kSSCP_ParamContextType_SSS_DeriveKey;
1392 
1393     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1394     op.resultCount = 0u;
1395 
1396     sscp_context_t *sscpCtx = context->session->sscp;
1397     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_ContextFree, &op, &ret);
1398     if (status != kStatus_SSCP_Success)
1399     {
1400         return kStatus_SSS_Fail;
1401     }
1402     return (sss_status_t)ret;
1403 }
1404 
1405 /*******************************KEYSTORE***************************************/
sss_sscp_key_store_init(sss_sscp_key_store_t * keyStore,sss_sscp_session_t * session)1406 sss_status_t sss_sscp_key_store_init(sss_sscp_key_store_t *keyStore, sss_sscp_session_t *session)
1407 {
1408     SSCP_BUILD_ASSURE(sizeof(sss_key_store_t) >= sizeof(sss_sscp_key_store_t), _sss_sscp_key_store_size);
1409     sscp_operation_t op  = {0};
1410     sscp_status_t status = kStatus_SSCP_Fail;
1411     uint32_t ret         = 0u;
1412 
1413     keyStore->session    = session;
1414     keyStore->keyStoreId = 0u;
1415 
1416     op.paramTypes =
1417         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
1418                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1419 
1420     op.params[0].context.ptr  = session;
1421     op.params[0].context.type = kSSCP_ParamContextType_SSS_Session;
1422 
1423     op.params[1].value.a = keyStore->keyStoreId;
1424 
1425     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
1426     op.resultCount            = 1u;
1427     op.result[0].context.ptr  = keyStore;
1428     op.result[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1429 
1430     sscp_context_t *sscpCtx = keyStore->session->sscp;
1431     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreContextInit, &op, &ret);
1432     if (status != kStatus_SSCP_Success)
1433     {
1434         return kStatus_SSS_Fail;
1435     }
1436 
1437     return (sss_status_t)ret;
1438 }
1439 
sss_sscp_key_store_set_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject,const uint8_t * data,size_t dataLen,uint32_t keyBitLen,sss_key_part_t keyPart)1440 sss_status_t sss_sscp_key_store_set_key(sss_sscp_key_store_t *keyStore,
1441                                         sss_sscp_object_t *keyObject,
1442                                         const uint8_t *data,
1443                                         size_t dataLen,
1444                                         uint32_t keyBitLen,
1445                                         sss_key_part_t keyPart)
1446 {
1447     sscp_operation_t op  = {0};
1448     sscp_status_t status = kStatus_SSCP_Fail;
1449     uint32_t ret         = 0u;
1450 
1451     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1452                                       kSSCP_ParamType_MemrefInput, kSSCP_ParamType_ValueInputTuple,
1453                                       kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1454 
1455     op.params[0].context.ptr  = keyStore;
1456     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1457 
1458     op.params[1].context.ptr  = keyObject;
1459     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1460 
1461     op.params[2].memref.buffer = (uintptr_t)data;
1462     op.params[2].memref.size   = dataLen;
1463 
1464     op.params[3].value.a = keyBitLen;
1465     op.params[3].value.b = keyPart;
1466 
1467     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1468     op.resultCount = 0u;
1469 
1470     sscp_context_t *sscpCtx = keyStore->session->sscp;
1471     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreSetKey, &op, &ret);
1472     if (status != kStatus_SSCP_Success)
1473     {
1474         return kStatus_SSS_Fail;
1475     }
1476 
1477     return (sss_status_t)ret;
1478 }
1479 
sss_sscp_key_store_get_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject,uint8_t * data,size_t * dataLen,size_t * pKeyBitLen,sss_key_part_t keyPart)1480 sss_status_t sss_sscp_key_store_get_key(sss_sscp_key_store_t *keyStore,
1481                                         sss_sscp_object_t *keyObject,
1482                                         uint8_t *data,
1483                                         size_t *dataLen,
1484                                         size_t *pKeyBitLen,
1485                                         sss_key_part_t keyPart)
1486 {
1487     sscp_operation_t op  = {0};
1488     sscp_status_t status = kStatus_SSCP_Fail;
1489     uint32_t ret         = 0u;
1490 
1491     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1492                                       kSSCP_ParamType_MemrefOutput, kSSCP_ParamType_MemrefOutputNoSize,
1493                                       kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None, kSSCP_ParamType_None);
1494 
1495     op.params[0].context.ptr  = keyStore;
1496     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1497 
1498     op.params[1].context.ptr  = keyObject;
1499     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1500 
1501     op.params[2].memref.buffer = (uintptr_t)data;
1502     op.params[2].memref.size   = *dataLen;
1503 
1504     op.params[3].memref.buffer = (uintptr_t)pKeyBitLen;
1505 
1506     op.params[4].value.a = keyPart;
1507 
1508     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
1509     op.resultCount       = 1u;
1510     op.result[0].value.a = (uint32_t)dataLen;
1511 
1512     sscp_context_t *sscpCtx = keyStore->session->sscp;
1513     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreGetKey, &op, &ret);
1514     if (status != kStatus_SSCP_Success)
1515     {
1516         return kStatus_SSS_Fail;
1517     }
1518 
1519     return (sss_status_t)ret;
1520 }
1521 
sss_sscp_key_store_import_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject,const uint8_t * data,size_t dataLen,uint32_t keyBitLen,sss_sscp_blob_type_t blobType)1522 sss_status_t sss_sscp_key_store_import_key(sss_sscp_key_store_t *keyStore,
1523                                            sss_sscp_object_t *keyObject,
1524                                            const uint8_t *data,
1525                                            size_t dataLen,
1526                                            uint32_t keyBitLen,
1527                                            sss_sscp_blob_type_t blobType)
1528 {
1529     sscp_operation_t op  = {0};
1530     sscp_status_t status = kStatus_SSCP_Fail;
1531     uint32_t ret         = 0u;
1532 
1533     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1534                                       kSSCP_ParamType_MemrefInput, kSSCP_ParamType_ValueInputSingle,
1535                                       kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1536 
1537     op.params[0].context.ptr  = keyStore;
1538     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1539 
1540     op.params[1].context.ptr  = keyObject;
1541     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1542 
1543     op.params[2].memref.buffer = (uintptr_t)data;
1544     op.params[2].memref.size   = dataLen;
1545 
1546     op.params[3].value.a = blobType;
1547 
1548     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1549     op.resultCount = 0u;
1550 
1551     sscp_context_t *sscpCtx = keyStore->session->sscp;
1552     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreImportKey, &op, &ret);
1553     if (status != kStatus_SSCP_Success)
1554     {
1555         return kStatus_SSS_Fail;
1556     }
1557 
1558     return (sss_status_t)ret;
1559 }
1560 
sss_sscp_key_store_export_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject,uint8_t * data,size_t * dataLen,sss_sscp_blob_type_t blobType)1561 sss_status_t sss_sscp_key_store_export_key(sss_sscp_key_store_t *keyStore,
1562                                            sss_sscp_object_t *keyObject,
1563                                            uint8_t *data,
1564                                            size_t *dataLen,
1565                                            sss_sscp_blob_type_t blobType)
1566 {
1567     sscp_operation_t op  = {0};
1568     sscp_status_t status = kStatus_SSCP_Fail;
1569     uint32_t ret         = 0u;
1570 
1571     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1572                                       kSSCP_ParamType_MemrefOutput, kSSCP_ParamType_ValueInputSingle,
1573                                       kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1574 
1575     op.params[0].context.ptr  = keyStore;
1576     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1577 
1578     op.params[1].context.ptr  = keyObject;
1579     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1580 
1581     op.params[2].memref.buffer = (uintptr_t)data;
1582     op.params[2].memref.size   = *dataLen;
1583 
1584     op.params[3].value.a = blobType;
1585 
1586     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
1587     op.resultCount       = 1u;
1588     op.result[0].value.a = (uint32_t)dataLen;
1589 
1590     sscp_context_t *sscpCtx = keyStore->session->sscp;
1591     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreExportKey, &op, &ret);
1592     if (status != kStatus_SSCP_Success)
1593     {
1594         return kStatus_SSS_Fail;
1595     }
1596 
1597     return (sss_status_t)ret;
1598 }
1599 
sss_sscp_key_store_open_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject)1600 sss_status_t sss_sscp_key_store_open_key(sss_sscp_key_store_t *keyStore, sss_sscp_object_t *keyObject)
1601 {
1602     sscp_operation_t op  = {0};
1603     sscp_status_t status = kStatus_SSCP_Fail;
1604     uint32_t ret         = 0u;
1605 
1606     op.paramTypes =
1607         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference, kSSCP_ParamType_None,
1608                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1609 
1610     op.params[0].context.ptr  = keyStore;
1611     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1612 
1613     op.params[1].context.ptr  = keyObject;
1614     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1615 
1616     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1617     op.resultCount = 0u;
1618 
1619     sscp_context_t *sscpCtx = keyStore->session->sscp;
1620     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreOpenKey, &op, &ret);
1621     if (status != kStatus_SSCP_Success)
1622     {
1623         return kStatus_SSS_Fail;
1624     }
1625 
1626     return (sss_status_t)ret;
1627 }
1628 
sss_sscp_key_store_open_internal_key(sss_sscp_key_store_t * keyStore,sss_internal_keyID_t keyID)1629 sss_status_t sss_sscp_key_store_open_internal_key(sss_sscp_key_store_t *keyStore, sss_internal_keyID_t keyID)
1630 {
1631     sscp_operation_t op  = {0};
1632     sscp_status_t status = kStatus_SSCP_Fail;
1633     uint32_t ret         = 0u;
1634 
1635     op.paramTypes =
1636         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
1637                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1638 
1639     op.params[0].context.ptr  = keyStore;
1640     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1641 
1642     op.params[1].value.a = keyID;
1643 
1644     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1645     op.resultCount = 0u;
1646 
1647     sscp_context_t *sscpCtx = keyStore->session->sscp;
1648     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreOpenKey, &op, &ret);
1649     if (status != kStatus_SSCP_Success)
1650     {
1651         return kStatus_SSS_Fail;
1652     }
1653 
1654     return (sss_status_t)ret;
1655 }
1656 
sss_sscp_key_store_generate_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject,size_t keyBitLen,void * options)1657 sss_status_t sss_sscp_key_store_generate_key(sss_sscp_key_store_t *keyStore,
1658                                              sss_sscp_object_t *keyObject,
1659                                              size_t keyBitLen,
1660                                              void *options)
1661 {
1662     sscp_operation_t op  = {0};
1663     sscp_status_t status = kStatus_SSCP_Fail;
1664     uint32_t ret         = 0u;
1665 
1666     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference,
1667                                       kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None, kSSCP_ParamType_None,
1668                                       kSSCP_ParamType_None, kSSCP_ParamType_None);
1669 
1670     op.params[0].context.ptr  = keyStore;
1671     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1672 
1673     op.params[1].context.ptr  = keyObject;
1674     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1675 
1676     op.params[2].value.a = keyBitLen;
1677 
1678     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1679     op.resultCount = 0u;
1680 
1681     sscp_context_t *sscpCtx = keyStore->session->sscp;
1682     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreGenerateKey, &op, &ret);
1683     if (status != kStatus_SSCP_Success)
1684     {
1685         return kStatus_SSS_Fail;
1686     }
1687 
1688     return (sss_status_t)ret;
1689 }
1690 
sss_sscp_key_store_erase_key(sss_sscp_key_store_t * keyStore,sss_sscp_object_t * keyObject)1691 sss_status_t sss_sscp_key_store_erase_key(sss_sscp_key_store_t *keyStore, sss_sscp_object_t *keyObject)
1692 {
1693     sscp_operation_t op  = {0};
1694     sscp_status_t status = kStatus_SSCP_Fail;
1695     uint32_t ret         = 0u;
1696 
1697     op.paramTypes =
1698         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ContextReference, kSSCP_ParamType_None,
1699                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1700 
1701     op.params[0].context.ptr  = keyStore;
1702     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1703 
1704     op.params[1].context.ptr  = keyObject;
1705     op.params[1].context.type = kSSCP_ParamContextType_SSS_Object;
1706 
1707     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1708     op.resultCount = 0u;
1709 
1710     sscp_context_t *sscpCtx = keyStore->session->sscp;
1711     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreEraseKey, &op, &ret);
1712     if (status != kStatus_SSCP_Success)
1713     {
1714         return kStatus_SSS_Fail;
1715     }
1716 
1717     return (sss_status_t)ret;
1718 }
1719 
sss_sscp_key_store_erase_all(sss_sscp_key_store_t * keyStore)1720 sss_status_t sss_sscp_key_store_erase_all(sss_sscp_key_store_t *keyStore)
1721 {
1722     sscp_operation_t op  = {0};
1723     sscp_status_t status = kStatus_SSCP_Fail;
1724     uint32_t ret         = 0u;
1725 
1726     op.paramTypes =
1727         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1728                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1729 
1730     op.params[0].context.ptr  = keyStore;
1731     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1732 
1733     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1734     op.resultCount = 0u;
1735 
1736     sscp_context_t *sscpCtx = keyStore->session->sscp;
1737     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreEraseAll, &op, &ret);
1738     if (status != kStatus_SSCP_Success)
1739     {
1740         return kStatus_SSS_Fail;
1741     }
1742 
1743     return (sss_status_t)ret;
1744 }
1745 
sss_sscp_key_store_free(sss_sscp_key_store_t * keyStore)1746 sss_status_t sss_sscp_key_store_free(sss_sscp_key_store_t *keyStore)
1747 {
1748     sscp_operation_t op  = {0};
1749     sscp_status_t status = kStatus_SSCP_Fail;
1750     uint32_t ret         = 0u;
1751 
1752     op.paramTypes =
1753         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1754                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1755 
1756     op.params[0].context.ptr  = keyStore;
1757     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1758 
1759     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1760     op.resultCount = 0u;
1761 
1762     sscp_context_t *sscpCtx = keyStore->session->sscp;
1763     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreContextFree, &op, &ret);
1764     if (status != kStatus_SSCP_Success)
1765     {
1766         return kStatus_SSS_Fail;
1767     }
1768     return (sss_status_t)ret;
1769 }
1770 
sss_sscp_key_store_get_property(sss_sscp_key_store_t * keyStore,sss_sscp_key_store_property_t propertyId,uint32_t * property)1771 sss_status_t sss_sscp_key_store_get_property(sss_sscp_key_store_t *keyStore,
1772                                              sss_sscp_key_store_property_t propertyId,
1773                                              uint32_t *property)
1774 {
1775     sscp_operation_t op  = {0};
1776     sscp_status_t status = kStatus_SSCP_Fail;
1777     uint32_t ret         = 0u;
1778 
1779     op.paramTypes =
1780         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
1781                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1782 
1783     op.params[0].context.ptr  = keyStore;
1784     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1785 
1786     op.params[1].value.a = propertyId;
1787 
1788     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
1789     op.resultCount       = 1u;
1790     op.result[0].value.a = (uint32_t)property;
1791 
1792     sscp_context_t *sscpCtx = keyStore->session->sscp;
1793     if ((sscpCtx == NULL) || (sscpCtx->invoke == NULL))
1794     {
1795         return kStatus_SSS_Fail;
1796     }
1797     status = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyStoreGetProperty, &op, &ret);
1798     if (status != kStatus_SSCP_Success)
1799     {
1800         return kStatus_SSS_Fail;
1801     }
1802 
1803     return (sss_status_t)ret;
1804 }
1805 /*********************************RNG******************************************/
sss_sscp_rng_context_init(sss_sscp_session_t * session,sss_sscp_rng_t * context,uint32_t rngTypeSpecifier)1806 sss_status_t sss_sscp_rng_context_init(sss_sscp_session_t *session, sss_sscp_rng_t *context, uint32_t rngTypeSpecifier)
1807 {
1808     context->session          = session;
1809     context->rngTypeSpecifier = rngTypeSpecifier;
1810     return kStatus_SSS_Success;
1811 }
1812 
sss_sscp_rng_get_random(sss_sscp_rng_t * context,uint8_t * random_data,size_t dataLen)1813 sss_status_t sss_sscp_rng_get_random(sss_sscp_rng_t *context, uint8_t *random_data, size_t dataLen)
1814 {
1815     sscp_operation_t op  = {0};
1816     sscp_status_t status = kStatus_SSCP_Fail;
1817     uint32_t ret         = 0u;
1818 
1819     op.paramTypes =
1820         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_MemrefInOut, kSSCP_ParamType_None,
1821                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1822 
1823     op.params[0].context.ptr  = context;
1824     op.params[0].context.type = kSSCP_ParamContextType_SSS_Rng;
1825 
1826     op.params[1].memref.buffer = (uintptr_t)random_data;
1827     op.params[1].memref.size   = dataLen;
1828 
1829     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1830     op.resultCount = 0u;
1831 
1832     sscp_context_t *sscpCtx = context->session->sscp;
1833     status                  = sscpCtx->invoke(sscpCtx, KSSCP_CMD_SSS_RngGet, &op, &ret);
1834     if (status != kStatus_SSCP_Success)
1835     {
1836         return kStatus_SSS_Fail;
1837     }
1838 
1839     return (sss_status_t)ret;
1840 }
1841 
sss_sscp_rng_free(sss_sscp_rng_t * context)1842 sss_status_t sss_sscp_rng_free(sss_sscp_rng_t *context)
1843 {
1844     /* clean the rng context */
1845     (void)memset(context, 0, sizeof(sss_sscp_rng_t));
1846     return kStatus_SSS_Success;
1847 }
1848 
1849 /******************************KEYOBJECT***************************************/
sss_sscp_key_object_init_internal(sss_sscp_object_t * keyObject,sss_sscp_key_store_t * keyStore)1850 sss_status_t sss_sscp_key_object_init_internal(sss_sscp_object_t *keyObject, sss_sscp_key_store_t *keyStore)
1851 {
1852     SSCP_BUILD_ASSURE(sizeof(sss_object_t) >= sizeof(sss_sscp_object_t), _sss_sscp_key_object_size);
1853     keyObject->keyStore   = keyStore;
1854     keyObject->objectType = 0u; /* object type: key */
1855 
1856     return kStatus_SSS_Success;
1857 }
1858 
sss_sscp_key_object_init(sss_sscp_object_t * keyObject,sss_sscp_key_store_t * keyStore)1859 sss_status_t sss_sscp_key_object_init(sss_sscp_object_t *keyObject, sss_sscp_key_store_t *keyStore)
1860 {
1861     SSCP_BUILD_ASSURE(sizeof(sss_object_t) >= sizeof(sss_sscp_object_t), _sss_sscp_key_object_size);
1862     sscp_operation_t op  = {0};
1863     sscp_status_t status = kStatus_SSCP_Fail;
1864     uint32_t ret         = 0u;
1865 
1866     keyObject->keyStore   = keyStore;
1867     keyObject->objectType = 0u; /* object type: key */
1868 
1869     op.paramTypes =
1870         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
1871                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1872 
1873     op.params[0].context.ptr  = keyStore;
1874     op.params[0].context.type = kSSCP_ParamContextType_SSS_KeyStore;
1875 
1876     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
1877     op.resultCount            = 1u;
1878     op.result[0].context.ptr  = keyObject;
1879     op.result[0].context.type = kSSCP_ParamContextType_SSS_Object;
1880 
1881     sscp_context_t *sscpCtx = keyStore->session->sscp;
1882     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectContextInit, &op, &ret);
1883     if (status != kStatus_SSCP_Success)
1884     {
1885         return kStatus_SSS_Fail;
1886     }
1887 
1888     return (sss_status_t)ret;
1889 }
1890 
sss_sscp_key_object_allocate_handle(sss_sscp_object_t * keyObject,uint32_t keyId,sss_key_part_t keyPart,sss_cipher_type_t cipherType,uint32_t keyByteLenMax,uint32_t options)1891 sss_status_t sss_sscp_key_object_allocate_handle(sss_sscp_object_t *keyObject,
1892                                                  uint32_t keyId,
1893                                                  sss_key_part_t keyPart,
1894                                                  sss_cipher_type_t cipherType,
1895                                                  uint32_t keyByteLenMax,
1896                                                  uint32_t options)
1897 {
1898     SSCP_BUILD_ASSURE(sizeof(sss_object_t) >= sizeof(sss_sscp_object_t), _sss_sscp_object_size);
1899     sscp_operation_t op  = {0};
1900     sscp_status_t status = kStatus_SSCP_Fail;
1901     uint32_t ret         = 0u;
1902 
1903     keyObject->objectType      = keyPart;
1904     keyObject->objectKeyCipher = cipherType;
1905 
1906     op.paramTypes = SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputTuple,
1907                                       kSSCP_ParamType_ValueInputTuple, kSSCP_ParamType_ValueInputSingle,
1908                                       kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1909 
1910     op.params[0].context.ptr  = keyObject;
1911     op.params[0].context.type = kSSCP_ParamContextType_SSS_Object;
1912 
1913     op.params[1].value.a = keyId;
1914     op.params[1].value.b = keyPart;
1915 
1916     op.params[2].value.a = cipherType;
1917     op.params[2].value.b = keyByteLenMax;
1918 
1919     op.params[3].value.a = options;
1920 
1921     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1922     op.resultCount = 0u;
1923 
1924     sscp_context_t *sscpCtx = keyObject->keyStore->session->sscp;
1925     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectAllocateHandle, &op, &ret);
1926     if (status != kStatus_SSCP_Success)
1927     {
1928         return kStatus_SSS_Fail;
1929     }
1930 
1931     return (sss_status_t)ret;
1932 }
1933 
sss_sscp_key_object_get_handle(sss_sscp_object_t * keyObject,uint32_t keyId)1934 sss_status_t sss_sscp_key_object_get_handle(sss_sscp_object_t *keyObject, uint32_t keyId)
1935 {
1936     SSCP_BUILD_ASSURE(sizeof(sss_object_t) >= sizeof(sss_sscp_object_t), _sss_sscp_object_size);
1937     sscp_operation_t op  = {0};
1938     sscp_status_t status = kStatus_SSCP_Fail;
1939     uint32_t ret         = 0u;
1940 
1941     op.paramTypes =
1942         SSCP_OP_SET_PARAM(kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None, kSSCP_ParamType_None,
1943                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1944 
1945     op.params[0].value.a = keyId;
1946 
1947     op.resultTypes            = SSCP_OP_SET_RESULT(kSSCP_ParamType_ContextReference);
1948     op.resultCount            = 1u;
1949     op.result[0].context.ptr  = keyObject;
1950     op.result[0].context.type = kSSCP_ParamContextType_SSS_Object;
1951 
1952     sscp_context_t *sscpCtx = keyObject->keyStore->session->sscp;
1953     status                  = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectGetHandle, &op, &ret);
1954     if (status != kStatus_SSCP_Success)
1955     {
1956         return kStatus_SSS_Fail;
1957     }
1958     return (sss_status_t)ret;
1959 }
1960 
sss_sscp_key_object_set_eccgfp_group(sss_sscp_object_t * keyObject,sss_eccgfp_group_t * group)1961 sss_status_t sss_sscp_key_object_set_eccgfp_group(sss_sscp_object_t *keyObject, sss_eccgfp_group_t *group)
1962 {
1963     keyObject->eccgfpGroup = group;
1964     return kStatus_SSS_Success;
1965 }
1966 
sss_sscp_key_object_set_properties(sss_sscp_object_t * keyObject,uint32_t options)1967 sss_status_t sss_sscp_key_object_set_properties(sss_sscp_object_t *keyObject, uint32_t options)
1968 {
1969     sscp_operation_t op  = {0};
1970     sscp_status_t status = kStatus_SSCP_Fail;
1971     uint32_t ret         = 0u;
1972 
1973     op.paramTypes =
1974         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
1975                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
1976 
1977     op.params[0].context.ptr  = keyObject;
1978     op.params[0].context.type = kSSCP_ParamContextType_SSS_Object;
1979 
1980     op.params[1].value.a = options;
1981 
1982     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
1983     op.resultCount = 0u;
1984 
1985     sscp_context_t *sscpCtx = keyObject->keyStore->session->sscp;
1986     if ((sscpCtx == NULL) || (sscpCtx->invoke == NULL))
1987     {
1988         return kStatus_SSS_Fail;
1989     }
1990     status = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectSetProperties, &op, &ret);
1991     if (status != kStatus_SSCP_Success)
1992     {
1993         return kStatus_SSS_Fail;
1994     }
1995     return (sss_status_t)ret;
1996 }
1997 
sss_sscp_key_object_get_properties(sss_sscp_object_t * keyObject,uint32_t * options)1998 sss_status_t sss_sscp_key_object_get_properties(sss_sscp_object_t *keyObject, uint32_t *options)
1999 {
2000     sscp_operation_t op  = {0};
2001     sscp_status_t status = kStatus_SSCP_Fail;
2002     uint32_t ret         = 0u;
2003 
2004     op.paramTypes =
2005         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_None, kSSCP_ParamType_None,
2006                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
2007 
2008     op.params[0].context.ptr  = keyObject;
2009     op.params[0].context.type = kSSCP_ParamContextType_SSS_Object;
2010 
2011     op.resultTypes       = SSCP_OP_SET_RESULT(kSSCP_ParamType_ValueOutputSingle);
2012     op.resultCount       = 1u;
2013     op.result[0].value.a = (uint32_t)options;
2014 
2015     sscp_context_t *sscpCtx = keyObject->keyStore->session->sscp;
2016     if ((sscpCtx == NULL) || (sscpCtx->invoke == NULL))
2017     {
2018         return kStatus_SSS_Fail;
2019     }
2020     status = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectGetProperties, &op, &ret);
2021     if (status != kStatus_SSCP_Success)
2022     {
2023         return kStatus_SSS_Fail;
2024     }
2025     return (sss_status_t)ret;
2026 }
2027 
sss_sscp_key_object_free(sss_sscp_object_t * keyObject,uint32_t options)2028 sss_status_t sss_sscp_key_object_free(sss_sscp_object_t *keyObject, uint32_t options)
2029 {
2030     sscp_operation_t op  = {0};
2031     sscp_status_t status = kStatus_SSCP_Fail;
2032     uint32_t ret         = 0u;
2033 
2034     op.paramTypes =
2035         SSCP_OP_SET_PARAM(kSSCP_ParamType_ContextReference, kSSCP_ParamType_ValueInputSingle, kSSCP_ParamType_None,
2036                           kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None, kSSCP_ParamType_None);
2037 
2038     op.params[0].context.ptr  = keyObject;
2039     op.params[0].context.type = kSSCP_ParamContextType_SSS_Object;
2040 
2041     op.params[1].value.a = options;
2042 
2043     op.resultTypes = SSCP_OP_SET_RESULT(kSSCP_ParamType_None);
2044     op.resultCount = 0u;
2045 
2046     sscp_context_t *sscpCtx = keyObject->keyStore->session->sscp;
2047     if ((sscpCtx == NULL) || (sscpCtx->invoke == NULL))
2048     {
2049         return kStatus_SSS_Fail;
2050     }
2051     status = sscpCtx->invoke(sscpCtx, kSSCP_CMD_SSS_KeyObjectContextFree, &op, &ret);
2052     if (status != kStatus_SSCP_Success)
2053     {
2054         return kStatus_SSS_Fail;
2055     }
2056     return (sss_status_t)ret;
2057 }
2058