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