mirror of
				https://github.com/Mbed-TLS/mbedtls.git
				synced 2025-11-03 20:33:16 +03:00 
			
		
		
		
	Merge pull request #7700 from silabs-Kusumit/PBKDF2_output_bytes
PBKDF2: Output bytes
This commit is contained in:
		
							
								
								
									
										2
									
								
								ChangeLog.d/add-pbkdf2-hmac.txt
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								ChangeLog.d/add-pbkdf2-hmac.txt
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,2 @@
 | 
			
		||||
Features
 | 
			
		||||
   * Add support for PBKDF2-HMAC through the PSA API.
 | 
			
		||||
@@ -121,6 +121,9 @@ typedef struct {
 | 
			
		||||
    size_t MBEDTLS_PRIVATE(salt_length);
 | 
			
		||||
    uint8_t MBEDTLS_PRIVATE(password)[PSA_HMAC_MAX_HASH_BLOCK_SIZE];
 | 
			
		||||
    size_t MBEDTLS_PRIVATE(password_length);
 | 
			
		||||
    uint8_t MBEDTLS_PRIVATE(output_block)[PSA_HASH_MAX_SIZE];
 | 
			
		||||
    uint8_t MBEDTLS_PRIVATE(bytes_used);
 | 
			
		||||
    uint32_t MBEDTLS_PRIVATE(block_number);
 | 
			
		||||
} psa_pbkdf2_key_derivation_t;
 | 
			
		||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5474,6 +5474,137 @@ static psa_status_t psa_key_derivation_tls12_ecjpake_to_pms_read(
 | 
			
		||||
}
 | 
			
		||||
#endif
 | 
			
		||||
 | 
			
		||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
 | 
			
		||||
static psa_status_t psa_key_derivation_pbkdf2_generate_block(
 | 
			
		||||
    psa_pbkdf2_key_derivation_t *pbkdf2,
 | 
			
		||||
    psa_algorithm_t prf_alg,
 | 
			
		||||
    uint8_t prf_output_length,
 | 
			
		||||
    psa_key_attributes_t *attributes)
 | 
			
		||||
{
 | 
			
		||||
    psa_status_t status;
 | 
			
		||||
    psa_mac_operation_t mac_operation = PSA_MAC_OPERATION_INIT;
 | 
			
		||||
    size_t mac_output_length;
 | 
			
		||||
    uint8_t U_i[PSA_MAC_MAX_SIZE];
 | 
			
		||||
    uint8_t *U_accumulator = pbkdf2->output_block;
 | 
			
		||||
    uint64_t i;
 | 
			
		||||
    uint8_t block_counter[4];
 | 
			
		||||
 | 
			
		||||
    mac_operation.is_sign = 1;
 | 
			
		||||
    mac_operation.mac_size = prf_output_length;
 | 
			
		||||
    MBEDTLS_PUT_UINT32_BE(pbkdf2->block_number, block_counter, 0);
 | 
			
		||||
 | 
			
		||||
    status = psa_driver_wrapper_mac_sign_setup(&mac_operation,
 | 
			
		||||
                                               attributes,
 | 
			
		||||
                                               pbkdf2->password,
 | 
			
		||||
                                               pbkdf2->password_length,
 | 
			
		||||
                                               prf_alg);
 | 
			
		||||
    if (status != PSA_SUCCESS) {
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
    status = psa_mac_update(&mac_operation, pbkdf2->salt, pbkdf2->salt_length);
 | 
			
		||||
    if (status != PSA_SUCCESS) {
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
    status = psa_mac_update(&mac_operation, block_counter, sizeof(block_counter));
 | 
			
		||||
    if (status != PSA_SUCCESS) {
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
    status = psa_mac_sign_finish(&mac_operation, U_i, sizeof(U_i),
 | 
			
		||||
                                 &mac_output_length);
 | 
			
		||||
    if (status != PSA_SUCCESS) {
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    if (mac_output_length != prf_output_length) {
 | 
			
		||||
        status = PSA_ERROR_CORRUPTION_DETECTED;
 | 
			
		||||
        goto cleanup;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    memcpy(U_accumulator, U_i, prf_output_length);
 | 
			
		||||
 | 
			
		||||
    for (i = 1; i < pbkdf2->input_cost; i++) {
 | 
			
		||||
        status = psa_driver_wrapper_mac_compute(attributes,
 | 
			
		||||
                                                pbkdf2->password,
 | 
			
		||||
                                                pbkdf2->password_length,
 | 
			
		||||
                                                prf_alg, U_i, prf_output_length,
 | 
			
		||||
                                                U_i, sizeof(U_i),
 | 
			
		||||
                                                &mac_output_length);
 | 
			
		||||
        if (status != PSA_SUCCESS) {
 | 
			
		||||
            goto cleanup;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        mbedtls_xor(U_accumulator, U_accumulator, U_i, prf_output_length);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
cleanup:
 | 
			
		||||
    /* Zeroise buffers to clear sensitive data from memory. */
 | 
			
		||||
    mbedtls_platform_zeroize(U_i, PSA_MAC_MAX_SIZE);
 | 
			
		||||
    return status;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
static psa_status_t psa_key_derivation_pbkdf2_read(
 | 
			
		||||
    psa_pbkdf2_key_derivation_t *pbkdf2,
 | 
			
		||||
    psa_algorithm_t kdf_alg,
 | 
			
		||||
    uint8_t *output,
 | 
			
		||||
    size_t output_length)
 | 
			
		||||
{
 | 
			
		||||
    psa_status_t status;
 | 
			
		||||
    psa_algorithm_t prf_alg;
 | 
			
		||||
    uint8_t prf_output_length;
 | 
			
		||||
    psa_key_attributes_t attributes = PSA_KEY_ATTRIBUTES_INIT;
 | 
			
		||||
    psa_set_key_bits(&attributes, PSA_BYTES_TO_BITS(pbkdf2->password_length));
 | 
			
		||||
    psa_set_key_usage_flags(&attributes, PSA_KEY_USAGE_SIGN_MESSAGE);
 | 
			
		||||
 | 
			
		||||
    if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
 | 
			
		||||
        prf_alg = PSA_ALG_HMAC(PSA_ALG_PBKDF2_HMAC_GET_HASH(kdf_alg));
 | 
			
		||||
        prf_output_length = PSA_HASH_LENGTH(prf_alg);
 | 
			
		||||
        psa_set_key_type(&attributes, PSA_KEY_TYPE_HMAC);
 | 
			
		||||
    } else {
 | 
			
		||||
        return PSA_ERROR_INVALID_ARGUMENT;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    switch (pbkdf2->state) {
 | 
			
		||||
        case PSA_PBKDF2_STATE_PASSWORD_SET:
 | 
			
		||||
            /* Initially we need a new block so bytes_used is equal to block size*/
 | 
			
		||||
            pbkdf2->bytes_used = prf_output_length;
 | 
			
		||||
            pbkdf2->state = PSA_PBKDF2_STATE_OUTPUT;
 | 
			
		||||
            break;
 | 
			
		||||
        case PSA_PBKDF2_STATE_OUTPUT:
 | 
			
		||||
            break;
 | 
			
		||||
        default:
 | 
			
		||||
            return PSA_ERROR_BAD_STATE;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    while (output_length != 0) {
 | 
			
		||||
        uint8_t n = prf_output_length - pbkdf2->bytes_used;
 | 
			
		||||
        if (n > output_length) {
 | 
			
		||||
            n = (uint8_t) output_length;
 | 
			
		||||
        }
 | 
			
		||||
        memcpy(output, pbkdf2->output_block + pbkdf2->bytes_used, n);
 | 
			
		||||
        output += n;
 | 
			
		||||
        output_length -= n;
 | 
			
		||||
        pbkdf2->bytes_used += n;
 | 
			
		||||
 | 
			
		||||
        if (output_length == 0) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        /* We need a new block */
 | 
			
		||||
        pbkdf2->bytes_used = 0;
 | 
			
		||||
        pbkdf2->block_number++;
 | 
			
		||||
 | 
			
		||||
        status = psa_key_derivation_pbkdf2_generate_block(pbkdf2, prf_alg,
 | 
			
		||||
                                                          prf_output_length,
 | 
			
		||||
                                                          &attributes);
 | 
			
		||||
        if (status != PSA_SUCCESS) {
 | 
			
		||||
            return status;
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    return PSA_SUCCESS;
 | 
			
		||||
}
 | 
			
		||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
 | 
			
		||||
 | 
			
		||||
psa_status_t psa_key_derivation_output_bytes(
 | 
			
		||||
    psa_key_derivation_operation_t *operation,
 | 
			
		||||
    uint8_t *output,
 | 
			
		||||
@@ -5529,11 +5660,8 @@ psa_status_t psa_key_derivation_output_bytes(
 | 
			
		||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_TLS12_ECJPAKE_TO_PMS */
 | 
			
		||||
#if defined(MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC)
 | 
			
		||||
    if (PSA_ALG_IS_PBKDF2_HMAC(kdf_alg)) {
 | 
			
		||||
        /* As output functionality is not added yet return
 | 
			
		||||
         * PSA_ERROR_NOT_SUPPORTED for now if inputs are passed correctly.
 | 
			
		||||
         * If input validation fails operation is aborted and output_bytes
 | 
			
		||||
         * will return PSA_ERROR_BAD_STATE */
 | 
			
		||||
        status = PSA_ERROR_NOT_SUPPORTED;
 | 
			
		||||
        status = psa_key_derivation_pbkdf2_read(&operation->ctx.pbkdf2, kdf_alg,
 | 
			
		||||
                                                output, output_length);
 | 
			
		||||
    } else
 | 
			
		||||
#endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
 | 
			
		||||
 | 
			
		||||
 
 | 
			
		||||
@@ -5469,15 +5469,15 @@ derive_input:PSA_ALG_TLS12_ECJPAKE_TO_PMS:PSA_KEY_DERIVATION_INPUT_SECRET:PSA_KE
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, good case, direct output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_PASSWORD:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_PASSWORD:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, good case, key output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_PASSWORD:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_PASSWORD:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_SUCCESS
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, good case, DERIVE key as password, key output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_DERIVE:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_DERIVE:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_DERIVE:PSA_SUCCESS
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, input cost greater than PSA_VENDOR_PBKDF2_MAX_ITERATIONS
 | 
			
		||||
#Input cost is passed as hex number. Value of PSA_VENDOR_PBKDF2_MAX_ITERATIONS is 0xffffffff
 | 
			
		||||
@@ -5490,7 +5490,7 @@ derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, password missing
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:0:UNUSED:"":UNUSED:PSA_KEY_TYPE_NONE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:0:UNUSED:"":UNUSED:PSA_KEY_TYPE_NONE:PSA_ERROR_BAD_STATE
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, salt and password before cost
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
@@ -5506,11 +5506,11 @@ derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, direct password, direct output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_NONE:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_NONE:"706173737764":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, direct empty password, direct output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:PSA_KEY_TYPE_NONE:"":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_SUCCESS
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, direct password, key output
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
@@ -5526,7 +5526,7 @@ derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, duplicate salt step
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"73616c74":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_ERROR_NOT_SUPPORTED
 | 
			
		||||
derive_input:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:INPUT_INTEGER:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"7361":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:PSA_KEY_TYPE_NONE:"6c74":PSA_SUCCESS:PSA_KEY_TYPE_NONE:PSA_ERROR_BAD_STATE
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC-SHA256, reject secret step
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
@@ -6257,6 +6257,71 @@ PSA key derivation: over capacity 42: output 43+1
 | 
			
		||||
depends_on:PSA_WANT_ALG_HKDF:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_HKDF(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_SALT:"000102030405060708090a0b0c":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SECRET:"0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_INFO:"f0f1f2f3f4f5f6f7f8f9":PSA_SUCCESS:0:"":PSA_SUCCESS:"":42:"3cb25f25faacd57a90434f64d0362f2a2d2d0a90cf1a5a4c5db02d56ecc4c5bf34007208d5b887185865ff":"ff":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, 64+0
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:0:"":PSA_SUCCESS:"":64:"55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, 54+10
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:0:"":PSA_SUCCESS:"":64:"55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e3":"0bd509112041d3a19783":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, 20+0
 | 
			
		||||
# https://www.rfc-editor.org/rfc/rfc6070#section-2
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"0c60c80f961f0e71f3a9b524af6012062fe037a6":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, 0+20
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"":"0c60c80f961f0e71f3a9b524af6012062fe037a6":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, 1+19
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"0c":"60c80f961f0e71f3a9b524af6012062fe037a6":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, 10+10
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"0c60c80f961f0e71f3a9":"b524af6012062fe037a6":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #2
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"02":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #3
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"1000":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"4b007901b765489abead49d926f721d065a429c1":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #5
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"1000":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c7453414c5473616c7453414c5473616c7453414c5473616c7453414c5473616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f726450415353574f524470617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":25:"3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #6
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"1000":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"7361006c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"7061737300776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":16:"56fa6aa75548099dcc37d7f03425e0c3":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, salt in two step
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"7361":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"6c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:"":64:"55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, password as key, derive key
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:0:"":PSA_SUCCESS:"":64:"55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783":"":0:1:1
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, password as bytes
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:0:"":PSA_SUCCESS:"":64:"55ac046e56e3089fec1691c22544b605f94185216dde0465e68b9d57c20dacbc49ca9cccf179b645991664b39d77ef317c71b845b1e30bd509112041d3a19783":"":0:0:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-256), RFC7914 #1, password as bytes, derive key
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_256):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"706173737764":PSA_SUCCESS:0:"":PSA_SUCCESS:"":64:"":"":0:0:1
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, salt before cost
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_ERROR_BAD_STATE:PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_ERROR_BAD_STATE:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_ERROR_BAD_STATE:0:"":PSA_SUCCESS:"":20:"0c60c80f961f0e71f3a9b524af6012062fe037a6":"":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: PBKDF2-HMAC(SHA-1), RFC6070 #1, 20+1 (over capacity)
 | 
			
		||||
depends_on:PSA_WANT_ALG_PBKDF2_HMAC:PSA_WANT_ALG_SHA_1
 | 
			
		||||
derive_output:PSA_ALG_PBKDF2_HMAC(PSA_ALG_SHA_1):PSA_KEY_DERIVATION_INPUT_COST:"01":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_SALT:"73616c74":PSA_SUCCESS:PSA_KEY_DERIVATION_INPUT_PASSWORD:"70617373776f7264":PSA_SUCCESS:0:"":PSA_SUCCESS:"":20:"0c60c80f961f0e71f3a9b524af6012062fe037a6":"00":0:1:0
 | 
			
		||||
 | 
			
		||||
PSA key derivation: ECJPAKE to PMS, no input
 | 
			
		||||
depends_on:PSA_WANT_ALG_SHA_256
 | 
			
		||||
derive_ecjpake_to_pms:"":PSA_ERROR_INVALID_ARGUMENT:PSA_KEY_DERIVATION_INPUT_SECRET:32:PSA_SUCCESS:"":PSA_ERROR_INVALID_ARGUMENT
 | 
			
		||||
 
 | 
			
		||||
@@ -8713,6 +8713,16 @@ void derive_output(int alg_arg,
 | 
			
		||||
        switch (steps[i]) {
 | 
			
		||||
            case 0:
 | 
			
		||||
                break;
 | 
			
		||||
            case PSA_KEY_DERIVATION_INPUT_COST:
 | 
			
		||||
                TEST_EQUAL(psa_key_derivation_input_integer(
 | 
			
		||||
                               &operation, steps[i],
 | 
			
		||||
                               parse_binary_string(inputs[i])),
 | 
			
		||||
                           statuses[i]);
 | 
			
		||||
                if (statuses[i] != PSA_SUCCESS) {
 | 
			
		||||
                    goto exit;
 | 
			
		||||
                }
 | 
			
		||||
                break;
 | 
			
		||||
            case PSA_KEY_DERIVATION_INPUT_PASSWORD:
 | 
			
		||||
            case PSA_KEY_DERIVATION_INPUT_SECRET:
 | 
			
		||||
                switch (key_input_type) {
 | 
			
		||||
                    case 0: // input bytes
 | 
			
		||||
@@ -8740,9 +8750,14 @@ void derive_output(int alg_arg,
 | 
			
		||||
                                      PSA_TLS12_PSK_TO_MS_PSK_MAX_SIZE);
 | 
			
		||||
                        }
 | 
			
		||||
 | 
			
		||||
                        PSA_ASSERT(psa_key_derivation_input_key(&operation,
 | 
			
		||||
                        TEST_EQUAL(psa_key_derivation_input_key(&operation,
 | 
			
		||||
                                                                steps[i],
 | 
			
		||||
                                                                keys[i]));
 | 
			
		||||
                                                                keys[i]),
 | 
			
		||||
                                   statuses[i]);
 | 
			
		||||
 | 
			
		||||
                        if (statuses[i] != PSA_SUCCESS) {
 | 
			
		||||
                            goto exit;
 | 
			
		||||
                        }
 | 
			
		||||
                        break;
 | 
			
		||||
                    default:
 | 
			
		||||
                        TEST_ASSERT(!"default case not supported");
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user