int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,

                   const uint8_t *key, size_t nkey,

                   const uint8_t *salt, size_t nsalt,

                   unsigned int iterations,

                   uint8_t *out, size_t nout,

                   Error **errp)

{

    static const int hash_map[QCRYPTO_HASH_ALG__MAX] = {

        [QCRYPTO_HASH_ALG_MD5] = GCRY_MD_MD5,

        [QCRYPTO_HASH_ALG_SHA1] = GCRY_MD_SHA1,

        [QCRYPTO_HASH_ALG_SHA256] = GCRY_MD_SHA256,

    };

    int ret;



    if (hash >= G_N_ELEMENTS(hash_map) ||

        hash_map[hash] == GCRY_MD_NONE) {

        error_setg(errp, "Unexpected hash algorithm %d", hash);

        return -1;

    }



    ret = gcry_kdf_derive(key, nkey, GCRY_KDF_PBKDF2,

                          hash_map[hash],

                          salt, nsalt, iterations,

                          nout, out);

    if (ret != 0) {

        error_setg(errp, "Cannot derive password: %s",

                   gcry_strerror(ret));

        return -1;

    }



    return 0;

}

int qcrypto_pbkdf2(QCryptoHashAlgorithm hash,

                   const uint8_t *key, size_t nkey,

                   const uint8_t *salt, size_t nsalt,

                   unsigned int iterations,

                   uint8_t *out, size_t nout,

                   Error **errp)

{

    static const int hash_map[QCRYPTO_HASH_ALG__MAX] = {

        [QCRYPTO_HASH_ALG_MD5] = GCRY_MD_MD5,

        [QCRYPTO_HASH_ALG_SHA1] = GCRY_MD_SHA1,

        [QCRYPTO_HASH_ALG_SHA256] = GCRY_MD_SHA256,

    };

    int ret;



    if (hash >= G_N_ELEMENTS(hash_map) ||

        hash_map[hash] == GCRY_MD_NONE) {

        error_setg(errp, "Unexpected hash algorithm %d", hash);

        return -1;

    }



    ret = gcry_kdf_derive(key, nkey, GCRY_KDF_PBKDF2,

                          hash_map[hash],

                          salt, nsalt, iterations,

                          nout, out);

    if (ret != 0) {

        error_setg(errp, "Cannot derive password: %s",

                   gcry_strerror(ret));

        return -1;

    }



    return 0;

}

int FUNC_0(QCryptoHashAlgorithm VAR_0,

                   const uint8_t *VAR_1, size_t VAR_2,

                   const uint8_t *VAR_3, size_t VAR_4,

                   unsigned int VAR_5,

                   uint8_t *VAR_6, size_t VAR_7,

                   Error **VAR_8)

{

    static const int VAR_9[QCRYPTO_HASH_ALG__MAX] = {

        [QCRYPTO_HASH_ALG_MD5] = GCRY_MD_MD5,

        [QCRYPTO_HASH_ALG_SHA1] = GCRY_MD_SHA1,

        [QCRYPTO_HASH_ALG_SHA256] = GCRY_MD_SHA256,

    };

    int VAR_10;



    if (VAR_0 >= G_N_ELEMENTS(VAR_9) ||

        VAR_9[VAR_0] == GCRY_MD_NONE) {

        error_setg(VAR_8, "Unexpected VAR_0 algorithm %d", VAR_0);

        return -1;

    }



    VAR_10 = gcry_kdf_derive(VAR_1, VAR_2, GCRY_KDF_PBKDF2,

                          VAR_9[VAR_0],

                          VAR_3, VAR_4, VAR_5,

                          VAR_7, VAR_6);

    if (VAR_10 != 0) {

        error_setg(VAR_8, "Cannot derive password: %s",

                   gcry_strerror(VAR_10));

        return -1;

    }



    return 0;

}

int FUNC_0(QCryptoHashAlgorithm VAR_0,
const uint8_t *VAR_1, size_t VAR_2,
const uint8_t *VAR_3, size_t VAR_4,
unsigned int VAR_5,
uint8_t *VAR_6, size_t VAR_7,
Error **VAR_8)
{ static const int VAR_9[QCRYPTO_HASH_ALG__MAX] = { [QCRYPTO_HASH_ALG_MD5] = GCRY_MD_MD5,
[QCRYPTO_HASH_ALG_SHA1] = GCRY_MD_SHA1,
[QCRYPTO_HASH_ALG_SHA256] = GCRY_MD_SHA256,
}; int VAR_10; if (VAR_0 >= G_N_ELEMENTS(VAR_9) ||
VAR_9[VAR_0] == GCRY_MD_NONE) { error_setg(VAR_8, "Unexpected VAR_0 algorithm %d", VAR_0); return -1; } VAR_10 = gcry_kdf_derive(VAR_1, VAR_2, GCRY_KDF_PBKDF2,
VAR_9[VAR_0],
VAR_3, VAR_4, VAR_5,
VAR_7, VAR_6); if (VAR_10 != 0) { error_setg(VAR_8, "Cannot derive password: %s",
gcry_strerror(VAR_10)); return -1; } return 0; }