1e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch/* 2e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Copyright (C) 2013 Google Inc. All rights reserved. 3e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 4e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * Redistribution and use in source and binary forms, with or without 5e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * modification, are permitted provided that the following conditions are 6e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * met: 7e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 8e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * * Redistributions of source code must retain the above copyright 9e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * notice, this list of conditions and the following disclaimer. 10e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * * Redistributions in binary form must reproduce the above 11e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * copyright notice, this list of conditions and the following disclaimer 12e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * in the documentation and/or other materials provided with the 13e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * distribution. 14e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * * Neither the name of Google Inc. nor the names of its 15e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * contributors may be used to endorse or promote products derived from 16e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * this software without specific prior written permission. 17e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * 18e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 19e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 20e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 21e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 22e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 23e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 24e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 25e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 26e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 27e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 28e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 29e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch */ 30e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 31e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#ifndef WebCryptoKey_h 32e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#define WebCryptoKey_h 33e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 34e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebCommon.h" 35e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#include "WebPrivatePtr.h" 36e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 3751b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)namespace blink { 38e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 39e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochenum WebCryptoKeyType { 40e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyTypeSecret, 41e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyTypePublic, 42e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyTypePrivate, 43e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 44e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 45e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochenum WebCryptoKeyUsage { 46e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageEncrypt = 1 << 0, 47e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageDecrypt = 1 << 1, 48e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageSign = 1 << 2, 49e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageVerify = 1 << 3, 50e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageDeriveKey = 1 << 4, 51e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageWrapKey = 1 << 5, 52e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKeyUsageUnwrapKey = 1 << 6, 53f91f5fa1608c2cdd9af1842fb5dadbe78275be2aBo Liu WebCryptoKeyUsageDeriveBits = 1 << 7, 5419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)#if INSIDE_BLINK 55e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch EndOfWebCryptoKeyUsage, 56e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#endif 57e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 58e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 59e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// A bitfield of WebCryptoKeyUsage 60e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochtypedef int WebCryptoKeyUsageMask; 61e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 6202772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdochenum WebCryptoKeyFormat { 6302772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch WebCryptoKeyFormatRaw, 6402772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch WebCryptoKeyFormatPkcs8, 6502772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch WebCryptoKeyFormatSpki, 6602772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch WebCryptoKeyFormatJwk, 6702772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch}; 6802772c6a72f1ee0b226341a4f4439970c29fc861Ben Murdoch 69d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles)class WebCryptoKeyAlgorithm; 70e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass WebCryptoKeyPrivate; 71e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass WebCryptoKeyHandle; 72e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 73e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// The WebCryptoKey represents a key from the Web Crypto API: 74e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// 75e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#key-interface 76e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// 77e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// WebCryptoKey is just a reference-counted wrapper that manages the lifetime of 78e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// a "WebCryptoKeyHandle*". 79e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// 80e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// WebCryptoKey is: 81e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// * Copiable (cheaply) 82e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// * Threadsafe if the embedder's WebCryptoKeyHandle is also threadsafe. 83e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// 84e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// The embedder is responsible for creating all WebCryptoKeys, and therefore can 85e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// safely assume any details regarding the type of the wrapped 86e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// WebCryptoKeyHandle*. 87e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// 8819cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)// If WebCryptoKey "isNull()" then it is invalid to call any of the other 8919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles)// methods on it (other than destruction, assignment, or isNull()). 90e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass WebCryptoKey { 91e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochpublic: 92e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch ~WebCryptoKey() { reset(); } 93e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 94e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKey(const WebCryptoKey& other) { assign(other); } 95e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKey& operator=(const WebCryptoKey& other) 96e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch { 97e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch assign(other); 98e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch return *this; 99e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch } 100e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 101e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // For an explanation of these parameters see: 102e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // https://dvcs.w3.org/hg/webcrypto-api/raw-file/tip/spec/Overview.html#key-interface-members 103e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // 104e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // Note that the caller is passing ownership of the WebCryptoKeyHandle*. 105d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) BLINK_PLATFORM_EXPORT static WebCryptoKey create(WebCryptoKeyHandle*, WebCryptoKeyType, bool extractable, const WebCryptoKeyAlgorithm&, WebCryptoKeyUsageMask); 10619cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 10719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT static WebCryptoKey createNull(); 108e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 109e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // Returns the opaque key handle that was set by the embedder. 110e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // * Safe to downcast to known type (since embedder creates all the keys) 111e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch // * Returned pointer's lifetime is bound to |this| 11219cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT WebCryptoKeyHandle* handle() const; 11319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) 11419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT WebCryptoKeyType type() const; 11519cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT bool extractable() const; 116d5428f32f5d1719f774f62e19147104ca245a3abTorne (Richard Coles) BLINK_PLATFORM_EXPORT const WebCryptoKeyAlgorithm& algorithm() const; 11719cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT WebCryptoKeyUsageMask usages() const; 118e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 11919cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT bool isNull() const; 120e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 121e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochprivate: 122e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebCryptoKey() { } 12319cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT void assign(const WebCryptoKey& other); 12419cde67944066db31e633d9e386f2aa9bf9fadb3Torne (Richard Coles) BLINK_PLATFORM_EXPORT void reset(); 125e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 126e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch WebPrivatePtr<WebCryptoKeyPrivate> m_private; 127e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 128e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 129e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// Base class for the embedder to define its own opaque key handle. The lifetime 130e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch// of this object is controlled by WebCryptoKey using reference counting. 131e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochclass WebCryptoKeyHandle { 132e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdochpublic: 133e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch virtual ~WebCryptoKeyHandle() { } 134e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch}; 135e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 13651b2906e11752df6c18351cf520e30522d3b53a1Torne (Richard Coles)} // namespace blink 137e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch 138e69819bd8e388ea4ad1636a19aa6b2eed4952191Ben Murdoch#endif 139