diff --git a/packages/local_auth/local_auth_windows/AUTHORS b/packages/local_auth/local_auth_windows/AUTHORS
new file mode 100644
index 0000000..5db3d58
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/AUTHORS
@@ -0,0 +1,7 @@
+# Below is a list of people and organizations that have contributed
+# to the Flutter project. Names should be added to the list like so:
+#
+#   Name/Organization <email address>
+
+Google Inc.
+Alexandre Zollinger Chohfi <alzollin@microsoft.com>
\ No newline at end of file
diff --git a/packages/local_auth/local_auth_windows/CHANGELOG.md b/packages/local_auth/local_auth_windows/CHANGELOG.md
new file mode 100644
index 0000000..7cf171f
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/CHANGELOG.md
@@ -0,0 +1,3 @@
+## 1.0.0
+
+* Initial release of Windows support.
diff --git a/packages/local_auth/local_auth_windows/LICENSE b/packages/local_auth/local_auth_windows/LICENSE
new file mode 100644
index 0000000..c6823b8
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/LICENSE
@@ -0,0 +1,25 @@
+Copyright 2013 The Flutter Authors. All rights reserved.
+
+Redistribution and use in source and binary forms, with or without modification,
+are permitted provided that the following conditions are met:
+
+    * Redistributions of source code must retain the above copyright
+      notice, this list of conditions and the following disclaimer.
+    * Redistributions in binary form must reproduce the above
+      copyright notice, this list of conditions and the following
+      disclaimer in the documentation and/or other materials provided
+      with the distribution.
+    * Neither the name of Google Inc. nor the names of its
+      contributors may be used to endorse or promote products derived
+      from this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR
+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
+LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
+ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
+SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/packages/local_auth/local_auth_windows/README.md b/packages/local_auth/local_auth_windows/README.md
new file mode 100644
index 0000000..0c2984f
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/README.md
@@ -0,0 +1,11 @@
+# local\_auth\_windows
+
+The Windows implementation of [`local_auth`][1].
+
+## Usage
+
+This package is [endorsed][2], which means you can simply use `local_auth`
+normally. This package will be automatically included in your app when you do.
+
+[1]: https://pub.dev/packages/local_auth
+[2]: https://flutter.dev/docs/development/packages-and-plugins/developing-packages#endorsed-federated-plugin
\ No newline at end of file
diff --git a/packages/local_auth/local_auth_windows/example/.gitignore b/packages/local_auth/local_auth_windows/example/.gitignore
new file mode 100644
index 0000000..0fa6b67
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/.gitignore
@@ -0,0 +1,46 @@
+# Miscellaneous
+*.class
+*.log
+*.pyc
+*.swp
+.DS_Store
+.atom/
+.buildlog/
+.history
+.svn/
+
+# IntelliJ related
+*.iml
+*.ipr
+*.iws
+.idea/
+
+# The .vscode folder contains launch configuration and tasks you configure in
+# VS Code which you may wish to be included in version control, so this line
+# is commented out by default.
+#.vscode/
+
+# Flutter/Dart/Pub related
+**/doc/api/
+**/ios/Flutter/.last_build_id
+.dart_tool/
+.flutter-plugins
+.flutter-plugins-dependencies
+.packages
+.pub-cache/
+.pub/
+/build/
+
+# Web related
+lib/generated_plugin_registrant.dart
+
+# Symbolication related
+app.*.symbols
+
+# Obfuscation related
+app.*.map.json
+
+# Android Studio will place build artifacts here
+/android/app/debug
+/android/app/profile
+/android/app/release
diff --git a/packages/local_auth/local_auth_windows/example/.metadata b/packages/local_auth/local_auth_windows/example/.metadata
new file mode 100644
index 0000000..166a998
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/.metadata
@@ -0,0 +1,10 @@
+# This file tracks properties of this Flutter project.
+# Used by Flutter tool to assess capabilities and perform upgrades etc.
+#
+# This file should be version controlled and should not be manually edited.
+
+version:
+  revision: c860cba910319332564e1e9d470a17074c1f2dfd
+  channel: stable
+
+project_type: app
diff --git a/packages/local_auth/local_auth_windows/example/README.md b/packages/local_auth/local_auth_windows/example/README.md
new file mode 100644
index 0000000..8f48b85
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/README.md
@@ -0,0 +1,3 @@
+# local_auth_example
+
+Demonstrates how to use the local_auth plugin.
\ No newline at end of file
diff --git a/packages/local_auth/local_auth_windows/example/integration_test/local_auth_test.dart b/packages/local_auth/local_auth_windows/example/integration_test/local_auth_test.dart
new file mode 100644
index 0000000..cedaaf2
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/integration_test/local_auth_test.dart
@@ -0,0 +1,19 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter_test/flutter_test.dart';
+import 'package:integration_test/integration_test.dart';
+
+import 'package:local_auth_windows/local_auth_windows.dart';
+
+void main() {
+  IntegrationTestWidgetsFlutterBinding.ensureInitialized();
+
+  testWidgets('canCheckBiometrics', (WidgetTester tester) async {
+    expect(
+      LocalAuthWindows().getEnrolledBiometrics(),
+      completion(isList),
+    );
+  });
+}
diff --git a/packages/local_auth/local_auth_windows/example/lib/main.dart b/packages/local_auth/local_auth_windows/example/lib/main.dart
new file mode 100644
index 0000000..ef26ec5
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/lib/main.dart
@@ -0,0 +1,241 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// ignore_for_file: public_member_api_docs
+
+import 'dart:async';
+
+import 'package:flutter/material.dart';
+import 'package:flutter/services.dart';
+import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
+import 'package:local_auth_windows/local_auth_windows.dart';
+
+void main() {
+  runApp(const MyApp());
+}
+
+class MyApp extends StatefulWidget {
+  const MyApp({Key? key}) : super(key: key);
+
+  @override
+  State<MyApp> createState() => _MyAppState();
+}
+
+class _MyAppState extends State<MyApp> {
+  _SupportState _supportState = _SupportState.unknown;
+  bool? _deviceSupportsBiometrics;
+  List<BiometricType>? _enrolledBiometrics;
+  String _authorized = 'Not Authorized';
+  bool _isAuthenticating = false;
+
+  @override
+  void initState() {
+    super.initState();
+    LocalAuthPlatform.instance.isDeviceSupported().then(
+          (bool isSupported) => setState(() => _supportState = isSupported
+              ? _SupportState.supported
+              : _SupportState.unsupported),
+        );
+  }
+
+  Future<void> _checkBiometrics() async {
+    late bool deviceSupportsBiometrics;
+    try {
+      deviceSupportsBiometrics =
+          await LocalAuthPlatform.instance.deviceSupportsBiometrics();
+    } on PlatformException catch (e) {
+      deviceSupportsBiometrics = false;
+      print(e);
+    }
+    if (!mounted) {
+      return;
+    }
+
+    setState(() {
+      _deviceSupportsBiometrics = deviceSupportsBiometrics;
+    });
+  }
+
+  Future<void> _getEnrolledBiometrics() async {
+    late List<BiometricType> availableBiometrics;
+    try {
+      availableBiometrics =
+          await LocalAuthPlatform.instance.getEnrolledBiometrics();
+    } on PlatformException catch (e) {
+      availableBiometrics = <BiometricType>[];
+      print(e);
+    }
+    if (!mounted) {
+      return;
+    }
+
+    setState(() {
+      _enrolledBiometrics = availableBiometrics;
+    });
+  }
+
+  Future<void> _authenticate() async {
+    bool authenticated = false;
+    try {
+      setState(() {
+        _isAuthenticating = true;
+        _authorized = 'Authenticating';
+      });
+      authenticated = await LocalAuthPlatform.instance.authenticate(
+        localizedReason: 'Let OS determine authentication method',
+        authMessages: <AuthMessages>[const WindowsAuthMessages()],
+        options: const AuthenticationOptions(
+          useErrorDialogs: true,
+          stickyAuth: true,
+        ),
+      );
+      setState(() {
+        _isAuthenticating = false;
+      });
+    } on PlatformException catch (e) {
+      print(e);
+      setState(() {
+        _isAuthenticating = false;
+        _authorized = 'Error - ${e.message}';
+      });
+      return;
+    }
+    if (!mounted) {
+      return;
+    }
+
+    setState(
+        () => _authorized = authenticated ? 'Authorized' : 'Not Authorized');
+  }
+
+  Future<void> _authenticateWithBiometrics() async {
+    bool authenticated = false;
+    try {
+      setState(() {
+        _isAuthenticating = true;
+        _authorized = 'Authenticating';
+      });
+      authenticated = await LocalAuthPlatform.instance.authenticate(
+        localizedReason:
+            'Scan your fingerprint (or face or whatever) to authenticate',
+        authMessages: <AuthMessages>[const WindowsAuthMessages()],
+        options: const AuthenticationOptions(
+          useErrorDialogs: true,
+          stickyAuth: true,
+          biometricOnly: true,
+        ),
+      );
+      setState(() {
+        _isAuthenticating = false;
+        _authorized = 'Authenticating';
+      });
+    } on PlatformException catch (e) {
+      print(e);
+      setState(() {
+        _isAuthenticating = false;
+        _authorized = 'Error - ${e.message}';
+      });
+      return;
+    }
+    if (!mounted) {
+      return;
+    }
+
+    final String message = authenticated ? 'Authorized' : 'Not Authorized';
+    setState(() {
+      _authorized = message;
+    });
+  }
+
+  Future<void> _cancelAuthentication() async {
+    await LocalAuthPlatform.instance.stopAuthentication();
+    setState(() => _isAuthenticating = false);
+  }
+
+  @override
+  Widget build(BuildContext context) {
+    return MaterialApp(
+      home: Scaffold(
+        appBar: AppBar(
+          title: const Text('Plugin example app'),
+        ),
+        body: ListView(
+          padding: const EdgeInsets.only(top: 30),
+          children: <Widget>[
+            Column(
+              mainAxisAlignment: MainAxisAlignment.center,
+              children: <Widget>[
+                if (_supportState == _SupportState.unknown)
+                  const CircularProgressIndicator()
+                else if (_supportState == _SupportState.supported)
+                  const Text('This device is supported')
+                else
+                  const Text('This device is not supported'),
+                const Divider(height: 100),
+                Text(
+                    'Device supports biometrics: $_deviceSupportsBiometrics\n'),
+                ElevatedButton(
+                  onPressed: _checkBiometrics,
+                  child: const Text('Check biometrics'),
+                ),
+                const Divider(height: 100),
+                Text('Enrolled biometrics: $_enrolledBiometrics\n'),
+                ElevatedButton(
+                  onPressed: _getEnrolledBiometrics,
+                  child: const Text('Get enrolled biometrics'),
+                ),
+                const Divider(height: 100),
+                Text('Current State: $_authorized\n'),
+                if (_isAuthenticating)
+                  ElevatedButton(
+                    onPressed: _cancelAuthentication,
+                    child: Row(
+                      mainAxisSize: MainAxisSize.min,
+                      children: const <Widget>[
+                        Text('Cancel Authentication'),
+                        Icon(Icons.cancel),
+                      ],
+                    ),
+                  )
+                else
+                  Column(
+                    children: <Widget>[
+                      ElevatedButton(
+                        onPressed: _authenticate,
+                        child: Row(
+                          mainAxisSize: MainAxisSize.min,
+                          children: const <Widget>[
+                            Text('Authenticate'),
+                            Icon(Icons.perm_device_information),
+                          ],
+                        ),
+                      ),
+                      ElevatedButton(
+                        onPressed: _authenticateWithBiometrics,
+                        child: Row(
+                          mainAxisSize: MainAxisSize.min,
+                          children: <Widget>[
+                            Text(_isAuthenticating
+                                ? 'Cancel'
+                                : 'Authenticate: biometrics only'),
+                            const Icon(Icons.fingerprint),
+                          ],
+                        ),
+                      ),
+                    ],
+                  ),
+              ],
+            ),
+          ],
+        ),
+      ),
+    );
+  }
+}
+
+enum _SupportState {
+  unknown,
+  supported,
+  unsupported,
+}
diff --git a/packages/local_auth/local_auth_windows/example/pubspec.yaml b/packages/local_auth/local_auth_windows/example/pubspec.yaml
new file mode 100644
index 0000000..266c9fc
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/pubspec.yaml
@@ -0,0 +1,28 @@
+name: local_auth_windows_example
+description: Demonstrates how to use the local_auth_windows plugin.
+publish_to: none
+
+environment:
+  sdk: ">=2.14.0 <3.0.0"
+  flutter: ">=2.8.0"
+
+dependencies:
+  flutter:
+    sdk: flutter
+  local_auth_platform_interface: ^1.0.0
+  local_auth_windows:
+    # When depending on this package from a real application you should use:
+    #   local_auth_windows: ^x.y.z
+    # See https://dart.dev/tools/pub/dependencies#version-constraints
+    # The example app is bundled with the plugin so we use a path dependency on
+    # the parent directory to use the current plugin's version.
+    path: ../
+
+dev_dependencies:
+  flutter_driver:
+    sdk: flutter
+  integration_test:
+    sdk: flutter
+
+flutter:
+  uses-material-design: true
diff --git a/packages/local_auth/local_auth_windows/example/test_driver/integration_test.dart b/packages/local_auth/local_auth_windows/example/test_driver/integration_test.dart
new file mode 100644
index 0000000..4f10f2a
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/test_driver/integration_test.dart
@@ -0,0 +1,7 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:integration_test/integration_test_driver.dart';
+
+Future<void> main() => integrationDriver();
diff --git a/packages/local_auth/local_auth_windows/example/windows/.gitignore b/packages/local_auth/local_auth_windows/example/windows/.gitignore
new file mode 100644
index 0000000..d492d0d
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/.gitignore
@@ -0,0 +1,17 @@
+flutter/ephemeral/
+
+# Visual Studio user-specific files.
+*.suo
+*.user
+*.userosscache
+*.sln.docstates
+
+# Visual Studio build-related files.
+x64/
+x86/
+
+# Visual Studio cache files
+# files ending in .cache can be ignored
+*.[Cc]ache
+# but keep track of directories ending in .cache
+!*.[Cc]ache/
diff --git a/packages/local_auth/local_auth_windows/example/windows/CMakeLists.txt b/packages/local_auth/local_auth_windows/example/windows/CMakeLists.txt
new file mode 100644
index 0000000..2163be8
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/CMakeLists.txt
@@ -0,0 +1,100 @@
+cmake_minimum_required(VERSION 3.14)
+project(local_auth_windows_example LANGUAGES CXX)
+
+set(BINARY_NAME "local_auth_windows_example")
+
+cmake_policy(SET CMP0063 NEW)
+
+set(CMAKE_INSTALL_RPATH "$ORIGIN/lib")
+
+# Configure build options.
+get_property(IS_MULTICONFIG GLOBAL PROPERTY GENERATOR_IS_MULTI_CONFIG)
+if(IS_MULTICONFIG)
+  set(CMAKE_CONFIGURATION_TYPES "Debug;Profile;Release"
+    CACHE STRING "" FORCE)
+else()
+  if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+    set(CMAKE_BUILD_TYPE "Debug" CACHE
+      STRING "Flutter build mode" FORCE)
+    set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+      "Debug" "Profile" "Release")
+  endif()
+endif()
+
+set(CMAKE_EXE_LINKER_FLAGS_PROFILE "${CMAKE_EXE_LINKER_FLAGS_RELEASE}")
+set(CMAKE_SHARED_LINKER_FLAGS_PROFILE "${CMAKE_SHARED_LINKER_FLAGS_RELEASE}")
+set(CMAKE_C_FLAGS_PROFILE "${CMAKE_C_FLAGS_RELEASE}")
+set(CMAKE_CXX_FLAGS_PROFILE "${CMAKE_CXX_FLAGS_RELEASE}")
+
+# Use Unicode for all projects.
+add_definitions(-DUNICODE -D_UNICODE)
+
+# Compilation settings that should be applied to most targets.
+function(APPLY_STANDARD_SETTINGS TARGET)
+  target_compile_features(${TARGET} PUBLIC cxx_std_17)
+  target_compile_options(${TARGET} PRIVATE /W4 /WX /wd"4100")
+  target_compile_options(${TARGET} PRIVATE /EHsc)
+  target_compile_definitions(${TARGET} PRIVATE "_HAS_EXCEPTIONS=0")
+  target_compile_definitions(${TARGET} PRIVATE "$<$<CONFIG:Debug>:_DEBUG>")
+endfunction()
+
+set(FLUTTER_MANAGED_DIR "${CMAKE_CURRENT_SOURCE_DIR}/flutter")
+
+# Flutter library and tool build rules.
+add_subdirectory(${FLUTTER_MANAGED_DIR})
+
+# Application build
+add_subdirectory("runner")
+
+# Enable the test target.
+set(include_local_auth_windows_tests TRUE)
+# Provide an alias for the test target using the name expected by repo tooling.
+add_custom_target(unit_tests DEPENDS local_auth_windows_test)
+
+# Generated plugin build rules, which manage building the plugins and adding
+# them to the application.
+include(flutter/generated_plugins.cmake)
+
+
+# === Installation ===
+# Support files are copied into place next to the executable, so that it can
+# run in place. This is done instead of making a separate bundle (as on Linux)
+# so that building and running from within Visual Studio will work.
+set(BUILD_BUNDLE_DIR "$<TARGET_FILE_DIR:${BINARY_NAME}>")
+# Make the "install" step default, as it's required to run.
+set(CMAKE_VS_INCLUDE_INSTALL_TO_DEFAULT_BUILD 1)
+if(CMAKE_INSTALL_PREFIX_INITIALIZED_TO_DEFAULT)
+  set(CMAKE_INSTALL_PREFIX "${BUILD_BUNDLE_DIR}" CACHE PATH "..." FORCE)
+endif()
+
+set(INSTALL_BUNDLE_DATA_DIR "${CMAKE_INSTALL_PREFIX}/data")
+set(INSTALL_BUNDLE_LIB_DIR "${CMAKE_INSTALL_PREFIX}")
+
+install(TARGETS ${BINARY_NAME} RUNTIME DESTINATION "${CMAKE_INSTALL_PREFIX}"
+  COMPONENT Runtime)
+
+install(FILES "${FLUTTER_ICU_DATA_FILE}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+  COMPONENT Runtime)
+
+install(FILES "${FLUTTER_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+  COMPONENT Runtime)
+
+if(PLUGIN_BUNDLED_LIBRARIES)
+  install(FILES "${PLUGIN_BUNDLED_LIBRARIES}"
+    DESTINATION "${INSTALL_BUNDLE_LIB_DIR}"
+    COMPONENT Runtime)
+endif()
+
+# Fully re-copy the assets directory on each build to avoid having stale files
+# from a previous install.
+set(FLUTTER_ASSET_DIR_NAME "flutter_assets")
+install(CODE "
+  file(REMOVE_RECURSE \"${INSTALL_BUNDLE_DATA_DIR}/${FLUTTER_ASSET_DIR_NAME}\")
+  " COMPONENT Runtime)
+install(DIRECTORY "${PROJECT_BUILD_DIR}/${FLUTTER_ASSET_DIR_NAME}"
+  DESTINATION "${INSTALL_BUNDLE_DATA_DIR}" COMPONENT Runtime)
+
+# Install the AOT library on non-Debug builds only.
+install(FILES "${AOT_LIBRARY}" DESTINATION "${INSTALL_BUNDLE_DATA_DIR}"
+  CONFIGURATIONS Profile;Release
+  COMPONENT Runtime)
diff --git a/packages/local_auth/local_auth_windows/example/windows/flutter/CMakeLists.txt b/packages/local_auth/local_auth_windows/example/windows/flutter/CMakeLists.txt
new file mode 100644
index 0000000..b2e4bd8
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/flutter/CMakeLists.txt
@@ -0,0 +1,103 @@
+cmake_minimum_required(VERSION 3.14)
+
+set(EPHEMERAL_DIR "${CMAKE_CURRENT_SOURCE_DIR}/ephemeral")
+
+# Configuration provided via flutter tool.
+include(${EPHEMERAL_DIR}/generated_config.cmake)
+
+# TODO: Move the rest of this into files in ephemeral. See
+# https://github.com/flutter/flutter/issues/57146.
+set(WRAPPER_ROOT "${EPHEMERAL_DIR}/cpp_client_wrapper")
+
+# === Flutter Library ===
+set(FLUTTER_LIBRARY "${EPHEMERAL_DIR}/flutter_windows.dll")
+
+# Published to parent scope for install step.
+set(FLUTTER_LIBRARY ${FLUTTER_LIBRARY} PARENT_SCOPE)
+set(FLUTTER_ICU_DATA_FILE "${EPHEMERAL_DIR}/icudtl.dat" PARENT_SCOPE)
+set(PROJECT_BUILD_DIR "${PROJECT_DIR}/build/" PARENT_SCOPE)
+set(AOT_LIBRARY "${PROJECT_DIR}/build/windows/app.so" PARENT_SCOPE)
+
+list(APPEND FLUTTER_LIBRARY_HEADERS
+  "flutter_export.h"
+  "flutter_windows.h"
+  "flutter_messenger.h"
+  "flutter_plugin_registrar.h"
+  "flutter_texture_registrar.h"
+)
+list(TRANSFORM FLUTTER_LIBRARY_HEADERS PREPEND "${EPHEMERAL_DIR}/")
+add_library(flutter INTERFACE)
+target_include_directories(flutter INTERFACE
+  "${EPHEMERAL_DIR}"
+)
+target_link_libraries(flutter INTERFACE "${FLUTTER_LIBRARY}.lib")
+add_dependencies(flutter flutter_assemble)
+
+# === Wrapper ===
+list(APPEND CPP_WRAPPER_SOURCES_CORE
+  "core_implementations.cc"
+  "standard_codec.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_CORE PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_PLUGIN
+  "plugin_registrar.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_PLUGIN PREPEND "${WRAPPER_ROOT}/")
+list(APPEND CPP_WRAPPER_SOURCES_APP
+  "flutter_engine.cc"
+  "flutter_view_controller.cc"
+)
+list(TRANSFORM CPP_WRAPPER_SOURCES_APP PREPEND "${WRAPPER_ROOT}/")
+
+# Wrapper sources needed for a plugin.
+add_library(flutter_wrapper_plugin STATIC
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_PLUGIN}
+)
+apply_standard_settings(flutter_wrapper_plugin)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+  POSITION_INDEPENDENT_CODE ON)
+set_target_properties(flutter_wrapper_plugin PROPERTIES
+  CXX_VISIBILITY_PRESET hidden)
+target_link_libraries(flutter_wrapper_plugin PUBLIC flutter)
+target_include_directories(flutter_wrapper_plugin PUBLIC
+  "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_plugin flutter_assemble)
+
+# Wrapper sources needed for the runner.
+add_library(flutter_wrapper_app STATIC
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_APP}
+)
+apply_standard_settings(flutter_wrapper_app)
+target_link_libraries(flutter_wrapper_app PUBLIC flutter)
+target_include_directories(flutter_wrapper_app PUBLIC
+  "${WRAPPER_ROOT}/include"
+)
+add_dependencies(flutter_wrapper_app flutter_assemble)
+
+# === Flutter tool backend ===
+# _phony_ is a non-existent file to force this command to run every time,
+# since currently there's no way to get a full input/output list from the
+# flutter tool.
+set(PHONY_OUTPUT "${CMAKE_CURRENT_BINARY_DIR}/_phony_")
+set_source_files_properties("${PHONY_OUTPUT}" PROPERTIES SYMBOLIC TRUE)
+add_custom_command(
+  OUTPUT ${FLUTTER_LIBRARY} ${FLUTTER_LIBRARY_HEADERS}
+    ${CPP_WRAPPER_SOURCES_CORE} ${CPP_WRAPPER_SOURCES_PLUGIN}
+    ${CPP_WRAPPER_SOURCES_APP}
+    ${PHONY_OUTPUT}
+  COMMAND ${CMAKE_COMMAND} -E env
+    ${FLUTTER_TOOL_ENVIRONMENT}
+    "${FLUTTER_ROOT}/packages/flutter_tools/bin/tool_backend.bat"
+      windows-x64 $<CONFIG>
+  VERBATIM
+)
+add_custom_target(flutter_assemble DEPENDS
+  "${FLUTTER_LIBRARY}"
+  ${FLUTTER_LIBRARY_HEADERS}
+  ${CPP_WRAPPER_SOURCES_CORE}
+  ${CPP_WRAPPER_SOURCES_PLUGIN}
+  ${CPP_WRAPPER_SOURCES_APP}
+)
diff --git a/packages/local_auth/local_auth_windows/example/windows/flutter/generated_plugins.cmake b/packages/local_auth/local_auth_windows/example/windows/flutter/generated_plugins.cmake
new file mode 100644
index 0000000..ef187dc
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/flutter/generated_plugins.cmake
@@ -0,0 +1,24 @@
+#
+# Generated file, do not edit.
+#
+
+list(APPEND FLUTTER_PLUGIN_LIST
+  local_auth_windows
+)
+
+list(APPEND FLUTTER_FFI_PLUGIN_LIST
+)
+
+set(PLUGIN_BUNDLED_LIBRARIES)
+
+foreach(plugin ${FLUTTER_PLUGIN_LIST})
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${plugin}/windows plugins/${plugin})
+  target_link_libraries(${BINARY_NAME} PRIVATE ${plugin}_plugin)
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES $<TARGET_FILE:${plugin}_plugin>)
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${plugin}_bundled_libraries})
+endforeach(plugin)
+
+foreach(ffi_plugin ${FLUTTER_FFI_PLUGIN_LIST})
+  add_subdirectory(flutter/ephemeral/.plugin_symlinks/${ffi_plugin}/windows plugins/${ffi_plugin})
+  list(APPEND PLUGIN_BUNDLED_LIBRARIES ${${ffi_plugin}_bundled_libraries})
+endforeach(ffi_plugin)
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/CMakeLists.txt b/packages/local_auth/local_auth_windows/example/windows/runner/CMakeLists.txt
new file mode 100644
index 0000000..de2d891
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/CMakeLists.txt
@@ -0,0 +1,17 @@
+cmake_minimum_required(VERSION 3.14)
+project(runner LANGUAGES CXX)
+
+add_executable(${BINARY_NAME} WIN32
+  "flutter_window.cpp"
+  "main.cpp"
+  "utils.cpp"
+  "win32_window.cpp"
+  "${FLUTTER_MANAGED_DIR}/generated_plugin_registrant.cc"
+  "Runner.rc"
+  "runner.exe.manifest"
+)
+apply_standard_settings(${BINARY_NAME})
+target_compile_definitions(${BINARY_NAME} PRIVATE "NOMINMAX")
+target_link_libraries(${BINARY_NAME} PRIVATE flutter flutter_wrapper_app)
+target_include_directories(${BINARY_NAME} PRIVATE "${CMAKE_SOURCE_DIR}")
+add_dependencies(${BINARY_NAME} flutter_assemble)
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/Runner.rc b/packages/local_auth/local_auth_windows/example/windows/runner/Runner.rc
new file mode 100644
index 0000000..5fdea29
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/Runner.rc
@@ -0,0 +1,121 @@
+// Microsoft Visual C++ generated resource script.
+//
+#pragma code_page(65001)
+#include "resource.h"
+
+#define APSTUDIO_READONLY_SYMBOLS
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 2 resource.
+//
+#include "winres.h"
+
+/////////////////////////////////////////////////////////////////////////////
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// English (United States) resources
+
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU)
+LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US
+
+#ifdef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// TEXTINCLUDE
+//
+
+1 TEXTINCLUDE
+BEGIN
+    "resource.h\0"
+END
+
+2 TEXTINCLUDE
+BEGIN
+    "#include ""winres.h""\r\n"
+    "\0"
+END
+
+3 TEXTINCLUDE
+BEGIN
+    "\r\n"
+    "\0"
+END
+
+#endif    // APSTUDIO_INVOKED
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Icon
+//
+
+// Icon with lowest ID value placed first to ensure application icon
+// remains consistent on all systems.
+IDI_APP_ICON            ICON                    "resources\\app_icon.ico"
+
+
+/////////////////////////////////////////////////////////////////////////////
+//
+// Version
+//
+
+#ifdef FLUTTER_BUILD_NUMBER
+#define VERSION_AS_NUMBER FLUTTER_BUILD_NUMBER
+#else
+#define VERSION_AS_NUMBER 1,0,0
+#endif
+
+#ifdef FLUTTER_BUILD_NAME
+#define VERSION_AS_STRING #FLUTTER_BUILD_NAME
+#else
+#define VERSION_AS_STRING "1.0.0"
+#endif
+
+VS_VERSION_INFO VERSIONINFO
+ FILEVERSION VERSION_AS_NUMBER
+ PRODUCTVERSION VERSION_AS_NUMBER
+ FILEFLAGSMASK VS_FFI_FILEFLAGSMASK
+#ifdef _DEBUG
+ FILEFLAGS VS_FF_DEBUG
+#else
+ FILEFLAGS 0x0L
+#endif
+ FILEOS VOS__WINDOWS32
+ FILETYPE VFT_APP
+ FILESUBTYPE 0x0L
+BEGIN
+    BLOCK "StringFileInfo"
+    BEGIN
+        BLOCK "040904e4"
+        BEGIN
+            VALUE "CompanyName", "com.example" "\0"
+            VALUE "FileDescription", "example" "\0"
+            VALUE "FileVersion", VERSION_AS_STRING "\0"
+            VALUE "InternalName", "example" "\0"
+            VALUE "LegalCopyright", "Copyright (C) 2022 com.example. All rights reserved." "\0"
+            VALUE "OriginalFilename", "example.exe" "\0"
+            VALUE "ProductName", "example" "\0"
+            VALUE "ProductVersion", VERSION_AS_STRING "\0"
+        END
+    END
+    BLOCK "VarFileInfo"
+    BEGIN
+        VALUE "Translation", 0x409, 1252
+    END
+END
+
+#endif    // English (United States) resources
+/////////////////////////////////////////////////////////////////////////////
+
+
+
+#ifndef APSTUDIO_INVOKED
+/////////////////////////////////////////////////////////////////////////////
+//
+// Generated from the TEXTINCLUDE 3 resource.
+//
+
+
+/////////////////////////////////////////////////////////////////////////////
+#endif    // not APSTUDIO_INVOKED
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.cpp b/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.cpp
new file mode 100644
index 0000000..8254bd9
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.cpp
@@ -0,0 +1,65 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "flutter_window.h"
+
+#include <optional>
+
+#include "flutter/generated_plugin_registrant.h"
+
+FlutterWindow::FlutterWindow(const flutter::DartProject& project)
+    : project_(project) {}
+
+FlutterWindow::~FlutterWindow() {}
+
+bool FlutterWindow::OnCreate() {
+  if (!Win32Window::OnCreate()) {
+    return false;
+  }
+
+  RECT frame = GetClientArea();
+
+  // The size here must match the window dimensions to avoid unnecessary surface
+  // creation / destruction in the startup path.
+  flutter_controller_ = std::make_unique<flutter::FlutterViewController>(
+      frame.right - frame.left, frame.bottom - frame.top, project_);
+  // Ensure that basic setup of the controller was successful.
+  if (!flutter_controller_->engine() || !flutter_controller_->view()) {
+    return false;
+  }
+  RegisterPlugins(flutter_controller_->engine());
+  SetChildContent(flutter_controller_->view()->GetNativeWindow());
+  return true;
+}
+
+void FlutterWindow::OnDestroy() {
+  if (flutter_controller_) {
+    flutter_controller_ = nullptr;
+  }
+
+  Win32Window::OnDestroy();
+}
+
+LRESULT
+FlutterWindow::MessageHandler(HWND hwnd, UINT const message,
+                              WPARAM const wparam,
+                              LPARAM const lparam) noexcept {
+  // Give Flutter, including plugins, an opportunity to handle window messages.
+  if (flutter_controller_) {
+    std::optional<LRESULT> result =
+        flutter_controller_->HandleTopLevelWindowProc(hwnd, message, wparam,
+                                                      lparam);
+    if (result) {
+      return *result;
+    }
+  }
+
+  switch (message) {
+    case WM_FONTCHANGE:
+      flutter_controller_->engine()->ReloadSystemFonts();
+      break;
+  }
+
+  return Win32Window::MessageHandler(hwnd, message, wparam, lparam);
+}
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.h b/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.h
new file mode 100644
index 0000000..f1fc669
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/flutter_window.h
@@ -0,0 +1,37 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef RUNNER_FLUTTER_WINDOW_H_
+#define RUNNER_FLUTTER_WINDOW_H_
+
+#include <flutter/dart_project.h>
+#include <flutter/flutter_view_controller.h>
+
+#include <memory>
+
+#include "win32_window.h"
+
+// A window that does nothing but host a Flutter view.
+class FlutterWindow : public Win32Window {
+ public:
+  // Creates a new FlutterWindow hosting a Flutter view running |project|.
+  explicit FlutterWindow(const flutter::DartProject& project);
+  virtual ~FlutterWindow();
+
+ protected:
+  // Win32Window:
+  bool OnCreate() override;
+  void OnDestroy() override;
+  LRESULT MessageHandler(HWND window, UINT const message, WPARAM const wparam,
+                         LPARAM const lparam) noexcept override;
+
+ private:
+  // The project to run.
+  flutter::DartProject project_;
+
+  // The Flutter instance hosted by this window.
+  std::unique_ptr<flutter::FlutterViewController> flutter_controller_;
+};
+
+#endif  // RUNNER_FLUTTER_WINDOW_H_
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/main.cpp b/packages/local_auth/local_auth_windows/example/windows/runner/main.cpp
new file mode 100644
index 0000000..4e37ae2
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/main.cpp
@@ -0,0 +1,46 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <flutter/dart_project.h>
+#include <flutter/flutter_view_controller.h>
+#include <windows.h>
+
+#include "flutter_window.h"
+#include "utils.h"
+
+int APIENTRY wWinMain(_In_ HINSTANCE instance, _In_opt_ HINSTANCE prev,
+                      _In_ wchar_t* command_line, _In_ int show_command) {
+  // Attach to console when present (e.g., 'flutter run') or create a
+  // new console when running with a debugger.
+  if (!::AttachConsole(ATTACH_PARENT_PROCESS) && ::IsDebuggerPresent()) {
+    CreateAndAttachConsole();
+  }
+
+  // Initialize COM, so that it is available for use in the library and/or
+  // plugins.
+  ::CoInitializeEx(nullptr, COINIT_APARTMENTTHREADED);
+
+  flutter::DartProject project(L"data");
+
+  std::vector<std::string> command_line_arguments = GetCommandLineArguments();
+
+  project.set_dart_entrypoint_arguments(std::move(command_line_arguments));
+
+  FlutterWindow window(project);
+  Win32Window::Point origin(10, 10);
+  Win32Window::Size size(1280, 720);
+  if (!window.CreateAndShow(L"local_auth_windows_example", origin, size)) {
+    return EXIT_FAILURE;
+  }
+  window.SetQuitOnClose(true);
+
+  ::MSG msg;
+  while (::GetMessage(&msg, nullptr, 0, 0)) {
+    ::TranslateMessage(&msg);
+    ::DispatchMessage(&msg);
+  }
+
+  ::CoUninitialize();
+  return EXIT_SUCCESS;
+}
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/resource.h b/packages/local_auth/local_auth_windows/example/windows/runner/resource.h
new file mode 100644
index 0000000..d5d958d
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/resource.h
@@ -0,0 +1,16 @@
+//{{NO_DEPENDENCIES}}
+// Microsoft Visual C++ generated include file.
+// Used by Runner.rc
+//
+#define IDI_APP_ICON 101
+
+// Next default values for new objects
+//
+#ifdef APSTUDIO_INVOKED
+#ifndef APSTUDIO_READONLY_SYMBOLS
+#define _APS_NEXT_RESOURCE_VALUE 102
+#define _APS_NEXT_COMMAND_VALUE 40001
+#define _APS_NEXT_CONTROL_VALUE 1001
+#define _APS_NEXT_SYMED_VALUE 101
+#endif
+#endif
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/resources/app_icon.ico b/packages/local_auth/local_auth_windows/example/windows/runner/resources/app_icon.ico
new file mode 100644
index 0000000..c04e20c
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/resources/app_icon.ico
Binary files differ
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/runner.exe.manifest b/packages/local_auth/local_auth_windows/example/windows/runner/runner.exe.manifest
new file mode 100644
index 0000000..c977c4a
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/runner.exe.manifest
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
+<assembly xmlns="urn:schemas-microsoft-com:asm.v1" manifestVersion="1.0">
+  <application xmlns="urn:schemas-microsoft-com:asm.v3">
+    <windowsSettings>
+      <dpiAwareness xmlns="http://schemas.microsoft.com/SMI/2016/WindowsSettings">PerMonitorV2</dpiAwareness>
+    </windowsSettings>
+  </application>
+  <compatibility xmlns="urn:schemas-microsoft-com:compatibility.v1">
+    <application>
+      <!-- Windows 10 -->
+      <supportedOS Id="{8e0f7a12-bfb3-4fe8-b9a5-48fd50a15a9a}"/>
+      <!-- Windows 8.1 -->
+      <supportedOS Id="{1f676c76-80e1-4239-95bb-83d0f6d0da78}"/>
+      <!-- Windows 8 -->
+      <supportedOS Id="{4a2f28e3-53b9-4441-ba9c-d69d4a4a6e38}"/>
+      <!-- Windows 7 -->
+      <supportedOS Id="{35138b9a-5d96-4fbd-8e2d-a2440225f93a}"/>
+    </application>
+  </compatibility>
+</assembly>
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/utils.cpp b/packages/local_auth/local_auth_windows/example/windows/runner/utils.cpp
new file mode 100644
index 0000000..fb7e945
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/utils.cpp
@@ -0,0 +1,67 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "utils.h"
+
+#include <flutter_windows.h>
+#include <io.h>
+#include <stdio.h>
+#include <windows.h>
+
+#include <iostream>
+
+void CreateAndAttachConsole() {
+  if (::AllocConsole()) {
+    FILE* unused;
+    if (freopen_s(&unused, "CONOUT$", "w", stdout)) {
+      _dup2(_fileno(stdout), 1);
+    }
+    if (freopen_s(&unused, "CONOUT$", "w", stderr)) {
+      _dup2(_fileno(stdout), 2);
+    }
+    std::ios::sync_with_stdio();
+    FlutterDesktopResyncOutputStreams();
+  }
+}
+
+std::vector<std::string> GetCommandLineArguments() {
+  // Convert the UTF-16 command line arguments to UTF-8 for the Engine to use.
+  int argc;
+  wchar_t** argv = ::CommandLineToArgvW(::GetCommandLineW(), &argc);
+  if (argv == nullptr) {
+    return std::vector<std::string>();
+  }
+
+  std::vector<std::string> command_line_arguments;
+
+  // Skip the first argument as it's the binary name.
+  for (int i = 1; i < argc; i++) {
+    command_line_arguments.push_back(Utf8FromUtf16(argv[i]));
+  }
+
+  ::LocalFree(argv);
+
+  return command_line_arguments;
+}
+
+std::string Utf8FromUtf16(const wchar_t* utf16_string) {
+  if (utf16_string == nullptr) {
+    return std::string();
+  }
+  int target_length =
+      ::WideCharToMultiByte(CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1,
+                            nullptr, 0, nullptr, nullptr);
+  if (target_length == 0) {
+    return std::string();
+  }
+  std::string utf8_string;
+  utf8_string.resize(target_length);
+  int converted_length = ::WideCharToMultiByte(
+      CP_UTF8, WC_ERR_INVALID_CHARS, utf16_string, -1, utf8_string.data(),
+      target_length, nullptr, nullptr);
+  if (converted_length == 0) {
+    return std::string();
+  }
+  return utf8_string;
+}
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/utils.h b/packages/local_auth/local_auth_windows/example/windows/runner/utils.h
new file mode 100644
index 0000000..bd81e1e
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/utils.h
@@ -0,0 +1,23 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef RUNNER_UTILS_H_
+#define RUNNER_UTILS_H_
+
+#include <string>
+#include <vector>
+
+// Creates a console for the process, and redirects stdout and stderr to
+// it for both the runner and the Flutter library.
+void CreateAndAttachConsole();
+
+// Takes a null-terminated wchar_t* encoded in UTF-16 and returns a std::string
+// encoded in UTF-8. Returns an empty std::string on failure.
+std::string Utf8FromUtf16(const wchar_t* utf16_string);
+
+// Gets the command line arguments passed in as a std::vector<std::string>,
+// encoded in UTF-8. Returns an empty std::vector<std::string> on failure.
+std::vector<std::string> GetCommandLineArguments();
+
+#endif  // RUNNER_UTILS_H_
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.cpp b/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.cpp
new file mode 100644
index 0000000..85aa361
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.cpp
@@ -0,0 +1,241 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "win32_window.h"
+
+#include <flutter_windows.h>
+
+#include "resource.h"
+
+namespace {
+
+constexpr const wchar_t kWindowClassName[] = L"FLUTTER_RUNNER_WIN32_WINDOW";
+
+// The number of Win32Window objects that currently exist.
+static int g_active_window_count = 0;
+
+using EnableNonClientDpiScaling = BOOL __stdcall(HWND hwnd);
+
+// Scale helper to convert logical scaler values to physical using passed in
+// scale factor
+int Scale(int source, double scale_factor) {
+  return static_cast<int>(source * scale_factor);
+}
+
+// Dynamically loads the |EnableNonClientDpiScaling| from the User32 module.
+// This API is only needed for PerMonitor V1 awareness mode.
+void EnableFullDpiSupportIfAvailable(HWND hwnd) {
+  HMODULE user32_module = LoadLibraryA("User32.dll");
+  if (!user32_module) {
+    return;
+  }
+  auto enable_non_client_dpi_scaling =
+      reinterpret_cast<EnableNonClientDpiScaling*>(
+          GetProcAddress(user32_module, "EnableNonClientDpiScaling"));
+  if (enable_non_client_dpi_scaling != nullptr) {
+    enable_non_client_dpi_scaling(hwnd);
+    FreeLibrary(user32_module);
+  }
+}
+
+}  // namespace
+
+// Manages the Win32Window's window class registration.
+class WindowClassRegistrar {
+ public:
+  ~WindowClassRegistrar() = default;
+
+  // Returns the singleton registar instance.
+  static WindowClassRegistrar* GetInstance() {
+    if (!instance_) {
+      instance_ = new WindowClassRegistrar();
+    }
+    return instance_;
+  }
+
+  // Returns the name of the window class, registering the class if it hasn't
+  // previously been registered.
+  const wchar_t* GetWindowClass();
+
+  // Unregisters the window class. Should only be called if there are no
+  // instances of the window.
+  void UnregisterWindowClass();
+
+ private:
+  WindowClassRegistrar() = default;
+
+  static WindowClassRegistrar* instance_;
+
+  bool class_registered_ = false;
+};
+
+WindowClassRegistrar* WindowClassRegistrar::instance_ = nullptr;
+
+const wchar_t* WindowClassRegistrar::GetWindowClass() {
+  if (!class_registered_) {
+    WNDCLASS window_class{};
+    window_class.hCursor = LoadCursor(nullptr, IDC_ARROW);
+    window_class.lpszClassName = kWindowClassName;
+    window_class.style = CS_HREDRAW | CS_VREDRAW;
+    window_class.cbClsExtra = 0;
+    window_class.cbWndExtra = 0;
+    window_class.hInstance = GetModuleHandle(nullptr);
+    window_class.hIcon =
+        LoadIcon(window_class.hInstance, MAKEINTRESOURCE(IDI_APP_ICON));
+    window_class.hbrBackground = 0;
+    window_class.lpszMenuName = nullptr;
+    window_class.lpfnWndProc = Win32Window::WndProc;
+    RegisterClass(&window_class);
+    class_registered_ = true;
+  }
+  return kWindowClassName;
+}
+
+void WindowClassRegistrar::UnregisterWindowClass() {
+  UnregisterClass(kWindowClassName, nullptr);
+  class_registered_ = false;
+}
+
+Win32Window::Win32Window() { ++g_active_window_count; }
+
+Win32Window::~Win32Window() {
+  --g_active_window_count;
+  Destroy();
+}
+
+bool Win32Window::CreateAndShow(const std::wstring& title, const Point& origin,
+                                const Size& size) {
+  Destroy();
+
+  const wchar_t* window_class =
+      WindowClassRegistrar::GetInstance()->GetWindowClass();
+
+  const POINT target_point = {static_cast<LONG>(origin.x),
+                              static_cast<LONG>(origin.y)};
+  HMONITOR monitor = MonitorFromPoint(target_point, MONITOR_DEFAULTTONEAREST);
+  UINT dpi = FlutterDesktopGetDpiForMonitor(monitor);
+  double scale_factor = dpi / 96.0;
+
+  HWND window = CreateWindow(
+      window_class, title.c_str(), WS_OVERLAPPEDWINDOW | WS_VISIBLE,
+      Scale(origin.x, scale_factor), Scale(origin.y, scale_factor),
+      Scale(size.width, scale_factor), Scale(size.height, scale_factor),
+      nullptr, nullptr, GetModuleHandle(nullptr), this);
+
+  if (!window) {
+    return false;
+  }
+
+  return OnCreate();
+}
+
+// static
+LRESULT CALLBACK Win32Window::WndProc(HWND const window, UINT const message,
+                                      WPARAM const wparam,
+                                      LPARAM const lparam) noexcept {
+  if (message == WM_NCCREATE) {
+    auto window_struct = reinterpret_cast<CREATESTRUCT*>(lparam);
+    SetWindowLongPtr(window, GWLP_USERDATA,
+                     reinterpret_cast<LONG_PTR>(window_struct->lpCreateParams));
+
+    auto that = static_cast<Win32Window*>(window_struct->lpCreateParams);
+    EnableFullDpiSupportIfAvailable(window);
+    that->window_handle_ = window;
+  } else if (Win32Window* that = GetThisFromHandle(window)) {
+    return that->MessageHandler(window, message, wparam, lparam);
+  }
+
+  return DefWindowProc(window, message, wparam, lparam);
+}
+
+LRESULT
+Win32Window::MessageHandler(HWND hwnd, UINT const message, WPARAM const wparam,
+                            LPARAM const lparam) noexcept {
+  switch (message) {
+    case WM_DESTROY:
+      window_handle_ = nullptr;
+      Destroy();
+      if (quit_on_close_) {
+        PostQuitMessage(0);
+      }
+      return 0;
+
+    case WM_DPICHANGED: {
+      auto newRectSize = reinterpret_cast<RECT*>(lparam);
+      LONG newWidth = newRectSize->right - newRectSize->left;
+      LONG newHeight = newRectSize->bottom - newRectSize->top;
+
+      SetWindowPos(hwnd, nullptr, newRectSize->left, newRectSize->top, newWidth,
+                   newHeight, SWP_NOZORDER | SWP_NOACTIVATE);
+
+      return 0;
+    }
+    case WM_SIZE: {
+      RECT rect = GetClientArea();
+      if (child_content_ != nullptr) {
+        // Size and position the child window.
+        MoveWindow(child_content_, rect.left, rect.top, rect.right - rect.left,
+                   rect.bottom - rect.top, TRUE);
+      }
+      return 0;
+    }
+
+    case WM_ACTIVATE:
+      if (child_content_ != nullptr) {
+        SetFocus(child_content_);
+      }
+      return 0;
+  }
+
+  return DefWindowProc(window_handle_, message, wparam, lparam);
+}
+
+void Win32Window::Destroy() {
+  OnDestroy();
+
+  if (window_handle_) {
+    DestroyWindow(window_handle_);
+    window_handle_ = nullptr;
+  }
+  if (g_active_window_count == 0) {
+    WindowClassRegistrar::GetInstance()->UnregisterWindowClass();
+  }
+}
+
+Win32Window* Win32Window::GetThisFromHandle(HWND const window) noexcept {
+  return reinterpret_cast<Win32Window*>(
+      GetWindowLongPtr(window, GWLP_USERDATA));
+}
+
+void Win32Window::SetChildContent(HWND content) {
+  child_content_ = content;
+  SetParent(content, window_handle_);
+  RECT frame = GetClientArea();
+
+  MoveWindow(content, frame.left, frame.top, frame.right - frame.left,
+             frame.bottom - frame.top, true);
+
+  SetFocus(child_content_);
+}
+
+RECT Win32Window::GetClientArea() {
+  RECT frame;
+  GetClientRect(window_handle_, &frame);
+  return frame;
+}
+
+HWND Win32Window::GetHandle() { return window_handle_; }
+
+void Win32Window::SetQuitOnClose(bool quit_on_close) {
+  quit_on_close_ = quit_on_close;
+}
+
+bool Win32Window::OnCreate() {
+  // No-op; provided for subclasses.
+  return true;
+}
+
+void Win32Window::OnDestroy() {
+  // No-op; provided for subclasses.
+}
diff --git a/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.h b/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.h
new file mode 100644
index 0000000..d2a7300
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/example/windows/runner/win32_window.h
@@ -0,0 +1,99 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef RUNNER_WIN32_WINDOW_H_
+#define RUNNER_WIN32_WINDOW_H_
+
+#include <windows.h>
+
+#include <functional>
+#include <memory>
+#include <string>
+
+// A class abstraction for a high DPI-aware Win32 Window. Intended to be
+// inherited from by classes that wish to specialize with custom
+// rendering and input handling
+class Win32Window {
+ public:
+  struct Point {
+    unsigned int x;
+    unsigned int y;
+    Point(unsigned int x, unsigned int y) : x(x), y(y) {}
+  };
+
+  struct Size {
+    unsigned int width;
+    unsigned int height;
+    Size(unsigned int width, unsigned int height)
+        : width(width), height(height) {}
+  };
+
+  Win32Window();
+  virtual ~Win32Window();
+
+  // Creates and shows a win32 window with |title| and position and size using
+  // |origin| and |size|. New windows are created on the default monitor. Window
+  // sizes are specified to the OS in physical pixels, hence to ensure a
+  // consistent size to will treat the width height passed in to this function
+  // as logical pixels and scale to appropriate for the default monitor. Returns
+  // true if the window was created successfully.
+  bool CreateAndShow(const std::wstring& title, const Point& origin,
+                     const Size& size);
+
+  // Release OS resources associated with window.
+  void Destroy();
+
+  // Inserts |content| into the window tree.
+  void SetChildContent(HWND content);
+
+  // Returns the backing Window handle to enable clients to set icon and other
+  // window properties. Returns nullptr if the window has been destroyed.
+  HWND GetHandle();
+
+  // If true, closing this window will quit the application.
+  void SetQuitOnClose(bool quit_on_close);
+
+  // Return a RECT representing the bounds of the current client area.
+  RECT GetClientArea();
+
+ protected:
+  // Processes and route salient window messages for mouse handling,
+  // size change and DPI. Delegates handling of these to member overloads that
+  // inheriting classes can handle.
+  virtual LRESULT MessageHandler(HWND window, UINT const message,
+                                 WPARAM const wparam,
+                                 LPARAM const lparam) noexcept;
+
+  // Called when CreateAndShow is called, allowing subclass window-related
+  // setup. Subclasses should return false if setup fails.
+  virtual bool OnCreate();
+
+  // Called when Destroy is called.
+  virtual void OnDestroy();
+
+ private:
+  friend class WindowClassRegistrar;
+
+  // OS callback called by message pump. Handles the WM_NCCREATE message which
+  // is passed when the non-client area is being created and enables automatic
+  // non-client DPI scaling so that the non-client area automatically
+  // responsponds to changes in DPI. All other messages are handled by
+  // MessageHandler.
+  static LRESULT CALLBACK WndProc(HWND const window, UINT const message,
+                                  WPARAM const wparam,
+                                  LPARAM const lparam) noexcept;
+
+  // Retrieves a class instance pointer for |window|
+  static Win32Window* GetThisFromHandle(HWND const window) noexcept;
+
+  bool quit_on_close_ = false;
+
+  // window handle for top level window.
+  HWND window_handle_ = nullptr;
+
+  // window handle for hosted content.
+  HWND child_content_ = nullptr;
+};
+
+#endif  // RUNNER_WIN32_WINDOW_H_
diff --git a/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart b/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart
new file mode 100644
index 0000000..1d65e81
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/lib/local_auth_windows.dart
@@ -0,0 +1,82 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/services.dart';
+import 'package:local_auth_platform_interface/local_auth_platform_interface.dart';
+import 'package:local_auth_windows/types/auth_messages_windows.dart';
+
+export 'package:local_auth_platform_interface/types/auth_messages.dart';
+export 'package:local_auth_platform_interface/types/auth_options.dart';
+export 'package:local_auth_platform_interface/types/biometric_type.dart';
+export 'package:local_auth_windows/types/auth_messages_windows.dart';
+
+const MethodChannel _channel =
+    MethodChannel('plugins.flutter.io/local_auth_windows');
+
+/// The implementation of [LocalAuthPlatform] for Windows.
+class LocalAuthWindows extends LocalAuthPlatform {
+  /// Registers this class as the default instance of [LocalAuthPlatform].
+  static void registerWith() {
+    LocalAuthPlatform.instance = LocalAuthWindows();
+  }
+
+  @override
+  Future<bool> authenticate({
+    required String localizedReason,
+    required Iterable<AuthMessages> authMessages,
+    AuthenticationOptions options = const AuthenticationOptions(),
+  }) async {
+    assert(localizedReason.isNotEmpty);
+    final Map<String, Object> args = <String, Object>{
+      'localizedReason': localizedReason,
+      'useErrorDialogs': options.useErrorDialogs,
+      'stickyAuth': options.stickyAuth,
+      'sensitiveTransaction': options.sensitiveTransaction,
+      'biometricOnly': options.biometricOnly,
+    };
+    args.addAll(const WindowsAuthMessages().args);
+    for (final AuthMessages messages in authMessages) {
+      if (messages is WindowsAuthMessages) {
+        args.addAll(messages.args);
+      }
+    }
+    return (await _channel.invokeMethod<bool>('authenticate', args)) ?? false;
+  }
+
+  @override
+  Future<bool> deviceSupportsBiometrics() async {
+    return (await _channel.invokeMethod<bool>('deviceSupportsBiometrics')) ??
+        false;
+  }
+
+  @override
+  Future<List<BiometricType>> getEnrolledBiometrics() async {
+    final List<String> result = (await _channel.invokeListMethod<String>(
+          'getEnrolledBiometrics',
+        )) ??
+        <String>[];
+    final List<BiometricType> biometrics = <BiometricType>[];
+    for (final String value in result) {
+      switch (value) {
+        case 'weak':
+          biometrics.add(BiometricType.weak);
+          break;
+        case 'strong':
+          biometrics.add(BiometricType.strong);
+          break;
+      }
+    }
+    return biometrics;
+  }
+
+  @override
+  Future<bool> isDeviceSupported() async =>
+      (await _channel.invokeMethod<bool>('isDeviceSupported')) ?? false;
+
+  /// Always returns false as this method is not supported on Windows.
+  @override
+  Future<bool> stopAuthentication() async {
+    return false;
+  }
+}
diff --git a/packages/local_auth/local_auth_windows/lib/types/auth_messages_windows.dart b/packages/local_auth/local_auth_windows/lib/types/auth_messages_windows.dart
new file mode 100644
index 0000000..e47e873
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/lib/types/auth_messages_windows.dart
@@ -0,0 +1,22 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/foundation.dart';
+import 'package:local_auth_platform_interface/types/auth_messages.dart';
+
+/// Windows side authentication messages.
+///
+/// Provides default values for all messages.
+///
+/// Currently unused.
+@immutable
+class WindowsAuthMessages extends AuthMessages {
+  /// Constructs a new instance.
+  const WindowsAuthMessages();
+
+  @override
+  Map<String, String> get args {
+    return <String, String>{};
+  }
+}
diff --git a/packages/local_auth/local_auth_windows/pubspec.yaml b/packages/local_auth/local_auth_windows/pubspec.yaml
new file mode 100644
index 0000000..9edeffb
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/pubspec.yaml
@@ -0,0 +1,26 @@
+name: local_auth_windows
+description: Windows implementation of the local_auth plugin.
+repository: https://github.com/flutter/plugins/tree/master/packages/local_auth/local_auth_windows
+issue_tracker: https://github.com/flutter/flutter/issues?q=is%3Aissue+is%3Aopen+label%3A%22p%3A+local_auth%22
+version: 1.0.0
+
+environment:
+  sdk: ">=2.14.0 <3.0.0"
+  flutter: ">=2.8.0"
+
+flutter:
+  plugin:
+    implements: local_auth
+    platforms:
+      windows:
+        pluginClass: LocalAuthPlugin
+        dartPluginClass: LocalAuthWindows
+
+dependencies:
+  flutter:
+    sdk: flutter
+  local_auth_platform_interface: ^1.0.0
+
+dev_dependencies:
+  flutter_test:
+    sdk: flutter
\ No newline at end of file
diff --git a/packages/local_auth/local_auth_windows/test/local_auth_test.dart b/packages/local_auth/local_auth_windows/test/local_auth_test.dart
new file mode 100644
index 0000000..b11c19e
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/test/local_auth_test.dart
@@ -0,0 +1,79 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+import 'package:flutter/services.dart';
+import 'package:flutter_test/flutter_test.dart';
+import 'package:local_auth_windows/local_auth_windows.dart';
+
+void main() {
+  TestWidgetsFlutterBinding.ensureInitialized();
+
+  group('authenticate', () {
+    const MethodChannel channel = MethodChannel(
+      'plugins.flutter.io/local_auth_windows',
+    );
+
+    final List<MethodCall> log = <MethodCall>[];
+    late LocalAuthWindows localAuthentication;
+
+    setUp(() {
+      channel.setMockMethodCallHandler((MethodCall methodCall) {
+        log.add(methodCall);
+        switch (methodCall.method) {
+          case 'getEnrolledBiometrics':
+            return Future<List<String>>.value(<String>['weak', 'strong']);
+          default:
+            return Future<dynamic>.value(true);
+        }
+      });
+      localAuthentication = LocalAuthWindows();
+      log.clear();
+    });
+
+    test('authenticate with no arguments passes expected defaults', () async {
+      await localAuthentication.authenticate(
+          authMessages: <AuthMessages>[const WindowsAuthMessages()],
+          localizedReason: 'My localized reason');
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('authenticate',
+              arguments: <String, dynamic>{
+                'localizedReason': 'My localized reason',
+                'useErrorDialogs': true,
+                'stickyAuth': false,
+                'sensitiveTransaction': true,
+                'biometricOnly': false,
+              }..addAll(const WindowsAuthMessages().args)),
+        ],
+      );
+    });
+
+    test('authenticate passes all options.', () async {
+      await localAuthentication.authenticate(
+        authMessages: <AuthMessages>[const WindowsAuthMessages()],
+        localizedReason: 'My localized reason',
+        options: const AuthenticationOptions(
+          useErrorDialogs: false,
+          stickyAuth: true,
+          sensitiveTransaction: false,
+          biometricOnly: true,
+        ),
+      );
+      expect(
+        log,
+        <Matcher>[
+          isMethodCall('authenticate',
+              arguments: <String, dynamic>{
+                'localizedReason': 'My localized reason',
+                'useErrorDialogs': false,
+                'stickyAuth': true,
+                'sensitiveTransaction': false,
+                'biometricOnly': true,
+              }..addAll(const WindowsAuthMessages().args)),
+        ],
+      );
+    });
+  });
+}
diff --git a/packages/local_auth/local_auth_windows/windows/CMakeLists.txt b/packages/local_auth/local_auth_windows/windows/CMakeLists.txt
new file mode 100644
index 0000000..bcf59bb
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/CMakeLists.txt
@@ -0,0 +1,120 @@
+cmake_minimum_required(VERSION 3.15)
+set(PROJECT_NAME "local_auth_windows")
+set(WIL_VERSION "1.0.220201.1")
+set(CPPWINRT_VERSION "2.0.220418.1")
+project(${PROJECT_NAME} LANGUAGES CXX)
+include(FetchContent)
+
+set(PLUGIN_NAME "${PROJECT_NAME}_plugin")
+
+FetchContent_Declare(nuget
+  URL "https://dist.nuget.org/win-x86-commandline/v6.0.0/nuget.exe"
+  URL_HASH SHA256=04eb6c4fe4213907e2773e1be1bbbd730e9a655a3c9c58387ce8d4a714a5b9e1
+  DOWNLOAD_NO_EXTRACT true
+)
+
+find_program(NUGET nuget)
+if (NOT NUGET)
+    message("Nuget.exe not found, trying to download or use cached version.")
+    FetchContent_MakeAvailable(nuget)
+    set(NUGET ${nuget_SOURCE_DIR}/nuget.exe)
+endif()
+
+execute_process(COMMAND
+    ${NUGET} install Microsoft.Windows.ImplementationLibrary -Version ${WIL_VERSION} -OutputDirectory ${CMAKE_BINARY_DIR}/packages
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+    RESULT_VARIABLE ret)
+if (NOT ret EQUAL 0)
+    message(FATAL_ERROR "Failed to install nuget package Microsoft.Windows.ImplementationLibrary.${WIL_VERSION}")
+endif()
+
+execute_process(COMMAND
+    ${NUGET} install Microsoft.Windows.CppWinRT -Version ${CPPWINRT_VERSION} -OutputDirectory packages
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+    RESULT_VARIABLE ret)
+if (NOT ret EQUAL 0)
+    message(FATAL_ERROR "Failed to install nuget package Microsoft.Windows.CppWinRT.${CPPWINRT_VERSION}")
+endif()
+
+set(CPPWINRT ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.CppWinRT.${CPPWINRT_VERSION}/bin/cppwinrt.exe)
+execute_process(COMMAND
+    ${CPPWINRT} -input sdk -output include
+    WORKING_DIRECTORY ${CMAKE_BINARY_DIR}
+    RESULT_VARIABLE ret)
+if (NOT ret EQUAL 0)
+    message(FATAL_ERROR "Failed to run cppwinrt.exe")
+endif()
+
+include_directories(BEFORE SYSTEM ${CMAKE_BINARY_DIR}/include)
+
+list(APPEND PLUGIN_SOURCES
+  "local_auth_plugin.cpp"
+)
+
+add_library(${PLUGIN_NAME} SHARED
+  "include/local_auth_windows/local_auth_plugin.h"
+  "local_auth_windows.cpp"
+  "local_auth.h"
+  ${PLUGIN_SOURCES}
+)
+apply_standard_settings(${PLUGIN_NAME})
+set_target_properties(${PLUGIN_NAME} PROPERTIES CXX_VISIBILITY_PRESET hidden)
+target_compile_features(${PLUGIN_NAME} PRIVATE cxx_std_20)
+target_compile_options(${PLUGIN_NAME} PRIVATE /await)
+target_compile_definitions(${PLUGIN_NAME} PRIVATE FLUTTER_PLUGIN_IMPL)
+target_include_directories(${PLUGIN_NAME} INTERFACE
+  "${CMAKE_CURRENT_SOURCE_DIR}/include")
+target_link_libraries(${PLUGIN_NAME} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.ImplementationLibrary.${WIL_VERSION}/build/native/Microsoft.Windows.ImplementationLibrary.targets)
+target_link_libraries(${PLUGIN_NAME} PRIVATE flutter flutter_wrapper_plugin windowsapp)
+
+# List of absolute paths to libraries that should be bundled with the plugin
+set(file_chooser_bundled_libraries
+  ""
+  PARENT_SCOPE
+)
+
+
+# === Tests ===
+
+if (${include_${PROJECT_NAME}_tests})
+set(TEST_RUNNER "${PROJECT_NAME}_test")
+enable_testing()
+# TODO(stuartmorgan): Consider using a single shared, pre-checked-in googletest
+# instance rather than downloading for each plugin. This approach makes sense
+# for a template, but not for a monorepo with many plugins.
+FetchContent_Declare(
+  googletest
+  URL https://github.com/google/googletest/archive/release-1.11.0.zip
+)
+# Prevent overriding the parent project's compiler/linker settings
+set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
+# Disable install commands for gtest so it doesn't end up in the bundle.
+set(INSTALL_GTEST OFF CACHE BOOL "Disable installation of googletest" FORCE)
+
+FetchContent_MakeAvailable(googletest)
+
+# The plugin's C API is not very useful for unit testing, so build the sources
+# directly into the test binary rather than using the DLL.
+add_executable(${TEST_RUNNER}
+  test/mocks.h
+  test/local_auth_plugin_test.cpp
+  ${PLUGIN_SOURCES}
+)
+apply_standard_settings(${TEST_RUNNER})
+target_include_directories(${TEST_RUNNER} PRIVATE "${CMAKE_CURRENT_SOURCE_DIR}")
+target_compile_features(${TEST_RUNNER} PRIVATE cxx_std_20)
+target_compile_options(${TEST_RUNNER} PRIVATE /await)
+target_link_libraries(${TEST_RUNNER} PRIVATE ${CMAKE_BINARY_DIR}/packages/Microsoft.Windows.ImplementationLibrary.${WIL_VERSION}/build/native/Microsoft.Windows.ImplementationLibrary.targets)
+target_link_libraries(${TEST_RUNNER} PRIVATE flutter_wrapper_plugin)
+target_link_libraries(${TEST_RUNNER} PRIVATE windowsapp)
+target_link_libraries(${TEST_RUNNER} PRIVATE gtest_main gmock)
+
+# flutter_wrapper_plugin has link dependencies on the Flutter DLL.
+add_custom_command(TARGET ${TEST_RUNNER} POST_BUILD
+  COMMAND ${CMAKE_COMMAND} -E copy_if_different
+  "${FLUTTER_LIBRARY}" $<TARGET_FILE_DIR:${TEST_RUNNER}>
+)
+
+include(GoogleTest)
+gtest_discover_tests(${TEST_RUNNER})
+endif()
diff --git a/packages/local_auth/local_auth_windows/windows/include/local_auth_windows/local_auth_plugin.h b/packages/local_auth/local_auth_windows/windows/include/local_auth_windows/local_auth_plugin.h
new file mode 100644
index 0000000..0604de8
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/include/local_auth_windows/local_auth_plugin.h
@@ -0,0 +1,26 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#ifndef FLUTTER_PLUGIN_LOCAL_AUTH_WINDOWS_PLUGIN_H_
+#define FLUTTER_PLUGIN_LOCAL_AUTH_WINDOWS_PLUGIN_H_
+
+#include <flutter_plugin_registrar.h>
+
+#ifdef FLUTTER_PLUGIN_IMPL
+#define FLUTTER_PLUGIN_EXPORT __declspec(dllexport)
+#else
+#define FLUTTER_PLUGIN_EXPORT __declspec(dllimport)
+#endif
+
+#if defined(__cplusplus)
+extern "C" {
+#endif
+
+FLUTTER_PLUGIN_EXPORT void LocalAuthPluginRegisterWithRegistrar(
+    FlutterDesktopPluginRegistrarRef registrar);
+
+#if defined(__cplusplus)
+}  // extern "C"
+#endif
+
+#endif  // FLUTTER_PLUGIN_LOCAL_AUTH_WINDOWS_PLUGIN_H_
diff --git a/packages/local_auth/local_auth_windows/windows/local_auth.h b/packages/local_auth/local_auth_windows/windows/local_auth.h
new file mode 100644
index 0000000..94b91f8
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/local_auth.h
@@ -0,0 +1,89 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <UserConsentVerifierInterop.h>
+#include <flutter/encodable_value.h>
+#include <flutter/method_channel.h>
+#include <flutter/plugin_registrar_windows.h>
+#include <flutter/standard_method_codec.h>
+#include <pplawait.h>
+#include <ppltasks.h>
+
+#include "include/local_auth_windows/local_auth_plugin.h"
+
+// Include prior to C++/WinRT Headers
+#include <wil/cppwinrt.h>
+#include <wil/win32_helpers.h>
+#include <windows.h>
+#include <winrt/Windows.Foundation.h>
+#include <winrt/Windows.Security.Credentials.UI.h>
+
+#include <map>
+#include <memory>
+#include <sstream>
+
+namespace local_auth_windows {
+
+// Abstract class that is used to determine whether a user
+// has given consent to a particular action, and if the system
+// supports asking this question.
+class UserConsentVerifier {
+ public:
+  UserConsentVerifier() {}
+  virtual ~UserConsentVerifier() = default;
+
+  // Abstract method that request the user's verification
+  // given the provided reason.
+  virtual winrt::Windows::Foundation::IAsyncOperation<
+      winrt::Windows::Security::Credentials::UI::UserConsentVerificationResult>
+  RequestVerificationForWindowAsync(std::wstring localized_reason) = 0;
+
+  // Abstract method that returns weather the system supports Windows Hello.
+  virtual winrt::Windows::Foundation::IAsyncOperation<
+      winrt::Windows::Security::Credentials::UI::
+          UserConsentVerifierAvailability>
+  CheckAvailabilityAsync() = 0;
+
+  // Disallow copy and move.
+  UserConsentVerifier(const UserConsentVerifier&) = delete;
+  UserConsentVerifier& operator=(const UserConsentVerifier&) = delete;
+};
+
+class LocalAuthPlugin : public flutter::Plugin {
+ public:
+  static void RegisterWithRegistrar(flutter::PluginRegistrarWindows* registrar);
+
+  // Creates a plugin instance that will create the dialog and associate
+  // it with the HWND returned from the provided function.
+  LocalAuthPlugin(std::function<HWND()> window_provider);
+
+  // Creates a plugin instance with the given UserConsentVerifier instance.
+  // Exists for unit testing with mock implementations.
+  LocalAuthPlugin(std::unique_ptr<UserConsentVerifier> user_consent_verifier);
+
+  // Handles method calls from Dart on this plugin's channel.
+  void HandleMethodCall(
+      const flutter::MethodCall<flutter::EncodableValue>& method_call,
+      std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
+
+  virtual ~LocalAuthPlugin();
+
+ private:
+  std::unique_ptr<UserConsentVerifier> user_consent_verifier_;
+
+  // Starts authentication process.
+  winrt::fire_and_forget Authenticate(
+      const flutter::MethodCall<flutter::EncodableValue>& method_call,
+      std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
+
+  // Returns enrolled biometric types available on device.
+  winrt::fire_and_forget GetEnrolledBiometrics(
+      std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
+
+  // Returns whether the system supports Windows Hello.
+  winrt::fire_and_forget IsDeviceSupported(
+      std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result);
+};
+
+}  // namespace local_auth_windows
\ No newline at end of file
diff --git a/packages/local_auth/local_auth_windows/windows/local_auth_plugin.cpp b/packages/local_auth/local_auth_windows/windows/local_auth_plugin.cpp
new file mode 100644
index 0000000..7a25abb
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/local_auth_plugin.cpp
@@ -0,0 +1,236 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+#include <winstring.h>
+
+#include "local_auth.h"
+
+namespace {
+
+template <typename T>
+// Helper method for getting an argument from an EncodableValue.
+T GetArgument(const std::string arg, const flutter::EncodableValue* args,
+              T fallback) {
+  T result{fallback};
+  const auto* arguments = std::get_if<flutter::EncodableMap>(args);
+  if (arguments) {
+    auto result_it = arguments->find(flutter::EncodableValue(arg));
+    if (result_it != arguments->end()) {
+      result = std::get<T>(result_it->second);
+    }
+  }
+  return result;
+}
+
+// Returns the window's HWND for a given FlutterView.
+HWND GetRootWindow(flutter::FlutterView* view) {
+  return ::GetAncestor(view->GetNativeWindow(), GA_ROOT);
+}
+
+// Converts the given UTF-8 string to UTF-16.
+std::wstring Utf16FromUtf8(const std::string& utf8_string) {
+  if (utf8_string.empty()) {
+    return std::wstring();
+  }
+  int target_length =
+      ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8_string.data(),
+                            static_cast<int>(utf8_string.length()), nullptr, 0);
+  if (target_length == 0) {
+    return std::wstring();
+  }
+  std::wstring utf16_string;
+  utf16_string.resize(target_length);
+  int converted_length =
+      ::MultiByteToWideChar(CP_UTF8, MB_ERR_INVALID_CHARS, utf8_string.data(),
+                            static_cast<int>(utf8_string.length()),
+                            utf16_string.data(), target_length);
+  if (converted_length == 0) {
+    return std::wstring();
+  }
+  return utf16_string;
+}
+
+}  // namespace
+
+namespace local_auth_windows {
+
+// Creates an instance of the UserConsentVerifier that
+// calls the native Windows APIs to get the user's consent.
+class UserConsentVerifierImpl : public UserConsentVerifier {
+ public:
+  explicit UserConsentVerifierImpl(std::function<HWND()> window_provider)
+      : get_root_window_(std::move(window_provider)){};
+  virtual ~UserConsentVerifierImpl() = default;
+
+  // Calls the native Windows API to get the user's consent
+  // with the provided reason.
+  winrt::Windows::Foundation::IAsyncOperation<
+      winrt::Windows::Security::Credentials::UI::UserConsentVerificationResult>
+  RequestVerificationForWindowAsync(std::wstring localized_reason) override {
+    winrt::impl::com_ref<IUserConsentVerifierInterop>
+        user_consent_verifier_interop = winrt::get_activation_factory<
+            winrt::Windows::Security::Credentials::UI::UserConsentVerifier,
+            IUserConsentVerifierInterop>();
+
+    HWND root_window_handle = get_root_window_();
+
+    auto reason = wil::make_unique_string<wil::unique_hstring>(
+        localized_reason.c_str(), localized_reason.size());
+
+    winrt::Windows::Security::Credentials::UI::UserConsentVerificationResult
+        consent_result = co_await winrt::capture<
+            winrt::Windows::Foundation::IAsyncOperation<
+                winrt::Windows::Security::Credentials::UI::
+                    UserConsentVerificationResult>>(
+            user_consent_verifier_interop,
+            &::IUserConsentVerifierInterop::RequestVerificationForWindowAsync,
+            root_window_handle, reason.get());
+
+    return consent_result;
+  }
+
+  // Calls the native Windows API to check for the Windows Hello availability.
+  winrt::Windows::Foundation::IAsyncOperation<
+      winrt::Windows::Security::Credentials::UI::
+          UserConsentVerifierAvailability>
+  CheckAvailabilityAsync() override {
+    return winrt::Windows::Security::Credentials::UI::UserConsentVerifier::
+        CheckAvailabilityAsync();
+  }
+
+  // Disallow copy and move.
+  UserConsentVerifierImpl(const UserConsentVerifierImpl&) = delete;
+  UserConsentVerifierImpl& operator=(const UserConsentVerifierImpl&) = delete;
+
+ private:
+  // The provider for the root window to attach the dialog to.
+  std::function<HWND()> get_root_window_;
+};
+
+// static
+void LocalAuthPlugin::RegisterWithRegistrar(
+    flutter::PluginRegistrarWindows* registrar) {
+  auto channel =
+      std::make_unique<flutter::MethodChannel<flutter::EncodableValue>>(
+          registrar->messenger(), "plugins.flutter.io/local_auth_windows",
+          &flutter::StandardMethodCodec::GetInstance());
+
+  auto plugin = std::make_unique<LocalAuthPlugin>(
+      [registrar]() { return GetRootWindow(registrar->GetView()); });
+
+  channel->SetMethodCallHandler(
+      [plugin_pointer = plugin.get()](const auto& call, auto result) {
+        plugin_pointer->HandleMethodCall(call, std::move(result));
+      });
+
+  registrar->AddPlugin(std::move(plugin));
+}
+
+// Default constructor for LocalAuthPlugin.
+LocalAuthPlugin::LocalAuthPlugin(std::function<HWND()> window_provider)
+    : user_consent_verifier_(std::make_unique<UserConsentVerifierImpl>(
+          std::move(window_provider))) {}
+
+LocalAuthPlugin::LocalAuthPlugin(
+    std::unique_ptr<UserConsentVerifier> user_consent_verifier)
+    : user_consent_verifier_(std::move(user_consent_verifier)) {}
+
+LocalAuthPlugin::~LocalAuthPlugin() {}
+
+void LocalAuthPlugin::HandleMethodCall(
+    const flutter::MethodCall<flutter::EncodableValue>& method_call,
+    std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
+  if (method_call.method_name().compare("authenticate") == 0) {
+    Authenticate(method_call, std::move(result));
+  } else if (method_call.method_name().compare("getEnrolledBiometrics") == 0) {
+    GetEnrolledBiometrics(std::move(result));
+  } else if (method_call.method_name().compare("isDeviceSupported") == 0 ||
+             method_call.method_name().compare("deviceSupportsBiometrics") ==
+                 0) {
+    IsDeviceSupported(std::move(result));
+  } else {
+    result->NotImplemented();
+  }
+}
+
+// Starts authentication process.
+winrt::fire_and_forget LocalAuthPlugin::Authenticate(
+    const flutter::MethodCall<flutter::EncodableValue>& method_call,
+    std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
+  std::wstring reason = Utf16FromUtf8(GetArgument<std::string>(
+      "localizedReason", method_call.arguments(), std::string()));
+
+  bool biometric_only =
+      GetArgument<bool>("biometricOnly", method_call.arguments(), false);
+  if (biometric_only) {
+    result->Error("biometricOnlyNotSupported",
+                  "Windows doesn't support the biometricOnly parameter.");
+    co_return;
+  }
+
+  winrt::Windows::Security::Credentials::UI::UserConsentVerifierAvailability
+      ucv_availability =
+          co_await user_consent_verifier_->CheckAvailabilityAsync();
+
+  if (ucv_availability ==
+      winrt::Windows::Security::Credentials::UI::
+          UserConsentVerifierAvailability::DeviceNotPresent) {
+    result->Error("NoHardware", "No biometric hardware found");
+    co_return;
+  } else if (ucv_availability ==
+             winrt::Windows::Security::Credentials::UI::
+                 UserConsentVerifierAvailability::NotConfiguredForUser) {
+    result->Error("NotEnrolled", "No biometrics enrolled on this device.");
+    co_return;
+  } else if (ucv_availability !=
+             winrt::Windows::Security::Credentials::UI::
+                 UserConsentVerifierAvailability::Available) {
+    result->Error("NotAvailable", "Required security features not enabled");
+    co_return;
+  }
+
+  try {
+    winrt::Windows::Security::Credentials::UI::UserConsentVerificationResult
+        consent_result =
+            co_await user_consent_verifier_->RequestVerificationForWindowAsync(
+                reason);
+
+    result->Success(flutter::EncodableValue(
+        consent_result == winrt::Windows::Security::Credentials::UI::
+                              UserConsentVerificationResult::Verified));
+  } catch (...) {
+    result->Success(flutter::EncodableValue(false));
+  }
+}
+
+// Returns biometric types available on device.
+winrt::fire_and_forget LocalAuthPlugin::GetEnrolledBiometrics(
+    std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
+  try {
+    flutter::EncodableList biometrics;
+    winrt::Windows::Security::Credentials::UI::UserConsentVerifierAvailability
+        ucv_availability =
+            co_await user_consent_verifier_->CheckAvailabilityAsync();
+    if (ucv_availability == winrt::Windows::Security::Credentials::UI::
+                                UserConsentVerifierAvailability::Available) {
+      biometrics.push_back(flutter::EncodableValue("weak"));
+      biometrics.push_back(flutter::EncodableValue("strong"));
+    }
+    result->Success(biometrics);
+  } catch (const std::exception& e) {
+    result->Error("no_biometrics_available", e.what());
+  }
+}
+
+// Returns whether the device supports Windows Hello or not.
+winrt::fire_and_forget LocalAuthPlugin::IsDeviceSupported(
+    std::unique_ptr<flutter::MethodResult<flutter::EncodableValue>> result) {
+  winrt::Windows::Security::Credentials::UI::UserConsentVerifierAvailability
+      ucv_availability =
+          co_await user_consent_verifier_->CheckAvailabilityAsync();
+  result->Success(flutter::EncodableValue(
+      ucv_availability == winrt::Windows::Security::Credentials::UI::
+                              UserConsentVerifierAvailability::Available));
+}
+
+}  // namespace local_auth_windows
diff --git a/packages/local_auth/local_auth_windows/windows/local_auth_windows.cpp b/packages/local_auth/local_auth_windows/windows/local_auth_windows.cpp
new file mode 100644
index 0000000..6e5e6a1
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/local_auth_windows.cpp
@@ -0,0 +1,15 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include <flutter/plugin_registrar_windows.h>
+
+#include "include/local_auth_windows/local_auth_plugin.h"
+#include "local_auth.h"
+
+void LocalAuthPluginRegisterWithRegistrar(
+    FlutterDesktopPluginRegistrarRef registrar) {
+  local_auth_windows::LocalAuthPlugin::RegisterWithRegistrar(
+      flutter::PluginRegistrarManager::GetInstance()
+          ->GetRegistrar<flutter::PluginRegistrarWindows>(registrar));
+}
diff --git a/packages/local_auth/local_auth_windows/windows/test/local_auth_plugin_test.cpp b/packages/local_auth/local_auth_windows/windows/test/local_auth_plugin_test.cpp
new file mode 100644
index 0000000..3828b05
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/test/local_auth_plugin_test.cpp
@@ -0,0 +1,253 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "include/local_auth_windows/local_auth_plugin.h"
+
+#include <flutter/method_call.h>
+#include <flutter/method_result_functions.h>
+#include <flutter/standard_method_codec.h>
+#include <flutter/texture_registrar.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+#include <windows.h>
+
+#include <functional>
+#include <memory>
+#include <string>
+
+#include "mocks.h"
+
+namespace local_auth_windows {
+namespace test {
+
+using flutter::EncodableList;
+using flutter::EncodableMap;
+using flutter::EncodableValue;
+using ::testing::_;
+using ::testing::DoAll;
+using ::testing::EndsWith;
+using ::testing::Eq;
+using ::testing::Pointee;
+using ::testing::Return;
+
+TEST(LocalAuthPlugin, IsDeviceSupportedHandlerSuccessIfVerifierAvailable) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::Available;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result, SuccessInternal(Pointee(EncodableValue(true))));
+
+  plugin.HandleMethodCall(
+      flutter::MethodCall("isDeviceSupported",
+                          std::make_unique<EncodableValue>()),
+      std::move(result));
+}
+
+TEST(LocalAuthPlugin, IsDeviceSupportedHandlerSuccessIfVerifierNotAvailable) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::DeviceNotPresent;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result, SuccessInternal(Pointee(EncodableValue(false))));
+
+  plugin.HandleMethodCall(
+      flutter::MethodCall("isDeviceSupported",
+                          std::make_unique<EncodableValue>()),
+      std::move(result));
+}
+
+TEST(LocalAuthPlugin,
+     GetEnrolledBiometricsHandlerReturnEmptyListIfVerifierNotAvailable) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::DeviceNotPresent;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result, SuccessInternal(Pointee(EncodableList())));
+
+  plugin.HandleMethodCall(
+      flutter::MethodCall("getEnrolledBiometrics",
+                          std::make_unique<EncodableValue>()),
+      std::move(result));
+}
+
+TEST(LocalAuthPlugin,
+     GetEnrolledBiometricsHandlerReturnNonEmptyListIfVerifierAvailable) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::Available;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result,
+              SuccessInternal(Pointee(EncodableList(
+                  {EncodableValue("weak"), EncodableValue("strong")}))));
+
+  plugin.HandleMethodCall(
+      flutter::MethodCall("getEnrolledBiometrics",
+                          std::make_unique<EncodableValue>()),
+      std::move(result));
+}
+
+TEST(LocalAuthPlugin, AuthenticateHandlerDoesNotSupportBiometricOnly) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(1);
+  EXPECT_CALL(*result, SuccessInternal).Times(0);
+
+  std::unique_ptr<EncodableValue> args =
+      std::make_unique<EncodableValue>(EncodableMap({
+          {"localizedReason", EncodableValue("My Reason")},
+          {"biometricOnly", EncodableValue(true)},
+      }));
+
+  plugin.HandleMethodCall(flutter::MethodCall("authenticate", std::move(args)),
+                          std::move(result));
+}
+
+TEST(LocalAuthPlugin, AuthenticateHandlerWorksWhenAuthorized) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::Available;
+      });
+
+  EXPECT_CALL(*mockConsentVerifier, RequestVerificationForWindowAsync)
+      .Times(1)
+      .WillOnce([](std::wstring localizedReason)
+                    -> winrt::Windows::Foundation::IAsyncOperation<
+                        winrt::Windows::Security::Credentials::UI::
+                            UserConsentVerificationResult> {
+        EXPECT_EQ(localizedReason, L"My Reason");
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerificationResult::Verified;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result, SuccessInternal(Pointee(EncodableValue(true))));
+
+  std::unique_ptr<EncodableValue> args =
+      std::make_unique<EncodableValue>(EncodableMap({
+          {"localizedReason", EncodableValue("My Reason")},
+          {"biometricOnly", EncodableValue(false)},
+      }));
+
+  plugin.HandleMethodCall(flutter::MethodCall("authenticate", std::move(args)),
+                          std::move(result));
+}
+
+TEST(LocalAuthPlugin, AuthenticateHandlerWorksWhenNotAuthorized) {
+  std::unique_ptr<MockMethodResult> result =
+      std::make_unique<MockMethodResult>();
+
+  std::unique_ptr<MockUserConsentVerifier> mockConsentVerifier =
+      std::make_unique<MockUserConsentVerifier>();
+
+  EXPECT_CALL(*mockConsentVerifier, CheckAvailabilityAsync)
+      .Times(1)
+      .WillOnce([]() -> winrt::Windows::Foundation::IAsyncOperation<
+                         winrt::Windows::Security::Credentials::UI::
+                             UserConsentVerifierAvailability> {
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerifierAvailability::Available;
+      });
+
+  EXPECT_CALL(*mockConsentVerifier, RequestVerificationForWindowAsync)
+      .Times(1)
+      .WillOnce([](std::wstring localizedReason)
+                    -> winrt::Windows::Foundation::IAsyncOperation<
+                        winrt::Windows::Security::Credentials::UI::
+                            UserConsentVerificationResult> {
+        EXPECT_EQ(localizedReason, L"My Reason");
+        co_return winrt::Windows::Security::Credentials::UI::
+            UserConsentVerificationResult::Canceled;
+      });
+
+  LocalAuthPlugin plugin(std::move(mockConsentVerifier));
+
+  EXPECT_CALL(*result, ErrorInternal).Times(0);
+  EXPECT_CALL(*result, SuccessInternal(Pointee(EncodableValue(false))));
+
+  std::unique_ptr<EncodableValue> args =
+      std::make_unique<EncodableValue>(EncodableMap({
+          {"localizedReason", EncodableValue("My Reason")},
+          {"biometricOnly", EncodableValue(false)},
+      }));
+
+  plugin.HandleMethodCall(flutter::MethodCall("authenticate", std::move(args)),
+                          std::move(result));
+}
+
+}  // namespace test
+}  // namespace local_auth_windows
diff --git a/packages/local_auth/local_auth_windows/windows/test/mocks.h b/packages/local_auth/local_auth_windows/windows/test/mocks.h
new file mode 100644
index 0000000..d82ae80
--- /dev/null
+++ b/packages/local_auth/local_auth_windows/windows/test/mocks.h
@@ -0,0 +1,63 @@
+// Copyright 2013 The Flutter Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef PACKAGES_LOCAL_AUTH_LOCAL_AUTH_WINDOWS_WINDOWS_TEST_MOCKS_H_
+#define PACKAGES_LOCAL_AUTH_LOCAL_AUTH_WINDOWS_WINDOWS_TEST_MOCKS_H_
+
+#include <flutter/method_call.h>
+#include <flutter/method_result_functions.h>
+#include <flutter/standard_method_codec.h>
+#include <flutter/texture_registrar.h>
+#include <gmock/gmock.h>
+#include <gtest/gtest.h>
+
+#include "../local_auth.h"
+
+namespace local_auth_windows {
+namespace test {
+
+namespace {
+
+using flutter::EncodableMap;
+using flutter::EncodableValue;
+using ::testing::_;
+
+class MockMethodResult : public flutter::MethodResult<> {
+ public:
+  ~MockMethodResult() = default;
+
+  MOCK_METHOD(void, SuccessInternal, (const EncodableValue* result),
+              (override));
+  MOCK_METHOD(void, ErrorInternal,
+              (const std::string& error_code, const std::string& error_message,
+               const EncodableValue* details),
+              (override));
+  MOCK_METHOD(void, NotImplementedInternal, (), (override));
+};
+
+class MockUserConsentVerifier : public UserConsentVerifier {
+ public:
+  explicit MockUserConsentVerifier(){};
+  virtual ~MockUserConsentVerifier() = default;
+
+  MOCK_METHOD(winrt::Windows::Foundation::IAsyncOperation<
+                  winrt::Windows::Security::Credentials::UI::
+                      UserConsentVerificationResult>,
+              RequestVerificationForWindowAsync, (std::wstring localizedReason),
+              (override));
+  MOCK_METHOD(winrt::Windows::Foundation::IAsyncOperation<
+                  winrt::Windows::Security::Credentials::UI::
+                      UserConsentVerifierAvailability>,
+              CheckAvailabilityAsync, (), (override));
+
+  // Disallow copy and move.
+  MockUserConsentVerifier(const MockUserConsentVerifier&) = delete;
+  MockUserConsentVerifier& operator=(const MockUserConsentVerifier&) = delete;
+};
+
+}  // namespace
+}  // namespace test
+}  // namespace local_auth_windows
+
+#endif  // PACKAGES_LOCAL_AUTH_LOCAL_AUTH_WINDOWS_WINDOWS_TEST_MOCKS_H_
