1 /* 2 * Copyright 2018-2021 NXP 3 * All rights reserved. 4 * 5 * SPDX-License-Identifier: BSD-3-Clause 6 */ 7 #ifndef FSL_SSS_SSCP_H 8 #define FSL_SSS_SSCP_H 9 10 // #include <stddef.h> 11 #include <stdint.h> 12 #include "fsl_sscp.h" 13 #include "fsl_sss_api.h" 14 15 #if !defined(SSS_SSCP_CONFIG_FILE) 16 #include "fsl_sss_sscp_config.h" 17 #else 18 #include SSS_SSCP_CONFIG_FILE 19 #endif 20 21 typedef struct 22 { 23 /*! Indicates which security subsystem is selected to be used. */ 24 sss_type_t subsystem; 25 26 /*! Implementation specific part */ 27 sscp_context_t *sscp; 28 uint32_t ctx; 29 } sss_sscp_session_t; 30 31 typedef struct 32 { 33 /*! Virtual connection between application (user context) and specific 34 * security subsystem and function thereof. */ 35 sss_sscp_session_t *session; 36 /*! Implementation specific part */ 37 uint32_t keyStoreId; 38 struct 39 { 40 uint8_t data[SSS_SSCP_KEY_STORE_CONTEXT_SIZE]; 41 } context; 42 uint32_t ctx; 43 } sss_sscp_key_store_t; 44 45 typedef struct 46 { 47 /*! key store holding the data and other properties */ 48 sss_sscp_key_store_t *keyStore; 49 50 uint32_t objectType; /*! TODO define object types */ 51 uint32_t objectKeyCipher; 52 /*! Application specific key identifier. The keyId is kept in the key store along with the key data and other 53 * properties. */ 54 uint32_t keyId; 55 /*! Used only for ECC key types, to specify the elliptic curve related to the key. */ 56 sss_eccgfp_group_t *eccgfpGroup; 57 /*! Implementation specific part */ 58 struct 59 { 60 uint8_t data[SSS_SSCP_KEY_OBJECT_CONTEXT_SIZE]; 61 } context; 62 uint32_t ctx; 63 } sss_sscp_object_t; 64 65 /*! @brief ::_sss_symmetric with SSCP specific information */ 66 typedef struct 67 { 68 /*! Virtual connection between application (user context) and 69 specific security subsystem and function thereof. */ 70 sss_sscp_session_t *session; 71 sss_sscp_object_t *keyObject; /*! Reference to key and it's properties. */ 72 sss_algorithm_t algorithm; /*! */ 73 sss_mode_t mode; /*! */ 74 75 /*! Implementation specific part */ 76 struct 77 { 78 uint8_t data[SSS_SSCP_SYMMETRIC_CONTEXT_SIZE]; 79 } context; 80 uint32_t ctx; 81 } sss_sscp_symmetric_t; 82 83 typedef struct 84 { 85 /*! Virtual connection between application (user context) and specific 86 * security subsystem and function thereof. */ 87 sss_sscp_session_t *session; 88 sss_sscp_object_t *keyObject; /*! Reference to key and it's properties. */ 89 sss_algorithm_t algorithm; /*! */ 90 sss_mode_t mode; /*! */ 91 92 /*! Implementation specific part */ 93 struct 94 { 95 uint8_t data[SSS_SSCP_AEAD_CONTEXT_SIZE]; 96 } context; 97 uint32_t ctx; 98 } sss_sscp_aead_t; 99 100 typedef struct 101 { 102 /*! Virtual connection between application (user context) and specific security subsystem and function thereof. */ 103 sss_sscp_session_t *session; 104 sss_algorithm_t algorithm; /*! */ 105 sss_mode_t mode; /*! */ 106 /*! Full digest length per algorithm definition. This field is initialized along with algorithm. */ 107 size_t digestFullLen; 108 /*! Implementation specific part */ 109 struct 110 { 111 uint8_t data[SSS_SSCP_DIGEST_CONTEXT_SIZE]; 112 } context; 113 uint32_t ctx; 114 } sss_sscp_digest_t; 115 116 typedef struct 117 { 118 /*! Virtual connection between application (user context) and specific 119 * security subsystem and function thereof. */ 120 sss_sscp_session_t *session; 121 sss_sscp_object_t *keyObject; /*! Reference to key and it's properties. */ 122 sss_algorithm_t algorithm; /*! */ 123 sss_mode_t mode; /*! */ 124 125 /*! Implementation specific part */ 126 uint32_t ctx; 127 struct 128 { 129 uint8_t data[SSS_SSCP_MAC_CONTEXT_SIZE]; 130 } context; 131 } sss_sscp_mac_t; 132 133 typedef struct 134 { 135 sss_sscp_session_t *session; 136 sss_sscp_object_t *keyObject; 137 sss_algorithm_t algorithm; /*! */ 138 sss_mode_t mode; /*! */ 139 size_t signatureFullLen; 140 141 /*! Implementation specific part */ 142 uint32_t ctx; 143 } sss_sscp_asymmetric_t; 144 145 typedef struct 146 { 147 sss_sscp_session_t *session; 148 uint32_t tunnelType; 149 150 /*! Implementation specific part */ 151 uint32_t ctx; 152 uint8_t *buffer; 153 size_t bufferSize; 154 } sss_sscp_tunnel_t; 155 156 typedef struct 157 { 158 sss_sscp_session_t *session; 159 sss_sscp_object_t *keyObject; 160 sss_algorithm_t algorithm; /*! */ 161 sss_mode_t mode; /*! */ 162 163 /*! Implementation specific part */ 164 uint32_t ctx; 165 } sss_sscp_derive_key_t; 166 167 typedef struct 168 { 169 sss_sscp_session_t *session; 170 uint32_t rngTypeSpecifier; 171 /*! Implementation specific part */ 172 } sss_sscp_rng_t; 173 174 /******************************************************************************* 175 * API 176 ******************************************************************************/ 177 #if defined(__cplusplus) 178 extern "C" { 179 #endif 180 sss_status_t sss_sscp_open_session(sss_sscp_session_t *session, 181 uint32_t sessionId, 182 sss_type_t subsystem, 183 sscp_context_t *sscpctx); 184 185 sss_status_t sss_sscp_close_session(sss_sscp_session_t *session); 186 187 /*******************************SYMETRIC***************************************/ 188 189 sss_status_t sss_sscp_symmetric_context_init(sss_sscp_symmetric_t *context, 190 sss_sscp_session_t *session, 191 sss_sscp_object_t *keyObject, 192 sss_algorithm_t algorithm, 193 sss_mode_t mode); 194 195 sss_status_t sss_sscp_cipher_one_go(sss_sscp_symmetric_t *context, 196 uint8_t *iv, 197 size_t ivLen, 198 const uint8_t *srcData, 199 uint8_t *destData, 200 size_t dataLen); 201 202 sss_status_t sss_sscp_cipher_init(sss_sscp_symmetric_t *context, uint8_t *iv, size_t ivLen); 203 204 sss_status_t sss_sscp_cipher_update( 205 sss_sscp_symmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen); 206 207 sss_status_t sss_sscp_cipher_finish( 208 sss_sscp_symmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen); 209 210 sss_status_t sss_sscp_cipher_crypt_ctr(sss_sscp_symmetric_t *context, 211 const uint8_t *srcData, 212 uint8_t *destData, 213 size_t size, 214 uint8_t *initialCounter, 215 uint8_t *lastEncryptedCounter, 216 size_t *szLeft); 217 218 sss_status_t sss_sscp_symmetric_context_free(sss_sscp_symmetric_t *context); 219 220 /**********************************AEAD****************************************/ 221 222 sss_status_t sss_sscp_aead_context_init(sss_sscp_aead_t *context, 223 sss_sscp_session_t *session, 224 sss_sscp_object_t *keyObject, 225 sss_algorithm_t algorithm, 226 sss_mode_t mode); 227 228 sss_status_t sss_sscp_aead_one_go(sss_sscp_aead_t *context, 229 const uint8_t *srcData, 230 uint8_t *destData, 231 size_t size, 232 uint8_t *nonce, 233 size_t nonceLen, 234 const uint8_t *aad, 235 size_t aadLen, 236 uint8_t *tag, 237 size_t *tagLen); 238 239 sss_status_t sss_sscp_aead_init( 240 sss_sscp_aead_t *context, uint8_t *nonce, size_t nonceLen, size_t tagLen, size_t aadLen, size_t payloadLen); 241 242 sss_status_t sss_sscp_aead_update_aad(sss_sscp_aead_t *context, const uint8_t *aadData, size_t aadDataLen); 243 244 sss_status_t sss_sscp_aead_update( 245 sss_sscp_aead_t *context, const uint8_t *srcData, size_t srcLen, uint8_t destData, size_t *destLen); 246 247 sss_status_t sss_sscp_aead_finish(sss_sscp_aead_t *context, 248 const uint8_t *srcData, 249 size_t srcLen, 250 uint8_t destData, 251 size_t *destLen, 252 uint8_t *tag, 253 size_t *tagLen); 254 255 sss_status_t sss_sscp_aead_context_free(sss_sscp_aead_t *context); 256 257 /********************************DIGEST****************************************/ 258 259 sss_status_t sss_sscp_digest_context_init(sss_sscp_digest_t *context, 260 sss_sscp_session_t *session, 261 sss_algorithm_t algorithm, 262 sss_mode_t mode); 263 264 /*! @copydoc sss_digest_one_go */ 265 sss_status_t sss_sscp_digest_one_go( 266 sss_sscp_digest_t *context, const uint8_t *message, size_t messageLen, uint8_t *digest, size_t *digestLen); 267 268 sss_status_t sss_sscp_digest_init(sss_sscp_digest_t *context); 269 270 sss_status_t sss_sscp_digest_update(sss_sscp_digest_t *context, uint8_t *message, size_t messageLen); 271 272 sss_status_t sss_sscp_digest_finish(sss_sscp_digest_t *context, uint8_t *digest, size_t *digestLen); 273 274 sss_status_t sss_sscp_digest_context_free(sss_sscp_digest_t *context); 275 276 /*******************************ASYMETRIC**************************************/ 277 sss_status_t sss_sscp_asymmetric_context_init(sss_sscp_asymmetric_t *context, 278 sss_sscp_session_t *session, 279 sss_sscp_object_t *keyObject, 280 sss_algorithm_t algorithm, 281 sss_mode_t mode); 282 283 sss_status_t sss_sscp_asymmetric_encrypt( 284 sss_sscp_asymmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen); 285 286 sss_status_t sss_sscp_asymmetric_decrypt( 287 sss_sscp_asymmetric_t *context, const uint8_t *srcData, size_t srcLen, uint8_t *destData, size_t *destLen); 288 289 sss_status_t sss_sscp_asymmetric_sign_digest( 290 sss_sscp_asymmetric_t *context, uint8_t *digest, size_t digestLen, uint8_t *signature, size_t *signatureLen); 291 292 sss_status_t sss_sscp_asymmetric_verify_digest( 293 sss_sscp_asymmetric_t *context, uint8_t *digest, size_t digestLen, uint8_t *signature, size_t signatureLen); 294 295 sss_status_t sss_sscp_asymmetric_context_free(sss_sscp_asymmetric_t *context); 296 297 /******************************DERIVE KEY**************************************/ 298 sss_status_t sss_sscp_derive_key_context_init(sss_sscp_derive_key_t *context, 299 sss_sscp_session_t *session, 300 sss_sscp_object_t *keyObject, 301 sss_algorithm_t algorithm, 302 sss_mode_t mode); 303 304 sss_status_t sss_sscp_derive_key(sss_sscp_derive_key_t *context, 305 const uint8_t *saltData, 306 size_t saltLen, 307 sss_sscp_object_t *derivedKeyObject); 308 309 sss_status_t sss_sscp_asymmetric_dh_derive_key(sss_sscp_derive_key_t *context, 310 sss_sscp_object_t *otherPartyKeyObject, 311 sss_sscp_object_t *derivedKeyObject); 312 313 sss_status_t sss_sscp_derive_key_context_free(sss_sscp_derive_key_t *context); 314 /*********************************MAC******************************************/ 315 sss_status_t sss_sscp_mac_context_init(sss_sscp_mac_t *context, 316 sss_sscp_session_t *session, 317 sss_sscp_object_t *keyObject, 318 sss_algorithm_t algorithm, 319 sss_mode_t mode); 320 321 sss_status_t sss_sscp_mac_one_go( 322 sss_sscp_mac_t *context, const uint8_t *message, size_t messageLen, uint8_t *mac, size_t *macLen); 323 324 sss_status_t sss_sscp_mac_init(sss_sscp_mac_t *context); 325 326 sss_status_t sss_sscp_mac_update(sss_sscp_mac_t *context, const uint8_t *message, size_t messageLen); 327 328 sss_status_t sss_sscp_mac_finish(sss_sscp_mac_t *context, uint8_t *mac, size_t *macLen); 329 330 sss_status_t sss_sscp_mac_context_free(sss_sscp_mac_t *context); 331 332 /*******************************KEYSTORE***************************************/ 333 sss_status_t sss_sscp_key_store_init(sss_sscp_key_store_t *keyStore, sss_sscp_session_t *session); 334 335 sss_status_t sss_sscp_key_store_set_key(sss_sscp_key_store_t *keyStore, 336 sss_sscp_object_t *keyObject, 337 const uint8_t *data, 338 size_t dataLen, 339 uint32_t keyBitLen, 340 sss_key_part_t keyPart); 341 342 sss_status_t sss_sscp_key_store_get_key(sss_sscp_key_store_t *keyStore, 343 sss_sscp_object_t *keyObject, 344 uint8_t *data, 345 size_t *dataLen, 346 size_t *pKeyBitLen, 347 sss_key_part_t keyPart); 348 349 sss_status_t sss_sscp_key_store_export_key(sss_sscp_key_store_t *keyStore, 350 sss_sscp_object_t *keyObject, 351 uint8_t *data, 352 size_t *dataLen, 353 sss_sscp_blob_type_t blobType); 354 355 sss_status_t sss_sscp_key_store_import_key(sss_sscp_key_store_t *keyStore, 356 sss_sscp_object_t *keyObject, 357 const uint8_t *data, 358 size_t dataLen, 359 uint32_t keyBitLen, 360 sss_sscp_blob_type_t blobType); 361 362 sss_status_t sss_sscp_key_store_generate_key(sss_sscp_key_store_t *keyStore, 363 sss_sscp_object_t *keyObject, 364 size_t keyBitLen, 365 void *options); 366 367 sss_status_t sss_sscp_key_store_open_key(sss_sscp_key_store_t *keyStore, sss_sscp_object_t *keyObject); 368 sss_status_t sss_sscp_key_store_open_internal_key(sss_sscp_key_store_t *keyStore, sss_internal_keyID_t keyID); 369 sss_status_t sss_sscp_key_store_erase_key(sss_sscp_key_store_t *keyStore, sss_sscp_object_t *keyObject); 370 sss_status_t sss_sscp_key_store_erase_all(sss_sscp_key_store_t *keyStore); 371 sss_status_t sss_sscp_key_store_get_property(sss_sscp_key_store_t *keyStore, 372 sss_sscp_key_store_property_t propertyId, 373 uint32_t *property); 374 375 sss_status_t sss_sscp_key_store_free(sss_sscp_key_store_t *keyStore); 376 /******************************KEYOBJECT***************************************/ 377 sss_status_t sss_sscp_key_object_init_internal(sss_sscp_object_t *keyObject, sss_sscp_key_store_t *keyStore); 378 379 sss_status_t sss_sscp_key_object_init(sss_sscp_object_t *keyObject, sss_sscp_key_store_t *keyStore); 380 381 sss_status_t sss_sscp_key_object_set_eccgfp_group(sss_sscp_object_t *keyObject, sss_eccgfp_group_t *group); 382 383 sss_status_t sss_sscp_key_object_set_properties(sss_sscp_object_t *keyObject, uint32_t options); 384 385 sss_status_t sss_sscp_key_object_get_properties(sss_sscp_object_t *keyObject, uint32_t *options); 386 387 sss_status_t sss_sscp_key_object_allocate_handle(sss_sscp_object_t *keyObject, 388 uint32_t keyId, 389 sss_key_part_t keyPart, 390 sss_cipher_type_t cipherType, 391 uint32_t keyByteLenMax, 392 uint32_t options); 393 394 sss_status_t sss_sscp_key_object_get_handle(sss_sscp_object_t *keyObject, uint32_t keyId); 395 #define SSS_SSCP_KEY_OBJECT_FREE_STATIC (0x0u) 396 #define SSS_SSCP_KEY_OBJECT_FREE_DYNAMIC (0x1u) 397 sss_status_t sss_sscp_key_object_free(sss_sscp_object_t *keyObject, uint32_t options); 398 399 /*******************************TUNNEL*****************************************/ 400 sss_status_t sss_sscp_tunnel_context_init(sss_sscp_tunnel_t *context, sss_sscp_session_t *session, uint32_t tunnelType); 401 402 sss_status_t sss_sscp_tunnel(sss_sscp_tunnel_t *context, uint8_t *data, size_t dataLen, uint32_t *resultState); 403 404 sss_status_t sss_sscp_tunnel_context_free(sss_sscp_tunnel_t *context); 405 /*********************************RNG******************************************/ 406 sss_status_t sss_sscp_rng_context_init(sss_sscp_session_t *session, sss_sscp_rng_t *context, uint32_t rngTypeSpecifier); 407 408 sss_status_t sss_sscp_rng_get_random(sss_sscp_rng_t *context, uint8_t *random_data, size_t dataLen); 409 410 sss_status_t sss_sscp_rng_free(sss_sscp_rng_t *context); 411 412 #if defined(__cplusplus) 413 } 414 #endif 415 416 #endif /* FSL_SSS_SSCP_H */ 417