Skip to content

Commit 6725c6f

Browse files
committed
sync aaguids automatically
1 parent 24c2e4c commit 6725c6f

4 files changed

Lines changed: 139 additions & 82 deletions

File tree

.github/workflows/sync-aaguids.yml

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
name: Sync AAGUIDs
2+
3+
on:
4+
schedule:
5+
- cron: '0 0 * * 1'
6+
workflow_dispatch:
7+
8+
permissions:
9+
contents: write
10+
pull-requests: write
11+
12+
jobs:
13+
sync:
14+
runs-on: ubuntu-latest
15+
16+
steps:
17+
- uses: actions/checkout@v4
18+
19+
- uses: shivammathur/setup-php@v2
20+
with:
21+
php-version: '8.2'
22+
23+
- run: php scripts/sync-aaguids.php
24+
25+
- uses: peter-evans/create-pull-request@v7
26+
with:
27+
title: 'Update AAGUID list'
28+
body: 'Automated sync from [passkey-authenticator-aaguids](https://github.com/passkeydeveloper/passkey-authenticator-aaguids).'
29+
branch: sync-aaguids
30+
commit-message: 'sync aaguids'
31+
delete-branch: true

resources/aaguids.json

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
{
2+
"a11a5faa-9f32-4b8c-8c5d-2f7d13e8c942": "AliasVault",
3+
"ea9b8d66-4d01-1d21-3ce4-b6b48cb575d4": "Google Password Manager",
4+
"adce0002-35bc-c60a-648b-0b25f1f05503": "Chrome on Mac",
5+
"08987058-cadc-4b81-b6e1-30de50dcbe96": "Windows Hello",
6+
"9ddd1817-af5a-4672-a2b9-3e3dd95000a9": "Windows Hello",
7+
"6028b017-b1d4-4c02-b4b3-afcdafc96bb2": "Windows Hello",
8+
"dd4ec289-e01d-41c9-bb89-70fa845d4bf2": "iCloud Keychain (Managed)",
9+
"531126d6-e717-415c-9320-3d9aa6981239": "Dashlane",
10+
"bada5566-a7aa-401f-bd96-45619a55120d": "1Password",
11+
"b84e4048-15dc-4dd0-8640-f4f60813c8af": "NordPass",
12+
"0ea242b4-43c4-4a1b-8b17-dd6d0b6baec6": "Keeper",
13+
"891494da-2c90-4d31-a9cd-4eab0aed1309": "Sésame",
14+
"f3809540-7f14-49c1-a8b3-8f813b225541": "Enpass",
15+
"b5397666-4885-aa6b-cebf-e52262a439a2": "Chromium Browser",
16+
"771b48fd-d3d4-4f74-9232-fc157ab0507a": "Edge on Mac",
17+
"39a5647e-1853-446c-a1f6-a79bae9f5bc7": "IDmelon",
18+
"d548826e-79b4-db40-a3d8-11116f7e8349": "Bitwarden",
19+
"fbfc3007-154e-4ecc-8c0b-6e020557d7bd": "Apple Passwords",
20+
"53414d53-554e-4700-0000-000000000000": "Samsung Pass",
21+
"66a0ccb3-bd6a-191f-ee06-e375c50b9846": "Thales Bio iOS SDK",
22+
"8836336a-f590-0921-301d-46427531eee6": "Thales Bio Android SDK",
23+
"cd69adb5-3c7a-deb9-3177-6800ea6cb72a": "Thales PIN Android SDK",
24+
"17290f1e-c212-34d0-1423-365d729f09d9": "Thales PIN iOS SDK",
25+
"50726f74-6f6e-5061-7373-50726f746f6e": "Proton Pass",
26+
"fdb141b2-5d84-443e-8a35-4698c205a502": "KeePassXC",
27+
"eaecdef2-1c31-5634-8639-f1cbd9c00a08": "KeePassDX",
28+
"cc45f64e-52a2-451b-831a-4edd8022a202": "ToothPic Passkey Provider",
29+
"bfc748bb-3429-4faa-b9f9-7cfa9f3b76d0": "iPasswords",
30+
"b35a26b2-8f6e-4697-ab1d-d44db4da28c6": "Zoho Vault",
31+
"b78a0a55-6ef8-d246-a042-ba0f6d55050c": "LastPass",
32+
"de503f9c-21a4-4f76-b4b7-558eb55c6f89": "Devolutions",
33+
"22248c4c-7a12-46e2-9a41-44291b373a4d": "LogMeOnce",
34+
"a10c6dd9-465e-4226-8198-c7c44b91c555": "Kaspersky Password Manager",
35+
"d350af52-0351-4ba2-acd3-dfeeadc3f764": "pwSafe",
36+
"d3452668-01fd-4c12-926c-83a4204853aa": "Microsoft Password Manager",
37+
"6d212b28-a2c1-4638-b375-5932070f62e9": "initial",
38+
"d49b2120-b865-4191-8cea-be84a52b0485": "Heimlane Vault",
39+
"e8b7f4a2-c3d5-e6f7-890a-b1c2d3e4f567": "Sherlocked",
40+
"d9be9d39-e6a6-4c28-a581-32b044d986e4": "Sticky Password Manager",
41+
"70617373-7761-6c6c-6669-646f32303236": "Passwall",
42+
"c9cadfc9-89a9-489e-a25a-c7e86a4d5f15": "Burp Suite Navigation Recorder"
43+
}

scripts/sync-aaguids.php

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
/**
6+
* Syncs the AAGUID list from the passkey-authenticator-aaguids repository.
7+
*
8+
* @see https://github.com/passkeydeveloper/passkey-authenticator-aaguids
9+
*/
10+
$source = 'https://raw.githubusercontent.com/passkeydeveloper/passkey-authenticator-aaguids/main/aaguid.json';
11+
$destination = __DIR__.'/../resources/aaguids.json';
12+
13+
$json = file_get_contents($source);
14+
15+
if ($json === false) {
16+
fwrite(STDERR, "Failed to fetch AAGUID list from {$source}\n");
17+
exit(1);
18+
}
19+
20+
$data = json_decode($json, true, flags: JSON_THROW_ON_ERROR);
21+
22+
$aaguids = array_map(fn (array $entry) => $entry['name'], $data);
23+
24+
file_put_contents(
25+
$destination,
26+
json_encode($aaguids, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_THROW_ON_ERROR)."\n",
27+
);
28+
29+
echo 'Synced '.count($aaguids)." AAGUIDs.\n";

src/Support/Aaguids.php

Lines changed: 36 additions & 82 deletions
Original file line numberDiff line numberDiff line change
@@ -9,96 +9,50 @@
99
*
1010
* @see https://github.com/passkeydeveloper/passkey-authenticator-aaguids
1111
*/
12-
enum Aaguids: string
12+
class Aaguids
1313
{
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;
9420

21+
/**
22+
* Get the authenticator label for the given AAGUID.
23+
*/
9524
public static function labelFor(string $aaguid): ?string
9625
{
97-
return self::tryFrom($aaguid)?->label();
26+
return static::all()[$aaguid] ?? null;
9827
}
9928

29+
/**
30+
* Get the unknown AAGUID value.
31+
*/
10032
public static function unknown(): string
10133
{
10234
return '00000000-0000-0000-0000-000000000000';
10335
}
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+
}
10458
}

0 commit comments

Comments
 (0)