Skip to content

Commit 178c9aa

Browse files
Key derivation: forbid output_key without input_key
If none of the inputs to a key derivation is a PSA_KEY_DERIVATION_INPUT_SECRET passed with psa_key_derivation_input_key(), forbid psa_key_derivation_output_key(). It usually doesn't make sense to derive a key object if the secret isn't itself a proper key.
1 parent 1a2904c commit 178c9aa

File tree

5 files changed

+53
-6
lines changed

5 files changed

+53
-6
lines changed

include/psa/crypto.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3527,6 +3527,11 @@ psa_status_t psa_key_derivation_output_bytes(
35273527
* In all cases, the data that is read is discarded from the operation.
35283528
* The operation's capacity is decreased by the number of bytes read.
35293529
*
3530+
* For algorithms that take an input step #PSA_KEY_DERIVATION_INPUT_SECRET,
3531+
* the input to that step must be provided with psa_key_derivation_input_key().
3532+
* Future versions of this specification may include additional restrictions
3533+
* on the derived key based on the attributes and strength of the secret key.
3534+
*
35303535
* \param[in] attributes The attributes for the new key.
35313536
* \param[in,out] operation The key derivation operation object to read from.
35323537
* \param[out] handle On success, a handle to the newly created key.
@@ -3549,6 +3554,9 @@ psa_status_t psa_key_derivation_output_bytes(
35493554
* implementation in general or in this particular location.
35503555
* \retval #PSA_ERROR_INVALID_ARGUMENT
35513556
* The provided key attributes are not valid for the operation.
3557+
* \retval #PSA_ERROR_NOT_PERMITTED
3558+
* The #PSA_KEY_DERIVATION_INPUT_SECRET input was not provided through
3559+
* a key.
35523560
* \retval #PSA_ERROR_BAD_STATE
35533561
* The operation state is not valid (it must be active and completed
35543562
* all required input steps).

include/psa/crypto_struct.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -255,6 +255,7 @@ typedef struct psa_tls12_prf_key_derivation_s
255255
struct psa_key_derivation_s
256256
{
257257
psa_algorithm_t alg;
258+
unsigned int can_output_key : 1;
258259
size_t capacity;
259260
union
260261
{
@@ -268,7 +269,7 @@ struct psa_key_derivation_s
268269
};
269270

270271
/* This only zeroes out the first byte in the union, the rest is unspecified. */
271-
#define PSA_KEY_DERIVATION_OPERATION_INIT {0, 0, {0}}
272+
#define PSA_KEY_DERIVATION_OPERATION_INIT {0, 0, 0, {0}}
272273
static inline struct psa_key_derivation_s psa_key_derivation_operation_init( void )
273274
{
274275
const struct psa_key_derivation_s v = PSA_KEY_DERIVATION_OPERATION_INIT;

include/psa/crypto_values.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1622,7 +1622,11 @@
16221622
* (passed to psa_key_derivation_input_key())
16231623
* or the shared secret resulting from a key agreement
16241624
* (obtained via psa_key_derivation_key_agreement()).
1625-
* It can also be a direct input (passed to key_derivation_input_bytes()).
1625+
*
1626+
* The secret can also be a direct input (passed to
1627+
* key_derivation_input_bytes()). In this case, the derivation operation
1628+
* may not be used to derive keys: the operation will only allow
1629+
* psa_key_derivation_output_bytes(), not psa_key_derivation_output_key().
16261630
*/
16271631
#define PSA_KEY_DERIVATION_INPUT_SECRET ((psa_key_derivation_step_t)0x0101)
16281632

library/psa_crypto.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4787,6 +4787,9 @@ psa_status_t psa_key_derivation_output_key( const psa_key_attributes_t *attribut
47874787
if( psa_get_key_bits( attributes ) == 0 )
47884788
return( PSA_ERROR_INVALID_ARGUMENT );
47894789

4790+
if( ! operation->can_output_key )
4791+
return( PSA_ERROR_NOT_PERMITTED );
4792+
47904793
status = psa_start_key_creation( PSA_KEY_CREATION_DERIVE,
47914794
attributes, handle, &slot, &driver );
47924795
#if defined(MBEDTLS_PSA_CRYPTO_SE_C)
@@ -5174,6 +5177,7 @@ psa_status_t psa_key_derivation_input_key(
51745177
{
51755178
psa_key_slot_t *slot;
51765179
psa_status_t status;
5180+
51775181
status = psa_get_transparent_key( handle, &slot,
51785182
PSA_KEY_USAGE_DERIVE,
51795183
operation->alg );
@@ -5182,6 +5186,12 @@ psa_status_t psa_key_derivation_input_key(
51825186
psa_key_derivation_abort( operation );
51835187
return( status );
51845188
}
5189+
5190+
/* Passing a key object as a SECRET input unlocks the permission
5191+
* to output to a key object. */
5192+
if( step == PSA_KEY_DERIVATION_INPUT_SECRET )
5193+
operation->can_output_key = 1;
5194+
51855195
return( psa_key_derivation_input_internal( operation,
51865196
step, slot->attr.type,
51875197
slot->data.raw.data,

tests/suites/test_suite_psa_crypto.data

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1888,7 +1888,11 @@ PSA key derivation setup: bad algorithm
18881888
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
18891889
derive_setup:PSA_ALG_CATEGORY_KEY_DERIVATION:PSA_ERROR_NOT_SUPPORTED
18901890

1891-
PSA key derivation: HKDF-SHA-256, good case
1891+
PSA key derivation: HKDF-SHA-256, good case, direct output
1892+
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
1893+
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
1894+
1895+
PSA key derivation: HKDF-SHA-256, good case, key output
18921896
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
18931897
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_SUCCESS
18941898

@@ -1900,14 +1904,28 @@ PSA key derivation: HKDF-SHA-256, bad key type
19001904
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19011905
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_RAW_DATA:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_ERROR_BAD_STATE:PSA_KEY_TYPE_NONE:PSA_ERROR_BAD_STATE
19021906

1903-
PSA key derivation: HKDF-SHA-256, direct secret
1907+
PSA key derivation: HKDF-SHA-256, bad key type, key output
1908+
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
1909+
# Whether we get NOT_PERMITTED or BAD_STATE for the output is an implementation
1910+
# detail.
1911+
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_RAW_DATA:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_ERROR_BAD_STATE:PSA_KEY_TYPE_RAW_DATA:PSA_ERROR_NOT_PERMITTED
1912+
1913+
PSA key derivation: HKDF-SHA-256, direct secret, direct output
19041914
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19051915
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_NONE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
19061916

1907-
PSA key derivation: HKDF-SHA-256, direct empty secret
1917+
PSA key derivation: HKDF-SHA-256, direct empty secret, direct output
19081918
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19091919
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
19101920

1921+
PSA key derivation: HKDF-SHA-256, direct secret, key output
1922+
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
1923+
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_NONE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_RAW_DATA:PSA_ERROR_NOT_PERMITTED
1924+
1925+
PSA key derivation: HKDF-SHA-256, direct empty secret, key output
1926+
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
1927+
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_RAW_DATA:PSA_ERROR_NOT_PERMITTED
1928+
19111929
PSA key derivation: HKDF-SHA-256, RAW_DATA key as salt
19121930
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19131931
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_RAW_DATA:"412073616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_SUCCESS
@@ -1916,10 +1934,16 @@ PSA key derivation: HKDF-SHA-256, RAW_DATA key as info
19161934
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19171935
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_RAW_DATA:"4120696e666f":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_SUCCESS
19181936

1919-
PSA key derivation: HKDF-SHA-256, DERIVE key as salt
1937+
PSA key derivation: HKDF-SHA-256, DERIVE key as salt, direct output
19201938
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19211939
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_DERIVE:"412073616c74":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_ERROR_BAD_STATE:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_ERROR_BAD_STATE:PSA_KEY_TYPE_NONE:PSA_ERROR_BAD_STATE
19221940

1941+
PSA key derivation: HKDF-SHA-256, DERIVE key as salt, key output
1942+
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
1943+
# Whether we get NOT_PERMITTED or BAD_STATE for the output is an implementation
1944+
# detail.
1945+
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_DERIVE:"412073616c74":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_ERROR_BAD_STATE:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_NONE:"":PSA_ERROR_BAD_STATE:PSA_KEY_TYPE_RAW_DATA:PSA_ERROR_BAD_STATE
1946+
19231947
PSA key derivation: HKDF-SHA-256, DERIVE key as info
19241948
depends_on:MBEDTLS_MD_C:MBEDTLS_SHA256_C
19251949
derive_input:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KEY_TYPE_DERIVE:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:PSA_KEY_TYPE_DERIVE:"4120696e666f":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_TYPE_NONE:PSA_ERROR_BAD_STATE

0 commit comments

Comments
 (0)