0cc26ba6e44244f179a9c686fedb87a0b59fd495
[WebKit-https.git] / Source / WebCore / crypto / CryptoKey.cpp
1 /*
2  * Copyright (C) 2013 Apple Inc. 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 "CryptoKey.h"
28
29 #if ENABLE(SUBTLE_CRYPTO)
30
31 #include "CryptoAlgorithmDescriptionBuilder.h"
32 #include "CryptoAlgorithmRegistry.h"
33 #include <wtf/CryptographicallyRandomNumber.h>
34 #include <wtf/text/WTFString.h>
35
36 namespace WebCore {
37
38 CryptoKey::CryptoKey(CryptoAlgorithmIdentifier algorithm, CryptoKeyType type, bool extractable, CryptoKeyUsage usages)
39     : m_algorithm(algorithm)
40     , m_type(type)
41     , m_extractable(extractable)
42     , m_usages(usages)
43 {
44 }
45
46 CryptoKey::~CryptoKey()
47 {
48 }
49
50 String CryptoKey::type() const
51 {
52     switch (m_type) {
53     case CryptoKeyType::Secret:
54         return ASCIILiteral("secret");
55     case CryptoKeyType::Public:
56         return ASCIILiteral("public");
57     case CryptoKeyType::Private:
58         return ASCIILiteral("private");
59     }
60 }
61
62 void CryptoKey::buildAlgorithmDescription(CryptoAlgorithmDescriptionBuilder& builder) const
63 {
64     builder.add("name", CryptoAlgorithmRegistry::shared().nameForIdentifier(m_algorithm));
65     // Subclasses will add other keys.
66 }
67
68 Vector<String> CryptoKey::usages() const
69 {
70     Vector<String> result;
71     if (m_usages & CryptoKeyUsageEncrypt)
72         result.append(ASCIILiteral("encrypt"));
73     if (m_usages & CryptoKeyUsageDecrypt)
74         result.append(ASCIILiteral("decrypt"));
75     if (m_usages & CryptoKeyUsageSign)
76         result.append(ASCIILiteral("sign"));
77     if (m_usages & CryptoKeyUsageVerify)
78         result.append(ASCIILiteral("verify"));
79     if (m_usages & CryptoKeyUsageDeriveKey)
80         result.append(ASCIILiteral("deriveKey"));
81     if (m_usages & CryptoKeyUsageDeriveBits)
82         result.append(ASCIILiteral("deriveBits"));
83     if (m_usages & CryptoKeyUsageWrapKey)
84         result.append(ASCIILiteral("wrapKey"));
85     if (m_usages & CryptoKeyUsageUnwrapKey)
86         result.append(ASCIILiteral("unwrapKey"));
87
88     return result;
89 }
90
91 #if !PLATFORM(MAC)
92 Vector<char> CryptoKey::randomData(size_t size)
93 {
94     Vector<char> result(size);
95     cryptographicallyRandomValues(result.data(), result.size());
96     return result;
97 }
98 #endif
99 } // namespace WebCore
100
101 #endif // ENABLE(SUBTLE_CRYPTO)