add input salt function for pbkdf2

Signed-off-by: Kusumit Ghoderao <Kusumit.Ghoderao@silabs.com>
diff --git a/library/psa_crypto.c b/library/psa_crypto.c
index 0ed005f..ba6a64a 100644
--- a/library/psa_crypto.c
+++ b/library/psa_crypto.c
@@ -6411,6 +6411,50 @@
 
     return PSA_SUCCESS;
 }
+
+static psa_status_t psa_pbkdf2_set_salt(psa_pbkdf2_key_derivation_t *pbkdf2,
+                                        const uint8_t *data,
+                                        size_t data_length)
+{
+    uint8_t *prev_salt;
+    size_t prev_salt_length;
+
+    if (pbkdf2->state != PSA_PBKDF2_STATE_INPUT_COST_SET &&
+        pbkdf2->state != PSA_PBKDF2_STATE_SALT_SET) {
+        return PSA_ERROR_BAD_STATE;
+    }
+
+    if (data_length != 0) {
+        if (pbkdf2->state == PSA_PBKDF2_STATE_INPUT_COST_SET) {
+            pbkdf2->salt = mbedtls_calloc(1, data_length);
+            if (pbkdf2->salt == NULL) {
+                return PSA_ERROR_INSUFFICIENT_MEMORY;
+            }
+
+            memcpy(pbkdf2->salt, data, data_length);
+            pbkdf2->salt_length = data_length;
+        } else if (pbkdf2->state == PSA_PBKDF2_STATE_SALT_SET) {
+            prev_salt = pbkdf2->salt;
+            prev_salt_length = pbkdf2->salt_length;
+            pbkdf2->salt = mbedtls_calloc(1, data_length + prev_salt_length);
+            if (pbkdf2->salt == NULL) {
+                return PSA_ERROR_INSUFFICIENT_MEMORY;
+            }
+
+            memcpy(pbkdf2->salt, prev_salt, prev_salt_length);
+            memcpy(pbkdf2->salt + prev_salt_length, data,
+            data_length);
+            pbkdf2->salt_length += data_length;
+            mbedtls_free(prev_salt);
+        }
+    } else {
+        return PSA_ERROR_INVALID_ARGUMENT;
+    }
+
+    pbkdf2->state = PSA_PBKDF2_STATE_SALT_SET;
+
+    return PSA_SUCCESS;
+}
 #endif /* MBEDTLS_PSA_BUILTIN_ALG_PBKDF2_HMAC */
 
 /** Check whether the given key type is acceptable for the given