mirror of
				https://github.com/cuberite/polarssl.git
				synced 2025-11-04 04:32:24 -05:00 
			
		
		
		
	Split off psa_key_derivation_internal
Refactor psa_key_derivation to prepare for key agreement algorithms which need to plug into key derivation after argument validation.
This commit is contained in:
		
							parent
							
								
									93098fd996
								
							
						
					
					
						commit
						cce18aec4c
					
				@ -3432,7 +3432,8 @@ exit:
 | 
				
			|||||||
/* Set up an HKDF-based generator. This is exactly the extract phase
 | 
					/* Set up an HKDF-based generator. This is exactly the extract phase
 | 
				
			||||||
 * of the HKDF algorithm. */
 | 
					 * of the HKDF algorithm. */
 | 
				
			||||||
static psa_status_t psa_generator_hkdf_setup( psa_hkdf_generator_t *hkdf,
 | 
					static psa_status_t psa_generator_hkdf_setup( psa_hkdf_generator_t *hkdf,
 | 
				
			||||||
                                              key_slot_t *slot,
 | 
					                                              const uint8_t *secret,
 | 
				
			||||||
 | 
					                                              size_t secret_length,
 | 
				
			||||||
                                              psa_algorithm_t hash_alg,
 | 
					                                              psa_algorithm_t hash_alg,
 | 
				
			||||||
                                              const uint8_t *salt,
 | 
					                                              const uint8_t *salt,
 | 
				
			||||||
                                              size_t salt_length,
 | 
					                                              size_t salt_length,
 | 
				
			||||||
@ -3445,9 +3446,7 @@ static psa_status_t psa_generator_hkdf_setup( psa_hkdf_generator_t *hkdf,
 | 
				
			|||||||
                                      PSA_ALG_HMAC_GET_HASH( hash_alg ) );
 | 
					                                      PSA_ALG_HMAC_GET_HASH( hash_alg ) );
 | 
				
			||||||
    if( status != PSA_SUCCESS )
 | 
					    if( status != PSA_SUCCESS )
 | 
				
			||||||
        return( status );
 | 
					        return( status );
 | 
				
			||||||
    status = psa_hash_update( &hkdf->hmac.hash_ctx,
 | 
					    status = psa_hash_update( &hkdf->hmac.hash_ctx, secret, secret_length );
 | 
				
			||||||
                              slot->data.raw.data,
 | 
					 | 
				
			||||||
                              slot->data.raw.bytes );
 | 
					 | 
				
			||||||
    if( status != PSA_SUCCESS )
 | 
					    if( status != PSA_SUCCESS )
 | 
				
			||||||
        return( status );
 | 
					        return( status );
 | 
				
			||||||
    status = psa_hmac_finish_internal( &hkdf->hmac,
 | 
					    status = psa_hmac_finish_internal( &hkdf->hmac,
 | 
				
			||||||
@ -3468,6 +3467,51 @@ static psa_status_t psa_generator_hkdf_setup( psa_hkdf_generator_t *hkdf,
 | 
				
			|||||||
    return( PSA_SUCCESS );
 | 
					    return( PSA_SUCCESS );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					static psa_status_t psa_key_derivation_internal(
 | 
				
			||||||
 | 
					    psa_crypto_generator_t *generator,
 | 
				
			||||||
 | 
					    const uint8_t *secret, size_t secret_length,
 | 
				
			||||||
 | 
					    psa_algorithm_t alg,
 | 
				
			||||||
 | 
					    const uint8_t *salt, size_t salt_length,
 | 
				
			||||||
 | 
					    const uint8_t *label, size_t label_length,
 | 
				
			||||||
 | 
					    size_t capacity )
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    psa_status_t status;
 | 
				
			||||||
 | 
					    size_t max_capacity;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /* Set generator->alg even on failure so that abort knows what to do. */
 | 
				
			||||||
 | 
					    generator->alg = alg;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#if defined(MBEDTLS_MD_C)
 | 
				
			||||||
 | 
					    if( PSA_ALG_IS_HKDF( alg ) )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH( alg );
 | 
				
			||||||
 | 
					        size_t hash_size = PSA_HASH_SIZE( hash_alg );
 | 
				
			||||||
 | 
					        if( hash_size == 0 )
 | 
				
			||||||
 | 
					            return( PSA_ERROR_NOT_SUPPORTED );
 | 
				
			||||||
 | 
					        max_capacity = 255 * hash_size;
 | 
				
			||||||
 | 
					        status = psa_generator_hkdf_setup( &generator->ctx.hkdf,
 | 
				
			||||||
 | 
					                                           secret, secret_length,
 | 
				
			||||||
 | 
					                                           hash_alg,
 | 
				
			||||||
 | 
					                                           salt, salt_length,
 | 
				
			||||||
 | 
					                                           label, label_length );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        return( PSA_ERROR_NOT_SUPPORTED );
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( status != PSA_SUCCESS )
 | 
				
			||||||
 | 
					        return( status );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if( capacity <= max_capacity )
 | 
				
			||||||
 | 
					        generator->capacity = capacity;
 | 
				
			||||||
 | 
					    else
 | 
				
			||||||
 | 
					        return( PSA_ERROR_INVALID_ARGUMENT );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return( PSA_SUCCESS );
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
psa_status_t psa_key_derivation( psa_crypto_generator_t *generator,
 | 
					psa_status_t psa_key_derivation( psa_crypto_generator_t *generator,
 | 
				
			||||||
                                 psa_key_slot_t key,
 | 
					                                 psa_key_slot_t key,
 | 
				
			||||||
                                 psa_algorithm_t alg,
 | 
					                                 psa_algorithm_t alg,
 | 
				
			||||||
@ -3483,41 +3527,27 @@ psa_status_t psa_key_derivation( psa_crypto_generator_t *generator,
 | 
				
			|||||||
    if( generator->alg != 0 )
 | 
					    if( generator->alg != 0 )
 | 
				
			||||||
        return( PSA_ERROR_BAD_STATE );
 | 
					        return( PSA_ERROR_BAD_STATE );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    status = psa_get_key_from_slot( key, &slot, PSA_KEY_USAGE_DERIVE, alg );
 | 
					    /* Make sure that alg is a key derivation algorithm. This prevents
 | 
				
			||||||
    if( status != PSA_SUCCESS )
 | 
					     * key selection algorithms, which psa_key_derivation_internal
 | 
				
			||||||
        return( status );
 | 
					     * accepts for the sake of key agreement. */
 | 
				
			||||||
    if( slot->type != PSA_KEY_TYPE_DERIVE )
 | 
					 | 
				
			||||||
        return( PSA_ERROR_INVALID_ARGUMENT );
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    if( ! PSA_ALG_IS_KEY_DERIVATION( alg ) )
 | 
					    if( ! PSA_ALG_IS_KEY_DERIVATION( alg ) )
 | 
				
			||||||
        return( PSA_ERROR_INVALID_ARGUMENT );
 | 
					        return( PSA_ERROR_INVALID_ARGUMENT );
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#if defined(MBEDTLS_MD_C)
 | 
					    status = psa_get_key_from_slot( key, &slot, PSA_KEY_USAGE_DERIVE, alg );
 | 
				
			||||||
    if( PSA_ALG_IS_HKDF( alg ) )
 | 
					    if( status != PSA_SUCCESS )
 | 
				
			||||||
    {
 | 
					        return( status );
 | 
				
			||||||
        psa_algorithm_t hash_alg = PSA_ALG_HKDF_GET_HASH( alg );
 | 
					 | 
				
			||||||
        size_t hash_size = PSA_HASH_SIZE( hash_alg );
 | 
					 | 
				
			||||||
        if( hash_size == 0 )
 | 
					 | 
				
			||||||
            return( PSA_ERROR_NOT_SUPPORTED );
 | 
					 | 
				
			||||||
        if( capacity > 255 * hash_size )
 | 
					 | 
				
			||||||
            return( PSA_ERROR_INVALID_ARGUMENT );
 | 
					 | 
				
			||||||
        status = psa_generator_hkdf_setup( &generator->ctx.hkdf,
 | 
					 | 
				
			||||||
                                           slot,
 | 
					 | 
				
			||||||
                                           hash_alg,
 | 
					 | 
				
			||||||
                                           salt, salt_length,
 | 
					 | 
				
			||||||
                                           label, label_length );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
    else
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
    {
 | 
					 | 
				
			||||||
        return( PSA_ERROR_NOT_SUPPORTED );
 | 
					 | 
				
			||||||
    }
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
    /* Set generator->alg even on failure so that abort knows what to do. */
 | 
					    if( slot->type != PSA_KEY_TYPE_DERIVE )
 | 
				
			||||||
    generator->alg = alg;
 | 
					        return( PSA_ERROR_INVALID_ARGUMENT );
 | 
				
			||||||
    if( status == PSA_SUCCESS )
 | 
					
 | 
				
			||||||
        generator->capacity = capacity;
 | 
					    status = psa_key_derivation_internal( generator,
 | 
				
			||||||
    else
 | 
					                                          slot->data.raw.data,
 | 
				
			||||||
 | 
					                                          slot->data.raw.bytes,
 | 
				
			||||||
 | 
					                                          alg,
 | 
				
			||||||
 | 
					                                          salt, salt_length,
 | 
				
			||||||
 | 
					                                          label, label_length,
 | 
				
			||||||
 | 
					                                          capacity );
 | 
				
			||||||
 | 
					    if( status != PSA_SUCCESS )
 | 
				
			||||||
        psa_generator_abort( generator );
 | 
					        psa_generator_abort( generator );
 | 
				
			||||||
    return( status );
 | 
					    return( status );
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user