• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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:
WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsType type)54     explicit WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsType type)
55         : m_type(type)
56     {
57     }
58 
~WebCryptoAlgorithmParams()59     virtual ~WebCryptoAlgorithmParams() { }
60 
type()61     WebCryptoAlgorithmParamsType type() const { return m_type; }
62 
63 private:
64     const WebCryptoAlgorithmParamsType m_type;
65 };
66 
67 class WebCryptoAesCbcParams : public WebCryptoAlgorithmParams {
68 public:
WebCryptoAesCbcParams(const unsigned char * iv,unsigned ivSize)69     WebCryptoAesCbcParams(const unsigned char* iv, unsigned ivSize)
70         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeAesCbcParams)
71         , m_iv(iv, ivSize)
72     {
73     }
74 
iv()75     const WebVector<unsigned char>& iv() const { return m_iv; }
76 
77 private:
78     const WebVector<unsigned char> m_iv;
79 };
80 
81 class WebCryptoAesCtrParams : public WebCryptoAlgorithmParams {
82 public:
WebCryptoAesCtrParams(unsigned char lengthBits,const unsigned char * counter,unsigned counterSize)83     WebCryptoAesCtrParams(unsigned char lengthBits, const unsigned char* counter, unsigned counterSize)
84         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeAesCtrParams)
85         , m_counter(counter, counterSize)
86         , m_lengthBits(lengthBits)
87     {
88     }
89 
counter()90     const WebVector<unsigned char>& counter() const { return m_counter; }
lengthBits()91     unsigned char lengthBits() const { return m_lengthBits; }
92 
93 private:
94     const WebVector<unsigned char> m_counter;
95     const unsigned char m_lengthBits;
96 };
97 
98 class WebCryptoAesKeyGenParams : public WebCryptoAlgorithmParams {
99 public:
WebCryptoAesKeyGenParams(unsigned short lengthBits)100     explicit WebCryptoAesKeyGenParams(unsigned short lengthBits)
101         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeAesKeyGenParams)
102         , m_lengthBits(lengthBits)
103     {
104     }
105 
106     // FIXME: Delete once no longer referenced by chromium.
length()107     unsigned short length() const { return m_lengthBits; }
108 
lengthBits()109     unsigned short lengthBits() const { return m_lengthBits; }
110 
111 private:
112     const unsigned short m_lengthBits;
113 };
114 
115 class WebCryptoHmacParams : public WebCryptoAlgorithmParams {
116 public:
WebCryptoHmacParams(const WebCryptoAlgorithm & hash)117     explicit WebCryptoHmacParams(const WebCryptoAlgorithm& hash)
118         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeHmacParams)
119         , m_hash(hash)
120     {
121         BLINK_ASSERT(!hash.isNull());
122     }
123 
hash()124     const WebCryptoAlgorithm& hash() const { return m_hash; }
125 
126 private:
127     const WebCryptoAlgorithm m_hash;
128 };
129 
130 class WebCryptoHmacKeyParams : public WebCryptoAlgorithmParams {
131 public:
WebCryptoHmacKeyParams(const WebCryptoAlgorithm & hash,bool hasLengthBytes,unsigned lengthBytes)132     WebCryptoHmacKeyParams(const WebCryptoAlgorithm& hash, bool hasLengthBytes, unsigned lengthBytes)
133         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeHmacKeyParams)
134         , m_hash(hash)
135         , m_hasLengthBytes(hasLengthBytes)
136         , m_optionalLengthBytes(lengthBytes)
137     {
138         BLINK_ASSERT(!hash.isNull());
139         BLINK_ASSERT(hasLengthBytes || !lengthBytes);
140     }
141 
hash()142     const WebCryptoAlgorithm& hash() const { return m_hash; }
143 
hasLengthBytes()144     bool hasLengthBytes() const { return m_hasLengthBytes; }
145 
146     // FIXME: Delete once no longer referenced by chromium.
getLength(unsigned & length)147     bool getLength(unsigned& length) const
148     {
149         if (!m_hasLengthBytes)
150             return false;
151         length = m_optionalLengthBytes;
152         return true;
153     }
154 
optionalLengthBytes()155     unsigned optionalLengthBytes() const { return m_optionalLengthBytes; }
156 
157 private:
158     const WebCryptoAlgorithm m_hash;
159     const bool m_hasLengthBytes;
160     const unsigned m_optionalLengthBytes;
161 };
162 
163 class WebCryptoRsaSsaParams : public WebCryptoAlgorithmParams {
164 public:
WebCryptoRsaSsaParams(const WebCryptoAlgorithm & hash)165     explicit WebCryptoRsaSsaParams(const WebCryptoAlgorithm& hash)
166         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeRsaSsaParams)
167         , m_hash(hash)
168     {
169         BLINK_ASSERT(!hash.isNull());
170     }
171 
hash()172     const WebCryptoAlgorithm& hash() const { return m_hash; }
173 
174 private:
175     const WebCryptoAlgorithm m_hash;
176 };
177 
178 class WebCryptoRsaKeyGenParams : public WebCryptoAlgorithmParams {
179 public:
WebCryptoRsaKeyGenParams(unsigned modulusLengthBits,const unsigned char * publicExponent,unsigned publicExponentSize)180     WebCryptoRsaKeyGenParams(unsigned modulusLengthBits, const unsigned char* publicExponent, unsigned publicExponentSize)
181         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeRsaKeyGenParams)
182         , m_modulusLengthBits(modulusLengthBits)
183         , m_publicExponent(publicExponent, publicExponentSize)
184     {
185     }
186 
187     // FIXME: Delete once no longer referenced by chromium.
modulusLength()188     unsigned modulusLength() const { return m_modulusLengthBits; }
189 
modulusLengthBits()190     unsigned modulusLengthBits() const { return m_modulusLengthBits; }
publicExponent()191     const WebVector<unsigned char>& publicExponent() const { return m_publicExponent; }
192 
193 private:
194     const unsigned m_modulusLengthBits;
195     const WebVector<unsigned char> m_publicExponent;
196 };
197 
198 class WebCryptoAesGcmParams : public WebCryptoAlgorithmParams {
199 public:
WebCryptoAesGcmParams(const unsigned char * iv,unsigned ivSize,bool hasAdditionalData,const unsigned char * additionalData,unsigned additionalDataSize,bool hasTagLengthBits,unsigned char tagLengthBits)200     WebCryptoAesGcmParams(const unsigned char* iv, unsigned ivSize, bool hasAdditionalData, const unsigned char* additionalData, unsigned additionalDataSize, bool hasTagLengthBits, unsigned char tagLengthBits)
201         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeAesGcmParams)
202         , m_iv(iv, ivSize)
203         , m_hasAdditionalData(hasAdditionalData)
204         , m_optionalAdditionalData(additionalData, additionalDataSize)
205         , m_hasTagLengthBits(hasTagLengthBits)
206         , m_optionalTagLengthBits(tagLengthBits)
207     {
208         BLINK_ASSERT(hasAdditionalData || !additionalDataSize);
209         BLINK_ASSERT(hasTagLengthBits || !tagLengthBits);
210     }
211 
iv()212     const WebVector<unsigned char>& iv() const { return m_iv; }
213 
hasAdditionalData()214     bool hasAdditionalData() const { return m_hasAdditionalData; }
optionalAdditionalData()215     const WebVector<unsigned char>& optionalAdditionalData() const { return m_optionalAdditionalData; }
216 
hasTagLengthBits()217     bool hasTagLengthBits() const { return m_hasTagLengthBits; }
optionalTagLengthBits()218     unsigned optionalTagLengthBits() const { return m_optionalTagLengthBits; }
219 
220 private:
221     const WebVector<unsigned char> m_iv;
222     const bool m_hasAdditionalData;
223     const WebVector<unsigned char> m_optionalAdditionalData;
224     const bool m_hasTagLengthBits;
225     const unsigned char m_optionalTagLengthBits;
226 };
227 
228 class WebCryptoRsaOaepParams : public WebCryptoAlgorithmParams {
229 public:
WebCryptoRsaOaepParams(const WebCryptoAlgorithm & hash,bool hasLabel,const unsigned char * label,unsigned labelSize)230     WebCryptoRsaOaepParams(const WebCryptoAlgorithm& hash, bool hasLabel, const unsigned char* label, unsigned labelSize)
231         : WebCryptoAlgorithmParams(WebCryptoAlgorithmParamsTypeRsaOaepParams)
232         , m_hash(hash)
233         , m_hasLabel(hasLabel)
234         , m_optionalLabel(label, labelSize)
235     {
236         BLINK_ASSERT(!hash.isNull());
237         BLINK_ASSERT(hasLabel || !labelSize);
238     }
239 
hash()240     const WebCryptoAlgorithm& hash() const { return m_hash; }
241 
hasLabel()242     bool hasLabel() const { return m_hasLabel; }
optionalLabel()243     const WebVector<unsigned char>& optionalLabel() const { return m_optionalLabel; }
244 
245 private:
246     const WebCryptoAlgorithm m_hash;
247     const bool m_hasLabel;
248     const WebVector<unsigned char> m_optionalLabel;
249 };
250 
251 } // namespace blink
252 
253 #endif
254