1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this
3 * file, You can obtain one at http://mozilla.org/MPL/2.0/. */
5 #ifndef mozilla_dom_WebAuthnResult_h_
6 #define mozilla_dom_WebAuthnResult_h_
8 #include "nsIWebAuthnResult.h"
12 #include "mozilla/Maybe.h"
15 #ifdef MOZ_WIDGET_ANDROID
16 # include "mozilla/java/WebAuthnTokenManagerNatives.h"
21 # include "mozilla/dom/PWebAuthnTransactionParent.h"
22 # include "winwebauthn/webauthn.h"
25 namespace mozilla::dom
{
27 class WebAuthnRegisterResult final
: public nsIWebAuthnRegisterResult
{
29 NS_DECL_THREADSAFE_ISUPPORTS
30 NS_DECL_NSIWEBAUTHNREGISTERRESULT
32 WebAuthnRegisterResult(const nsTArray
<uint8_t>& aAttestationObject
,
33 const Maybe
<nsCString
>& aClientDataJSON
,
34 const nsTArray
<uint8_t>& aCredentialId
,
35 const nsTArray
<nsString
>& aTransports
,
36 const Maybe
<nsString
>& aAuthenticatorAttachment
)
37 : mClientDataJSON(aClientDataJSON
),
38 mCredPropsRk(Nothing()),
39 mAuthenticatorAttachment(aAuthenticatorAttachment
) {
40 mAttestationObject
.AppendElements(aAttestationObject
);
41 mCredentialId
.AppendElements(aCredentialId
);
42 mTransports
.AppendElements(aTransports
);
45 #ifdef MOZ_WIDGET_ANDROID
46 explicit WebAuthnRegisterResult(
47 const java::WebAuthnTokenManager::MakeCredentialResponse::LocalRef
&
49 mAttestationObject
.AppendElements(
50 reinterpret_cast<uint8_t*>(
51 aResponse
->AttestationObject()->GetElements().Elements()),
52 aResponse
->AttestationObject()->Length());
53 mClientDataJSON
= Some(nsAutoCString(
54 reinterpret_cast<const char*>(
55 aResponse
->ClientDataJson()->GetElements().Elements()),
56 aResponse
->ClientDataJson()->Length()));
57 mCredentialId
.AppendElements(
58 reinterpret_cast<uint8_t*>(
59 aResponse
->KeyHandle()->GetElements().Elements()),
60 aResponse
->KeyHandle()->Length());
61 auto transports
= aResponse
->Transports();
62 for (size_t i
= 0; i
< transports
->Length(); i
++) {
63 mTransports
.AppendElement(
64 jni::String::LocalRef(transports
->GetElement(i
))->ToString());
66 mAuthenticatorAttachment
=
67 Some(aResponse
->AuthenticatorAttachment()->ToString());
72 WebAuthnRegisterResult(nsCString
& aClientDataJSON
,
73 PCWEBAUTHN_CREDENTIAL_ATTESTATION aResponse
)
74 : mClientDataJSON(Some(aClientDataJSON
)) {
75 mCredentialId
.AppendElements(aResponse
->pbCredentialId
,
76 aResponse
->cbCredentialId
);
78 mAttestationObject
.AppendElements(aResponse
->pbAttestationObject
,
79 aResponse
->cbAttestationObject
);
81 nsTArray
<WebAuthnExtensionResult
> extensions
;
82 if (aResponse
->dwVersion
>= WEBAUTHN_CREDENTIAL_ATTESTATION_VERSION_2
) {
83 PCWEBAUTHN_EXTENSIONS pExtensionList
= &aResponse
->Extensions
;
84 if (pExtensionList
->cExtensions
!= 0 &&
85 pExtensionList
->pExtensions
!= NULL
) {
86 for (DWORD dwIndex
= 0; dwIndex
< pExtensionList
->cExtensions
;
88 PWEBAUTHN_EXTENSION pExtension
=
89 &pExtensionList
->pExtensions
[dwIndex
];
90 if (pExtension
->pwszExtensionIdentifier
&&
91 (0 == _wcsicmp(pExtension
->pwszExtensionIdentifier
,
92 WEBAUTHN_EXTENSIONS_IDENTIFIER_HMAC_SECRET
)) &&
93 pExtension
->cbExtension
== sizeof(BOOL
)) {
94 BOOL
* pCredentialCreatedWithHmacSecret
=
95 (BOOL
*)pExtension
->pvExtension
;
96 if (*pCredentialCreatedWithHmacSecret
) {
97 mHmacCreateSecret
= Some(true);
104 if (aResponse
->dwVersion
>= WEBAUTHN_CREDENTIAL_ATTESTATION_VERSION_3
) {
105 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_USB
) {
106 mTransports
.AppendElement(u
"usb"_ns
);
108 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_NFC
) {
109 mTransports
.AppendElement(u
"nfc"_ns
);
111 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_BLE
) {
112 mTransports
.AppendElement(u
"ble"_ns
);
114 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_INTERNAL
) {
115 mTransports
.AppendElement(u
"internal"_ns
);
118 // WEBAUTHN_CREDENTIAL_ATTESTATION_VERSION_5 corresponds to
119 // WEBAUTHN_API_VERSION_6 which is where WEBAUTHN_CTAP_TRANSPORT_HYBRID was
121 if (aResponse
->dwVersion
>= WEBAUTHN_CREDENTIAL_ATTESTATION_VERSION_5
) {
122 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_HYBRID
) {
123 mTransports
.AppendElement(u
"hybrid"_ns
);
127 if (aResponse
->dwVersion
>= WEBAUTHN_CREDENTIAL_ATTESTATION_VERSION_3
) {
128 if (aResponse
->dwUsedTransport
& WEBAUTHN_CTAP_TRANSPORT_INTERNAL
) {
129 mAuthenticatorAttachment
= Some(u
"platform"_ns
);
131 mAuthenticatorAttachment
= Some(u
"cross-platform"_ns
);
138 ~WebAuthnRegisterResult() = default;
140 nsTArray
<uint8_t> mAttestationObject
;
141 nsTArray
<uint8_t> mCredentialId
;
142 nsTArray
<nsString
> mTransports
;
143 Maybe
<nsCString
> mClientDataJSON
;
144 Maybe
<bool> mCredPropsRk
;
145 Maybe
<bool> mHmacCreateSecret
;
146 Maybe
<nsString
> mAuthenticatorAttachment
;
149 class WebAuthnSignResult final
: public nsIWebAuthnSignResult
{
151 NS_DECL_THREADSAFE_ISUPPORTS
152 NS_DECL_NSIWEBAUTHNSIGNRESULT
154 WebAuthnSignResult(const nsTArray
<uint8_t>& aAuthenticatorData
,
155 const Maybe
<nsCString
>& aClientDataJSON
,
156 const nsTArray
<uint8_t>& aCredentialId
,
157 const nsTArray
<uint8_t>& aSignature
,
158 const nsTArray
<uint8_t>& aUserHandle
,
159 const Maybe
<nsString
>& aAuthenticatorAttachment
)
160 : mClientDataJSON(aClientDataJSON
),
161 mAuthenticatorAttachment(aAuthenticatorAttachment
) {
162 mAuthenticatorData
.AppendElements(aAuthenticatorData
);
163 mCredentialId
.AppendElements(aCredentialId
);
164 mSignature
.AppendElements(aSignature
);
165 mUserHandle
.AppendElements(aUserHandle
);
168 #ifdef MOZ_WIDGET_ANDROID
169 explicit WebAuthnSignResult(
170 const java::WebAuthnTokenManager::GetAssertionResponse::LocalRef
&
172 mAuthenticatorData
.AppendElements(
173 reinterpret_cast<uint8_t*>(
174 aResponse
->AuthData()->GetElements().Elements()),
175 aResponse
->AuthData()->Length());
176 mClientDataJSON
= Some(nsAutoCString(
177 reinterpret_cast<const char*>(
178 aResponse
->ClientDataJson()->GetElements().Elements()),
179 aResponse
->ClientDataJson()->Length()));
180 mCredentialId
.AppendElements(
181 reinterpret_cast<uint8_t*>(
182 aResponse
->KeyHandle()->GetElements().Elements()),
183 aResponse
->KeyHandle()->Length());
184 mSignature
.AppendElements(
185 reinterpret_cast<uint8_t*>(
186 aResponse
->Signature()->GetElements().Elements()),
187 aResponse
->Signature()->Length());
188 mUserHandle
.AppendElements(
189 reinterpret_cast<uint8_t*>(
190 aResponse
->UserHandle()->GetElements().Elements()),
191 aResponse
->UserHandle()->Length());
192 mAuthenticatorAttachment
=
193 Some(aResponse
->AuthenticatorAttachment()->ToString());
198 WebAuthnSignResult(nsCString
& aClientDataJSON
, PCWEBAUTHN_ASSERTION aResponse
)
199 : mClientDataJSON(Some(aClientDataJSON
)) {
200 mSignature
.AppendElements(aResponse
->pbSignature
, aResponse
->cbSignature
);
202 mCredentialId
.AppendElements(aResponse
->Credential
.pbId
,
203 aResponse
->Credential
.cbId
);
205 mUserHandle
.AppendElements(aResponse
->pbUserId
, aResponse
->cbUserId
);
207 mAuthenticatorData
.AppendElements(aResponse
->pbAuthenticatorData
,
208 aResponse
->cbAuthenticatorData
);
210 mAuthenticatorAttachment
= Nothing(); // not available
215 ~WebAuthnSignResult() = default;
217 nsTArray
<uint8_t> mAuthenticatorData
;
218 Maybe
<nsCString
> mClientDataJSON
;
219 nsTArray
<uint8_t> mCredentialId
;
220 nsTArray
<uint8_t> mSignature
;
221 nsTArray
<uint8_t> mUserHandle
;
222 Maybe
<nsString
> mAuthenticatorAttachment
;
223 Maybe
<bool> mUsedAppId
;
226 } // namespace mozilla::dom
227 #endif // mozilla_dom_WebAuthnResult_h