123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Copyright 2014 The Chromium Authors. All rights reserved.
223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// found in the LICENSE file.
423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/child/webcrypto/status.h"
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace content {
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace webcrypto {
1023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
115c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool Status::IsError() const {
125c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return type_ == TYPE_ERROR;
135c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
155c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liubool Status::IsSuccess() const {
165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return type_ == TYPE_SUCCESS;
175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
195c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus Status::Success() {
205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(TYPE_SUCCESS);
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
235c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus Status::OperationError() {
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeOperation, "");
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
275c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus Status::DataError() {
285c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData, "");
295c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkNotDictionary() {
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "JWK input could not be parsed to a JSON dictionary");
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
3523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkPropertyMissing(const std::string& property) {
375c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
385c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The required JWK property \"" + property + "\" was missing");
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkPropertyWrongType(const std::string& property,
4223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                         const std::string& expected_type) {
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      blink::WebCryptoErrorTypeData,
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "The JWK property \"" + property + "\" must be a " + expected_type);
4623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkBase64Decode(const std::string& property) {
495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(
505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      blink::WebCryptoErrorTypeData,
515c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      "The JWK property \"" + property + "\" could not be base64 decoded");
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkExtInconsistent() {
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return Status(
565c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      blink::WebCryptoErrorTypeData,
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "The \"ext\" property of the JWK dictionary is inconsistent what that "
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "specified by the Web Crypto call");
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkAlgorithmInconsistent() {
625c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
635c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"alg\" property was inconsistent with that specified "
645c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "by the Web Crypto call");
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkUnrecognizedUse() {
685c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"use\" property could not be parsed");
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkUnrecognizedKeyop() {
735c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"key_ops\" property could not be parsed");
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkUseInconsistent() {
785c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
795c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"use\" property was inconsistent with that specified "
805c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "by the Web Crypto call. The JWK usage must be a superset of "
815c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "those requested");
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkKeyopsInconsistent() {
855c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
865c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"key_ops\" property was inconsistent with that "
875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "specified by the Web Crypto call. The JWK usage must be a "
885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "superset of those requested");
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkUseAndKeyopsInconsistent() {
925c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"use\" and \"key_ops\" properties were both found "
945c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "but are inconsistent with each other.");
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
9623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorJwkUnexpectedKty(const std::string& expected) {
985c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
995f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "The JWK \"kty\" property was not \"" + expected + "\"");
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorJwkIncorrectKeyLength() {
1035c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
1045c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The JWK \"k\" property did not include the right length "
1055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "of key data for the given algorithm.");
10623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
10723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorJwkEmptyBigInteger(const std::string& property) {
109cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return Status(blink::WebCryptoErrorTypeData,
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "The JWK \"" + property + "\" property was empty.");
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorJwkBigIntegerHasLeadingZero(const std::string& property) {
1145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status(
1155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      blink::WebCryptoErrorTypeData,
1165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)      "The JWK \"" + property + "\" property contained a leading zero.");
117cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
118cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorImportEmptyKeyData() {
1205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData, "No key data was provided");
1215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
1225c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorUnsupportedImportKeyFormat() {
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status(blink::WebCryptoErrorTypeNotSupported,
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "Unsupported import key format for algorithm");
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorUnsupportedExportKeyFormat() {
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status(blink::WebCryptoErrorTypeNotSupported,
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "Unsupported export key format for algorithm");
1315f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}
1325f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus Status::ErrorImportAesKeyLength() {
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
1355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "AES key data must be 128, 192 or 256 bits");
13623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
13723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
138f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)Status Status::ErrorAes192BitUnsupported() {
139f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  return Status(blink::WebCryptoErrorTypeNotSupported,
140f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                "192-bit AES keys are not supported");
141f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)}
142f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorUnexpectedKeyType() {
1445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeInvalidAccess,
1455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The key is not of the expected type");
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
14723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
14823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorIncorrectSizeAesCbcIv() {
1495c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
1505c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The \"iv\" has an unexpected length -- must be 16 bytes");
15123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
15223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatus Status::ErrorIncorrectSizeAesCtrCounter() {
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return Status(blink::WebCryptoErrorTypeData,
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "The \"counter\" has an unexpected length -- must be 16 bytes");
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatus Status::ErrorInvalidAesCtrCounterLength() {
1591320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return Status(blink::WebCryptoErrorTypeData,
1601320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "The \"length\" property must be >= 1 and <= 128");
1611320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1621320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano TucciStatus Status::ErrorAesCtrInputTooLongCounterRepeated() {
1641320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  return Status(blink::WebCryptoErrorTypeData,
1651320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci                "The input is too large for the counter length.");
1661320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci}
1671320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorDataTooLarge() {
1695c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
1705c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The provided data is too large");
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorDataTooSmall() {
1745c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
1755c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The provided data is too small");
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorUnsupported() {
1796d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return ErrorUnsupported("The requested operation is unsupported");
1806d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)}
1816d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)
1826d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)Status Status::ErrorUnsupported(const std::string& message) {
1836d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  return Status(blink::WebCryptoErrorTypeNotSupported, message);
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorUnexpected() {
1875c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeUnknown,
1885c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "Something unexpected happened...");
18923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorInvalidAesGcmTagLength() {
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  return Status(
1935c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      blink::WebCryptoErrorTypeData,
19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "The tag length is invalid: Must be 32, 64, 96, 104, 112, 120, or 128 "
19523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)      "bits");
19623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorInvalidAesKwDataLength() {
1995c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
2005c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "The AES-KW input data length is invalid: not a multiple of 8 "
2015c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "bytes");
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorGenerateKeyPublicExponent() {
2055c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
206f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)                "The \"publicExponent\" must be either 3 or 65537");
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
20823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorImportRsaEmptyModulus() {
2105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData, "The modulus is empty");
21123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
21223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)Status Status::ErrorGenerateRsaUnsupportedModulus() {
2145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  return Status(blink::WebCryptoErrorTypeNotSupported,
2155f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "The modulus length must be a multiple of 8 bits and >= 256 "
2165f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)                "and <= 16384");
21723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
21823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorImportRsaEmptyExponent() {
2205c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
2215c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "No bytes for the exponent were provided");
22223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
22323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorKeyNotExtractable() {
2255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeInvalidAccess,
2265c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "They key is not extractable");
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)Status Status::ErrorGenerateKeyLength() {
2305c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  return Status(blink::WebCryptoErrorTypeData,
2315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "Invalid key length: it is either zero or not a multiple of 8 "
2325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu                "bits");
23323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}
23423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
235cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)Status Status::ErrorCreateKeyBadUsages() {
236cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  return Status(blink::WebCryptoErrorTypeData,
237cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)                "Cannot create a key using the specified key usages.");
238cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}
239cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
2405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus::Status(blink::WebCryptoErrorType error_type,
2415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu               const std::string& error_details_utf8)
2425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu    : type_(TYPE_ERROR),
2435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      error_type_(error_type),
2445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu      error_details_(error_details_utf8) {
2455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
24623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2475c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo LiuStatus::Status(Type type) : type_(type) {
2485c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu}
24923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
25023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace webcrypto
25123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
25223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace content
253