mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-10-30 19:20:40 -04:00 
			
		
		
		
	Add new PSA Crypto Storage backend implementation using ITS APIs
The new file is conditionally compiled with the new mbedtls configuration option that Mbed OS would set by default - `MBEDTLS_PSA_CRYPTO_STORAGE_ITS_C`. -
This commit is contained in:
		
							parent
							
								
									a90abf13b6
								
							
						
					
					
						commit
						a26d764bae
					
				| @ -56,6 +56,7 @@ set(src_crypto | |||||||
|     psa_crypto.c |     psa_crypto.c | ||||||
|     psa_crypto_storage.c |     psa_crypto_storage.c | ||||||
|     psa_crypto_storage_file.c |     psa_crypto_storage_file.c | ||||||
|  |     psa_crypto_storage_its.c | ||||||
|     ripemd160.c |     ripemd160.c | ||||||
|     rsa.c |     rsa.c | ||||||
|     rsa_internal.c |     rsa_internal.c | ||||||
|  | |||||||
| @ -84,6 +84,7 @@ OBJS_CRYPTO=	aes.o		aesni.o		arc4.o		\ | |||||||
| 		psa_crypto.o					\
 | 		psa_crypto.o					\
 | ||||||
| 		psa_crypto_storage.o				\
 | 		psa_crypto_storage.o				\
 | ||||||
| 		psa_crypto_storage_file.o			\
 | 		psa_crypto_storage_file.o			\
 | ||||||
|  | 		psa_crypto_storage_its.o			\
 | ||||||
| 		ripemd160.o	rsa_internal.o	rsa.o  		\
 | 		ripemd160.o	rsa_internal.o	rsa.o  		\
 | ||||||
| 		sha1.o		sha256.o	sha512.o	\
 | 		sha1.o		sha256.o	sha512.o	\
 | ||||||
| 		threading.o	timing.o	version.o	\
 | 		threading.o	timing.o	version.o	\
 | ||||||
|  | |||||||
							
								
								
									
										184
									
								
								library/psa_crypto_storage_its.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										184
									
								
								library/psa_crypto_storage_its.c
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,184 @@ | |||||||
|  | /*
 | ||||||
|  |  *  PSA storage backend for persistent keys using psa_its APIs. | ||||||
|  |  */ | ||||||
|  | /*  Copyright (C) 2018, ARM Limited, All Rights Reserved
 | ||||||
|  |  *  SPDX-License-Identifier: Apache-2.0 | ||||||
|  |  * | ||||||
|  |  *  Licensed under the Apache License, Version 2.0 (the "License"); you may | ||||||
|  |  *  not use this file except in compliance with the License. | ||||||
|  |  *  You may obtain a copy of the License at | ||||||
|  |  * | ||||||
|  |  *  http://www.apache.org/licenses/LICENSE-2.0
 | ||||||
|  |  * | ||||||
|  |  *  Unless required by applicable law or agreed to in writing, software | ||||||
|  |  *  distributed under the License is distributed on an "AS IS" BASIS, WITHOUT | ||||||
|  |  *  WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | ||||||
|  |  *  See the License for the specific language governing permissions and | ||||||
|  |  *  limitations under the License. | ||||||
|  |  * | ||||||
|  |  *  This file is part of mbed TLS (https://tls.mbed.org)
 | ||||||
|  |  */ | ||||||
|  | 
 | ||||||
|  | #if defined(MBEDTLS_CONFIG_FILE) | ||||||
|  | #include MBEDTLS_CONFIG_FILE | ||||||
|  | #else | ||||||
|  | #include "mbedtls/config.h" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | #if defined(MBEDTLS_PSA_CRYPTO_STORAGE_ITS_C) | ||||||
|  | 
 | ||||||
|  | #include "psa/crypto.h" | ||||||
|  | #include "psa_crypto_storage_backend.h" | ||||||
|  | #include "psa_prot_internal_storage.h" | ||||||
|  | 
 | ||||||
|  | #if defined(MBEDTLS_PLATFORM_C) | ||||||
|  | #include "mbedtls/platform.h" | ||||||
|  | #endif | ||||||
|  | 
 | ||||||
|  | static psa_status_t its_to_psa_error( psa_its_status_t ret ) | ||||||
|  | { | ||||||
|  |     switch( ret ) | ||||||
|  |     { | ||||||
|  |         case PSA_ITS_SUCCESS: | ||||||
|  |             return( PSA_SUCCESS ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_KEY_NOT_FOUND: | ||||||
|  |             return( PSA_ERROR_EMPTY_SLOT ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_STORAGE_FAILURE: | ||||||
|  |             return( PSA_ERROR_STORAGE_FAILURE ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_INSUFFICIENT_SPACE: | ||||||
|  |             return( PSA_ERROR_INSUFFICIENT_STORAGE ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_INVALID_KEY: | ||||||
|  |         case PSA_PS_ERROR_OFFSET_INVALID: | ||||||
|  |         case PSA_ITS_ERROR_INCORRECT_SIZE: | ||||||
|  |         case PSA_ITS_ERROR_BAD_POINTER: | ||||||
|  |             return( PSA_ERROR_INVALID_ARGUMENT ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_FLAGS_NOT_SUPPORTED: | ||||||
|  |             return( PSA_ERROR_NOT_SUPPORTED ); | ||||||
|  | 
 | ||||||
|  |         case PSA_ITS_ERROR_WRITE_ONCE: | ||||||
|  |             return( PSA_ERROR_OCCUPIED_SLOT ); | ||||||
|  | 
 | ||||||
|  |         default: | ||||||
|  |             return( PSA_ERROR_UNKNOWN_ERROR ); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static uint32_t psa_its_identifier_of_slot( psa_key_slot_t key ) | ||||||
|  | { | ||||||
|  |     return( key ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | psa_status_t psa_crypto_storage_load( const psa_key_slot_t key, uint8_t *data, | ||||||
|  |                                       size_t data_size ) | ||||||
|  | { | ||||||
|  |     psa_its_status_t ret; | ||||||
|  |     psa_status_t status; | ||||||
|  |     uint32_t data_identifier = psa_its_identifier_of_slot( key ); | ||||||
|  |     struct psa_its_info_t data_identifier_info; | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  |     status = its_to_psa_error( ret ); | ||||||
|  |     if( status != PSA_SUCCESS ) | ||||||
|  |         return( status ); | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get( data_identifier, 0, data_size, data ); | ||||||
|  |     status = its_to_psa_error( ret ); | ||||||
|  | 
 | ||||||
|  |     return( status ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | int psa_is_key_present_in_storage( const psa_key_slot_t key ) | ||||||
|  | { | ||||||
|  |     psa_its_status_t ret; | ||||||
|  |     uint32_t data_identifier = psa_its_identifier_of_slot( key ); | ||||||
|  |     struct psa_its_info_t data_identifier_info; | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  | 
 | ||||||
|  |     if( ret == PSA_ITS_ERROR_KEY_NOT_FOUND ) | ||||||
|  |         return( 0 ); | ||||||
|  |     return( 1 ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | psa_status_t psa_crypto_storage_store( const psa_key_slot_t key, | ||||||
|  |                                        const uint8_t *data, | ||||||
|  |                                        size_t data_length ) | ||||||
|  | { | ||||||
|  |     psa_its_status_t ret; | ||||||
|  |     psa_status_t status; | ||||||
|  |     uint32_t data_identifier = psa_its_identifier_of_slot( key ); | ||||||
|  |     struct psa_its_info_t data_identifier_info; | ||||||
|  | 
 | ||||||
|  |     if( psa_is_key_present_in_storage( key ) == 1 ) | ||||||
|  |         return( PSA_ERROR_OCCUPIED_SLOT ); | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_set( data_identifier, data_length, data, 0 ); | ||||||
|  |     status = its_to_psa_error( ret ); | ||||||
|  |     if( status != PSA_SUCCESS ) | ||||||
|  |     { | ||||||
|  |         return( PSA_ERROR_STORAGE_FAILURE ); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  |     status = its_to_psa_error( ret ); | ||||||
|  |     if( status != PSA_SUCCESS ) | ||||||
|  |     { | ||||||
|  |         goto exit; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     if( data_identifier_info.size != data_length ) | ||||||
|  |     { | ||||||
|  |         status = PSA_ERROR_STORAGE_FAILURE; | ||||||
|  |         goto exit; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  | exit: | ||||||
|  |     if( status != PSA_SUCCESS ) | ||||||
|  |         psa_its_remove( data_identifier ); | ||||||
|  |     return( status ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | psa_status_t psa_destroy_persistent_key( const psa_key_slot_t key ) | ||||||
|  | { | ||||||
|  |     psa_its_status_t ret; | ||||||
|  |     uint32_t data_identifier = psa_its_identifier_of_slot( key ); | ||||||
|  |     struct psa_its_info_t data_identifier_info; | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  |     if( ret == PSA_ITS_ERROR_KEY_NOT_FOUND ) | ||||||
|  |         return( PSA_SUCCESS ); | ||||||
|  | 
 | ||||||
|  |     if( psa_its_remove( data_identifier ) != PSA_ITS_SUCCESS ) | ||||||
|  |         return( PSA_ERROR_STORAGE_FAILURE ); | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  |     if( ret != PSA_ITS_ERROR_KEY_NOT_FOUND ) | ||||||
|  |         return( PSA_ERROR_STORAGE_FAILURE ); | ||||||
|  | 
 | ||||||
|  |     return( PSA_SUCCESS ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | psa_status_t psa_crypto_storage_get_data_length( const psa_key_slot_t key, | ||||||
|  |                                                  size_t *data_length ) | ||||||
|  | { | ||||||
|  |     psa_its_status_t ret; | ||||||
|  |     psa_status_t status; | ||||||
|  |     uint32_t data_identifier = psa_its_identifier_of_slot( key ); | ||||||
|  |     struct psa_its_info_t data_identifier_info; | ||||||
|  | 
 | ||||||
|  |     ret = psa_its_get_info( data_identifier, &data_identifier_info ); | ||||||
|  |     status = its_to_psa_error( ret ); | ||||||
|  |     if( status != PSA_SUCCESS ) | ||||||
|  |         return( status ); | ||||||
|  | 
 | ||||||
|  |     *data_length = (size_t) data_identifier_info.size; | ||||||
|  | 
 | ||||||
|  |     return( PSA_SUCCESS ); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #endif /* MBEDTLS_PSA_CRYPTO_STORAGE_ITS_C */ | ||||||
| @ -291,6 +291,7 @@ | |||||||
|     <ClCompile Include="..\..\library\psa_crypto.c" /> |     <ClCompile Include="..\..\library\psa_crypto.c" /> | ||||||
|     <ClCompile Include="..\..\library\psa_crypto_storage.c" /> |     <ClCompile Include="..\..\library\psa_crypto_storage.c" /> | ||||||
|     <ClCompile Include="..\..\library\psa_crypto_storage_file.c" /> |     <ClCompile Include="..\..\library\psa_crypto_storage_file.c" /> | ||||||
|  |     <ClCompile Include="..\..\library\psa_crypto_storage_its.c" /> | ||||||
|     <ClCompile Include="..\..\library\ripemd160.c" /> |     <ClCompile Include="..\..\library\ripemd160.c" /> | ||||||
|     <ClCompile Include="..\..\library\rsa.c" /> |     <ClCompile Include="..\..\library\rsa.c" /> | ||||||
|     <ClCompile Include="..\..\library\rsa_internal.c" /> |     <ClCompile Include="..\..\library\rsa_internal.c" /> | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 Moran Peker
						Moran Peker