658b5f59150b7273eba754b3e73b62297cb9df3b
[WebKit-https.git] / Source / WebCore / crypto / gtk / CryptoDigestGtk.cpp
1 /*
2  * Copyright (C) 2014 Igalia S.L. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "CryptoDigest.h"
28
29 #if ENABLE(SUBTLE_CRYPTO)
30
31 #include <gnutls/gnutls.h>
32 #include <gnutls/crypto.h>
33
34 namespace WebCore {
35
36 struct CryptoDigestContext {
37     gnutls_digest_algorithm_t algorithm;
38     gnutls_hash_hd_t hash;
39 };
40
41 CryptoDigest::CryptoDigest()
42     : m_context(new CryptoDigestContext)
43 {
44 }
45
46 CryptoDigest::~CryptoDigest()
47 {
48     gnutls_hash_deinit(m_context->hash, 0);
49 }
50
51 std::unique_ptr<CryptoDigest> CryptoDigest::create(CryptoAlgorithmIdentifier algorithm)
52 {
53     gnutls_digest_algorithm_t gnutlsAlgorithm;
54
55     switch (algorithm) {
56     case CryptoAlgorithmIdentifier::SHA_1: {
57         gnutlsAlgorithm = GNUTLS_DIG_SHA1;
58         break;
59     }
60     case CryptoAlgorithmIdentifier::SHA_224: {
61         gnutlsAlgorithm = GNUTLS_DIG_SHA224;
62         break;
63     }
64     case CryptoAlgorithmIdentifier::SHA_256: {
65         gnutlsAlgorithm = GNUTLS_DIG_SHA256;
66         break;
67     }
68     case CryptoAlgorithmIdentifier::SHA_384: {
69         gnutlsAlgorithm = GNUTLS_DIG_SHA384;
70         break;
71     }
72     case CryptoAlgorithmIdentifier::SHA_512: {
73         gnutlsAlgorithm = GNUTLS_DIG_SHA512;
74         break;
75     }
76     default:
77         return nullptr;
78     }
79
80     std::unique_ptr<CryptoDigest> digest(new CryptoDigest);
81     digest->m_context->algorithm = gnutlsAlgorithm;
82
83     int ret = gnutls_hash_init(&digest->m_context->hash, gnutlsAlgorithm);
84     if (ret != GNUTLS_E_SUCCESS)
85         return nullptr;
86
87     return digest;
88 }
89
90 void CryptoDigest::addBytes(const void* input, size_t length)
91 {
92     gnutls_hash(m_context->hash, input, length);
93 }
94
95 Vector<uint8_t> CryptoDigest::computeHash()
96 {
97     Vector<uint8_t> result;
98     int digestLen = gnutls_hash_get_len(m_context->algorithm);
99     result.resize(digestLen);
100
101     gnutls_hash_output(m_context->hash, result.data());
102
103     return result;
104 }
105
106 } // namespace WebCore
107
108 #endif // ENABLE(SUBTLE_CRYPTO)