1 // Copyright 2014 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "content/child/webcrypto/status.h"
6
7 namespace content {
8
9 namespace webcrypto {
10
IsError() const11 bool Status::IsError() const {
12 return type_ == TYPE_ERROR;
13 }
14
IsSuccess() const15 bool Status::IsSuccess() const {
16 return type_ == TYPE_SUCCESS;
17 }
18
Success()19 Status Status::Success() {
20 return Status(TYPE_SUCCESS);
21 }
22
OperationError()23 Status Status::OperationError() {
24 return Status(blink::WebCryptoErrorTypeOperation, "");
25 }
26
DataError()27 Status Status::DataError() {
28 return Status(blink::WebCryptoErrorTypeData, "");
29 }
30
ErrorJwkNotDictionary()31 Status Status::ErrorJwkNotDictionary() {
32 return Status(blink::WebCryptoErrorTypeData,
33 "JWK input could not be parsed to a JSON dictionary");
34 }
35
ErrorJwkPropertyMissing(const std::string & property)36 Status Status::ErrorJwkPropertyMissing(const std::string& property) {
37 return Status(blink::WebCryptoErrorTypeData,
38 "The required JWK property \"" + property + "\" was missing");
39 }
40
ErrorJwkPropertyWrongType(const std::string & property,const std::string & expected_type)41 Status Status::ErrorJwkPropertyWrongType(const std::string& property,
42 const std::string& expected_type) {
43 return Status(
44 blink::WebCryptoErrorTypeData,
45 "The JWK property \"" + property + "\" must be a " + expected_type);
46 }
47
ErrorJwkBase64Decode(const std::string & property)48 Status Status::ErrorJwkBase64Decode(const std::string& property) {
49 return Status(
50 blink::WebCryptoErrorTypeData,
51 "The JWK property \"" + property + "\" could not be base64 decoded");
52 }
53
ErrorJwkExtInconsistent()54 Status Status::ErrorJwkExtInconsistent() {
55 return Status(
56 blink::WebCryptoErrorTypeData,
57 "The \"ext\" property of the JWK dictionary is inconsistent what that "
58 "specified by the Web Crypto call");
59 }
60
ErrorJwkAlgorithmInconsistent()61 Status Status::ErrorJwkAlgorithmInconsistent() {
62 return Status(blink::WebCryptoErrorTypeData,
63 "The JWK \"alg\" property was inconsistent with that specified "
64 "by the Web Crypto call");
65 }
66
ErrorJwkUnrecognizedUse()67 Status Status::ErrorJwkUnrecognizedUse() {
68 return Status(blink::WebCryptoErrorTypeData,
69 "The JWK \"use\" property could not be parsed");
70 }
71
ErrorJwkUnrecognizedKeyop()72 Status Status::ErrorJwkUnrecognizedKeyop() {
73 return Status(blink::WebCryptoErrorTypeData,
74 "The JWK \"key_ops\" property could not be parsed");
75 }
76
ErrorJwkUseInconsistent()77 Status Status::ErrorJwkUseInconsistent() {
78 return Status(blink::WebCryptoErrorTypeData,
79 "The JWK \"use\" property was inconsistent with that specified "
80 "by the Web Crypto call. The JWK usage must be a superset of "
81 "those requested");
82 }
83
ErrorJwkKeyopsInconsistent()84 Status Status::ErrorJwkKeyopsInconsistent() {
85 return Status(blink::WebCryptoErrorTypeData,
86 "The JWK \"key_ops\" property was inconsistent with that "
87 "specified by the Web Crypto call. The JWK usage must be a "
88 "superset of those requested");
89 }
90
ErrorJwkUseAndKeyopsInconsistent()91 Status Status::ErrorJwkUseAndKeyopsInconsistent() {
92 return Status(blink::WebCryptoErrorTypeData,
93 "The JWK \"use\" and \"key_ops\" properties were both found "
94 "but are inconsistent with each other.");
95 }
96
ErrorJwkUnexpectedKty(const std::string & expected)97 Status Status::ErrorJwkUnexpectedKty(const std::string& expected) {
98 return Status(blink::WebCryptoErrorTypeData,
99 "The JWK \"kty\" property was not \"" + expected + "\"");
100 }
101
ErrorJwkIncorrectKeyLength()102 Status Status::ErrorJwkIncorrectKeyLength() {
103 return Status(blink::WebCryptoErrorTypeData,
104 "The JWK \"k\" property did not include the right length "
105 "of key data for the given algorithm.");
106 }
107
ErrorJwkEmptyBigInteger(const std::string & property)108 Status Status::ErrorJwkEmptyBigInteger(const std::string& property) {
109 return Status(blink::WebCryptoErrorTypeData,
110 "The JWK \"" + property + "\" property was empty.");
111 }
112
ErrorJwkBigIntegerHasLeadingZero(const std::string & property)113 Status Status::ErrorJwkBigIntegerHasLeadingZero(const std::string& property) {
114 return Status(
115 blink::WebCryptoErrorTypeData,
116 "The JWK \"" + property + "\" property contained a leading zero.");
117 }
118
ErrorImportEmptyKeyData()119 Status Status::ErrorImportEmptyKeyData() {
120 return Status(blink::WebCryptoErrorTypeData, "No key data was provided");
121 }
122
ErrorUnsupportedImportKeyFormat()123 Status Status::ErrorUnsupportedImportKeyFormat() {
124 return Status(blink::WebCryptoErrorTypeNotSupported,
125 "Unsupported import key format for algorithm");
126 }
127
ErrorUnsupportedExportKeyFormat()128 Status Status::ErrorUnsupportedExportKeyFormat() {
129 return Status(blink::WebCryptoErrorTypeNotSupported,
130 "Unsupported export key format for algorithm");
131 }
132
ErrorImportAesKeyLength()133 Status Status::ErrorImportAesKeyLength() {
134 return Status(blink::WebCryptoErrorTypeData,
135 "AES key data must be 128, 192 or 256 bits");
136 }
137
ErrorAes192BitUnsupported()138 Status Status::ErrorAes192BitUnsupported() {
139 return Status(blink::WebCryptoErrorTypeNotSupported,
140 "192-bit AES keys are not supported");
141 }
142
ErrorUnexpectedKeyType()143 Status Status::ErrorUnexpectedKeyType() {
144 return Status(blink::WebCryptoErrorTypeInvalidAccess,
145 "The key is not of the expected type");
146 }
147
ErrorIncorrectSizeAesCbcIv()148 Status Status::ErrorIncorrectSizeAesCbcIv() {
149 return Status(blink::WebCryptoErrorTypeData,
150 "The \"iv\" has an unexpected length -- must be 16 bytes");
151 }
152
ErrorIncorrectSizeAesCtrCounter()153 Status Status::ErrorIncorrectSizeAesCtrCounter() {
154 return Status(blink::WebCryptoErrorTypeData,
155 "The \"counter\" has an unexpected length -- must be 16 bytes");
156 }
157
ErrorInvalidAesCtrCounterLength()158 Status Status::ErrorInvalidAesCtrCounterLength() {
159 return Status(blink::WebCryptoErrorTypeData,
160 "The \"length\" property must be >= 1 and <= 128");
161 }
162
ErrorAesCtrInputTooLongCounterRepeated()163 Status Status::ErrorAesCtrInputTooLongCounterRepeated() {
164 return Status(blink::WebCryptoErrorTypeData,
165 "The input is too large for the counter length.");
166 }
167
ErrorDataTooLarge()168 Status Status::ErrorDataTooLarge() {
169 return Status(blink::WebCryptoErrorTypeData,
170 "The provided data is too large");
171 }
172
ErrorDataTooSmall()173 Status Status::ErrorDataTooSmall() {
174 return Status(blink::WebCryptoErrorTypeData,
175 "The provided data is too small");
176 }
177
ErrorUnsupported()178 Status Status::ErrorUnsupported() {
179 return ErrorUnsupported("The requested operation is unsupported");
180 }
181
ErrorUnsupported(const std::string & message)182 Status Status::ErrorUnsupported(const std::string& message) {
183 return Status(blink::WebCryptoErrorTypeNotSupported, message);
184 }
185
ErrorUnexpected()186 Status Status::ErrorUnexpected() {
187 return Status(blink::WebCryptoErrorTypeUnknown,
188 "Something unexpected happened...");
189 }
190
ErrorInvalidAesGcmTagLength()191 Status Status::ErrorInvalidAesGcmTagLength() {
192 return Status(
193 blink::WebCryptoErrorTypeData,
194 "The tag length is invalid: Must be 32, 64, 96, 104, 112, 120, or 128 "
195 "bits");
196 }
197
ErrorInvalidAesKwDataLength()198 Status Status::ErrorInvalidAesKwDataLength() {
199 return Status(blink::WebCryptoErrorTypeData,
200 "The AES-KW input data length is invalid: not a multiple of 8 "
201 "bytes");
202 }
203
ErrorGenerateKeyPublicExponent()204 Status Status::ErrorGenerateKeyPublicExponent() {
205 return Status(blink::WebCryptoErrorTypeData,
206 "The \"publicExponent\" must be either 3 or 65537");
207 }
208
ErrorImportRsaEmptyModulus()209 Status Status::ErrorImportRsaEmptyModulus() {
210 return Status(blink::WebCryptoErrorTypeData, "The modulus is empty");
211 }
212
ErrorGenerateRsaUnsupportedModulus()213 Status Status::ErrorGenerateRsaUnsupportedModulus() {
214 return Status(blink::WebCryptoErrorTypeNotSupported,
215 "The modulus length must be a multiple of 8 bits and >= 256 "
216 "and <= 16384");
217 }
218
ErrorImportRsaEmptyExponent()219 Status Status::ErrorImportRsaEmptyExponent() {
220 return Status(blink::WebCryptoErrorTypeData,
221 "No bytes for the exponent were provided");
222 }
223
ErrorKeyNotExtractable()224 Status Status::ErrorKeyNotExtractable() {
225 return Status(blink::WebCryptoErrorTypeInvalidAccess,
226 "They key is not extractable");
227 }
228
ErrorGenerateKeyLength()229 Status Status::ErrorGenerateKeyLength() {
230 return Status(blink::WebCryptoErrorTypeData,
231 "Invalid key length: it is either zero or not a multiple of 8 "
232 "bits");
233 }
234
ErrorCreateKeyBadUsages()235 Status Status::ErrorCreateKeyBadUsages() {
236 return Status(blink::WebCryptoErrorTypeData,
237 "Cannot create a key using the specified key usages.");
238 }
239
Status(blink::WebCryptoErrorType error_type,const std::string & error_details_utf8)240 Status::Status(blink::WebCryptoErrorType error_type,
241 const std::string& error_details_utf8)
242 : type_(TYPE_ERROR),
243 error_type_(error_type),
244 error_details_(error_details_utf8) {
245 }
246
Status(Type type)247 Status::Status(Type type) : type_(type) {
248 }
249
250 } // namespace webcrypto
251
252 } // namespace content
253