[WebAuthN] Implement authenticatorMakeCredential
[WebKit-https.git] / Source / WebCore / Modules / webauthn / PublicKeyCredentialCreationOptions.h
1 /*
2  * Copyright (C) 2018 Apple Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #pragma once
27
28 #if ENABLE(WEB_AUTHN)
29
30 #include "BufferSource.h"
31 #include "PublicKeyCredentialDescriptor.h"
32 #include "PublicKeyCredentialType.h"
33 #include <wtf/CrossThreadCopier.h>
34 #include <wtf/Forward.h>
35
36 namespace WebCore {
37
38 struct PublicKeyCredentialCreationOptions {
39     struct Entity {
40         String name;
41         String icon;
42     };
43
44     struct RpEntity : public Entity {
45         mutable String id;
46     };
47
48     struct UserEntity : public Entity {
49         BufferSource id; // id becomes idVector once it is passed to UIProcess.
50         mutable Vector<uint8_t> idVector;
51         String displayName;
52     };
53
54     struct Parameters {
55         PublicKeyCredentialType type;
56         int64_t alg;
57
58         template<class Encoder> void encode(Encoder&) const;
59         template<class Decoder> static std::optional<Parameters> decode(Decoder&);
60     };
61
62     RpEntity rp;
63     UserEntity user;
64
65     BufferSource challenge;
66     Vector<Parameters> pubKeyCredParams;
67
68     std::optional<unsigned long> timeout;
69     Vector<PublicKeyCredentialDescriptor> excludeCredentials;
70
71     template<class Encoder> void encode(Encoder&) const;
72     template<class Decoder> static std::optional<PublicKeyCredentialCreationOptions> decode(Decoder&);
73 };
74
75 template<class Encoder>
76 void PublicKeyCredentialCreationOptions::Parameters::encode(Encoder& encoder) const
77 {
78     encoder << type << alg;
79 }
80
81 template<class Decoder>
82 std::optional<PublicKeyCredentialCreationOptions::Parameters> PublicKeyCredentialCreationOptions::Parameters::decode(Decoder& decoder)
83 {
84     PublicKeyCredentialCreationOptions::Parameters result;
85     if (!decoder.decodeEnum(result.type))
86         return std::nullopt;
87     if (!decoder.decode(result.alg))
88         return std::nullopt;
89     return result;
90 }
91
92 // Not every member is encoded.
93 template<class Encoder>
94 void PublicKeyCredentialCreationOptions::encode(Encoder& encoder) const
95 {
96     encoder << rp.id << rp.name << rp.icon;
97     Vector<uint8_t> idVector;
98     idVector.append(user.id.data(), user.id.length());
99     encoder << idVector << user.displayName << user.name << user.icon << pubKeyCredParams << excludeCredentials;
100 }
101
102 template<class Decoder>
103 std::optional<PublicKeyCredentialCreationOptions> PublicKeyCredentialCreationOptions::decode(Decoder& decoder)
104 {
105     PublicKeyCredentialCreationOptions result;
106     if (!decoder.decode(result.rp.id))
107         return std::nullopt;
108     if (!decoder.decode(result.rp.name))
109         return std::nullopt;
110     if (!decoder.decode(result.rp.icon))
111         return std::nullopt;
112     if (!decoder.decode(result.user.idVector))
113         return std::nullopt;
114     if (!decoder.decode(result.user.displayName))
115         return std::nullopt;
116     if (!decoder.decode(result.user.name))
117         return std::nullopt;
118     if (!decoder.decode(result.user.icon))
119         return std::nullopt;
120     if (!decoder.decode(result.pubKeyCredParams))
121         return std::nullopt;
122     if (!decoder.decode(result.excludeCredentials))
123         return std::nullopt;
124     return result;
125 }
126
127 } // namespace WebCore
128
129 namespace WTF {
130 // Not every member is copied.
131 template<> struct CrossThreadCopierBase<false, false, WebCore::PublicKeyCredentialCreationOptions> {
132     typedef WebCore::PublicKeyCredentialCreationOptions Type;
133     static Type copy(const Type& source)
134     {
135         Type result;
136         result.rp.name = source.rp.name.isolatedCopy();
137         result.rp.icon = source.rp.icon.isolatedCopy();
138         result.rp.id = source.rp.id.isolatedCopy();
139
140         result.user.name = source.user.name.isolatedCopy();
141         result.user.icon = source.user.icon.isolatedCopy();
142         result.user.displayName = source.user.displayName.isolatedCopy();
143         result.user.idVector = WTFMove(source.user.idVector);
144         return result;
145     }
146 };
147 } // namespace WTF
148
149 #endif // ENABLE(WEB_AUTHN)