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