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)#ifndef CONTENT_CHILD_WEBCRYPTO_STATUS_H_
623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#define CONTENT_CHILD_WEBCRYPTO_STATUS_H_
723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include <string>
923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#include "content/common/content_export.h"
105c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu#include "third_party/WebKit/public/platform/WebCrypto.h"
1123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace content {
1323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)namespace webcrypto {
1523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// Status indicates whether an operation completed successfully, or with an
1723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// error. The error is used for verification in unit-tests, as well as for
1823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// display to the user.
1923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)//
2023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// As such, it is important that errors DO NOT reveal any sensitive material
2123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)// (like key bytes).
2223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)class CONTENT_EXPORT Status {
2323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) public:
245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Status() : type_(TYPE_ERROR) {}
255c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
2623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Returns true if the Status represents an error (any one of them).
2723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool IsError() const;
2823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Returns true if the Status represent success.
3023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  bool IsSuccess() const;
3123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Returns a UTF-8 error message (non-localized) describing the error.
335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  const std::string& error_details() const { return error_details_; }
3423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
355c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  blink::WebCryptoErrorType error_type() const { return error_type_; }
3623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
3723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Constructs a status representing success.
3823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status Success();
3923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
405c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Constructs a status representing a generic operation error. It contains no
415c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // extra details.
425c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static Status OperationError();
435c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
445c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Constructs a status representing a generic data error. It contains no
455c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // extra details.
465c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static Status DataError();
4723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
4823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // ------------------------------------
4923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Errors when importing a JWK formatted key
5023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // ------------------------------------
5123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The key bytes could not parsed as JSON dictionary. This either
5323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // means there was a parsing error, or the JSON object was not
5423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // convertable to a dictionary.
5523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkNotDictionary();
5623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
5723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The required property |property| was missing.
5823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkPropertyMissing(const std::string& property);
5923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The property |property| was not of type |expected_type|.
6123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkPropertyWrongType(const std::string& property,
6223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)                                          const std::string& expected_type);
6323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The property |property| was a string, however could not be successfully
6523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // base64 decoded.
6623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkBase64Decode(const std::string& property);
6723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
6823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "ext" parameter was specified but was
6923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // incompatible with the value requested by the Web Crypto call.
7023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkExtInconsistent();
7123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "alg" parameter is incompatible with the (optional) Algorithm
7323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // specified by the Web Crypto import operation.
7423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkAlgorithmInconsistent();
7523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
7623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "use" parameter was specified, however it couldn't be converted to an
7723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // equivalent Web Crypto usage.
7823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkUnrecognizedUse();
7923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "key_ops" parameter was specified, however one of the values in the
8123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // array couldn't be converted to an equivalent Web Crypto usage.
8223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkUnrecognizedKeyop();
8323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "use" parameter was specified, however it is incompatible with that
8523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // specified by the Web Crypto import operation.
8623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkUseInconsistent();
8723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
8823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The "key_ops" parameter was specified, however it is incompatible with that
8923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // specified by the Web Crypto import operation.
9023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkKeyopsInconsistent();
9123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
9223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Both the "key_ops" and the "use" parameters were specified, however they
9323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // are incompatible with each other.
9423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkUseAndKeyopsInconsistent();
9523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The "kty" parameter was given and was a string, however it was not the
975f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // expected value.
985f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorJwkUnexpectedKty(const std::string& expected);
9923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
10023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The amount of key data provided was incompatible with the selected
10123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // algorithm. For instance if the algorith name was A128CBC then EXACTLY
10223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // 128-bits of key data must have been provided. If 192-bits of key data were
10323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // given that is an error.
10423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorJwkIncorrectKeyLength();
10523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1065f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The JWK property |property| is supposed to represent a big-endian unsigned
1075f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // integer, however was the empty string.
1085f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorJwkEmptyBigInteger(const std::string& property);
1095f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1105f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The big-endian unsigned integer |property| contained leading zeros. This
1115f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // violates the JWA requirement that such octet strings be minimal.
1125f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorJwkBigIntegerHasLeadingZero(const std::string& property);
113cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
11423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // ------------------------------------
11523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Other errors
11623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // ------------------------------------
11723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
11823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // No key data was provided when importing an spki, pkcs8, or jwk formatted
11923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // key. This does not apply to raw format, since it is possible to have empty
12023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // key data there.
12123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorImportEmptyKeyData();
12223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Tried importing a key using an unsupported format for the key type (for
1245f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // instance importing an HMAC key using format=spki).
1255f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorUnsupportedImportKeyFormat();
1265f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1275f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // Tried exporting a key using an unsupported format for the key type (for
1285f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // instance exporting an HMAC key using format=spki).
1295f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorUnsupportedExportKeyFormat();
1305f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)
1315c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // The key data buffer provided for importKey() is an incorrect length for
1325c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // AES.
1335c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  static Status ErrorImportAesKeyLength();
1345c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu
135f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // 192-bit AES keys are valid, however unsupported.
136f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  static Status ErrorAes192BitUnsupported();
137f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)
13823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The wrong key was used for the operation. For instance, a public key was
13923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // used to verify a RsaSsaPkcs1v1_5 signature, or tried exporting a private
14023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // key using spki format.
14123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorUnexpectedKeyType();
14223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
14323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // When doing an AES-CBC encryption/decryption, the "iv" parameter was not 16
14423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // bytes.
14523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorIncorrectSizeAesCbcIv();
14623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1471320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // When doing AES-CTR encryption/decryption, the "counter" parameter was not
1481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // 16 bytes.
1491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static Status ErrorIncorrectSizeAesCtrCounter();
1501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // When doing AES-CTR encryption/decryption, the "length" parameter for the
1521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // counter was out of range.
1531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static Status ErrorInvalidAesCtrCounterLength();
1541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
1551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // The input to encrypt/decrypt was too large. Based on the counter size, it
1561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  // would cause the counter to wraparound and repeat earlier values.
1571320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci  static Status ErrorAesCtrInputTooLongCounterRepeated();
1581320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci
15923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The data provided to an encrypt/decrypt/sign/verify operation was too
16023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // large. This can either represent an internal limitation (for instance
161cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // representing buffer lengths as uints).
16223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorDataTooLarge();
16323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The data provided to an encrypt/decrypt/sign/verify operation was too
16523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // small. This usually represents an algorithm restriction (for instance
16623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // AES-KW requires a minimum of 24 bytes input data).
16723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorDataTooSmall();
16823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
16923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Something was unsupported or unimplemented. This can mean the algorithm in
17023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // question was unsupported, some parameter combination was unsupported, or
17123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // something has not yet been implemented.
17223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorUnsupported();
1736d86b77056ed63eb6871182f42a9fd5f07550f90Torne (Richard Coles)  static Status ErrorUnsupported(const std::string& message);
17423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
17523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Something unexpected happened in the code, which implies there is a
17623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // source-level bug. These should not happen, but safer to fail than simply
17723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // DCHECK.
17823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorUnexpected();
17923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The authentication tag length specified for AES-GCM encrypt/decrypt was
18123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // not 32, 64, 96, 104, 112, 120, or 128.
18223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorInvalidAesGcmTagLength();
18323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
18423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The input data given to an AES-KW encrypt/decrypt operation was not a
18523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // multiple of 8 bytes, as required by RFC 3394.
18623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorInvalidAesKwDataLength();
18723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
188f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // The "publicExponent" used to generate a key was invalid or unsupported.
189f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles)  // Only values of 3 and 65537 are allowed.
19023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorGenerateKeyPublicExponent();
19123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The modulus bytes were empty when importing an RSA public key.
19323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorImportRsaEmptyModulus();
19423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  // The modulus length was unsupported when generating an RSA key pair.
1965f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)  static Status ErrorGenerateRsaUnsupportedModulus();
19723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
19823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The exponent bytes were empty when importing an RSA public key.
19923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorImportRsaEmptyExponent();
20023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // An unextractable key was used by an operation which exports the key data.
20223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorKeyNotExtractable();
20323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
20423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // The key length specified when generating a key was invalid. Either it was
20523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // zero, or it was not a multiple of 8 bits.
20623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  static Status ErrorGenerateKeyLength();
20723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // Attempted to create a key (either by importKey(), generateKey(), or
209cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // unwrapKey()) however the key usages were not applicable for the key type
210cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  // and algorithm.
211cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)  static Status ErrorCreateKeyBadUsages();
212cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)
21323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles) private:
21423730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  enum Type { TYPE_ERROR, TYPE_SUCCESS };
21523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
2165c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  // Constructs an error with the specified error type and message.
2175c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  Status(blink::WebCryptoErrorType error_type,
2185c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu         const std::string& error_details_utf8);
21923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  // Constructs a success or error without any details.
22123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  explicit Status(Type type);
22223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22323730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  Type type_;
2245c02ac1a9c1b504631c0a3d2b6e737b5d738bae1Bo Liu  blink::WebCryptoErrorType error_type_;
22523730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)  std::string error_details_;
22623730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)};
22723730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
22823730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace webcrypto
22923730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
23023730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)}  // namespace content
23123730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)
23223730a6e56a168d1879203e4b3819bb36e3d8f1fTorne (Richard Coles)#endif  // CONTENT_CHILD_WEBCRYPTO_STATUS_H_
233