CryptoDigestGnuTLS.cpp [plain text]
#include "config.h"
#include "CryptoDigest.h"
#if ENABLE(SUBTLE_CRYPTO)
#include <gnutls/gnutls.h>
#include <gnutls/crypto.h>
namespace WebCore {
struct CryptoDigestContext {
gnutls_digest_algorithm_t algorithm;
gnutls_hash_hd_t hash;
};
CryptoDigest::CryptoDigest()
: m_context(new CryptoDigestContext)
{
}
CryptoDigest::~CryptoDigest()
{
gnutls_hash_deinit(m_context->hash, 0);
}
std::unique_ptr<CryptoDigest> CryptoDigest::create(CryptoAlgorithmIdentifier algorithm)
{
gnutls_digest_algorithm_t gnutlsAlgorithm;
switch (algorithm) {
case CryptoAlgorithmIdentifier::SHA_1: {
gnutlsAlgorithm = GNUTLS_DIG_SHA1;
break;
}
case CryptoAlgorithmIdentifier::SHA_224: {
gnutlsAlgorithm = GNUTLS_DIG_SHA224;
break;
}
case CryptoAlgorithmIdentifier::SHA_256: {
gnutlsAlgorithm = GNUTLS_DIG_SHA256;
break;
}
case CryptoAlgorithmIdentifier::SHA_384: {
gnutlsAlgorithm = GNUTLS_DIG_SHA384;
break;
}
case CryptoAlgorithmIdentifier::SHA_512: {
gnutlsAlgorithm = GNUTLS_DIG_SHA512;
break;
}
default:
return nullptr;
}
std::unique_ptr<CryptoDigest> digest(new CryptoDigest);
digest->m_context->algorithm = gnutlsAlgorithm;
int ret = gnutls_hash_init(&digest->m_context->hash, gnutlsAlgorithm);
if (ret != GNUTLS_E_SUCCESS)
return nullptr;
return digest;
}
void CryptoDigest::addBytes(const void* input, size_t length)
{
gnutls_hash(m_context->hash, input, length);
}
Vector<uint8_t> CryptoDigest::computeHash()
{
Vector<uint8_t> result;
int digestLen = gnutls_hash_get_len(m_context->algorithm);
result.resize(digestLen);
gnutls_hash_output(m_context->hash, result.data());
return result;
}
}
#endif // ENABLE(SUBTLE_CRYPTO)