atproto explorer pdsls.dev
atproto tool

add ed25519 key detection

juli.ee a5a8a76e d813d590

verified
Changed files
+37 -5
src
utils
views
+1
package.json
···
"@atcute/lexicon-doc": "^2.0.4",
"@atcute/lexicon-resolver": "^0.1.5",
"@atcute/lexicons": "^1.2.5",
"@atcute/oauth-browser-client": "^2.0.1",
"@atcute/repo": "^0.1.0",
"@atcute/tangled": "^1.0.12",
···
"@atcute/lexicon-doc": "^2.0.4",
"@atcute/lexicon-resolver": "^0.1.5",
"@atcute/lexicons": "^1.2.5",
+
"@atcute/multibase": "^1.1.6",
"@atcute/oauth-browser-client": "^2.0.1",
"@atcute/repo": "^0.1.0",
"@atcute/tangled": "^1.0.12",
+3
pnpm-lock.yaml
···
'@atcute/lexicons':
specifier: ^1.2.5
version: 1.2.5
'@atcute/oauth-browser-client':
specifier: ^2.0.1
version: 2.0.1
···
'@atcute/lexicons':
specifier: ^1.2.5
version: 1.2.5
+
'@atcute/multibase':
+
specifier: ^1.1.6
+
version: 1.1.6
'@atcute/oauth-browser-client':
specifier: ^2.0.1
version: 2.0.1
+30
src/utils/key.ts
···
···
+
import { parseDidKey, parsePublicMultikey } from "@atcute/crypto";
+
import { fromBase58Btc } from "@atcute/multibase";
+
+
export const detectKeyType = (key: string): string => {
+
try {
+
return parsePublicMultikey(key).type;
+
} catch (e) {
+
try {
+
const bytes = fromBase58Btc(key.startsWith("z") ? key.slice(1) : key);
+
if (bytes.length >= 2) {
+
const type = (bytes[0] << 8) | bytes[1];
+
if (type === 0xed01) {
+
return "ed25519";
+
}
+
}
+
} catch {}
+
return "unknown";
+
}
+
};
+
+
export const detectDidKeyType = (key: string): string => {
+
try {
+
return parseDidKey(key).type;
+
} catch (e) {
+
if (key.startsWith("did:key:")) {
+
return detectKeyType(key.slice(8));
+
}
+
return "unknown";
+
}
+
};
+3 -5
src/views/repo.tsx
···
import { Client, CredentialManager } from "@atcute/client";
-
import { parseDidKey, parsePublicMultikey } from "@atcute/crypto";
import { DidDocument } from "@atcute/identity";
import { ActorIdentifier, Did, Handle, Nsid } from "@atcute/lexicons";
import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
···
resolvePDS,
validateHandle,
} from "../utils/api.js";
import { BlobView } from "./blob.jsx";
import { PlcLogView } from "./logs.jsx";
···
#{verif.id.split("#")[1]}
</span>
<span class="rounded bg-neutral-200 px-1 py-0.5 text-xs text-neutral-800 dark:bg-neutral-700 dark:text-neutral-300">
-
<ErrorBoundary fallback={<>unknown</>}>
-
{parsePublicMultikey(key()).type}
-
</ErrorBoundary>
</span>
</div>
<div class="font-mono break-all">{key()}</div>
···
{(key) => (
<div class="text-sm">
<span class="rounded bg-neutral-200 px-1 py-0.5 text-xs text-neutral-800 dark:bg-neutral-700 dark:text-neutral-300">
-
{parseDidKey(key).type}
</span>
<div class="font-mono break-all">{key.replace("did:key:", "")}</div>
</div>
···
import { Client, CredentialManager } from "@atcute/client";
import { DidDocument } from "@atcute/identity";
import { ActorIdentifier, Did, Handle, Nsid } from "@atcute/lexicons";
import { A, useLocation, useNavigate, useParams } from "@solidjs/router";
···
resolvePDS,
validateHandle,
} from "../utils/api.js";
+
import { detectDidKeyType, detectKeyType } from "../utils/key.js";
import { BlobView } from "./blob.jsx";
import { PlcLogView } from "./logs.jsx";
···
#{verif.id.split("#")[1]}
</span>
<span class="rounded bg-neutral-200 px-1 py-0.5 text-xs text-neutral-800 dark:bg-neutral-700 dark:text-neutral-300">
+
{detectKeyType(key())}
</span>
</div>
<div class="font-mono break-all">{key()}</div>
···
{(key) => (
<div class="text-sm">
<span class="rounded bg-neutral-200 px-1 py-0.5 text-xs text-neutral-800 dark:bg-neutral-700 dark:text-neutral-300">
+
{detectDidKeyType(key)}
</span>
<div class="font-mono break-all">{key.replace("did:key:", "")}</div>
</div>