Bug 1874684 - Part 6: Limit day length calculations to safe integers. r=mgaudet
[gecko.git] / dom / webauthn / WebAuthnResult.h
blob13cea0e18788f9a71b13ab8bc4839611de14d2f7
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"
9 #include "nsString.h"
10 #include "nsTArray.h"
12 #include "mozilla/Maybe.h"
13 #include "nsString.h"
15 #ifdef MOZ_WIDGET_ANDROID
16 # include "mozilla/java/WebAuthnTokenManagerNatives.h"
17 #endif
19 #ifdef XP_WIN
20 # include <windows.h>
21 # include "mozilla/dom/PWebAuthnTransactionParent.h"
22 # include "winwebauthn/webauthn.h"
23 #endif
25 namespace mozilla::dom {
27 class WebAuthnRegisterResult final : public nsIWebAuthnRegisterResult {
28 public:
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&
48 aResponse) {
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());
69 #endif
71 #ifdef XP_WIN
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;
87 dwIndex++) {
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
120 // defined.
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);
130 } else {
131 mAuthenticatorAttachment = Some(u"cross-platform"_ns);
135 #endif
137 private:
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 {
150 public:
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&
171 aResponse) {
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());
195 #endif
197 #ifdef XP_WIN
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
212 #endif
214 private:
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