Virtualizzazione risorse
La funzione principale di TBS consiste nel condividere in modo efficiente alcune risorse TPM limitate: chiavi, autorizzazione e sessioni di trasporto.
Quando viene creata un'istanza di una di queste risorse, tbs crea un'istanza virtuale della risorsa e restituisce un handle a questa istanza virtuale nel flusso dei comandi dei risultati , anziché l'istanza di handle effettiva restituita dal TPM. TBS mantiene un mapping tra l'handle virtuale e l'handle effettivo internamente. Se il TPM esaurisce lo spazio per contenere più risorse di un determinato tipo, le istanze esistenti della risorsa vengono salvate e rimosse in modo selettivo finché il TPM non può contenere la nuova risorsa. Quando le risorse precedenti sono necessarie di nuovo, tbs carica i contesti salvati (salvando ed rimuovendo altre risorse, se necessario) prima di inviare il comando.
Tutta la virtualizzazione in TBS viene eseguita per conto di un contesto specifico. Ogni contesto può accedere solo alle risorse virtuali create appositamente per suo conto, nonché alle risorse fisiche nel TPM che corrisponde a tali risorse virtuali. Per impostazione predefinita, il numero totale di tutte le risorse virtualizzate è limitato a 500. Questo numero può essere modificato creando o modificando un valore del Registro di sistema D WORD denominato MaxResources in HKEY_LOCAL_MACHINE\Software\Microsoft\Tpm. È possibile osservare l'utilizzo delle risorse TBS in tempo reale usando lo strumento Performance Monitor per tenere traccia del numero di risorse TBS. Questa restrizione è diventata obsoleta con Windows 8 e Windows Server 2012.
Le risorse TPM limitate non virtualizzate da TBS (ad esempio contatori e archivio NV) devono essere condivise in modo cooperativo tra gli stack software.
Nota
Questa virtualizzazione di handle causa l'esito negativo dei comandi che includono handle di chiave nel calcolo dei parametri di autorizzazione HMAC. Di conseguenza, molti comandi deprecati in TPM versione 1.2 non possono essere usati dal software dell'applicazione nell'ambiente TBS.
Limiti delle risorse
Il TPM consente ai chiamanti di eseguire query sulle relative funzionalità per determinare la quantità di spazio disponibile per determinati tipi di risorse. Alcuni di questi limiti di risorse, ad esempio la quantità di spazio disponibile per le chiavi, le sessioni di autorizzazione e le sessioni di trasporto, vengono estesi efficacemente dai TBS tramite la virtualizzazione. Le limitazioni di TBS, controllate dall'impostazione MaxResources registro di sistema, sono in genere molto più grandi delle limitazioni effettive dell'hardware TPM sottostante. Non viene fornito alcun meccanismo per l'esecuzione di query sulle limitazioni TBS separatamente dai limiti hardware TPM. Questa limitazione TBS è diventata obsoleta con Windows 8 e Windows Server 2012.
Chiavi
TBS virtualizza gli handle di chiave in modo che le chiavi possano essere scaricate in modo trasparente dal TPM quando non vengono usate e caricate nuovamente nel TPM quando sono necessarie. Quando viene creata una chiave, TBS associa un handle virtuale alla chiave caricata. Lo stesso handle virtuale viene usato per la durata della risorsa. Gli handle di chiave virtuale sono validi solo nel contesto che li ha creati e le risorse associate non vengono mantenute oltre la durata del contesto.
Creazione di chiavi con TPM_LoadKey2
Se una chiave viene creata utilizzando il comando TPM_LoadKey2, TPM2_CreatePrimary, TPM2_Load o TPM2_LoadExternal, il tbs sostituisce l'handle nel flusso di byte restituito con un handle di chiave virtuale scelto. Di conseguenza, il TBS garantisce che ogni handle virtuale sia univoco. Se TBS rileva una collisione (un evento estremamente improbabile), TBS scarica la chiave dal TPM e informa il software chiamante. Il software può quindi inviare nuovamente l'operazione. Questo processo può essere ripetuto fino a quando il TBS non ottiene un handle di chiave univoco.
Cancellazione delle chiavi
TBS invalida l'handle di chiave virtuale quando riceve un messaggio di TPM_FlushSpecific o TPM2_FlushContext per tale handle virtuale dal contesto client. Se la chiave è fisicamente presente nel TPM quando viene ricevuto il messaggio di scaricamento, TBS scarica la chiave dal TPM in quel momento.
Rimozione temporanea delle chiavi
Quando si rimuove una chiave dal TPM per liberare spazio per un nuovo elemento, TBS esegue un comando TPM_SaveContext o TPM2_ContextSave sulla chiave prima di rimuoverlo.
Ripristino delle chiavi
Quando un comando che fa riferimento a una chiave caricata viene inviato ai TBS, garantisce che la chiave sia fisicamente presente nel TPM. Se la chiave non è presente, tbs la ripristina con una chiamata a TPM_LoadContext o TPM2_ContextLoad. Se non è possibile ripristinare una chiave nel TPM, il TPM restituisce TPM_E_INVALID_KEYHANDLE come risultato del TPM.
TBS sostituisce ogni handle virtuale associato a una chiave in un flusso di comandi con l'handle fisico della chiave caricata nel TPM. Se un comando viene inviato con un handle virtuale non riconosciuto dai TBS nel contesto del chiamante, tbs formatta un flusso di errore per il chiamante con TPM_E_INVALID_KEYHANDLE.
Sessioni di autorizzazione
Le sessioni di autorizzazione vengono create chiamando TPM_OIAP, TPM_OSAP o TPM_DSAP. In ogni caso, il flusso di byte restituito contiene l'handle TPM fisico della sessione di autorizzazione appena creata. TBS sostituisce questo oggetto con un handle virtuale. Quando viene successivamente fatto riferimento alla sessione di autorizzazione, TBS sostituisce l'handle virtuale nel flusso di comandi con l'handle fisico della sessione di autorizzazione. TBS garantisce che la durata della sessione di autorizzazione virtuale corrisponda a quella della sessione di autorizzazione fisica. Se un client tenta di usare un handle virtuale scaduto, il servizio TBS formatta un flusso di errore con errore TPM_INVALIDAUTHHANDLE.
Gli slot di sessione sono limitati e i TBS potrebbero esaurire gli slot esterni in cui salvare i contesti della sessione di autorizzazione. In questo caso, TBS sceglie una sessione di autorizzazione da invalidare in modo che il nuovo contesto possa essere salvato correttamente. Un'applicazione che tenta di usare il contesto precedente dovrà ricreare la sessione di autorizzazione.
TBS invalida la sessione di autorizzazione virtuale quando si verifica uno dei casi seguenti:
Il flag continue-use associato alla sessione di autorizzazione nel flusso di comandi restituito dal TPM è FALSE.
Un comando che usa una sessione di autorizzazione non riesce.
Viene eseguito un comando che invalida la sessione di autorizzazione associata al comando , ad esempio TPM_CreateWrapKey.
Una chiave associata a una sessione OSAP o DSAP viene rimossa dal TPM con una chiamata a TPM_FlushSpecific o TPM2_FlushContext (indipendentemente dal fatto che questo comando abbia avuto origine con TBS o con software di livello superiore).
Il TBS risincronizzerà automaticamente le sessioni di autorizzazione dopo l'esecuzione corretta di determinati comandi non deterministici per garantire che lo stato TBS rimanga coerente con lo stato TPM. I comandi interessati sono:
- TPM_ORD_Delegate_Manage
- TPM_ORD_Delegate_CreateOwnerDelegation
- TPM_ORD_Delegate_LoadOwnerDelegation
In ognuno dei casi seguenti la sessione di autorizzazione nel TPM viene scaricata automaticamente dal TPM:
Creazione di sessioni di autorizzazione
Gli handle di sessione di autorizzazione virtuale sono validi solo nel contesto in cui sono stati creati e le risorse associate non vengono mantenute oltre la durata del contesto associato.
Cancellazione di sessioni di autorizzazione
TBS invalida la sessione di autorizzazione virtuale se riceve un comando TPM_FlushSpecific o TPM2_FlushContext per l'handle virtuale dal contesto client. Se la sessione di autorizzazione è fisicamente presente nel TPM quando viene ricevuto il comando flush, TBS scarica immediatamente la sessione fisica dal TPM.
Rimozione temporanea delle sessioni di autorizzazione
Quando si rimuove una sessione di autorizzazione dal TPM per liberare spazio per una nuova entità, il TBS viene eseguito TPM_SaveContext o TPM2_ContextSave in tale sessione di autorizzazione.
Ripristino delle sessioni di autorizzazione
Quando un comando TPM autorizzato viene inviato ai TBS, il servizio TBS garantisce che tutte le sessioni di autorizzazione virtuale a cui si fa riferimento nel comando siano fisicamente presenti nel TPM. Se una delle sessioni di autorizzazione non è presente, il servizio TBS li ripristina con una chiamata a TPM_LoadContext o TPM2_ContextLoad. Se non è possibile ripristinare una sessione di autorizzazione nel TPM, il TPM restituisce TPM_E_INVALID_HANDLE come risultato del TPM.
TBS sostituisce ogni handle virtuale associato a una sessione di autorizzazione in un flusso di comandi con l'handle fisico della sessione di autorizzazione caricata nel TPM.
Se un comando viene inviato con un handle virtuale non riconosciuto dai TBS nel contesto del chiamante, TBS formatta un flusso di errore per il chiamante con l'errore TPM_E_INVALID_HANDLE.
Sessioni di trasporto
Nota
La gestione delle sessioni di trasporto, come descritto di seguito, è specifica per Windows Vista e Windows Server 2008.
Le sessioni di trasporto sono un meccanismo fornito dal TPM che consente a uno stack software di crittografare i dati in un comando mentre passa tra il software e il TPM. Ciò impedisce a un antagonista di intercettare i dati quando passa attraverso il bus hardware.
Importante
Vengono crittografati solo i dati del payload. I comandi eseguiti possono comunque essere identificati.
Sfortunatamente, questo meccanismo impedisce anche ai TBS di esaminare i dati del payload. Nella maggior parte dei casi non si tratta di un problema perché TBS modifica solo gli handle, non i dati del payload. Tuttavia, nel caso di TPM_LoadContext, ad esempio, l'handle di risorse restituito è coperto dalla crittografia. Di conseguenza, il TBS impedisce di eseguire un'operazione di TPM_LoadContext coperta da una sessione di trasporto.
TBS blocca i comandi seguenti nella sessione di trasporto:
- TPM_EstablishTransport
- TPM_ExecuteTransport
- TPM_Terminate_Handle
- TPM_LoadKey
- TPM_EvictKey
- TPM_SaveKeyContext
- TPM_LoadKeyContext
- TPM_SaveAuthContext
- TPM_LoadAuthContext
- TPM_SaveContext
- TPM_LoadContext
- TPM_FlushSpecific
Quando uno di questi comandi è coperto da una sessione di trasporto, tbs restituisce TPM_E_EMBEDDED_COMMAND_UNSUPPORTED come risultato del TPM.
Gli handle di sessione di trasporto vengono virtualizzati in modo simile agli handle di chiavi e agli handle di autorizzazione. Nel TPM sono disponibili un numero limitato di slot di contesto della sessione di trasporto salvati.
TBS invalida la sessione di trasporto virtuale se si verifica uno dei casi seguenti:
Il flag continue-use associato alla sessione di trasporto nel flusso di comandi restituito dal TPM è FALSE.
Come per le sessioni di autorizzazione precedenti, TBS risincronizzerà automaticamente le sessioni di trasporto dopo l'esecuzione corretta di determinati comandi non deterministici per garantire che lo stato TBS rimanga coerente con lo stato TPM. I comandi interessati sono:
- TPM_ORD_Delegate_Manage
- TPM_ORD_Delegate_CreateOwnerDelegation
- TPM_ORD_Delegate_LoadOwnerDelegation
In ognuno di questi casi, la sessione di trasporto sul TPM verrà scaricata automaticamente dal TPM:
Creazione di sessioni di trasporto
TBS crea un handle virtuale per ogni sessione di trasporto creata da un client. Gli handle di trasporto virtuale sono validi solo nel contesto che li ha creati e le risorse associate non vengono mantenute oltre la durata del contesto associato.
Cancellazione delle sessioni di trasporto
TBS invalida la sessione di trasporto virtuale se riceve un comando TPM_FlushSpecific per l'handle virtuale dal contesto client. Se la sessione di trasporto è fisicamente presente nel TPM quando viene ricevuto il comando flush, TBS scarica immediatamente la sessione fisica dal TPM.
Rimozione temporanea delle sessioni di trasporto
Quando si rimuove una sessione di trasporto dal TPM per liberare spazio per una nuova entità, il TBS viene eseguito TPM_SaveContext in tale sessione di trasporto.
Ripristino delle sessioni di trasporto
Quando un comando TPM_ExecuteTransport viene inviato ai TBS, il TBS garantisce che la sessione di trasporto a cui fa riferimento nel comando sia fisicamente presente nel TPM. Se la sessione di trasporto non è presente, il servizio TBS lo ripristina con una chiamata a TPM_LoadContext.
TBS sostituisce l'handle virtuale associato alla sessione di trasporto in un flusso di comandi con l'handle fisico della sessione di trasporto caricata nel TPM. Se un comando viene inviato con un handle virtuale non riconosciuto dai TBS nel contesto del chiamante, TBS formatta un flusso di errore per il chiamante usando TPM_E_INVALID_HANDLE.
Sessioni di trasporto esclusive
Le sessioni di trasporto con wrapping esclusivo sono un modo per il software di primo livello per determinare se qualsiasi altro software ha eseguito l'accesso al TPM durante una catena di comandi. Non impediscono ad altri software di accedere al TPM, ma danno all'autore della sessione di trasporto un mezzo per determinare che si è verificato un altro accesso. Il TBS non esegue alcuna operazione specifica per ostacolare sessioni di trasporto esclusive, ma è in qualche modo incompatibile con loro. TBS tenta di duplicare il comportamento naturale del TPM essendo trasparente, quindi non privilegia i comandi dai contesti che stabiliscono una sessione di trasporto esclusiva. Ad esempio, se il client B invia un comando quando il client A si trova in una sessione di trasporto esclusiva, invaliderà la sessione di trasporto esclusiva del client A.
I comandi avviati da TBS possono anche terminare la sessione di trasporto esclusiva. Ciò si verifica quando il client A si trova in una sessione di trasporto esclusiva e un comando eseguito dal client A chiama una risorsa non fisicamente presente nel TPM. Questa situazione attiva il gestore di virtualizzazione TBS per eseguire un comando TPM_LoadContext per fornire tale risorsa, che termina la sessione di trasporto esclusiva del client A.