1#[derive(Debug, Clone, Copy, PartialEq, Eq)]
7pub enum CodecTag {
8 Encryption,
10 Hash,
12 Key,
14 Multihash,
16 Multikey,
18}
19
20#[derive(Debug, Clone, Copy, PartialEq, Eq)]
22pub enum KeyMaterialKind {
23 NotKey,
25 PublicKey,
27 PrivateKey,
29 SymmetricKey,
31}
32
33#[derive(Debug, Clone)]
35pub struct CodecSpec {
36 pub tag: CodecTag,
38
39 pub key_material: KeyMaterialKind,
41
42 pub alg: &'static str,
44
45 pub codec: &'static [u8],
47
48 pub key_length: usize,
50}
51
52pub const VARIABLE_KEY_LENGTH: usize = 0;
55
56pub const FIXED_LENGTH_NOT_APPLICABLE: usize = 0;
58
59pub 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];