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