[WebAuthN] Implement PublicKeyCredential’s [[DiscoverFromExternalSource]] with a...
[WebKit-https.git] / Source / WebCore / Modules / webauthn / Authenticator.cpp
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 #include "config.h"
27 #include "Authenticator.h"
28
29 #include <AuthenticatorAttestationResponse.h>
30 #include <wtf/CurrentTime.h>
31 #include <wtf/NeverDestroyed.h>
32
33 namespace WebCore {
34
35 Authenticator& Authenticator::singleton()
36 {
37     static NeverDestroyed<Authenticator> authenticator;
38     return authenticator;
39 }
40
41 ExceptionOr<Vector<uint8_t>> Authenticator::makeCredential(const Vector<uint8_t>& hash, const PublicKeyCredentialCreationOptions::RpEntity&, const PublicKeyCredentialCreationOptions::UserEntity& user, const Vector<PublicKeyCredentialCreationOptions::Parameters>&, const Vector<PublicKeyCredentialDescriptor>&) const
42 {
43     // The followings is just a dummy implementaion to support initial development.
44     // User cancellation is effecively NotAllowedError.
45     if (user.displayName == "John")
46         return Exception { NotAllowedError };
47
48     // Fill all parts before CredentialID with 0x00
49     Vector<uint8_t> attestationObject(43, 0x00);
50     // Fill length of CredentialID: 1 Byte
51     attestationObject.append(0x00);
52     attestationObject.append(0x01);
53     // Fill CredentialID: 255
54     attestationObject.append(0xff);
55     // Append clientDataJsonHash
56     attestationObject.appendVector(hash);
57     return WTFMove(attestationObject);
58 }
59
60 ExceptionOr<Authenticator::AssertionReturnBundle> Authenticator::getAssertion(const String&, const Vector<uint8_t>& hash, const Vector<PublicKeyCredentialDescriptor>& allowCredentialIds) const
61 {
62     // The followings is just a dummy implementaion to support initial development.
63     // User cancellation is effecively NotAllowedError.
64     if (!allowCredentialIds.isEmpty())
65         return Exception { NotAllowedError };
66
67     // FIXME: Delay processing for 0.1 seconds to simulate a timeout condition. This code will be removed
68     // when the full test infrastructure is set up.
69     WTF::sleep(0.1);
70
71     // Fill all parts with hash
72     return AssertionReturnBundle(ArrayBuffer::create(hash.data(), hash.size()), ArrayBuffer::create(hash.data(), hash.size()), ArrayBuffer::create(hash.data(), hash.size()), ArrayBuffer::create(hash.data(), hash.size()));
73 }
74
75 } // namespace WebCore