@pkistudio/asn1defsifter 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1 @@
1
+ :root{--ads-bg-start: #f5f7fa;--ads-bg: #e8edf3;--ads-window: #eef2f6;--ads-chrome-start: #ffffff;--ads-chrome: #eef3f8;--ads-chrome-glass: linear-gradient(180deg, rgb(255 255 255 / 66%), rgb(238 243 248 / 42%));--ads-panel: rgb(255 255 255 / 72%);--ads-panel-tint: rgb(247 249 252 / 54%);--ads-content: rgb(255 255 255 / 46%);--ads-card: rgb(255 255 255 / 68%);--ads-glass: linear-gradient(180deg, rgb(255 255 255 / 58%), rgb(247 249 252 / 34%));--ads-panel-border: #b9c4d0;--ads-control-border: #aab6c3;--ads-subtle-border: #d6dee6;--ads-text: #18212f;--ads-muted: #5d6b7c;--ads-danger: #a83232;--ads-hover-border: #81a9dc;--ads-hover-bg: #e6f2ff;--ads-selection: #e8f3ff;--ads-selection-border: #5d91cc;--ads-splitter: #8f9baa;--ads-shadow-dialog: 0 18px 50px rgb(15 23 42 / 28%);--ads-api-log-row-border: #edf0f4;--ads-api-log-operation: #1f4f86;color:var(--ads-text);background:linear-gradient(var(--ads-bg-start),var(--ads-bg));font-family:Tahoma,MS UI Gothic,Yu Gothic UI,system-ui,sans-serif;font-size:13px}@media(prefers-color-scheme:dark){:root{--ads-bg-start: #242a33;--ads-bg: #171b22;--ads-window: rgb(37 43 52 / 72%);--ads-chrome-start: #303743;--ads-chrome: #252c36;--ads-chrome-glass: linear-gradient(180deg, rgb(48 55 67 / 54%), rgb(37 44 54 / 34%));--ads-panel: rgb(37 43 52 / 56%);--ads-panel-tint: rgb(26 31 39 / 42%);--ads-content: rgb(20 24 31 / 36%);--ads-card: rgb(43 50 60 / 58%);--ads-glass: linear-gradient(180deg, rgb(48 55 67 / 48%), rgb(25 30 38 / 26%));--ads-panel-border: #4f5a68;--ads-control-border: #657180;--ads-subtle-border: rgb(119 132 150 / 42%);--ads-text: #e7ebf1;--ads-muted: #aab3c1;--ads-danger: #ff9c9c;--ads-hover-border: #81a9dc;--ads-hover-bg: rgb(74 102 135 / 42%);--ads-selection: rgb(47 88 126 / 62%);--ads-selection-border: #6ea5da;--ads-splitter: #6b7786;--ads-api-log-row-border: rgb(119 132 150 / 26%);--ads-api-log-operation: #9ec9ff}}.ads-shell{color:var(--ads-text)}.ads-shell[data-theme=dark]{--ads-bg-start: #242a33;--ads-bg: #171b22;--ads-window: rgb(37 43 52 / 72%);--ads-chrome-start: #303743;--ads-chrome: #252c36;--ads-chrome-glass: linear-gradient(180deg, rgb(48 55 67 / 54%), rgb(37 44 54 / 34%));--ads-panel: rgb(37 43 52 / 56%);--ads-panel-tint: rgb(26 31 39 / 42%);--ads-content: rgb(20 24 31 / 36%);--ads-card: rgb(43 50 60 / 58%);--ads-glass: linear-gradient(180deg, rgb(48 55 67 / 48%), rgb(25 30 38 / 26%));--ads-panel-border: #4f5a68;--ads-control-border: #657180;--ads-subtle-border: rgb(119 132 150 / 42%);--ads-text: #e7ebf1;--ads-muted: #aab3c1;--ads-danger: #ff9c9c;--ads-hover-border: #81a9dc;--ads-hover-bg: rgb(74 102 135 / 42%);--ads-selection: rgb(47 88 126 / 62%);--ads-selection-border: #6ea5da;--ads-splitter: #6b7786;--ads-api-log-row-border: rgb(119 132 150 / 26%);--ads-api-log-operation: #9ec9ff}*{box-sizing:border-box}html,body{width:100%;height:100%;min-height:0;overflow-x:auto;overflow-y:hidden}body{margin:0;min-width:var(--ads-app-min-width, 640px)}#app{width:100%;height:100dvh;min-width:var(--ads-app-min-width, 640px);min-height:0}button{min-height:0;border:1px solid transparent;border-radius:3px;padding:4px 10px;color:var(--ads-text);background:transparent;font:inherit;cursor:pointer}button:hover,button:focus-visible{border-color:var(--ads-hover-border);background:var(--ads-hover-bg);outline:none}.ads-shell{display:grid;grid-template-rows:auto minmax(220px,1fr) 6px minmax(150px,var(--ads-selected-height, 30vh)) 6px minmax(86px,var(--ads-api-log-height, 156px));width:100%;height:100%;min-width:var(--ads-app-min-width, 640px);min-height:0;overflow:hidden;background:linear-gradient(var(--ads-bg-start),var(--ads-bg))}.ads-shell.ads-resizing-rows{cursor:row-resize;-webkit-user-select:none;user-select:none}.ads-shell.ads-resizing-columns{cursor:col-resize;-webkit-user-select:none;user-select:none}.ads-toolbar{display:flex;align-items:center;justify-content:flex-start;gap:8px;border:1px solid var(--ads-panel-border);border-bottom:0;padding:4px;background:var(--ads-chrome-glass)}.ads-toolbar strong{margin:0;padding:4px 8px;font-size:13px;font-weight:700}.ads-workspace{display:grid;grid-template-columns:minmax(280px,var(--ads-viewer-width, 42%)) 6px minmax(320px,1fr);gap:0;min-height:0;overflow:hidden;border:1px solid var(--ads-panel-border);border-bottom:0;padding:8px 8px 6px;background:var(--ads-window)}.ads-pane,.ads-viewer-pane,.ads-log-pane{display:flex;flex-direction:column;min-width:0;min-height:0;border:1px solid var(--ads-panel-border);border-radius:3px;background:var(--ads-glass);overflow:hidden}.ads-viewer-pane{flex:1 1 auto;margin-right:6px;border:0;border-radius:0;background:transparent}.ads-candidate-pane{margin-left:6px;border:0;border-radius:0;background:transparent}.ads-candidate-pane .ads-pane-content{border:0;background:transparent}.ads-pane-menu,.ads-log-menu{display:flex;align-items:center;gap:2px;min-height:0;padding:4px;border-bottom:1px solid var(--ads-subtle-border);color:var(--ads-text);background:linear-gradient(var(--ads-chrome-start),var(--ads-chrome))}.ads-pane-menu strong,.ads-log-menu strong{margin-right:auto;padding:4px 6px;font-size:12px;font-weight:650;letter-spacing:0}.ads-log-menu{justify-content:flex-end;min-height:32px;padding:0 6px 4px;border-bottom:0;background:transparent}.ads-log-menu button{min-height:24px;border-color:transparent;padding:2px 8px;background:transparent}.ads-log-menu button:hover,.ads-log-menu button:focus-visible{border-color:var(--ads-hover-border);background:var(--ads-hover-bg);outline:none}.ads-pane-content{flex:1 1 auto;min-height:0;overflow:auto;margin:8px;border:1px solid var(--ads-subtle-border);border-radius:3px;background:var(--ads-content);padding:10px}.ads-input-viewer{flex:1 1 auto;width:100%;height:100%;min-height:0;overflow:hidden;background:transparent}.ads-workspace-resizer{min-width:6px;border:1px solid transparent;border-radius:3px;background:linear-gradient(90deg,transparent 0 2px,var(--ads-splitter) 2px 3px,transparent 3px 6px);cursor:col-resize}.ads-workspace-resizer:hover,.ads-workspace-resizer:focus-visible,.ads-shell.ads-resizing-columns .ads-workspace-resizer{border-color:var(--ads-hover-border);background-color:var(--ads-hover-bg);outline:none}.ads-notice{flex:0 0 auto;width:100%;min-height:28px;padding:4px 10px 6px;border-top:0;color:var(--ads-muted);background:transparent;font-size:12px;line-height:1.35}.ads-tree{background:var(--ads-content)}.ads-candidate-split{display:flex;flex-direction:column;flex:1 1 auto;min-height:0}.ads-tree-node{margin:0 0 6px}.ads-tree-node summary{position:relative;display:grid;grid-template-columns:12px 18px minmax(0,1fr) auto;gap:5px;align-items:center;min-height:32px;border:1px solid var(--ads-subtle-border);border-radius:3px;padding:5px 8px;background:var(--ads-card);cursor:pointer}.ads-tree-node summary::marker,.ads-tree-node summary::-webkit-details-marker{display:none;content:""}.ads-tree-item{display:grid;grid-template-columns:12px 18px minmax(0,1fr) auto;gap:5px;align-items:center;width:100%;min-height:32px;margin:0 0 6px;border:1px solid var(--ads-subtle-border);border-radius:3px;padding:5px 8px;background:var(--ads-card);text-align:left}.ads-tree-alternatives{position:absolute;top:calc(100% + 2px);left:28px;right:8px;z-index:20;max-height:220px;overflow:auto;border:1px solid var(--ads-panel-border);border-radius:3px;padding:4px;background:var(--ads-panel);box-shadow:0 8px 18px #1e293b29}.ads-tree-alternatives[hidden]{display:none}.ads-tree-alternatives .ads-tree-item{grid-template-columns:14px minmax(0,1fr) auto;margin:0;border-color:transparent;box-shadow:none}.ads-tree-alternatives .ads-tree-item:hover,.ads-tree-alternatives .ads-tree-item:focus-visible{border-color:#b6d5f0;background:var(--ads-hover-bg)}.ads-tree-checkmark{display:inline-flex;align-items:center;justify-content:center;width:14px;color:#1f6f43;font-weight:700}.ads-disclosure{display:inline-flex;align-items:center;justify-content:center;width:11px;height:11px;border:1px solid #7f8b97;color:var(--ads-text);background:var(--ads-panel);font-size:10px;line-height:1}.ads-disclosure:before{content:""}details:not([open])>summary>.ads-disclosure:before{content:"+"}details[open]>summary>.ads-disclosure:before{content:"-"}.ads-disclosure-hidden{border-color:transparent;background:transparent;visibility:hidden}.ads-tree-icon{position:relative;display:inline-block;width:16px;height:14px}.ads-tree-icon-branch:before{position:absolute;top:1px;left:1px;width:7px;height:4px;border:1px solid #c29018;border-bottom:0;background:#ffd35a;content:""}.ads-tree-icon-branch:after{position:absolute;top:4px;left:0;width:15px;height:9px;border:1px solid #c29018;background:#ffc83d;content:""}.ads-tree-icon-leaf:before{position:absolute;top:1px;left:3px;width:10px;height:12px;border:1px solid #9ca7b3;background:var(--ads-panel);box-shadow:inset -3px 3px #eef2f6;content:""}.ads-tree-selected{border-color:var(--ads-selection-border)!important;background:var(--ads-selection)!important}.ads-subtree-node summary{background:color-mix(in srgb,var(--ads-panel) 94%,var(--ads-text) 6%)}.ads-candidate-node summary{background:var(--ads-card)}.ads-tree-label{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:600}.ads-tree-note{color:var(--ads-muted);font-size:12px;white-space:nowrap}.ads-tree-children{margin:6px 0 0 14px;padding-left:10px;border-left:1px solid var(--ads-subtle-border)}.ads-selected-pane{display:flex;flex-direction:column;min-width:0;min-height:0;border:0;border-radius:0;background:transparent;overflow:hidden}.ads-selected-header{display:grid;grid-template-columns:auto minmax(0,1fr) auto;gap:10px;align-items:center;min-height:34px;padding:4px;border:1px solid var(--ads-subtle-border);border-radius:3px;background:var(--ads-chrome-glass);font-size:12px}.ads-selected-header strong{padding:4px 6px}.ads-selected-header span{overflow:hidden;color:var(--ads-muted);text-overflow:ellipsis;white-space:nowrap}.ads-selected-header button{min-height:24px;padding:2px 8px}.ads-selected-detail{display:flex;flex:1 1 auto;flex-wrap:wrap;gap:8px;align-content:start;min-height:0;overflow-y:auto;overflow-x:hidden;margin:8px;border:0;border-radius:0;padding:10px;color:var(--ads-muted);background:transparent}.ads-key-value{flex:0 1 max-content;min-width:0;max-width:100%;border:1px solid var(--ads-subtle-border);border-radius:3px;background:var(--ads-card)}.ads-key-value h3{margin:0;padding:6px 8px;border-bottom:1px solid var(--ads-subtle-border);color:var(--ads-text);font-size:12px;white-space:nowrap}.ads-key-value pre{margin:0;padding:8px;overflow:visible;white-space:pre;overflow-wrap:normal;color:var(--ads-text);font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.45}.ads-key-value-bytes pre{white-space:pre-wrap;overflow-wrap:anywhere}.ads-key-value-bytes{flex:1 1 calc(14ch + 18px);min-width:calc(14ch + 18px)}.ads-api-log{display:grid;align-content:start;flex:1 1 auto;min-width:0;min-height:0;margin:0;overflow:auto;padding:5px 6px;color:var(--ads-text);background:transparent;font-family:Consolas,Courier New,monospace;font-size:12px;line-height:1.35;list-style:none}.ads-api-log-entry{display:grid;grid-template-columns:174px minmax(150px,220px) minmax(0,1fr);gap:8px;align-items:baseline;min-width:0;padding:2px 0;border-bottom:1px solid var(--ads-api-log-row-border)}.ads-api-log-entry time{color:var(--ads-muted)}.ads-api-log-operation{color:var(--ads-api-log-operation);overflow-wrap:anywhere}.ads-api-log-detail{min-width:0;overflow-wrap:anywhere}.ads-api-log-entry.success .ads-api-log-operation{color:#1f6f43}.ads-api-log-entry.warning .ads-api-log-operation,.ads-api-log-entry.warning .ads-api-log-detail{color:#806000}.ads-api-log-entry.error .ads-api-log-operation,.ads-api-log-entry.error .ads-api-log-detail{color:var(--ads-danger)}.ads-log-pane{border:0;border-radius:0;background:var(--ads-window)}.ads-selected-pane-resizer,.ads-api-log-resizer{min-height:6px;border:1px solid transparent;border-radius:3px;background:linear-gradient(0deg,transparent 0 2px,var(--ads-splitter) 2px 3px,transparent 3px 6px);cursor:row-resize}.ads-selected-pane-resizer:hover,.ads-selected-pane-resizer:focus-visible,.ads-api-log-resizer:hover,.ads-api-log-resizer:focus-visible,.ads-shell.ads-resizing-rows .ads-selected-pane-resizer,.ads-shell.ads-resizing-rows .ads-api-log-resizer{border-color:var(--ads-hover-border);background-color:var(--ads-hover-bg);outline:none}.ads-about-dialog{width:min(380px,calc(100% - 32px));margin:auto;border:1px solid var(--ads-panel-border);border-radius:4px;padding:0;color:var(--ads-text);background:var(--ads-panel);box-shadow:var(--ads-shadow-dialog)}.ads-about-dialog::backdrop{background:#0f172a47}.ads-about-panel{display:grid;gap:12px;padding:14px}.ads-about-panel p{margin:0;color:var(--ads-muted);font-size:12px;line-height:1.45}.ads-about-name{font-weight:700}.ads-about-module{margin-top:2px;color:var(--ads-muted);font-size:12px}.ads-about-panel form{display:flex;justify-content:flex-end;margin:0}@media(max-width:640px){.ads-shell{grid-template-rows:auto minmax(220px,1fr) 6px minmax(160px,var(--ads-selected-height, 32vh)) 6px minmax(86px,var(--ads-api-log-height, 180px))}.ads-workspace{grid-template-columns:1fr;grid-template-rows:minmax(220px,42%) minmax(260px,1fr);overflow:auto}.ads-workspace-resizer{display:none}.ads-viewer-pane,.ads-candidate-pane{margin:0}.ads-api-log-entry{grid-template-columns:174px minmax(0,1fr)}.ads-api-log-detail{grid-column:1 / -1}}
@@ -0,0 +1,2 @@
1
+ import type { SchemaCorpus } from '../core/types.js';
2
+ export declare function parseAsn1DefinitionCorpus(sources: string | string[]): SchemaCorpus;
@@ -0,0 +1,23 @@
1
+ import type { TlvNode } from '../core/types.js';
2
+ interface PkiStudioLikeNode {
3
+ id?: string;
4
+ tagClass?: string | number;
5
+ className?: string;
6
+ tagNumber?: number;
7
+ tag?: number;
8
+ tagName?: string;
9
+ constructed?: boolean;
10
+ isConstructed?: boolean;
11
+ valueBytes?: Uint8Array | number[];
12
+ contentBytes?: Uint8Array | number[];
13
+ bytes?: Uint8Array | number[];
14
+ value?: unknown;
15
+ oid?: string;
16
+ oidValue?: string;
17
+ children?: PkiStudioLikeNode[];
18
+ start?: number;
19
+ end?: number;
20
+ }
21
+ export declare function parseInputToTlvNodes(input: unknown, options?: Record<string, unknown>): Promise<TlvNode[]>;
22
+ export declare function pkistudioNodeToTlvNode(node: PkiStudioLikeNode): TlvNode;
23
+ export {};
@@ -0,0 +1,32 @@
1
+ import './styles.css';
2
+ import { type CandidateReport } from './core/index.js';
3
+ export type AppTheme = 'light' | 'dark';
4
+ export type Asn1DefinitionSifterAppOptions = {
5
+ mount?: string | Element;
6
+ theme?: AppTheme;
7
+ viewer?: {
8
+ oidResolver?: PkiStudioOidResolverApi | ((oid: string) => string);
9
+ newWindowUrl?: string;
10
+ };
11
+ };
12
+ export type Asn1DefinitionSifterAppInstance = {
13
+ readonly report: CandidateReport | null;
14
+ readonly sourceName: string | null;
15
+ loadBytes: (bytes: Uint8Array, sourceName?: string) => Promise<void>;
16
+ loadHex: (hex: string, sourceName?: string) => Promise<void>;
17
+ close: () => void;
18
+ };
19
+ type PkiStudioOidResolverApi = {
20
+ names: Record<string, string>;
21
+ resolve: (oid: string) => string;
22
+ create: (extraNames?: Record<string, string>) => PkiStudioOidResolverApi;
23
+ };
24
+ declare global {
25
+ interface Window {
26
+ Asn1DefinitionSifter?: {
27
+ init: typeof initAsn1DefinitionSifter;
28
+ };
29
+ }
30
+ }
31
+ export declare function initAsn1DefinitionSifter(options?: Asn1DefinitionSifterAppOptions): Asn1DefinitionSifterAppInstance;
32
+ export {};
@@ -0,0 +1,2 @@
1
+ import type { AnnotatedNode, Candidate, TlvNode } from './types.js';
2
+ export declare function createAnnotatedTree(node: TlvNode, candidate?: Candidate): AnnotatedNode[];
@@ -0,0 +1,2 @@
1
+ import type { Candidate, CandidateOptions, TlvNode } from './types.js';
2
+ export declare function findAsn1Candidates(node: TlvNode, options: CandidateOptions): Candidate[];
@@ -0,0 +1,3 @@
1
+ import type { SchemaCandidateTarget, SchemaCorpus, SchemaCorpusInput } from './types.js';
2
+ export declare function createSchemaCorpus(input: SchemaCorpusInput): SchemaCorpus;
3
+ export declare function listSchemaTargets(corpusInput: SchemaCorpusInput): SchemaCandidateTarget[];
@@ -0,0 +1,2 @@
1
+ import type { CandidateOptions, DocumentHypothesis, TlvNode } from './types.js';
2
+ export declare function identifyAsn1Document(node: TlvNode, options: CandidateOptions): DocumentHypothesis[];
@@ -0,0 +1,2 @@
1
+ import type { TlvFeatures, TlvNode } from './types.js';
2
+ export declare function extractDerFeatures(node: TlvNode): TlvFeatures;
@@ -0,0 +1,18 @@
1
+ export { createAnnotatedTree } from './annotated-tree.js';
2
+ export { findAsn1Candidates } from './candidates.js';
3
+ export { createSchemaCorpus, listSchemaTargets } from './corpus.js';
4
+ export { identifyAsn1Document } from './document.js';
5
+ export { extractDerFeatures } from './features.js';
6
+ export { matchType } from './matcher.js';
7
+ export { clampScore, confidenceFromScore } from './scoring.js';
8
+ export { describeNodeTag, getNodeTagName } from './tags.js';
9
+ export { parseAsn1DefinitionCorpus } from '../adapters/asn1instancebuilder.js';
10
+ export { parseInputToTlvNodes, pkistudioNodeToTlvNode } from '../adapters/pkistudiojs.js';
11
+ export { createPkiComponentCorpus, pkiComponentDefinition } from '../corpus/pki-components.js';
12
+ export { getPkiProfileTypeNames, pkiProfileTypeNames } from '../profiles/pki.js';
13
+ export { createPkiCandidateReport, createPkiCandidateReportFromNodes } from '../profiles/pki-report.js';
14
+ export { createCandidateReport, createCandidateReportFromNodes } from '../report/agent-report.js';
15
+ export type { PkiProfileName } from '../profiles/pki.js';
16
+ export type { PkiCandidateReportOptions } from '../profiles/pki-report.js';
17
+ export type { AnnotatedNode, Candidate, CandidateConfidence, CandidateContext, CandidateOptions, CandidateReport, CandidateReportCandidateSummary, CandidateReportOptions, CandidateReportRoot, CandidateReportSubtree, CandidateReportSummary, Diagnostic, DiagnosticSeverity, DocumentHypothesis, EvidenceItem, MatchedPath, MatchResult, SchemaCandidateTarget, SchemaCorpus, SchemaCorpusInput, TlvFeatures, TlvNode, TlvTagClass } from './types.js';
18
+ export type { Asn1Field, Asn1SchemaModule, Asn1Type, Asn1TypeDefinition } from './types.js';
@@ -0,0 +1,2 @@
1
+ import type { Asn1SchemaModule, Asn1Type, MatchResult, TlvNode } from './types.js';
2
+ export declare function matchType(node: TlvNode, type: Asn1Type, schema: Asn1SchemaModule, schemaPath: string, nodePath?: string): MatchResult;
@@ -0,0 +1,3 @@
1
+ import type { CandidateConfidence } from './types.js';
2
+ export declare function clampScore(score: number): number;
3
+ export declare function confidenceFromScore(score: number): CandidateConfidence;
@@ -0,0 +1,4 @@
1
+ import type { TlvNode } from './types.js';
2
+ export declare function getNodeTagName(node: TlvNode): string;
3
+ export declare function describeNodeTag(node: TlvNode): string;
4
+ export declare function universalTagForPrimitive(kind: string): number | undefined;
@@ -0,0 +1,153 @@
1
+ import type { Asn1SchemaModule, Asn1TypeDefinition } from '@pkistudio/asn1instancebuilder';
2
+ export type TlvTagClass = 'universal' | 'application' | 'context' | 'private';
3
+ export type UniversalTagName = 'BOOLEAN' | 'INTEGER' | 'BIT STRING' | 'OCTET STRING' | 'NULL' | 'OBJECT IDENTIFIER' | 'UTF8String' | 'SEQUENCE' | 'SET' | 'PrintableString' | 'IA5String' | 'UTCTime' | 'GeneralizedTime' | string;
4
+ export interface TlvNode {
5
+ id?: string;
6
+ tagClass: TlvTagClass;
7
+ tagNumber: number;
8
+ constructed: boolean;
9
+ tagName?: UniversalTagName;
10
+ valueBytes?: Uint8Array;
11
+ encodedBytes?: Uint8Array;
12
+ value?: unknown;
13
+ oid?: string;
14
+ oidName?: string;
15
+ children?: TlvNode[];
16
+ start?: number;
17
+ end?: number;
18
+ }
19
+ export interface TlvFeatures {
20
+ tagClass: TlvTagClass;
21
+ tagNumber: number;
22
+ constructed: boolean;
23
+ tagName: string;
24
+ childCount: number;
25
+ childTagSequence: string[];
26
+ oidValues: string[];
27
+ oidNames: string[];
28
+ primitiveValueKind?: string;
29
+ valueLength?: number;
30
+ }
31
+ export type CandidateConfidence = 'low' | 'medium' | 'high';
32
+ export type DiagnosticSeverity = 'info' | 'warning' | 'error';
33
+ export interface Diagnostic {
34
+ severity: DiagnosticSeverity;
35
+ path: string;
36
+ message: string;
37
+ }
38
+ export interface EvidenceItem {
39
+ path: string;
40
+ message: string;
41
+ }
42
+ export interface MatchedPath {
43
+ nodePath: string;
44
+ schemaPath: string;
45
+ }
46
+ export interface Candidate {
47
+ typeName: string;
48
+ moduleName?: string;
49
+ score: number;
50
+ confidence: CandidateConfidence;
51
+ evidence: string[];
52
+ diagnostics: Diagnostic[];
53
+ ambiguities: string[];
54
+ matchedPaths: MatchedPath[];
55
+ }
56
+ export interface CandidateOptions {
57
+ schemaCorpus: SchemaCorpusInput;
58
+ maxResults?: number;
59
+ minScore?: number;
60
+ includeTypes?: string[];
61
+ excludeTypes?: string[];
62
+ context?: CandidateContext;
63
+ }
64
+ export interface CandidateContext {
65
+ parentType?: string;
66
+ fieldPath?: string;
67
+ knownOids?: Record<string, string>;
68
+ }
69
+ export interface SchemaCorpus {
70
+ modules: Asn1SchemaModule[];
71
+ }
72
+ export type SchemaCorpusInput = SchemaCorpus | Asn1SchemaModule | Asn1SchemaModule[];
73
+ export interface SchemaCandidateTarget {
74
+ module: Asn1SchemaModule;
75
+ definition: Asn1TypeDefinition;
76
+ }
77
+ export interface MatchResult {
78
+ score: number;
79
+ possible: boolean;
80
+ evidence: EvidenceItem[];
81
+ diagnostics: Diagnostic[];
82
+ ambiguities: string[];
83
+ matchedPaths: MatchedPath[];
84
+ }
85
+ export interface AnnotatedNode {
86
+ id?: string;
87
+ tagName: string;
88
+ asn1Type?: string;
89
+ fieldName?: string;
90
+ schemaPath?: string;
91
+ start?: number;
92
+ end?: number;
93
+ children: AnnotatedNode[];
94
+ }
95
+ export interface DocumentHypothesis {
96
+ rootType: string;
97
+ moduleName?: string;
98
+ score: number;
99
+ confidence: CandidateConfidence;
100
+ evidence: string[];
101
+ diagnostics: Diagnostic[];
102
+ annotatedTree: AnnotatedNode[];
103
+ alternatives: Candidate[];
104
+ }
105
+ export interface CandidateReportOptions {
106
+ schemaCorpus?: SchemaCorpusInput;
107
+ maxResults?: number;
108
+ minScore?: number;
109
+ includeTypes?: string[];
110
+ excludeTypes?: string[];
111
+ parseOptions?: Record<string, unknown>;
112
+ includeNodes?: boolean;
113
+ includeSubtrees?: boolean;
114
+ includeEmptySubtrees?: boolean;
115
+ maxSubtreeDepth?: number;
116
+ maxSubtreeReports?: number;
117
+ }
118
+ export interface CandidateReportRoot {
119
+ index: number;
120
+ node?: TlvNode;
121
+ features: TlvFeatures;
122
+ summary: CandidateReportSummary;
123
+ candidates: Candidate[];
124
+ hypotheses: DocumentHypothesis[];
125
+ diagnostics: Diagnostic[];
126
+ ambiguities: string[];
127
+ subtrees?: CandidateReportSubtree[];
128
+ }
129
+ export interface CandidateReportSubtree {
130
+ path: string;
131
+ node?: TlvNode;
132
+ features: TlvFeatures;
133
+ summary: CandidateReportSummary;
134
+ candidates: Candidate[];
135
+ diagnostics: Diagnostic[];
136
+ ambiguities: string[];
137
+ }
138
+ export interface CandidateReportSummary {
139
+ candidateCount: number;
140
+ bestCandidate?: CandidateReportCandidateSummary;
141
+ diagnosticCounts: Record<DiagnosticSeverity, number>;
142
+ ambiguityCount: number;
143
+ }
144
+ export interface CandidateReportCandidateSummary {
145
+ typeName: string;
146
+ moduleName?: string;
147
+ score: number;
148
+ confidence: CandidateConfidence;
149
+ }
150
+ export interface CandidateReport {
151
+ roots: CandidateReportRoot[];
152
+ }
153
+ export type { Asn1Field, Asn1SchemaModule, Asn1Type, Asn1TypeDefinition } from '@pkistudio/asn1instancebuilder';
@@ -0,0 +1 @@
1
+ export * from './core/index.js';
@@ -0,0 +1,3 @@
1
+ import type { SchemaCorpus } from '../core/types.js';
2
+ export declare const pkiComponentDefinition = "PkiComponents DEFINITIONS EXPLICIT TAGS ::= BEGIN\nVersion ::= INTEGER { v1(0), v2(1), v3(2) }\nCertificateSerialNumber ::= INTEGER\nAlgorithmIdentifier ::= SEQUENCE {\n algorithm OBJECT IDENTIFIER,\n parameters CHOICE { null NULL, namedCurve OBJECT IDENTIFIER } OPTIONAL\n}\nAttributeTypeAndValue ::= SEQUENCE {\n type OBJECT IDENTIFIER,\n value DirectoryString\n}\nDirectoryString ::= CHOICE {\n utf8String UTF8String,\n printableString PrintableString,\n ia5String IA5String\n}\nRelativeDistinguishedName ::= SET OF AttributeTypeAndValue\nRDNSequence ::= SEQUENCE OF RelativeDistinguishedName\nName ::= CHOICE {\n rdnSequence RDNSequence\n}\nTime ::= CHOICE {\n utcTime UTCTime,\n generalizedTime GeneralizedTime\n}\nValidity ::= SEQUENCE {\n notBefore Time,\n notAfter Time\n}\nSubjectPublicKeyInfo ::= SEQUENCE {\n algorithm AlgorithmIdentifier,\n subjectPublicKey BIT STRING\n}\nRSAPublicKey ::= SEQUENCE {\n modulus INTEGER,\n publicExponent INTEGER\n}\nDSA-Sig-Value ::= SEQUENCE {\n r INTEGER,\n s INTEGER\n}\nECDSA-Sig-Value ::= SEQUENCE {\n r INTEGER,\n s INTEGER\n}\nSignatureValue ::= BIT STRING\nExtension ::= SEQUENCE {\n extnID OBJECT IDENTIFIER,\n critical BOOLEAN DEFAULT FALSE,\n extnValue OCTET STRING\n}\nExtensions ::= SEQUENCE OF Extension\nTBSCertificate ::= SEQUENCE {\n version [0] EXPLICIT Version DEFAULT v1,\n serialNumber CertificateSerialNumber,\n signature AlgorithmIdentifier,\n issuer Name,\n validity Validity,\n subject Name,\n subjectPublicKeyInfo SubjectPublicKeyInfo,\n issuerUniqueID [1] IMPLICIT BIT STRING OPTIONAL,\n subjectUniqueID [2] IMPLICIT BIT STRING OPTIONAL,\n extensions [3] EXPLICIT Extensions OPTIONAL\n}\nCertificate ::= SEQUENCE {\n tbsCertificate TBSCertificate,\n signatureAlgorithm AlgorithmIdentifier,\n signatureValue SignatureValue\n}\nCertificationRequestInfo ::= SEQUENCE {\n version INTEGER,\n subject Name,\n subjectPKInfo SubjectPublicKeyInfo,\n attributes [0] IMPLICIT SET OF AttributeTypeAndValue OPTIONAL\n}\nCertificationRequest ::= SEQUENCE {\n certificationRequestInfo CertificationRequestInfo,\n signatureAlgorithm AlgorithmIdentifier,\n signature SignatureValue\n}\nPrivateKeyInfo ::= SEQUENCE {\n version INTEGER,\n privateKeyAlgorithm AlgorithmIdentifier,\n privateKey OCTET STRING,\n attributes [0] IMPLICIT SET OF AttributeTypeAndValue OPTIONAL\n}\nContentInfo ::= SEQUENCE {\n contentType OBJECT IDENTIFIER,\n content [0] EXPLICIT OCTET STRING OPTIONAL\n}\nEND";
3
+ export declare function createPkiComponentCorpus(): SchemaCorpus;
@@ -0,0 +1 @@
1
+ export * from './core/index.js';
@@ -0,0 +1,8 @@
1
+ import type { CandidateReport, CandidateReportOptions, TlvNode } from '../core/types.js';
2
+ import { type PkiProfileName } from './pki.js';
3
+ export interface PkiCandidateReportOptions extends Omit<CandidateReportOptions, 'schemaCorpus' | 'includeTypes'> {
4
+ profiles?: PkiProfileName | PkiProfileName[];
5
+ includeTypes?: string[];
6
+ }
7
+ export declare function createPkiCandidateReport(input: unknown, options?: PkiCandidateReportOptions): Promise<CandidateReport>;
8
+ export declare function createPkiCandidateReportFromNodes(nodes: TlvNode | TlvNode[], options?: PkiCandidateReportOptions): CandidateReport;
@@ -0,0 +1,3 @@
1
+ export type PkiProfileName = 'components' | 'x509' | 'pkcs10' | 'pkcs8' | 'cms';
2
+ export declare const pkiProfileTypeNames: Record<PkiProfileName, string[]>;
3
+ export declare function getPkiProfileTypeNames(profiles: PkiProfileName | PkiProfileName[]): string[];
@@ -0,0 +1,3 @@
1
+ import type { CandidateReport, CandidateReportOptions, TlvNode } from '../core/types.js';
2
+ export declare function createCandidateReport(input: unknown, options?: CandidateReportOptions): Promise<CandidateReport>;
3
+ export declare function createCandidateReportFromNodes(nodes: TlvNode | TlvNode[], options?: CandidateReportOptions): CandidateReport;
@@ -0,0 +1 @@
1
+ export {};
package/package.json ADDED
@@ -0,0 +1,74 @@
1
+ {
2
+ "name": "@pkistudio/asn1defsifter",
3
+ "version": "0.1.0",
4
+ "description": "Explainable ASN.1 definition candidate resolver for DER fragments.",
5
+ "type": "module",
6
+ "main": "./dist/index.js",
7
+ "module": "./dist/index.js",
8
+ "types": "./dist/types/index.d.ts",
9
+ "license": "MIT",
10
+ "files": [
11
+ "dist",
12
+ "README.md",
13
+ "LICENSE"
14
+ ],
15
+ "exports": {
16
+ ".": {
17
+ "types": "./dist/types/index.d.ts",
18
+ "import": "./dist/index.js"
19
+ },
20
+ "./core": {
21
+ "types": "./dist/types/core.d.ts",
22
+ "import": "./dist/core.js"
23
+ },
24
+ "./app": {
25
+ "types": "./dist/types/app.d.ts",
26
+ "import": "./dist/app.js"
27
+ },
28
+ "./styles.css": "./dist/styles.css"
29
+ },
30
+ "sideEffects": [
31
+ "*.css"
32
+ ],
33
+ "scripts": {
34
+ "clean": "node -e \"require('node:fs').rmSync('dist',{recursive:true,force:true})\"",
35
+ "dev": "vite --host 0.0.0.0",
36
+ "build": "npm run clean && npm run build:types && npm run build:lib",
37
+ "build:pages": "vite build -c vite.pages.config.ts",
38
+ "build:lib": "vite build",
39
+ "build:types": "tsc -p tsconfig.types.json",
40
+ "preview": "vite preview --host 0.0.0.0",
41
+ "check": "tsc --noEmit",
42
+ "smoke": "npm run build && node scripts/smoke.mjs",
43
+ "test": "vitest run",
44
+ "pack:dry-run": "npm pack --dry-run"
45
+ },
46
+ "dependencies": {
47
+ "@pkistudio/asn1instancebuilder": "^0.1.2",
48
+ "@pkistudio/pkistudiojs": "^0.6.1"
49
+ },
50
+ "devDependencies": {
51
+ "@types/node": "^22.15.21",
52
+ "typescript": "^5.8.3",
53
+ "vite": "^6.3.5",
54
+ "vitest": "^3.1.4"
55
+ },
56
+ "repository": {
57
+ "type": "git",
58
+ "url": "https://github.com/pkistudio/asn1defsifter"
59
+ },
60
+ "keywords": [
61
+ "asn1",
62
+ "der",
63
+ "pki",
64
+ "x509",
65
+ "pkistudio"
66
+ ],
67
+ "bugs": {
68
+ "url": "https://github.com/pkistudio/asn1defsifter/issues"
69
+ },
70
+ "homepage": "https://github.com/pkistudio/asn1defsifter#readme",
71
+ "publishConfig": {
72
+ "access": "public"
73
+ }
74
+ }