Skip to content

Commit c734ff4

Browse files
authored
feat(pq-oid/ts): phase 3 - add migration compatibility layer (ENG-1916) (#28)
## Summary <!-- What does this PR do? Keep it brief. --> ## Package(s) <!-- Which package(s) are modified? --> ## Languages - [ ] TypeScript - [ ] Rust ## Checklist - [ ] Tests pass for all modified packages - [ ] Linting/formatting passes (`biome check`, `cargo fmt`) - [ ] Both language implementations are consistent (or noted as follow-up) - [ ] Package README updated if public API changed - [ ] No unnecessary dependencies added ## Related Issues <!-- Link any related issues: Fixes #123, Closes #456 -->
1 parent 0c8a94a commit c734ff4

3 files changed

Lines changed: 92 additions & 6 deletions

File tree

Lines changed: 57 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,11 @@
11
# pq-algorithm-id
22

3-
Algorithm identifier mappings (JOSE, COSE, X.509)
3+
Canonical post-quantum algorithm identifier mappings across `name`, `oid`, `jose`, `cose`, and `x509` descriptor shapes.
4+
5+
Package boundary:
6+
7+
- `pq-oid`: low-level OID primitives (constants, OID encode/decode)
8+
- `pq-algorithm-id`: multi-identifier mapping and normalization API
49

510
## Installation
611

@@ -11,11 +16,60 @@ npm install pq-algorithm-id
1116
## Usage
1217

1318
```typescript
14-
import { } from 'pq-algorithm-id';
19+
import {
20+
fromCose,
21+
fromJose,
22+
fromOid,
23+
fromX509AlgorithmIdentifier,
24+
toCose,
25+
toJose,
26+
toOid,
27+
toX509AlgorithmIdentifier,
28+
} from 'pq-algorithm-id';
29+
30+
// Name/OID lookup
31+
toOid('ML-DSA-65'); // '2.16.840.1.101.3.4.3.18'
32+
fromOid('2.16.840.1.101.3.4.3.18'); // 'ML-DSA-65'
33+
34+
// JOSE/COSE mapping (currently ML-DSA only)
35+
toJose('ML-DSA-65'); // 'ML-DSA-65'
36+
fromJose('ML-DSA-65'); // 'ML-DSA-65'
37+
toCose('ML-DSA-65'); // -49
38+
fromCose(-49); // 'ML-DSA-65'
39+
40+
// X.509 descriptor mapping
41+
toX509AlgorithmIdentifier('ML-KEM-768');
42+
// {
43+
// oid: '2.16.840.1.101.3.4.4.2',
44+
// parameters: { kind: 'absent' }
45+
// }
1546

16-
// Coming soon
47+
fromX509AlgorithmIdentifier({
48+
oid: '2.16.840.1.101.3.4.3.18',
49+
parameters: null,
50+
});
51+
// {
52+
// oid: '2.16.840.1.101.3.4.3.18',
53+
// parameters: { kind: 'null' }
54+
// }
1755
```
1856

57+
## Behavior Notes
58+
59+
- `fromOid`, `fromJose`, and `fromCose` are strict lookups (no trimming, no case normalization).
60+
- `toX509AlgorithmIdentifier(name)` emits `parameters: { kind: 'absent' }` by default.
61+
- `fromX509AlgorithmIdentifier(input)` accepts `parameters` as `undefined`, `null`, `{ kind: 'absent' }`, or `{ kind: 'null' }`.
62+
- Unsupported mappings (for example `toJose('ML-KEM-512')`) throw typed errors.
63+
64+
## Adoption Order
65+
66+
Suggested downstream migration order:
67+
68+
1. `pq-key-encoder`
69+
2. `pq-cose`
70+
3. `pq-jws`
71+
4. `pq-jwk`
72+
1973
## License
2074

2175
MIT

packages/pq-oid/ts/README.md

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,12 @@ npm install pq-oid
2121
bun add pq-oid
2222
```
2323

24+
## Migration Note
25+
26+
`pq-oid` remains the low-level OID primitive package. For canonical multi-identifier mapping (`name`/`oid`/`jose`/`cose`/`x509`), use `pq-algorithm-id`.
27+
28+
The JOSE/COSE helpers in `pq-oid` are still available for compatibility and are now deprecated in favor of `pq-algorithm-id`.
29+
2430
## Usage
2531

2632
```typescript
@@ -43,7 +49,7 @@ OID.toName('2.16.840.1.101.3.4.3.18') // 'ML-DSA-65'
4349
OID.toBytes('2.16.840.1.101.3.4.4.1') // Uint8Array
4450
OID.fromBytes(bytes) // '2.16.840.1.101.3.4.4.1'
4551

46-
// JOSE/COSE mappings (ML-DSA only)
52+
// JOSE/COSE mappings (ML-DSA only, compatibility path)
4753
OID.toJOSE('ML-DSA-65') // 'ML-DSA-65'
4854
OID.toCOSE('ML-DSA-65') // -48
4955
OID.fromJOSE('ML-DSA-65') // 'ML-DSA-65'
@@ -68,6 +74,16 @@ Algorithm.listByType('sign') // ML-DSA + SLH-DSA variants
6874
Algorithm.listByFamily('ML-DSA') // ['ML-DSA-44', 'ML-DSA-65', 'ML-DSA-87']
6975
```
7076

77+
For new identifier mapping code:
78+
79+
```typescript
80+
import { fromJose, toCose, toOid } from 'pq-algorithm-id';
81+
82+
toOid('ML-DSA-65'); // '2.16.840.1.101.3.4.3.18'
83+
fromJose('ML-DSA-65'); // 'ML-DSA-65'
84+
toCose('ML-DSA-65'); // -49
85+
```
86+
7187
## Supported Algorithms
7288

7389
### ML-KEM (FIPS 203) — Key Encapsulation

packages/pq-oid/ts/src/index.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
// Main exports for pq-oid package
22

33
import { decodeOid, encodeOid } from './encoding';
4-
import { fromCOSE, toCOSE } from './mappings/cose';
5-
import { fromJOSE, toJOSE } from './mappings/jose';
4+
import { fromCOSE as fromCOSEMapping, toCOSE as toCOSEMapping } from './mappings/cose';
5+
import { fromJOSE as fromJOSEMapping, toJOSE as toJOSEMapping } from './mappings/jose';
66
import {
77
// Lookup functions
88
fromName,
@@ -37,6 +37,18 @@ export { SlhDsa } from './slh-dsa';
3737
// Re-export all types
3838
export * from './types';
3939

40+
/** @deprecated Use toJose() from 'pq-algorithm-id'. */
41+
export const toJOSE = toJOSEMapping;
42+
43+
/** @deprecated Use fromJose() from 'pq-algorithm-id'. */
44+
export const fromJOSE = fromJOSEMapping;
45+
46+
/** @deprecated Use toCose() from 'pq-algorithm-id'. */
47+
export const toCOSE = toCOSEMapping;
48+
49+
/** @deprecated Use fromCose() from 'pq-algorithm-id'. */
50+
export const fromCOSE = fromCOSEMapping;
51+
4052
// Unified OID object with all constants and functions
4153
export const OID = {
4254
// ML-KEM OID constants
@@ -74,10 +86,14 @@ export const OID = {
7486
fromBytes: decodeOid,
7587

7688
// JOSE mapping functions
89+
/** @deprecated Use toJose() from 'pq-algorithm-id'. */
7790
toJOSE,
91+
/** @deprecated Use fromJose() from 'pq-algorithm-id'. */
7892
fromJOSE,
7993

8094
// COSE mapping functions
95+
/** @deprecated Use toCose() from 'pq-algorithm-id'. */
8196
toCOSE,
97+
/** @deprecated Use fromCose() from 'pq-algorithm-id'. */
8298
fromCOSE,
8399
};

0 commit comments

Comments
 (0)