mirror of
https://github.com/bitwarden/browser
synced 2025-12-12 06:13:38 +00:00
[PM-20334] Remove Bindgen from Windows Plugin Authenticator (#14328)
* PM-20334: Draft work removing bindgen * PM-20334: Remove comments and address clippy concerns * PM-20334: Edit wpa readme and remove .hpp header file
This commit is contained in:
66
apps/desktop/desktop_native/Cargo.lock
generated
66
apps/desktop/desktop_native/Cargo.lock
generated
@@ -410,26 +410,6 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "bindgen"
|
|
||||||
version = "0.71.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3"
|
|
||||||
dependencies = [
|
|
||||||
"bitflags",
|
|
||||||
"cexpr",
|
|
||||||
"clang-sys",
|
|
||||||
"itertools",
|
|
||||||
"log",
|
|
||||||
"prettyplease",
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"regex",
|
|
||||||
"rustc-hash",
|
|
||||||
"shlex",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "bitflags"
|
name = "bitflags"
|
||||||
version = "2.8.0"
|
version = "2.8.0"
|
||||||
@@ -573,15 +553,6 @@ dependencies = [
|
|||||||
"shlex",
|
"shlex",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cexpr"
|
|
||||||
version = "0.6.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766"
|
|
||||||
dependencies = [
|
|
||||||
"nom",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "cfg-if"
|
name = "cfg-if"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -622,17 +593,6 @@ dependencies = [
|
|||||||
"zeroize",
|
"zeroize",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "clang-sys"
|
|
||||||
version = "1.8.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4"
|
|
||||||
dependencies = [
|
|
||||||
"glob",
|
|
||||||
"libc",
|
|
||||||
"libloading",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "clap"
|
name = "clap"
|
||||||
version = "4.5.31"
|
version = "4.5.31"
|
||||||
@@ -1493,15 +1453,6 @@ version = "1.70.1"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
checksum = "7943c866cc5cd64cbc25b2e01621d07fa8eb2a1a23160ee81ce38704e97b8ecf"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "itertools"
|
|
||||||
version = "0.13.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186"
|
|
||||||
dependencies = [
|
|
||||||
"either",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "itoa"
|
name = "itoa"
|
||||||
version = "1.0.14"
|
version = "1.0.14"
|
||||||
@@ -2303,16 +2254,6 @@ dependencies = [
|
|||||||
"zerocopy",
|
"zerocopy",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "prettyplease"
|
|
||||||
version = "0.2.29"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "6924ced06e1f7dfe3fa48d57b9f74f55d8915f5036121bef647ef4b204895fac"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "proc-macro-crate"
|
name = "proc-macro-crate"
|
||||||
version = "3.2.0"
|
version = "3.2.0"
|
||||||
@@ -2491,12 +2432,6 @@ version = "0.1.24"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "rustc-hash"
|
|
||||||
version = "2.1.1"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "rustc_version"
|
name = "rustc_version"
|
||||||
version = "0.4.1"
|
version = "0.4.1"
|
||||||
@@ -3736,7 +3671,6 @@ checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d"
|
|||||||
name = "windows_plugin_authenticator"
|
name = "windows_plugin_authenticator"
|
||||||
version = "0.0.0"
|
version = "0.0.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bindgen",
|
|
||||||
"hex",
|
"hex",
|
||||||
"windows 0.61.1",
|
"windows 0.61.1",
|
||||||
"windows-core 0.61.0",
|
"windows-core 0.61.0",
|
||||||
|
|||||||
@@ -5,9 +5,6 @@ edition = { workspace = true }
|
|||||||
license = { workspace = true }
|
license = { workspace = true }
|
||||||
publish = { workspace = true }
|
publish = { workspace = true }
|
||||||
|
|
||||||
[target.'cfg(target_os = "windows")'.build-dependencies]
|
|
||||||
bindgen = { workspace = true }
|
|
||||||
|
|
||||||
[target.'cfg(windows)'.dependencies]
|
[target.'cfg(windows)'.dependencies]
|
||||||
windows = { workspace = true, features = ["Win32_Foundation", "Win32_Security", "Win32_System_Com", "Win32_System_LibraryLoader" ] }
|
windows = { workspace = true, features = ["Win32_Foundation", "Win32_Security", "Win32_System_Com", "Win32_System_LibraryLoader" ] }
|
||||||
windows-core = { workspace = true }
|
windows-core = { workspace = true }
|
||||||
|
|||||||
@@ -2,22 +2,6 @@
|
|||||||
|
|
||||||
This is an internal crate that's meant to be a safe abstraction layer over the generated Rust bindings for the Windows WebAuthn Plugin Authenticator API's.
|
This is an internal crate that's meant to be a safe abstraction layer over the generated Rust bindings for the Windows WebAuthn Plugin Authenticator API's.
|
||||||
|
|
||||||
|
This crate is very much a WIP and is not ready for internal use.
|
||||||
|
|
||||||
You can find more information about the Windows WebAuthn API's [here](https://github.com/microsoft/webauthn).
|
You can find more information about the Windows WebAuthn API's [here](https://github.com/microsoft/webauthn).
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
To build this crate, set the following environment variables:
|
|
||||||
|
|
||||||
- `LIBCLANG_PATH` -> the path to the `bin` directory of your LLVM install ([more info](https://rust-lang.github.io/rust-bindgen/requirements.html?highlight=libclang_path#installing-clang))
|
|
||||||
|
|
||||||
### Bash Example
|
|
||||||
|
|
||||||
```
|
|
||||||
export LIBCLANG_PATH='C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm\x64\bin'
|
|
||||||
```
|
|
||||||
|
|
||||||
### PowerShell Example
|
|
||||||
|
|
||||||
```
|
|
||||||
$env:LIBCLANG_PATH = 'C:\Program Files\Microsoft Visual Studio\2022\Community\VC\Tools\Llvm\x64\bin'
|
|
||||||
```
|
|
||||||
|
|||||||
@@ -1,27 +0,0 @@
|
|||||||
fn main() {
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
windows();
|
|
||||||
}
|
|
||||||
|
|
||||||
#[cfg(target_os = "windows")]
|
|
||||||
fn windows() {
|
|
||||||
let out_dir = std::env::var("OUT_DIR").expect("OUT_DIR not set");
|
|
||||||
|
|
||||||
let bindings = bindgen::Builder::default()
|
|
||||||
.header("pluginauthenticator.hpp")
|
|
||||||
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
|
|
||||||
.allowlist_type("DWORD")
|
|
||||||
.allowlist_type("PBYTE")
|
|
||||||
.allowlist_type("EXPERIMENTAL.*")
|
|
||||||
.allowlist_function(".*EXPERIMENTAL.*")
|
|
||||||
.allowlist_function("WebAuthNGetApiVersionNumber")
|
|
||||||
.generate()
|
|
||||||
.expect("Unable to generate bindings.");
|
|
||||||
|
|
||||||
bindings
|
|
||||||
.write_to_file(format!(
|
|
||||||
"{}\\windows_plugin_authenticator_bindings.rs",
|
|
||||||
out_dir
|
|
||||||
))
|
|
||||||
.expect("Couldn't write bindings.");
|
|
||||||
}
|
|
||||||
@@ -1,231 +0,0 @@
|
|||||||
/*
|
|
||||||
Bitwarden's pluginauthenticator.hpp
|
|
||||||
|
|
||||||
Source: https://github.com/microsoft/webauthn/blob/master/experimental/pluginauthenticator.h
|
|
||||||
|
|
||||||
This is a C++ header file, so the extension has been manually
|
|
||||||
changed from `.h` to `.hpp`, so bindgen will automatically
|
|
||||||
generate the correct C++ bindings.
|
|
||||||
|
|
||||||
More Info: https://rust-lang.github.io/rust-bindgen/cpp.html
|
|
||||||
*/
|
|
||||||
|
|
||||||
/* this ALWAYS GENERATED file contains the definitions for the interfaces */
|
|
||||||
|
|
||||||
/* File created by MIDL compiler version 8.01.0628 */
|
|
||||||
/* @@MIDL_FILE_HEADING( ) */
|
|
||||||
|
|
||||||
/* verify that the <rpcndr.h> version is high enough to compile this file*/
|
|
||||||
#ifndef __REQUIRED_RPCNDR_H_VERSION__
|
|
||||||
#define __REQUIRED_RPCNDR_H_VERSION__ 501
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* verify that the <rpcsal.h> version is high enough to compile this file*/
|
|
||||||
#ifndef __REQUIRED_RPCSAL_H_VERSION__
|
|
||||||
#define __REQUIRED_RPCSAL_H_VERSION__ 100
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#include "rpc.h"
|
|
||||||
#include "rpcndr.h"
|
|
||||||
|
|
||||||
#ifndef __RPCNDR_H_VERSION__
|
|
||||||
#error this stub requires an updated version of <rpcndr.h>
|
|
||||||
#endif /* __RPCNDR_H_VERSION__ */
|
|
||||||
|
|
||||||
#ifndef COM_NO_WINDOWS_H
|
|
||||||
#include "windows.h"
|
|
||||||
#include "ole2.h"
|
|
||||||
#endif /*COM_NO_WINDOWS_H*/
|
|
||||||
|
|
||||||
#ifndef __pluginauthenticator_h__
|
|
||||||
#define __pluginauthenticator_h__
|
|
||||||
|
|
||||||
#if defined(_MSC_VER) && (_MSC_VER >= 1020)
|
|
||||||
#pragma once
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#ifndef DECLSPEC_XFGVIRT
|
|
||||||
#if defined(_CONTROL_FLOW_GUARD_XFG)
|
|
||||||
#define DECLSPEC_XFGVIRT(base, func) __declspec(xfg_virtual(base, func))
|
|
||||||
#else
|
|
||||||
#define DECLSPEC_XFGVIRT(base, func)
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* Forward Declarations */
|
|
||||||
|
|
||||||
#ifndef __EXPERIMENTAL_IPluginAuthenticator_FWD_DEFINED__
|
|
||||||
#define __EXPERIMENTAL_IPluginAuthenticator_FWD_DEFINED__
|
|
||||||
typedef interface EXPERIMENTAL_IPluginAuthenticator EXPERIMENTAL_IPluginAuthenticator;
|
|
||||||
|
|
||||||
#endif /* __EXPERIMENTAL_IPluginAuthenticator_FWD_DEFINED__ */
|
|
||||||
|
|
||||||
/* header files for imported files */
|
|
||||||
#include "oaidl.h"
|
|
||||||
#include "webauthn.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
extern "C"{
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/* interface __MIDL_itf_pluginauthenticator_0000_0000 */
|
|
||||||
/* [local] */
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST
|
|
||||||
{
|
|
||||||
HWND hWnd;
|
|
||||||
GUID transactionId;
|
|
||||||
DWORD cbRequestSignature;
|
|
||||||
/* [size_is] */ byte *pbRequestSignature;
|
|
||||||
DWORD cbEncodedRequest;
|
|
||||||
/* [size_is] */ byte *pbEncodedRequest;
|
|
||||||
} EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST *EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
typedef const EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST *EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE
|
|
||||||
{
|
|
||||||
DWORD cbEncodedResponse;
|
|
||||||
/* [size_is] */ byte *pbEncodedResponse;
|
|
||||||
} EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE;
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE *EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE;
|
|
||||||
|
|
||||||
typedef const EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE *EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_RESPONSE;
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST
|
|
||||||
{
|
|
||||||
GUID transactionId;
|
|
||||||
DWORD cbRequestSignature;
|
|
||||||
/* [size_is] */ byte *pbRequestSignature;
|
|
||||||
} EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
typedef struct _EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST *EXPERIMENTAL_PWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
typedef const EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST *EXPERIMENTAL_PCWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST;
|
|
||||||
|
|
||||||
extern RPC_IF_HANDLE __MIDL_itf_pluginauthenticator_0000_0000_v0_0_c_ifspec;
|
|
||||||
extern RPC_IF_HANDLE __MIDL_itf_pluginauthenticator_0000_0000_v0_0_s_ifspec;
|
|
||||||
|
|
||||||
#ifndef __EXPERIMENTAL_IPluginAuthenticator_INTERFACE_DEFINED__
|
|
||||||
#define __EXPERIMENTAL_IPluginAuthenticator_INTERFACE_DEFINED__
|
|
||||||
|
|
||||||
/* interface EXPERIMENTAL_IPluginAuthenticator */
|
|
||||||
/* [unique][version][uuid][object] */
|
|
||||||
|
|
||||||
EXTERN_C const IID IID_EXPERIMENTAL_IPluginAuthenticator;
|
|
||||||
|
|
||||||
#if defined(__cplusplus) && !defined(CINTERFACE)
|
|
||||||
|
|
||||||
MIDL_INTERFACE("e6466e9a-b2f3-47c5-b88d-89bc14a8d998")
|
|
||||||
EXPERIMENTAL_IPluginAuthenticator : public IUnknown
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE EXPERIMENTAL_PluginMakeCredential(
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST request,
|
|
||||||
/* [out] */ __RPC__deref_out_opt EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE *response) = 0;
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE EXPERIMENTAL_PluginGetAssertion(
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST request,
|
|
||||||
/* [out] */ __RPC__deref_out_opt EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE *response) = 0;
|
|
||||||
|
|
||||||
virtual HRESULT STDMETHODCALLTYPE EXPERIMENTAL_PluginCancelOperation(
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST request) = 0;
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
#else /* C style interface */
|
|
||||||
|
|
||||||
typedef struct EXPERIMENTAL_IPluginAuthenticatorVtbl
|
|
||||||
{
|
|
||||||
BEGIN_INTERFACE
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(IUnknown, QueryInterface)
|
|
||||||
HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This,
|
|
||||||
/* [in] */ __RPC__in REFIID riid,
|
|
||||||
/* [annotation][iid_is][out] */
|
|
||||||
_COM_Outptr_ void **ppvObject);
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(IUnknown, AddRef)
|
|
||||||
ULONG ( STDMETHODCALLTYPE *AddRef )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This);
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(IUnknown, Release)
|
|
||||||
ULONG ( STDMETHODCALLTYPE *Release )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This);
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(EXPERIMENTAL_IPluginAuthenticator, EXPERIMENTAL_PluginMakeCredential)
|
|
||||||
HRESULT ( STDMETHODCALLTYPE *EXPERIMENTAL_PluginMakeCredential )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This,
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST request,
|
|
||||||
/* [out] */ __RPC__deref_out_opt EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE *response);
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(EXPERIMENTAL_IPluginAuthenticator, EXPERIMENTAL_PluginGetAssertion)
|
|
||||||
HRESULT ( STDMETHODCALLTYPE *EXPERIMENTAL_PluginGetAssertion )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This,
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST request,
|
|
||||||
/* [out] */ __RPC__deref_out_opt EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE *response);
|
|
||||||
|
|
||||||
DECLSPEC_XFGVIRT(EXPERIMENTAL_IPluginAuthenticator, EXPERIMENTAL_PluginCancelOperation)
|
|
||||||
HRESULT ( STDMETHODCALLTYPE *EXPERIMENTAL_PluginCancelOperation )(
|
|
||||||
__RPC__in EXPERIMENTAL_IPluginAuthenticator * This,
|
|
||||||
/* [in] */ __RPC__in EXPERIMENTAL_PCWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST request);
|
|
||||||
|
|
||||||
END_INTERFACE
|
|
||||||
} EXPERIMENTAL_IPluginAuthenticatorVtbl;
|
|
||||||
|
|
||||||
interface EXPERIMENTAL_IPluginAuthenticator
|
|
||||||
{
|
|
||||||
CONST_VTBL struct EXPERIMENTAL_IPluginAuthenticatorVtbl *lpVtbl;
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef COBJMACROS
|
|
||||||
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_QueryInterface(This,riid,ppvObject) \
|
|
||||||
( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_AddRef(This) \
|
|
||||||
( (This)->lpVtbl -> AddRef(This) )
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_Release(This) \
|
|
||||||
( (This)->lpVtbl -> Release(This) )
|
|
||||||
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_EXPERIMENTAL_PluginMakeCredential(This,request,response) \
|
|
||||||
( (This)->lpVtbl -> EXPERIMENTAL_PluginMakeCredential(This,request,response) )
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_EXPERIMENTAL_PluginGetAssertion(This,request,response) \
|
|
||||||
( (This)->lpVtbl -> EXPERIMENTAL_PluginGetAssertion(This,request,response) )
|
|
||||||
|
|
||||||
#define EXPERIMENTAL_IPluginAuthenticator_EXPERIMENTAL_PluginCancelOperation(This,request) \
|
|
||||||
( (This)->lpVtbl -> EXPERIMENTAL_PluginCancelOperation(This,request) )
|
|
||||||
|
|
||||||
#endif /* COBJMACROS */
|
|
||||||
|
|
||||||
#endif /* C style interface */
|
|
||||||
|
|
||||||
#endif /* __EXPERIMENTAL_IPluginAuthenticator_INTERFACE_DEFINED__ */
|
|
||||||
|
|
||||||
/* Additional Prototypes for ALL interfaces */
|
|
||||||
|
|
||||||
unsigned long __RPC_USER HWND_UserSize( __RPC__in unsigned long *, unsigned long , __RPC__in HWND * );
|
|
||||||
unsigned char * __RPC_USER HWND_UserMarshal( __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in HWND * );
|
|
||||||
unsigned char * __RPC_USER HWND_UserUnmarshal(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out HWND * );
|
|
||||||
void __RPC_USER HWND_UserFree( __RPC__in unsigned long *, __RPC__in HWND * );
|
|
||||||
|
|
||||||
unsigned long __RPC_USER HWND_UserSize64( __RPC__in unsigned long *, unsigned long , __RPC__in HWND * );
|
|
||||||
unsigned char * __RPC_USER HWND_UserMarshal64( __RPC__in unsigned long *, __RPC__inout_xcount(0) unsigned char *, __RPC__in HWND * );
|
|
||||||
unsigned char * __RPC_USER HWND_UserUnmarshal64(__RPC__in unsigned long *, __RPC__in_xcount(0) unsigned char *, __RPC__out HWND * );
|
|
||||||
void __RPC_USER HWND_UserFree64( __RPC__in unsigned long *, __RPC__in HWND * );
|
|
||||||
|
|
||||||
/* end of Additional Prototypes */
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#endif
|
|
||||||
@@ -2,15 +2,6 @@
|
|||||||
#![allow(non_snake_case)]
|
#![allow(non_snake_case)]
|
||||||
#![allow(non_camel_case_types)]
|
#![allow(non_camel_case_types)]
|
||||||
|
|
||||||
mod pa;
|
|
||||||
|
|
||||||
use pa::{
|
|
||||||
DWORD, EXPERIMENTAL_PCWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST,
|
|
||||||
EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST,
|
|
||||||
EXPERIMENTAL_PWEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE,
|
|
||||||
EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE,
|
|
||||||
EXPERIMENTAL_WEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE, PBYTE,
|
|
||||||
};
|
|
||||||
use std::ffi::c_uchar;
|
use std::ffi::c_uchar;
|
||||||
use std::ptr;
|
use std::ptr;
|
||||||
use windows::Win32::Foundation::*;
|
use windows::Win32::Foundation::*;
|
||||||
@@ -23,11 +14,53 @@ const AUTHENTICATOR_NAME: &str = "Bitwarden Desktop Authenticator";
|
|||||||
const CLSID: &str = "0f7dc5d9-69ce-4652-8572-6877fd695062";
|
const CLSID: &str = "0f7dc5d9-69ce-4652-8572-6877fd695062";
|
||||||
const RPID: &str = "bitwarden.com";
|
const RPID: &str = "bitwarden.com";
|
||||||
|
|
||||||
/// Returns the current Windows WebAuthN version.
|
#[repr(C)]
|
||||||
pub fn get_version_number() -> u32 {
|
#[derive(Debug, Copy, Clone)]
|
||||||
unsafe { pa::WebAuthNGetApiVersionNumber() }
|
pub struct EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST {
|
||||||
|
pub transactionId: GUID,
|
||||||
|
pub cbRequestSignature: Dword,
|
||||||
|
pub pbRequestSignature: *mut byte,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST {
|
||||||
|
pub hWnd: HWND,
|
||||||
|
pub transactionId: GUID,
|
||||||
|
pub cbRequestSignature: Dword,
|
||||||
|
pub pbRequestSignature: *mut byte,
|
||||||
|
pub cbEncodedRequest: Dword,
|
||||||
|
pub pbEncodedRequest: *mut byte,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct EXPERIMENTAL_WEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE {
|
||||||
|
pub cbOpSignPubKey: Dword,
|
||||||
|
pub pbOpSignPubKey: PByte,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Copy, Clone)]
|
||||||
|
pub struct EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE {
|
||||||
|
pub cbEncodedResponse: Dword,
|
||||||
|
pub pbEncodedResponse: *mut byte,
|
||||||
|
}
|
||||||
|
|
||||||
|
type Dword = u32;
|
||||||
|
type Byte = u8;
|
||||||
|
type byte = u8;
|
||||||
|
pub type PByte = *mut Byte;
|
||||||
|
|
||||||
|
type EXPERIMENTAL_PCWEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST =
|
||||||
|
*const EXPERIMENTAL_WEBAUTHN_PLUGIN_CANCEL_OPERATION_REQUEST;
|
||||||
|
pub type EXPERIMENTAL_PCWEBAUTHN_PLUGIN_OPERATION_REQUEST =
|
||||||
|
*const EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_REQUEST;
|
||||||
|
pub type EXPERIMENTAL_PWEBAUTHN_PLUGIN_OPERATION_RESPONSE =
|
||||||
|
*mut EXPERIMENTAL_WEBAUTHN_PLUGIN_OPERATION_RESPONSE;
|
||||||
|
pub type EXPERIMENTAL_PWEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE =
|
||||||
|
*mut EXPERIMENTAL_WEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE;
|
||||||
|
|
||||||
/// Handles initialization and registration for the Bitwarden desktop app as a
|
/// Handles initialization and registration for the Bitwarden desktop app as a
|
||||||
/// plugin authenticator with Windows.
|
/// plugin authenticator with Windows.
|
||||||
/// For now, also adds the authenticator
|
/// For now, also adds the authenticator
|
||||||
@@ -123,9 +156,9 @@ fn add_authenticator() -> std::result::Result<(), String> {
|
|||||||
pbAuthenticatorInfo: authenticator_info_bytes.as_mut_ptr(),
|
pbAuthenticatorInfo: authenticator_info_bytes.as_mut_ptr(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let plugin_signing_public_key_byte_count: DWORD = 0;
|
let plugin_signing_public_key_byte_count: Dword = 0;
|
||||||
let mut plugin_signing_public_key: c_uchar = 0;
|
let mut plugin_signing_public_key: c_uchar = 0;
|
||||||
let plugin_signing_public_key_ptr: PBYTE = &mut plugin_signing_public_key;
|
let plugin_signing_public_key_ptr: PByte = &mut plugin_signing_public_key;
|
||||||
|
|
||||||
let mut add_response = EXPERIMENTAL_WEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE {
|
let mut add_response = EXPERIMENTAL_WEBAUTHN_PLUGIN_ADD_AUTHENTICATOR_RESPONSE {
|
||||||
cbOpSignPubKey: plugin_signing_public_key_byte_count,
|
cbOpSignPubKey: plugin_signing_public_key_byte_count,
|
||||||
|
|||||||
@@ -1,15 +0,0 @@
|
|||||||
/*
|
|
||||||
The 'pa' (plugin authenticator) module will contain the generated
|
|
||||||
bindgen code.
|
|
||||||
|
|
||||||
The attributes below will suppress warnings from the generated code.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#![cfg(target_os = "windows")]
|
|
||||||
#![allow(clippy::all)]
|
|
||||||
#![allow(warnings)]
|
|
||||||
|
|
||||||
include!(concat!(
|
|
||||||
env!("OUT_DIR"),
|
|
||||||
"/windows_plugin_authenticator_bindings.rs"
|
|
||||||
));
|
|
||||||
Reference in New Issue
Block a user