|
9 | 9 | * |
10 | 10 | * @see https://github.com/passkeydeveloper/passkey-authenticator-aaguids |
11 | 11 | */ |
12 | | -enum Aaguids: string |
| 12 | +class Aaguids |
13 | 13 | { |
14 | | - case AliasVault = 'a11a5faa-9f32-4b8c-8c5d-2f7d13e8c942'; |
15 | | - case GooglePasswordManager = 'ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4'; |
16 | | - case ChromeOnMac = 'adce0002-35bc-c60a-648b-0b25f1f05503'; |
17 | | - case WindowsHello1 = '08987058-cadc-4b81-b6e1-30de50dcbe96'; |
18 | | - case WindowsHello2 = '9ddd1817-af5a-4672-a2b9-3e3dd95000a9'; |
19 | | - case WindowsHello3 = '6028b017-b1d4-4c02-b4b3-afcdafc96bb2'; |
20 | | - case ICloudKeychainManaged = 'dd4ec289-e01d-41c9-bb89-70fa845d4bf2'; |
21 | | - case Dashlane = '531126d6-e717-415c-9320-3d9aa6981239'; |
22 | | - case OnePassword = 'bada5566-a7aa-401f-bd96-45619a55120d'; |
23 | | - case NordPass = 'b84e4048-15dc-4dd0-8640-f4f60813c8af'; |
24 | | - case Keeper = '0ea242b4-43c4-4a1b-8b17-dd6d0b6baec6'; |
25 | | - case Sesame = '891494da-2c90-4d31-a9cd-4eab0aed1309'; |
26 | | - case Enpass = 'f3809540-7f14-49c1-a8b3-8f813b225541'; |
27 | | - case ChromiumBrowser = 'b5397666-4885-aa6b-cebf-e52262a439a2'; |
28 | | - case EdgeOnMac = '771b48fd-d3d4-4f74-9232-fc157ab0507a'; |
29 | | - case IDmelon = '39a5647e-1853-446c-a1f6-a79bae9f5bc7'; |
30 | | - case Bitwarden = 'd548826e-79b4-db40-a3d8-11116f7e8349'; |
31 | | - case ApplePasswords = 'fbfc3007-154e-4ecc-8c0b-6e020557d7bd'; |
32 | | - case SamsungPass = '53414d53-554e-4700-0000-000000000000'; |
33 | | - case ThalesBioIosSdk = '66a0ccb3-bd6a-191f-ee06-e375c50b9846'; |
34 | | - case ThalesBioAndroidSdk = '8836336a-f590-0921-301d-46427531eee6'; |
35 | | - case ThalesPinAndroidSdk = 'cd69adb5-3c7a-deb9-3177-6800ea6cb72a'; |
36 | | - case ThalesPinIosSdk = '17290f1e-c212-34d0-1423-365d729f09d9'; |
37 | | - case ProtonPass = '50726f74-6f6e-5061-7373-50726f746f6e'; |
38 | | - case KeePassXC = 'fdb141b2-5d84-443e-8a35-4698c205a502'; |
39 | | - case KeePassDX = 'eaecdef2-1c31-5634-8639-f1cbd9c00a08'; |
40 | | - case ToothPicPasskeyProvider = 'cc45f64e-52a2-451b-831a-4edd8022a202'; |
41 | | - case IPasswords = 'bfc748bb-3429-4faa-b9f9-7cfa9f3b76d0'; |
42 | | - case ZohoVault = 'b35a26b2-8f6e-4697-ab1d-d44db4da28c6'; |
43 | | - case LastPass = 'b78a0a55-6ef8-d246-a042-ba0f6d55050c'; |
44 | | - case Devolutions = 'de503f9c-21a4-4f76-b4b7-558eb55c6f89'; |
45 | | - case LogMeOnce = '22248c4c-7a12-46e2-9a41-44291b373a4d'; |
46 | | - case KasperskyPasswordManager = 'a10c6dd9-465e-4226-8198-c7c44b91c555'; |
47 | | - case PwSafe = 'd350af52-0351-4ba2-acd3-dfeeadc3f764'; |
48 | | - case MicrosoftPasswordManager = 'd3452668-01fd-4c12-926c-83a4204853aa'; |
49 | | - case Initial = '6d212b28-a2c1-4638-b375-5932070f62e9'; |
50 | | - case HeimlaneVault = 'd49b2120-b865-4191-8cea-be84a52b0485'; |
51 | | - |
52 | | - public function label(): string |
53 | | - { |
54 | | - return match ($this) { |
55 | | - self::AliasVault => 'AliasVault', |
56 | | - self::GooglePasswordManager => 'Google Password Manager', |
57 | | - self::ChromeOnMac => 'Chrome on Mac', |
58 | | - self::WindowsHello1, |
59 | | - self::WindowsHello2, |
60 | | - self::WindowsHello3 => 'Windows Hello', |
61 | | - self::ICloudKeychainManaged => 'iCloud Keychain (Managed)', |
62 | | - self::Dashlane => 'Dashlane', |
63 | | - self::OnePassword => '1Password', |
64 | | - self::NordPass => 'NordPass', |
65 | | - self::Keeper => 'Keeper', |
66 | | - self::Sesame => 'Sésame', |
67 | | - self::Enpass => 'Enpass', |
68 | | - self::ChromiumBrowser => 'Chromium Browser', |
69 | | - self::EdgeOnMac => 'Edge on Mac', |
70 | | - self::IDmelon => 'IDmelon', |
71 | | - self::Bitwarden => 'Bitwarden', |
72 | | - self::ApplePasswords => 'Apple Passwords', |
73 | | - self::SamsungPass => 'Samsung Pass', |
74 | | - self::ThalesBioIosSdk => 'Thales Bio iOS SDK', |
75 | | - self::ThalesBioAndroidSdk => 'Thales Bio Android SDK', |
76 | | - self::ThalesPinAndroidSdk => 'Thales PIN Android SDK', |
77 | | - self::ThalesPinIosSdk => 'Thales PIN iOS SDK', |
78 | | - self::ProtonPass => 'Proton Pass', |
79 | | - self::KeePassXC => 'KeePassXC', |
80 | | - self::KeePassDX => 'KeePassDX', |
81 | | - self::ToothPicPasskeyProvider => 'ToothPic Passkey Provider', |
82 | | - self::IPasswords => 'iPasswords', |
83 | | - self::ZohoVault => 'Zoho Vault', |
84 | | - self::LastPass => 'LastPass', |
85 | | - self::Devolutions => 'Devolutions', |
86 | | - self::LogMeOnce => 'LogMeOnce', |
87 | | - self::KasperskyPasswordManager => 'Kaspersky Password Manager', |
88 | | - self::PwSafe => 'pwSafe', |
89 | | - self::MicrosoftPasswordManager => 'Microsoft Password Manager', |
90 | | - self::Initial => 'initial', |
91 | | - self::HeimlaneVault => 'Heimlane Vault', |
92 | | - }; |
93 | | - } |
| 14 | + /** |
| 15 | + * The cached AAGUID to name mapping. |
| 16 | + * |
| 17 | + * @var array<string, string>|null |
| 18 | + */ |
| 19 | + protected static ?array $aaguids = null; |
94 | 20 |
|
| 21 | + /** |
| 22 | + * Get the authenticator label for the given AAGUID. |
| 23 | + */ |
95 | 24 | public static function labelFor(string $aaguid): ?string |
96 | 25 | { |
97 | | - return self::tryFrom($aaguid)?->label(); |
| 26 | + return static::all()[$aaguid] ?? null; |
98 | 27 | } |
99 | 28 |
|
| 29 | + /** |
| 30 | + * Get the unknown AAGUID value. |
| 31 | + */ |
100 | 32 | public static function unknown(): string |
101 | 33 | { |
102 | 34 | return '00000000-0000-0000-0000-000000000000'; |
103 | 35 | } |
| 36 | + |
| 37 | + /** |
| 38 | + * Get all AAGUID to name mappings. |
| 39 | + * |
| 40 | + * @return array<string, string> |
| 41 | + */ |
| 42 | + public static function all(): array |
| 43 | + { |
| 44 | + return static::$aaguids ??= json_decode( |
| 45 | + file_get_contents(__DIR__.'/../../resources/aaguids.json'), |
| 46 | + true, |
| 47 | + flags: JSON_THROW_ON_ERROR, |
| 48 | + ); |
| 49 | + } |
| 50 | + |
| 51 | + /** |
| 52 | + * Flush the cached AAGUIDs. |
| 53 | + */ |
| 54 | + public static function flush(): void |
| 55 | + { |
| 56 | + static::$aaguids = null; |
| 57 | + } |
104 | 58 | } |
0 commit comments