/** @mainpage Overview @anchor core_pkcs11 @brief PKCS #11 Crypto Abstraction Library. > PKCS #11 is a standard maintained by OASIS for interacting with cryptographic hardware. Official documentation of PKCS #11 from [oasis](http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/os/pkcs11-base-v2.40-os.html)
This corePKCS11 library implements a subset of the PKCS #11 API required to establish a secure connection to AWS IoT: - Verifying the signature of the contents of a message. - Signing a message. - Managing certificates and keys. - Generating random numbers. @section pkcs11_memory_requirements Memory Requirements @brief Memory requirements of the PKCS #11 library. @include{doc} size_table.md */ /** @page pkcs11_design Design @section PKCS11_Wrapper Dependencies of the corePKCS11 Wrapper for the PKCS #11 standard Currently, the corePKCS11 library provides a wrapper header around the [PKCS #11 standard](http://docs.oasis-open.org/pkcs11/pkcs11-base/v2.40/os/pkcs11-base-v2.40-os.html). It has dependencies on: - `stdint.h` from the C standard library - PKCS #11 standard. Note: "core_pkcs11.h" should always be included first as it defines the macros that are needed by the standard PKCS #11 header files. @dot "PKCS #11 wrapper direct dependencies" digraph pkcs11_wrapper_dependencies { node[shape=box, fontname=Helvetica, fontsize=10, style=filled]; edge[fontname=Helvetica, fontsize=10]; subgraph { pkcs11_wrapper[label="PKCS #11 Wrapper", fillcolor="#cc00ccff"]; } subgraph { node[fillcolor="#aed8a9ff"]; rank = same; pkcs11[label="PKCS #11"]; } pkcs11_wrapper -> pkcs11; } @enddot @section PKCS11_implementation corePKCS11 Software Implementation Dependencies The corePKCS11 library provides one implementation of the PKCS #11 standard, and it can easily be swapped out for other implementations. The corePKCS11 library documented here is a software based implementation of the PKCS #11 standard, to allow for writing libraries and code that can easily interface with Hardware Security Modules (HSM). Currently, the software based corePKCS11 library has the following dependencies: - The API defined by the PKCS #11 specification. The headers used can be found [here](https://github.com/amazon-freertos/pkcs11/tree/v2.40_errata01). - The PKCS #11 PAL layer. This is used for writing PKCS #11 objects to flash. - [Mbed TLS](https://github.com/ARMmbed/mbedtls/tree/v2.28.0). This library uses Mbed TLS for the cryptographic logic. Some examples include parsing key and certificate objects, signing operations, and creating digests. - The standard C library `string.h`, for memory manipulation. @dot "PKCS #11 implementation direct dependencies" digraph pkcs11_software_implementation_dependencies { node[shape=box, fontname=Helvetica, fontsize=10, style=filled]; edge[fontname=Helvetica, fontsize=10]; subgraph { pkcs11_software_implementation[label="PKCS #11 Software Implementation", fillcolor="#cc00ccff"]; } subgraph { node[fillcolor="#aed8a9ff"]; rank = same; pkcs11_wrapper[label="PKCS #11"]; mbedtls[label="Mbed TLS"]; pkcs11_pal[label="PKCS #11 PAL"]; } pkcs11_software_implementation -> pkcs11_wrapper; pkcs11_software_implementation -> mbedtls; pkcs11_software_implementation -> pkcs11_pal; } @enddot @section PKCS11_utilities corePKCS11 Utilities Dependencies The PKI utils module is a forked version of the PKI utilities provided by Mbed TLS. They provide helper utilities to convert the format of ECDSA P-256 signatures. The conversions provided are: - DER format to PKCS #11 format. - PKCS #11 format to ASN.1 format. Currently, the module has a dependency only on the C standard library. @dot "PKCS #11 Utilities Dependencies" digraph pkcs11_utils_dependencies { node[shape=box, fontname=Helvetica, fontsize=10, style=filled]; edge[fontname=Helvetica, fontsize=10]; subgraph { pkcs11_utils[label="PKCS #11 Utilities", fillcolor="#cc00ccff"]; } subgraph { node[fillcolor="#aed8a9ff"]; rank = same; stdlib[label="string.h"]; } pkcs11_utils -> stdlib; } @enddot */ /** @page pkcs11_seq PKCS #11 Sequence Diagrams @brief The following are sequence diagrams for common PKCS #11 operations. @subpage pkcs11_rng_seq
@subpage pkcs11_dig_seq
@subpage pkcs11_obj_imp_seq
@subpage pkcs11_obj_gen_seq
@subpage pkcs11_sign_verify_seq
@page pkcs11_rng_seq PKCS #11 RNG Sequence Diagram @brief Sequence diagram illustrating how to generate random bytes from PKCS #11. @image html pkcs11_rng.png "PKCS #11 RNG Sequence" width=50% @page pkcs11_dig_seq PKCS #11 Digest Sequence Diagram @brief Sequence diagram illustrating how to create a message digest with PKCS #11. @image html pkcs11_digest.png "PKCS #11 Digest Sequence" width=50% @page pkcs11_obj_imp_seq PKCS #11 Object Import Sequence Diagram @brief Sequence diagram illustrating how to import an object with PKCS #11. @image html pkcs11_object_import.png "PKCS #11 Object Import Sequence" width=50% @page pkcs11_obj_gen_seq PKCS #11 Generate Key Pair Sequence Diagram @brief Sequence diagram illustrating how to generate a key pair with PKCS #11. @image html pkcs11_object_generate.png "PKCS #11 Generate Key Pair Sequence" width=50% @page pkcs11_sign_verify_seq PKCS #11 Sign and Verify Sequence Diagram @brief Sequence diagram illustrating how to sign a hash and verify a signature with PKCS #11. @image html pkcs11_sign_verify.png "PKCS #11 Sign and Verify Sequence" width=50% */ /** @page pkcs11_config PKCS #11 Configuration Macros @brief These are the configuration macros used by the corePKCS11 Library. @section pkcs11configPKCS11_MALLOC @copydoc pkcs11configPKCS11_MALLOC @section pkcs11configPKCS11_FREE @copydoc pkcs11configPKCS11_FREE @section pkcs11configPKCS11_DEFAULT_USER_PIN @copydoc pkcs11configPKCS11_DEFAULT_USER_PIN @section pkcs11configMAX_LABEL_LENGTH @copydoc pkcs11configMAX_LABEL_LENGTH @section pkcs11configMAX_NUM_OBJECTS @copydoc pkcs11configMAX_NUM_OBJECTS @section pkcs11configMAX_SESSIONS @copydoc pkcs11configMAX_SESSIONS @section pkcs11configPAL_DESTROY_SUPPORTED @copydoc pkcs11configPAL_DESTROY_SUPPORTED @section pkcs11configOTA_SUPPORTED @copydoc pkcs11configOTA_SUPPORTED @section pkcs11configJITP_CODEVERIFY_ROOT_CERT_SUPPORTED @copydoc pkcs11configJITP_CODEVERIFY_ROOT_CERT_SUPPORTED @section pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS @copydoc pkcs11configLABEL_DEVICE_PRIVATE_KEY_FOR_TLS @section pkcs11configLABEL_DEVICE_PUBLIC_KEY_FOR_TLS @copydoc pkcs11configLABEL_DEVICE_PUBLIC_KEY_FOR_TLS @section pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS @copydoc pkcs11configLABEL_DEVICE_CERTIFICATE_FOR_TLS @section pkcs11configLABEL_ROOT_CERTIFICATE @copydoc pkcs11configLABEL_ROOT_CERTIFICATE @section pkcs11configLABEL_HMAC_KEY @copydoc pkcs11configLABEL_HMAC_KEY @section pkcs11configLABEL_CMAC_KEY @copydoc pkcs11configLABEL_CMAC_KEY @section pkcs11configLABEL_CODE_VERIFICATION_KEY @copydoc pkcs11configLABEL_CODE_VERIFICATION_KEY @section pkcs11configLABEL_JITP_CERTIFICATE @copydoc pkcs11configLABEL_JITP_CERTIFICATE @section LogError @copydoc LogError @section LogWarn @copydoc LogWarn @section LogInfo @copydoc LogInfo @section LogDebug @copydoc LogDebug */ /** @page pkcs11_core_mbedtls_function PKCS #11 Mbed TLS Implementation Functions @brief Primary functions of the PKCS #11 Mbed TLS based Implementation Library:

@subpage pkcs11_mbedtls_function_c_initialize
@subpage pkcs11_mbedtls_function_c_finalize
@subpage pkcs11_mbedtls_function_c_getfunctionlist
@subpage pkcs11_mbedtls_function_c_getslotlist
@subpage pkcs11_mbedtls_function_c_gettokeninfo
@subpage pkcs11_mbedtls_function_c_getmechanisminfo
@subpage pkcs11_mbedtls_function_c_inittoken
@subpage pkcs11_mbedtls_function_c_opensession
@subpage pkcs11_mbedtls_function_c_closesession
@subpage pkcs11_mbedtls_function_c_login
@subpage pkcs11_mbedtls_function_c_createobject
@subpage pkcs11_mbedtls_function_c_destroyobject
@subpage pkcs11_mbedtls_function_c_getattributevalue
@subpage pkcs11_mbedtls_function_c_findobjectsinit
@subpage pkcs11_mbedtls_function_c_findobjects
@subpage pkcs11_mbedtls_function_c_findobjectsfinal
@subpage pkcs11_mbedtls_function_c_digestinit
@subpage pkcs11_mbedtls_function_c_digestupdate
@subpage pkcs11_mbedtls_function_c_digestfinal
@subpage pkcs11_mbedtls_function_c_signinit
@subpage pkcs11_mbedtls_function_c_verifyinit
@subpage pkcs11_mbedtls_function_c_verify
@subpage pkcs11_mbedtls_function_c_generatekeypair
@subpage pkcs11_mbedtls_function_c_generate_random
@page pkcs11_mbedtls_function_c_initialize C_Initialize @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_initialize @copydoc C_Initialize @page pkcs11_mbedtls_function_c_finalize C_Finalize @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_finalize @copydoc C_Finalize @page pkcs11_mbedtls_function_c_getfunctionlist C_GetFunctionList @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_getfunctionlist @copydoc C_GetFunctionList @page pkcs11_mbedtls_function_c_getslotlist C_GetSlotList @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_getslotlist @copydoc C_GetSlotList @page pkcs11_mbedtls_function_c_gettokeninfo C_GetTokenInfo @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_gettokeninfo @copydoc C_GetTokenInfo @page pkcs11_mbedtls_function_c_getmechanisminfo C_GetMechanismInfo @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_getmechanisminfo @copydoc C_GetMechanismInfo @page pkcs11_mbedtls_function_c_inittoken C_InitToken @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_inittoken @copydoc C_InitToken @page pkcs11_mbedtls_function_c_opensession C_OpenSession @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_opensession @copydoc C_OpenSession @page pkcs11_mbedtls_function_c_closesession C_CloseSession @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_closesession @copydoc C_CloseSession @page pkcs11_mbedtls_function_c_login C_Login @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_login @copydoc C_Login @page pkcs11_mbedtls_function_c_createobject C_CreateObject @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_createobject @copydoc C_CreateObject @page pkcs11_mbedtls_function_c_destroyobject C_DestroyObject @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_destroyobject @copydoc C_DestroyObject @page pkcs11_mbedtls_function_c_getattributevalue C_GetAttributeValue @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_getattributevalue @copydoc C_GetAttributeValue @page pkcs11_mbedtls_function_c_findobjectsinit C_FindObjectsInit @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_findobjectsinit @copydoc C_FindObjectsInit @page pkcs11_mbedtls_function_c_findobjects C_FindObjects @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_findobjects @copydoc C_FindObjects @page pkcs11_mbedtls_function_c_findobjectsfinal C_FindObjectsFinal @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_findobjectsfinal @copydoc C_FindObjectsFinal @page pkcs11_mbedtls_function_c_digestinit C_DigestInit @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_digestinit @copydoc C_DigestInit @page pkcs11_mbedtls_function_c_digestupdate C_DigestUpdate @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_digestupdate @copydoc C_DigestUpdate @page pkcs11_mbedtls_function_c_digestfinal C_DigestFinal @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_digestfinal @copydoc C_DigestFinal @page pkcs11_mbedtls_function_c_signinit C_SignInit @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_signinit @copydoc C_SignInit @page pkcs11_mbedtls_function_c_verifyinit C_VerifyInit @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_verifyinit @copydoc C_VerifyInit @page pkcs11_mbedtls_function_c_verify C_Verify @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_verify @copydoc C_Verify @page pkcs11_mbedtls_function_c_generatekeypair C_GenerateKeyPair @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_generatekeypair @copydoc C_GenerateKeyPair @page pkcs11_mbedtls_function_c_generate_random C_GenerateRandom @snippet core_pkcs11_mbedtls.c declare_pkcs11_mbedtls_c_generate_random @copydoc C_GenerateRandom */ /** @page pkcs11_core_wrapper_function PKCS #11 Wrapper Functions @brief Primary functions of the PKCS #11 wrapper Library:

@subpage pkcs11_core_xinitializepkcs11
@subpage pkcs11_core_xgetslotlist
@subpage pkcs11_core_xinitializepkcs11token
@subpage pkcs11_core_xinitializepkcs11session
@subpage pkcs11_core_xfindobjectwithlabelandclass
@subpage pkcs11_core_vappendsha256algorithmidentifiersequence
@page pkcs11_core_xinitializepkcs11 xInitializePKCS11 @snippet core_pkcs11.h declare_pkcs11_core_xinitializepkcs11 @copydoc xInitializePKCS11 @page pkcs11_core_xgetslotlist xGetSlotList @snippet core_pkcs11.h declare_pkcs11_core_xgetslotlist @copydoc xGetSlotList @page pkcs11_core_xinitializepkcs11token xInitializePkcs11Token @snippet core_pkcs11.h declare_pkcs11_core_xinitializepkcs11token @copydoc xInitializePkcs11Token @page pkcs11_core_xinitializepkcs11session xInitializePkcs11Session @snippet core_pkcs11.h declare_pkcs11_core_xinitializepkcs11session @copydoc xInitializePkcs11Session @page pkcs11_core_xfindobjectwithlabelandclass xFindObjectWithLabelAndClass @snippet core_pkcs11.h declare_pkcs11_core_xfindobjectwithlabelandclass @copydoc xFindObjectWithLabelAndClass @page pkcs11_core_vappendsha256algorithmidentifiersequence vAppendSHA256AlgorithmIdentifierSequence @snippet core_pkcs11.h declare_pkcs11_core_vappendsha256algorithmidentifiersequence @copydoc vAppendSHA256AlgorithmIdentifierSequence */ /** @page pkcs11_core_pal_function PKCS #11 PAL Functions @brief Primary functions of the PKCS #11 Platform Abstraction Layer Library:

@subpage pkcs11_pal_initialize
@subpage pkcs11_pal_saveobject
@subpage pkcs11_pal_destroyobject
@subpage pkcs11_pal_findobject
@subpage pkcs11_pal_getobjectvalue
@subpage pkcs11_pal_getobjectvaluecleanup
@page pkcs11_pal_initialize PKCS11_PAL_Initialize @snippet core_pkcs11_pal.h declare_pkcs11_pal_initialize @copydoc PKCS11_PAL_Initialize @page pkcs11_pal_saveobject PKCS11_PAL_SaveObject @snippet core_pkcs11_pal.h declare_pkcs11_pal_saveobject @copydoc PKCS11_PAL_SaveObject @page pkcs11_pal_destroyobject PKCS11_PAL_DestroyObject @snippet core_pkcs11_pal.h declare_pkcs11_pal_destroyobject @copydoc PKCS11_PAL_DestroyObject @page pkcs11_pal_findobject PKCS11_PAL_FindObject @snippet core_pkcs11_pal.h declare_pkcs11_pal_findobject @copydoc PKCS11_PAL_FindObject @page pkcs11_pal_getobjectvalue PKCS11_PAL_GetObjectValue @snippet core_pkcs11_pal.h declare_pkcs11_pal_getobjectvalue @copydoc PKCS11_PAL_GetObjectValue @page pkcs11_pal_getobjectvaluecleanup PKCS11_PAL_GetObjectValueCleanup @snippet core_pkcs11_pal.h declare_pkcs11_pal_getobjectvaluecleanup @copydoc PKCS11_PAL_GetObjectValueCleanup */ /** @page pkcs11_core_utils_function PKCS #11 Utils Functions @brief Primary functions of the PKCS #11 Utils Library:

@subpage pkcs11_utils_pkipkcs11signaturetombedtlssignature
@subpage pkcs11_utils_pkimbedtlssignaturetopkcs11signature
@page pkcs11_utils_pkipkcs11signaturetombedtlssignature PKI_mbedTLSSignatureToPkcs11Signature @snippet core_pki_utils.h declare_pkcs11_utils_pkipkcs11signaturetombedtlssignature @copydoc PKI_mbedTLSSignatureToPkcs11Signature @page pkcs11_utils_pkimbedtlssignaturetopkcs11signature PKI_pkcs11SignatureTombedTLSSignature @snippet core_pki_utils.h declare_pkcs11_utils_pkimbedtlssignaturetopkcs11signature @copydoc PKI_pkcs11SignatureTombedTLSSignature */