Skip to main content

codec_multicodec/
table.rs

1// SPDX-FileCopyrightText: Copyright © 2026 ReallyMe LLC. All rights reserved
2//
3// SPDX-License-Identifier: Apache-2.0
4
5/// Multicodec table tag.
6#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum CodecTag {
8    /// `encryption` table tag.
9    Encryption,
10    /// `hash` table tag.
11    Hash,
12    /// `key` table tag.
13    Key,
14    /// `multihash` table tag.
15    Multihash,
16    /// `multikey` table tag.
17    Multikey,
18}
19
20/// Key-material class for codecs that carry raw key bytes.
21#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum KeyMaterialKind {
23    /// The codec is not raw key material.
24    NotKey,
25    /// Public key material that is safe for `multikey` verification methods.
26    PublicKey,
27    /// Private key material. The codec is known, but `multikey` must reject it.
28    PrivateKey,
29    /// Symmetric key material. The codec is known, but `multikey` must reject it.
30    SymmetricKey,
31}
32
33/// Static metadata for one multicodec entry.
34#[derive(Debug, Clone)]
35pub struct CodecSpec {
36    /// Multicodec table tag.
37    pub tag: CodecTag,
38
39    /// Key-material class for `key` codecs.
40    pub key_material: KeyMaterialKind,
41
42    /// Human-readable algorithm name
43    pub alg: &'static str,
44
45    /// Multicodec varint prefix bytes
46    pub codec: &'static [u8],
47
48    /// Expected raw public key length AFTER prefix
49    pub key_length: usize,
50}
51
52/// Variable-length key payload. RSA keys use DER, whose length depends on
53/// modulus size and integer leading-byte normalization.
54pub const VARIABLE_KEY_LENGTH: usize = 0;
55
56/// Fixed length does not apply to this codec.
57pub const FIXED_LENGTH_NOT_APPLICABLE: usize = 0;
58
59/// Single source of truth for multicodec prefixes
60pub static MULTICODEC_TABLE: &[(&str, CodecSpec)] = &[
61    (
62        "sha2-256",
63        CodecSpec {
64            tag: CodecTag::Multihash,
65            key_material: KeyMaterialKind::NotKey,
66            alg: "SHA2-256",
67            codec: &[0x12],
68            key_length: 32,
69        },
70    ),
71    (
72        "sha2-512",
73        CodecSpec {
74            tag: CodecTag::Multihash,
75            key_material: KeyMaterialKind::NotKey,
76            alg: "SHA2-512",
77            codec: &[0x13],
78            key_length: 64,
79        },
80    ),
81    (
82        "sha3-512",
83        CodecSpec {
84            tag: CodecTag::Multihash,
85            key_material: KeyMaterialKind::NotKey,
86            alg: "SHA3-512",
87            codec: &[0x14],
88            key_length: 64,
89        },
90    ),
91    (
92        "sha3-384",
93        CodecSpec {
94            tag: CodecTag::Multihash,
95            key_material: KeyMaterialKind::NotKey,
96            alg: "SHA3-384",
97            codec: &[0x15],
98            key_length: 48,
99        },
100    ),
101    (
102        "sha3-256",
103        CodecSpec {
104            tag: CodecTag::Multihash,
105            key_material: KeyMaterialKind::NotKey,
106            alg: "SHA3-256",
107            codec: &[0x16],
108            key_length: 32,
109        },
110    ),
111    (
112        "sha3-224",
113        CodecSpec {
114            tag: CodecTag::Multihash,
115            key_material: KeyMaterialKind::NotKey,
116            alg: "SHA3-224",
117            codec: &[0x17],
118            key_length: 28,
119        },
120    ),
121    (
122        "sha2-384",
123        CodecSpec {
124            tag: CodecTag::Multihash,
125            key_material: KeyMaterialKind::NotKey,
126            alg: "SHA2-384",
127            codec: &[0x20],
128            key_length: 48,
129        },
130    ),
131    (
132        "aes-128",
133        CodecSpec {
134            tag: CodecTag::Key,
135            key_material: KeyMaterialKind::SymmetricKey,
136            alg: "AES-128",
137            codec: &[0xa0, 0x01],
138            key_length: 16,
139        },
140    ),
141    (
142        "aes-192",
143        CodecSpec {
144            tag: CodecTag::Key,
145            key_material: KeyMaterialKind::SymmetricKey,
146            alg: "AES-192",
147            codec: &[0xa1, 0x01],
148            key_length: 24,
149        },
150    ),
151    (
152        "aes-256",
153        CodecSpec {
154            tag: CodecTag::Key,
155            key_material: KeyMaterialKind::SymmetricKey,
156            alg: "AES-256",
157            codec: &[0xa2, 0x01],
158            key_length: 32,
159        },
160    ),
161    (
162        "chacha-128",
163        CodecSpec {
164            tag: CodecTag::Key,
165            key_material: KeyMaterialKind::SymmetricKey,
166            alg: "ChaCha-128",
167            codec: &[0xa3, 0x01],
168            key_length: 16,
169        },
170    ),
171    (
172        "chacha-256",
173        CodecSpec {
174            tag: CodecTag::Key,
175            key_material: KeyMaterialKind::SymmetricKey,
176            alg: "ChaCha-256",
177            codec: &[0xa4, 0x01],
178            key_length: 32,
179        },
180    ),
181    (
182        "ed25519-pub",
183        CodecSpec {
184            tag: CodecTag::Key,
185            key_material: KeyMaterialKind::PublicKey,
186            alg: "Ed25519",
187            codec: &[0xed, 0x01],
188            key_length: 32,
189        },
190    ),
191    (
192        "x25519-pub",
193        CodecSpec {
194            tag: CodecTag::Key,
195            key_material: KeyMaterialKind::PublicKey,
196            alg: "X25519",
197            codec: &[0xec, 0x01],
198            key_length: 32,
199        },
200    ),
201    (
202        "p256-pub",
203        CodecSpec {
204            tag: CodecTag::Key,
205            key_material: KeyMaterialKind::PublicKey,
206            alg: "P-256",
207            codec: &[0x80, 0x24],
208            key_length: 33,
209        },
210    ),
211    (
212        "p384-pub",
213        CodecSpec {
214            tag: CodecTag::Key,
215            key_material: KeyMaterialKind::PublicKey,
216            alg: "P-384",
217            codec: &[0x81, 0x24],
218            key_length: 49,
219        },
220    ),
221    (
222        "p521-pub",
223        CodecSpec {
224            tag: CodecTag::Key,
225            key_material: KeyMaterialKind::PublicKey,
226            alg: "P-521",
227            codec: &[0x82, 0x24],
228            key_length: 67,
229        },
230    ),
231    (
232        "ed448-pub",
233        CodecSpec {
234            tag: CodecTag::Key,
235            key_material: KeyMaterialKind::PublicKey,
236            alg: "Ed448",
237            codec: &[0x83, 0x24],
238            key_length: 57,
239        },
240    ),
241    (
242        "rsa-pub",
243        CodecSpec {
244            tag: CodecTag::Key,
245            key_material: KeyMaterialKind::PublicKey,
246            alg: "RSA",
247            codec: &[0x85, 0x24],
248            key_length: VARIABLE_KEY_LENGTH,
249        },
250    ),
251    (
252        "secp256k1-pub",
253        CodecSpec {
254            tag: CodecTag::Key,
255            key_material: KeyMaterialKind::PublicKey,
256            alg: "secp256k1",
257            codec: &[0xe7, 0x01],
258            key_length: 33,
259        },
260    ),
261    (
262        "mldsa-44-pub",
263        CodecSpec {
264            tag: CodecTag::Key,
265            key_material: KeyMaterialKind::PublicKey,
266            alg: "ML-DSA-44",
267            codec: &[0x90, 0x24],
268            key_length: 1312,
269        },
270    ),
271    (
272        "mldsa-65-pub",
273        CodecSpec {
274            tag: CodecTag::Key,
275            key_material: KeyMaterialKind::PublicKey,
276            alg: "ML-DSA-65",
277            codec: &[0x91, 0x24],
278            key_length: 1952,
279        },
280    ),
281    (
282        "mldsa-87-pub",
283        CodecSpec {
284            tag: CodecTag::Key,
285            key_material: KeyMaterialKind::PublicKey,
286            alg: "ML-DSA-87",
287            codec: &[0x92, 0x24],
288            key_length: 2592,
289        },
290    ),
291    (
292        "mlkem-512-pub",
293        CodecSpec {
294            tag: CodecTag::Key,
295            key_material: KeyMaterialKind::PublicKey,
296            alg: "ML-KEM-512",
297            codec: &[0x8b, 0x24],
298            key_length: 800,
299        },
300    ),
301    (
302        "mlkem-768-pub",
303        CodecSpec {
304            tag: CodecTag::Key,
305            key_material: KeyMaterialKind::PublicKey,
306            alg: "ML-KEM-768",
307            codec: &[0x8c, 0x24],
308            key_length: 1184,
309        },
310    ),
311    (
312        "mlkem-1024-pub",
313        CodecSpec {
314            tag: CodecTag::Key,
315            key_material: KeyMaterialKind::PublicKey,
316            alg: "ML-KEM-1024",
317            codec: &[0x8d, 0x24],
318            key_length: 1568,
319        },
320    ),
321    (
322        "ed25519-priv",
323        CodecSpec {
324            tag: CodecTag::Key,
325            key_material: KeyMaterialKind::PrivateKey,
326            alg: "Ed25519",
327            codec: &[0x80, 0x26],
328            key_length: 32,
329        },
330    ),
331    (
332        "secp256k1-priv",
333        CodecSpec {
334            tag: CodecTag::Key,
335            key_material: KeyMaterialKind::PrivateKey,
336            alg: "secp256k1",
337            codec: &[0x81, 0x26],
338            key_length: 32,
339        },
340    ),
341    (
342        "x25519-priv",
343        CodecSpec {
344            tag: CodecTag::Key,
345            key_material: KeyMaterialKind::PrivateKey,
346            alg: "X25519",
347            codec: &[0x82, 0x26],
348            key_length: 32,
349        },
350    ),
351    (
352        "rsa-priv",
353        CodecSpec {
354            tag: CodecTag::Key,
355            key_material: KeyMaterialKind::PrivateKey,
356            alg: "RSA",
357            codec: &[0x85, 0x26],
358            key_length: VARIABLE_KEY_LENGTH,
359        },
360    ),
361    (
362        "p256-priv",
363        CodecSpec {
364            tag: CodecTag::Key,
365            key_material: KeyMaterialKind::PrivateKey,
366            alg: "P-256",
367            codec: &[0x86, 0x26],
368            key_length: 32,
369        },
370    ),
371    (
372        "p384-priv",
373        CodecSpec {
374            tag: CodecTag::Key,
375            key_material: KeyMaterialKind::PrivateKey,
376            alg: "P-384",
377            codec: &[0x87, 0x26],
378            key_length: 48,
379        },
380    ),
381    (
382        "p521-priv",
383        CodecSpec {
384            tag: CodecTag::Key,
385            key_material: KeyMaterialKind::PrivateKey,
386            alg: "P-521",
387            codec: &[0x88, 0x26],
388            key_length: 66,
389        },
390    ),
391    (
392        "ed448-priv",
393        CodecSpec {
394            tag: CodecTag::Key,
395            key_material: KeyMaterialKind::PrivateKey,
396            alg: "Ed448",
397            codec: &[0x91, 0x26],
398            key_length: 57,
399        },
400    ),
401    (
402        "mlkem-512-priv",
403        CodecSpec {
404            tag: CodecTag::Key,
405            key_material: KeyMaterialKind::PrivateKey,
406            alg: "ML-KEM-512",
407            codec: &[0x93, 0x26],
408            key_length: 1632,
409        },
410    ),
411    (
412        "mlkem-768-priv",
413        CodecSpec {
414            tag: CodecTag::Key,
415            key_material: KeyMaterialKind::PrivateKey,
416            alg: "ML-KEM-768",
417            codec: &[0x94, 0x26],
418            key_length: 2400,
419        },
420    ),
421    (
422        "mlkem-1024-priv",
423        CodecSpec {
424            tag: CodecTag::Key,
425            key_material: KeyMaterialKind::PrivateKey,
426            alg: "ML-KEM-1024",
427            codec: &[0x95, 0x26],
428            key_length: 3168,
429        },
430    ),
431    (
432        "aes-gcm-256",
433        CodecSpec {
434            tag: CodecTag::Encryption,
435            key_material: KeyMaterialKind::NotKey,
436            alg: "AES-256-GCM",
437            codec: &[0x80, 0x40],
438            key_length: FIXED_LENGTH_NOT_APPLICABLE,
439        },
440    ),
441    (
442        "chacha20-poly1305",
443        CodecSpec {
444            tag: CodecTag::Multikey,
445            key_material: KeyMaterialKind::NotKey,
446            alg: "ChaCha20-Poly1305",
447            codec: &[0x80, 0xc0, 0x02],
448            key_length: FIXED_LENGTH_NOT_APPLICABLE,
449        },
450    ),
451];