Vector<uint8_t> CryptoDigest::computeHash()
{
    Vector<uint8_t> result;
    switch (m_context->algorithm) {
    case CryptoAlgorithmIdentifier::SHA_1:
        result.resize(CC_SHA1_DIGEST_LENGTH);
        CC_SHA1_Final(result.data(), toSHA1Context(m_context.get()));
        break;
    case CryptoAlgorithmIdentifier::SHA_224:
        result.resize(CC_SHA224_DIGEST_LENGTH);
        CC_SHA224_Final(result.data(), toSHA224Context(m_context.get()));
        break;
    case CryptoAlgorithmIdentifier::SHA_256:
        result.resize(CC_SHA256_DIGEST_LENGTH);
        CC_SHA256_Final(result.data(), toSHA256Context(m_context.get()));
        break;
    case CryptoAlgorithmIdentifier::SHA_384:
        result.resize(CC_SHA384_DIGEST_LENGTH);
        CC_SHA384_Final(result.data(), toSHA384Context(m_context.get()));
        break;
    case CryptoAlgorithmIdentifier::SHA_512:
        result.resize(CC_SHA512_DIGEST_LENGTH);
        CC_SHA512_Final(result.data(), toSHA512Context(m_context.get()));
        break;
    default:
        ASSERT_NOT_REACHED();
    }
    return result;
}
CryptoDigest::~CryptoDigest()
{
    switch (m_context->algorithm) {
    case CryptoDigest::Algorithm::SHA_1:
        delete toSHA1Context(m_context.get());
        return;
    case CryptoDigest::Algorithm::SHA_224:
        delete toSHA224Context(m_context.get());
        return;
    case CryptoDigest::Algorithm::SHA_256:
        delete toSHA256Context(m_context.get());
        return;
    case CryptoDigest::Algorithm::SHA_384:
        delete toSHA384Context(m_context.get());
        return;
    case CryptoDigest::Algorithm::SHA_512:
        delete toSHA512Context(m_context.get());
        return;
    }
}
void CryptoDigest::addBytes(const void* input, size_t length)
{
    switch (m_context->algorithm) {
    case CryptoDigest::Algorithm::SHA_1:
        CC_SHA1_Update(toSHA1Context(m_context.get()), input, length);
        return;
    case CryptoDigest::Algorithm::SHA_224:
        CC_SHA224_Update(toSHA224Context(m_context.get()), input, length);
        return;
    case CryptoDigest::Algorithm::SHA_256:
        CC_SHA256_Update(toSHA256Context(m_context.get()), input, length);
        return;
    case CryptoDigest::Algorithm::SHA_384:
        CC_SHA384_Update(toSHA384Context(m_context.get()), input, length);
        return;
    case CryptoDigest::Algorithm::SHA_512:
        CC_SHA512_Update(toSHA512Context(m_context.get()), input, length);
        return;
    }
}
CryptoDigest::~CryptoDigest()
{
    switch (m_context->algorithm) {
    case CryptoAlgorithmIdentifier::SHA_1:
        delete toSHA1Context(m_context.get());
        return;
    case CryptoAlgorithmIdentifier::SHA_224:
        delete toSHA224Context(m_context.get());
        return;
    case CryptoAlgorithmIdentifier::SHA_256:
        delete toSHA256Context(m_context.get());
        return;
    case CryptoAlgorithmIdentifier::SHA_384:
        delete toSHA384Context(m_context.get());
        return;
    case CryptoAlgorithmIdentifier::SHA_512:
        delete toSHA512Context(m_context.get());
        return;
    default:
        ASSERT_NOT_REACHED();
    }
}
void CryptoDigest::addBytes(const void* input, size_t length)
{
    switch (m_context->algorithm) {
    case CryptoAlgorithmIdentifier::SHA_1:
        CC_SHA1_Update(toSHA1Context(m_context.get()), input, length);
        return;
    case CryptoAlgorithmIdentifier::SHA_224:
        CC_SHA224_Update(toSHA224Context(m_context.get()), input, length);
        return;
    case CryptoAlgorithmIdentifier::SHA_256:
        CC_SHA256_Update(toSHA256Context(m_context.get()), input, length);
        return;
    case CryptoAlgorithmIdentifier::SHA_384:
        CC_SHA384_Update(toSHA384Context(m_context.get()), input, length);
        return;
    case CryptoAlgorithmIdentifier::SHA_512:
        CC_SHA512_Update(toSHA512Context(m_context.get()), input, length);
        return;
    default:
        ASSERT_NOT_REACHED();
    }
}