1038c538f1382dd51092e96133cccea24bef1437
[platform/framework/web/crosswalk.git] / src / third_party / WebKit / public / platform / WebCryptoAlgorithmParams.h
1 /*
2  * Copyright (C) 2013 Google 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 are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #ifndef WebCryptoAlgorithmParams_h
32 #define WebCryptoAlgorithmParams_h
33
34 #include "WebCommon.h"
35 #include "WebCryptoAlgorithm.h"
36 #include "WebVector.h"
37
38 namespace blink {
39
40 // NOTE: For documentation on the meaning of each of the parameters see the
41 //       Web crypto spec:
42 //
43 //       http://www.w3.org/TR/WebCryptoAPI
44 //
45 //       For the most part, the parameters in the spec have the same name,
46 //       except that in the blink code:
47 //
48 //         - Structure names are prefixed by "WebCrypto"
49 //         - Optional fields are prefixed by "optional"
50 //         - Data length properties are suffixed by either "Bits" or "Bytes"
51
52 class WebCryptoAlgorithmParams {
53 public:
54     WebCryptoAlgorithmParams() { }
55     virtual ~WebCryptoAlgorithmParams() { }
56     virtual WebCryptoAlgorithmParamsType type() const = 0;
57 };
58
59 class WebCryptoAesCbcParams : public WebCryptoAlgorithmParams {
60 public:
61     WebCryptoAesCbcParams(const unsigned char* iv, unsigned ivSize)
62         : m_iv(iv, ivSize)
63     {
64     }
65
66     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeAesCbcParams; }
67
68     const WebVector<unsigned char>& iv() const { return m_iv; }
69
70 private:
71     const WebVector<unsigned char> m_iv;
72 };
73
74 class WebCryptoAlgorithmParamsWithHash : public WebCryptoAlgorithmParams {
75 public:
76     explicit WebCryptoAlgorithmParamsWithHash(const WebCryptoAlgorithm& hash)
77         : m_hash(hash)
78     {
79         BLINK_ASSERT(!hash.isNull());
80     }
81
82     const WebCryptoAlgorithm& hash() const { return m_hash; }
83
84 private:
85     const WebCryptoAlgorithm m_hash;
86 };
87
88 class WebCryptoAesCtrParams : public WebCryptoAlgorithmParams {
89 public:
90     WebCryptoAesCtrParams(unsigned char lengthBits, const unsigned char* counter, unsigned counterSize)
91         : WebCryptoAlgorithmParams()
92         , m_counter(counter, counterSize)
93         , m_lengthBits(lengthBits)
94     {
95     }
96
97     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeAesCtrParams; }
98
99     const WebVector<unsigned char>& counter() const { return m_counter; }
100     unsigned char lengthBits() const { return m_lengthBits; }
101
102 private:
103     const WebVector<unsigned char> m_counter;
104     const unsigned char m_lengthBits;
105 };
106
107 class WebCryptoAesKeyGenParams : public WebCryptoAlgorithmParams {
108 public:
109     explicit WebCryptoAesKeyGenParams(unsigned short lengthBits)
110         : m_lengthBits(lengthBits)
111     {
112     }
113
114     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeAesKeyGenParams; }
115
116     unsigned short lengthBits() const { return m_lengthBits; }
117
118 private:
119     const unsigned short m_lengthBits;
120 };
121
122 class WebCryptoHmacImportParams : public WebCryptoAlgorithmParamsWithHash {
123 public:
124     explicit WebCryptoHmacImportParams(const WebCryptoAlgorithm& hash)
125         : WebCryptoAlgorithmParamsWithHash(hash)
126     {
127     }
128
129     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeHmacImportParams; }
130 };
131
132 class WebCryptoHmacKeyGenParams : public WebCryptoAlgorithmParamsWithHash {
133 public:
134     WebCryptoHmacKeyGenParams(const WebCryptoAlgorithm& hash, bool hasLengthBits, unsigned lengthBits)
135         : WebCryptoAlgorithmParamsWithHash(hash)
136         , m_hasLengthBits(hasLengthBits)
137         , m_optionalLengthBits(lengthBits)
138     {
139         BLINK_ASSERT(hasLengthBits || !lengthBits);
140     }
141
142     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeHmacKeyGenParams; }
143
144     bool hasLengthBits() const { return m_hasLengthBits; }
145
146     unsigned optionalLengthBits() const { return m_optionalLengthBits; }
147
148 private:
149     const bool m_hasLengthBits;
150     const unsigned m_optionalLengthBits;
151 };
152
153 class WebCryptoAesGcmParams : public WebCryptoAlgorithmParams {
154 public:
155     WebCryptoAesGcmParams(const unsigned char* iv, unsigned ivSize, bool hasAdditionalData, const unsigned char* additionalData, unsigned additionalDataSize, bool hasTagLengthBits, unsigned char tagLengthBits)
156         : m_iv(iv, ivSize)
157         , m_hasAdditionalData(hasAdditionalData)
158         , m_optionalAdditionalData(additionalData, additionalDataSize)
159         , m_hasTagLengthBits(hasTagLengthBits)
160         , m_optionalTagLengthBits(tagLengthBits)
161     {
162         BLINK_ASSERT(hasAdditionalData || !additionalDataSize);
163         BLINK_ASSERT(hasTagLengthBits || !tagLengthBits);
164     }
165
166     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeAesGcmParams; }
167
168     const WebVector<unsigned char>& iv() const { return m_iv; }
169
170     bool hasAdditionalData() const { return m_hasAdditionalData; }
171     const WebVector<unsigned char>& optionalAdditionalData() const { return m_optionalAdditionalData; }
172
173     bool hasTagLengthBits() const { return m_hasTagLengthBits; }
174     unsigned optionalTagLengthBits() const { return m_optionalTagLengthBits; }
175
176 private:
177     const WebVector<unsigned char> m_iv;
178     const bool m_hasAdditionalData;
179     const WebVector<unsigned char> m_optionalAdditionalData;
180     const bool m_hasTagLengthBits;
181     const unsigned char m_optionalTagLengthBits;
182 };
183
184 class WebCryptoRsaHashedImportParams : public WebCryptoAlgorithmParamsWithHash {
185 public:
186     explicit WebCryptoRsaHashedImportParams(const WebCryptoAlgorithm& hash)
187         : WebCryptoAlgorithmParamsWithHash(hash)
188     {
189     }
190
191     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeRsaHashedImportParams; }
192 };
193
194 class WebCryptoRsaHashedKeyGenParams : public WebCryptoAlgorithmParams {
195 public:
196     explicit WebCryptoRsaHashedKeyGenParams(const WebCryptoAlgorithm& hash, unsigned modulusLengthBits, const unsigned char* publicExponent, unsigned publicExponentSize)
197         : m_modulusLengthBits(modulusLengthBits)
198         , m_publicExponent(publicExponent, publicExponentSize)
199         , m_hash(hash)
200     {
201         BLINK_ASSERT(!hash.isNull());
202     }
203
204     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeRsaHashedKeyGenParams; }
205
206     unsigned modulusLengthBits() const { return m_modulusLengthBits; }
207     const WebVector<unsigned char>& publicExponent() const { return m_publicExponent; }
208     const WebCryptoAlgorithm& hash() const { return m_hash; }
209
210 private:
211     const unsigned m_modulusLengthBits;
212     const WebVector<unsigned char> m_publicExponent;
213     const WebCryptoAlgorithm m_hash;
214 };
215
216 class WebCryptoRsaOaepParams : public WebCryptoAlgorithmParams {
217 public:
218     WebCryptoRsaOaepParams(bool hasLabel, const unsigned char* label, unsigned labelSize)
219         : m_hasLabel(hasLabel)
220         , m_optionalLabel(label, labelSize)
221     {
222         BLINK_ASSERT(hasLabel || !labelSize);
223     }
224
225     virtual WebCryptoAlgorithmParamsType type() const { return WebCryptoAlgorithmParamsTypeRsaOaepParams; }
226
227     bool hasLabel() const { return m_hasLabel; }
228     const WebVector<unsigned char>& optionalLabel() const { return m_optionalLabel; }
229
230 private:
231     const bool m_hasLabel;
232     const WebVector<unsigned char> m_optionalLabel;
233 };
234
235 } // namespace blink
236
237 #endif