

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Portare la libreria CorePKCS11
<a name="afr-porting-pkcs"></a>

Il Public Key Cryptography Standard \#11 definisce un'API indipendente dalla piattaforma per gestire e utilizzare i token crittografici. [PKCS 11](https://en.wikipedia.org/wiki/PKCS_11) fa riferimento allo standard e alle API da esso definite. L'API crittografica PKCS \#11 astrae l'archiviazione delle chiavi, get/set le proprietà degli oggetti crittografici e la semantica delle sessioni. È ampiamente utilizzata per manipolare oggetti crittografici comuni. Le sue funzioni consentono al software applicativo di utilizzare, creare, modificare ed eliminare oggetti crittografici, senza esporre tali oggetti alla memoria dell'applicazione. 

Le librerie FreerTOS e le integrazioni di riferimento utilizzano un sottoinsieme dello standard di interfaccia PCKS \#11, con particolare attenzione alle operazioni che coinvolgono chiavi asimmetriche, generazione di numeri casuali e hashing. La tabella seguente elenca i casi d'uso e le API PKCS \#11 richieste da supportare.


**Casi d'uso**  

| Caso d'uso | Famiglia di API PKCS \#11 richiesta | 
| --- | --- | 
| Tutti | Inizializzazione, finalizzazione, Open/Close sessione, accesso GetSlotList | 
| Approvvigionamento | GenerateKeyPair, CreateObject, DestroyObject, InitToken, GetTokenInfo | 
| TLS | Casuale, Sign, FindObject GetAttributeValue | 
| FreeRTOS\+TCP | Casuale, Digest | 
| OTA | Verifica, Digest, FindObject GetAttributeValue | 

## Quando implementare un modulo PKCS \#11 completo
<a name="implemeting-pkcs"></a>

L'archiviazione di chiavi private nella memoria flash per scopi generici può essere utile nella valutazione e creazione rapida di prototipi di scenari. Si consiglia di utilizzare hardware crittografico dedicato per ridurre le minacce di furto di dati e duplicazione dei dispositivi negli scenari di produzione. L'hardware di crittografia include componenti con caratteristiche che impediscono l'esportazione di chiavi segrete di crittografia. Per supportare ciò, dovrai implementare un sottoinsieme di PKCS \#11 necessario per lavorare con le librerie FreerTOS come definito nella tabella precedente. 

## Quando usare FreerTOS CorePKCS11
<a name="using-pkcs"></a>

[La libreria CorePKCS11 contiene un'implementazione basata su software dell'interfaccia (API) PKCS \#11 che utilizza la funzionalità crittografica fornita da Mbed TLS.](https://tls.mbed.org/) Viene fornita per scenari di prototipazione e valutazione rapida in cui l'hardware non dispone di un hardware crittografico dedicato. In questo caso, è sufficiente implementare CorePKCS11 PAL per far funzionare l'implementazione basata sul software CorePKCS11 con la piattaforma hardware in uso. 

## Portare CorePKCS11
<a name="porting-core-pkcs"></a>

Dovrai disporre di implementazioni per leggere e scrivere oggetti crittografici nella memoria non volatile (NVM), come la memoria flash integrata. Gli oggetti crittografici devono essere archiviati in una sezione di NVM che non è inizializzata e non viene cancellata durante la riprogrammazione del dispositivo. Gli utenti della libreria CorePKCS11 forniranno ai dispositivi le credenziali e quindi riprogrammeranno il dispositivo con una nuova applicazione che accede a tali credenziali tramite l'interfaccia CorePKCS11. Le porte PAL CorePKCS11 devono fornire una posizione in cui archiviare: 
+ Il certificato client del dispositivo
+ La chiave privata del client del dispositivo
+ La chiave pubblica del client del dispositivo
+ Una CA root affidabile
+ Una chiave pubblica per la verifica del codice (o un certificato che contiene la chiave pubblica per la verifica del codice) per un bootloader sicuro e gli aggiornamenti over-the-air (OTA)
+ Un certificato di approvvigionamento Just-In-Time 

[Includi il file di intestazione](https://github.com/FreeRTOS/corePKCS11/blob/main/source/include/core_pkcs11_pal.h) e implementa le API PAL definite.


**API PAL**  

| Funzione | Description | 
| --- | --- | 
| PKCS11\_PAL\_inizializza | Inizializza il livello PAL. Chiamato dalla libreria CorePKCS11 all'inizio della sequenza di inizializzazione. | 
| PKCS11\_PAL\_ SaveObject | Scrive i dati in storage non volatile. | 
| PKCS11\_PAL\_ FindObject | Utilizza `CKA_LABEL` PKCS \# 11 per cercare un oggetto PKCS \# 11 corrispondente in storage non volatile e restituisce l'handle dell'oggetto, se esistente. | 
| PKCS11\_PAL\_ GetObjectValue | Recupera il valore di un oggetto, specificato l'handle. | 
| PKCS11\_PAL\_ GetObjectValueCleanup | Pulizia per la chiamata `PKCS11_PAL_GetObjectValue`. Può essere utilizzata per liberare memoria allocata in una chiamata `PKCS11_PAL_GetObjectValue`. | 

## Test in corso
<a name="porting-testing-pkcs"></a>

Se utilizzi la libreria FreerTOS CorePKCS11 o implementi il sottoinsieme richiesto di API PKCS11, devi superare i test FreerTOS PKCS11. Questi verificano se le funzioni richieste per le librerie FreerTOS funzionano come previsto.

Questa sezione descrive anche come eseguire localmente i test FreerTOS PKCS11 con i test di qualificazione.

### Prerequisiti
<a name="porting-testing-prereqs"></a>

Per configurare i test FreerTOS PKCS11, è necessario implementare quanto segue.
+ Una porta supportata di API PKCS11.
+ Un'implementazione delle funzioni della piattaforma per i test di qualificazione FreerTOS che includono quanto segue:
  + `FRTest_ThreadCreate`
  + `FRTest_ThreadTimedJoin`
  + `FRTest_MemoryAlloc`
  + `FRTest_MemoryFree`

(Vedi il [ README.md](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11)file per i test di integrazione delle librerie FreerTOS per PKCS \#11 in poi.) GitHub

### Test di portabilità
<a name="porting-tests-pkcs11"></a>
+ Aggiungi [ FreeRTOS-Libraries-Integration-Tests](https://github.com/FreeRTOS/FreeRTOS-Libraries-Integration-Tests/tree/main/src/pkcs11)come sottomodulo al tuo progetto. Il sottomodulo può essere inserito in qualsiasi directory del progetto, purché possa essere creato.
+ Copia `config_template/test_execution_config_template.h` e `config_template/test_param_config_template.h` in una posizione del progetto nel percorso di creazione e rinominali in e. `test_execution_config.h` `test_param_config.h` 
+ Includi i file pertinenti nel sistema di compilazione. Se si utilizza`CMake`, `qualification_test.cmake` e `src/pkcs11_tests.cmake` può essere utilizzato per includere i file pertinenti.
+ Implementa `UNITY_OUTPUT_CHAR` in modo che i registri dell'output del test e i registri del dispositivo non si interlacciano.
+ Integra MbedTLS, che verifica il risultato dell'operazione cryptoki.
+ Chiama dall'applicazione. `RunQualificationTest()`

### Configurazione dei test
<a name="configure-pkcs11-tests"></a>

La suite di test PKCS11 deve essere configurata in base all'implementazione PKCS11. La tabella seguente elenca la configurazione richiesta dai test PKCS11 nel file di intestazione. `test_param_config.h`


**Configurazioni di test PKSC11**  

| Configurazione | Description | 
| --- | --- | 
| PKCS11\_TEST\_RSA\_KEY\_SUPPORT | Il porting supporta le funzioni chiave RSA. | 
| PKCS11\_TEST\_EC\_KEY\_SUPPORT | Il porting supporta le funzioni chiave EC. | 
| PKCS11\_TEST\_IMPORT\_PRIVATE\_KEY\_SUPPORT | Il porting supporta l'importazione della chiave privata. L'importazione di chiavi RSA ed EC viene convalidata nel test se le funzioni chiave di supporto sono abilitate. | 
| PKCS11\_TEST\_GENERATE\_KEYPAIR\_SUPPORT | Il porting supporta la generazione di coppie di chiavi. La generazione di coppie di chiavi EC viene convalidata nel test se le funzioni chiave di supporto sono abilitate. | 
| PKCS11\_TEST\_PREPROVISIONED\_SUPPORT | Il porting ha credenziali preimpostate. `PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`, `PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` e`PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS`, sono esempi delle credenziali. | 
| PKCS11\_TEST\_LABEL\_DEVICE\_PRIVATE\_KEY\_FOR\_TLS | L'etichetta della chiave privata utilizzata nel test. | 
| PKCS11\_TEST\_LABEL\_DEVICE\_PUBLIC\_KEY\_FOR\_TLS | L'etichetta della chiave pubblica utilizzata nel test. | 
| PKCS11\_TEST\_LABEL\_DEVICE\_CERTIFICATE\_FOR\_TLS | L'etichetta del certificato utilizzato nel test. | 
| PKCS11\_TEST\_JITP\_CODEVERIFY\_ROOT\_CERT\_SUPPORTED | Il porting supporta l'archiviazione per JITP. Impostalo su 1 per abilitare il test JITP. `codeverify` | 
| PKCS11\_TEST\_LABEL\_CODE\_VERIFICATION\_KEY | L'etichetta della chiave di verifica del codice utilizzata nel test JITP. `codeverify` | 
| PKCS11\_TEST\_LABEL\_JITP\_CERTIFICATE | L'etichetta del certificato JITP utilizzato nel test JITP. `codeverify` | 
| PKCS11\_TEST\_LABEL\_ROOT\_CERTIFICATE | L'etichetta del certificato principale utilizzato nel test JITP. `codeverify` | 

Le librerie FreerTOS e le integrazioni di riferimento devono supportare almeno una configurazione di funzioni chiave come le chiavi RSA o Elliptic curve e un meccanismo di provisioning chiave supportato dalle API PKCS11. Il test deve abilitare le seguenti configurazioni: 
+ Almeno una delle seguenti configurazioni di funzioni chiave:
  + PKCS11\_TEST\_RSA\_KEY\_SUPPORT
  + PKCS11\_TEST\_EC\_KEY\_SUPPORT
+ Almeno una delle seguenti configurazioni di provisioning chiave:
  + PKCS11\_TEST\_IMPORT\_PRIVATE\_KEY\_SUPPORT
  + PKCS11\_TEST\_GENERATE\_KEYPAIR\_SUPPORT
  + PKCS11\_TEST\_PREPROVISIONED\_SUPPORT 

Il test delle credenziali del dispositivo preimpostato deve essere eseguito nelle seguenti condizioni:
+ `PKCS11_TEST_PREPROVISIONED_SUPPORT`deve essere abilitato e gli altri meccanismi di provisioning devono essere disabilitati.
+ È abilitata solo una funzione chiave`PKCS11_TEST_EC_KEY_SUPPORT`, una delle due`PKCS11_TEST_RSA_KEY_SUPPORT`.
+ Imposta le etichette dei tasti preimpostate in base alla tua funzione chiave`PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS`, `PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` tra cui e. `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS` Queste credenziali devono esistere prima di eseguire il test.

Potrebbe essere necessario eseguire il test più volte con configurazioni diverse, se l'implementazione supporta credenziali preimpostate e altri meccanismi di provisioning.

**Nota**  
Gli oggetti con etichette `PKCS11_TEST_LABEL_DEVICE_PRIVATE_KEY_FOR_TLS` `PKCS11_TEST_LABEL_DEVICE_CERTIFICATE_FOR_TLS` vengono distrutti durante `PKCS11_TEST_LABEL_DEVICE_PUBLIC_KEY_FOR_TLS` il test se uno dei due è abilitato. `PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT` `PKCS11_TEST_GENERATE_KEYPAIR_SUPPORT`

### Esecuzione di test.
<a name="running-tests"></a>

Questa sezione descrive come testare localmente l'interfaccia PKCS11 con i test di qualificazione. In alternativa, puoi anche usare IDT per automatizzare l'esecuzione. Vedi [AWS IoT Device Tester FreerTOS nella FreerTOS](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) User *Guide per i dettagli*.

Le seguenti istruzioni descrivono come eseguire i test:
+ Aprire `test_execution_config.h` e definire **CORE\_PKCS11\_TEST\_ENABLED** su 1.
+ Compilate e installate l'applicazione sul dispositivo per eseguirla. I risultati del test vengono inviati alla porta seriale.

Di seguito è riportato un esempio del risultato del test di output.

```
TEST(Full_PKCS11_StartFinish, PKCS11_StartFinish_FirstTest) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_GetFunctionList) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_InitializeFinalize) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_GetSlotList) PASS
TEST(Full_PKCS11_StartFinish, PKCS11_OpenSessionCloseSession) PASS
TEST(Full_PKCS11_Capabilities, PKCS11_Capabilities) PASS
TEST(Full_PKCS11_NoObject, PKCS11_Digest) PASS
TEST(Full_PKCS11_NoObject, PKCS11_Digest_ErrorConditions) PASS
TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandom) PASS
TEST(Full_PKCS11_NoObject, PKCS11_GenerateRandomMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_CreateObject) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObject) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValue) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_Sign) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_FindObjectMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_GetAttributeValueMultiThread) PASS
TEST(Full_PKCS11_RSA, PKCS11_RSA_DestroyObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GenerateKeyPair) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_CreateObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_FindObject) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValue) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_Sign) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_Verify) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_FindObjectMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_GetAttributeValueMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_SignVerifyMultiThread) PASS
TEST(Full_PKCS11_EC, PKCS11_EC_DestroyObject) PASS

-----------------------
27 Tests 0 Failures 0 Ignored
OK
```

 Il test è completato quando tutti i test vengono superati.

**Nota**  
Per qualificare ufficialmente un dispositivo per FreerTOS, devi convalidare il codice sorgente portato del dispositivo con. AWS IoT Device Tester Segui le istruzioni in [Using AWS IoT Device Tester for FreerTOS](https://docs.aws.amazon.com/freertos/latest/userguide/device-tester-for-freertos-ug.html) nella FreeRTOS User Guide per configurare la convalida delle porte. AWS IoT Device Tester Per testare la porta di una libreria specifica, è necessario abilitare il gruppo di test corretto nel file nella `device.json` cartella. AWS IoT Device Tester `configs`