#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum CodecTag {
Encryption,
Hash,
Key,
Multihash,
Multikey,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
#[non_exhaustive]
pub enum KeyMaterialKind {
NotKey,
PublicKey,
PrivateKey,
SymmetricKey,
}
#[derive(Debug, Clone)]
pub struct CodecSpec {
pub tag: CodecTag,
pub key_material: KeyMaterialKind,
pub alg: &'static str,
pub codec: &'static [u8],
pub key_length: KeyLength,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum KeyLength {
Fixed(usize),
Variable,
NotApplicable,
}
pub static MULTICODEC_TABLE: &[(&str, CodecSpec)] = &[
(
"sha2-256",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA2-256",
codec: &[0x12],
key_length: KeyLength::Fixed(32),
},
),
(
"sha2-512",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA2-512",
codec: &[0x13],
key_length: KeyLength::Fixed(64),
},
),
(
"sha3-512",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA3-512",
codec: &[0x14],
key_length: KeyLength::Fixed(64),
},
),
(
"sha3-384",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA3-384",
codec: &[0x15],
key_length: KeyLength::Fixed(48),
},
),
(
"sha3-256",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA3-256",
codec: &[0x16],
key_length: KeyLength::Fixed(32),
},
),
(
"sha3-224",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA3-224",
codec: &[0x17],
key_length: KeyLength::Fixed(28),
},
),
(
"sha2-384",
CodecSpec {
tag: CodecTag::Multihash,
key_material: KeyMaterialKind::NotKey,
alg: "SHA2-384",
codec: &[0x20],
key_length: KeyLength::Fixed(48),
},
),
(
"aes-128",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::SymmetricKey,
alg: "AES-128",
codec: &[0xa0, 0x01],
key_length: KeyLength::Fixed(16),
},
),
(
"aes-192",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::SymmetricKey,
alg: "AES-192",
codec: &[0xa1, 0x01],
key_length: KeyLength::Fixed(24),
},
),
(
"aes-256",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::SymmetricKey,
alg: "AES-256",
codec: &[0xa2, 0x01],
key_length: KeyLength::Fixed(32),
},
),
(
"chacha-128",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::SymmetricKey,
alg: "ChaCha-128",
codec: &[0xa3, 0x01],
key_length: KeyLength::Fixed(16),
},
),
(
"chacha-256",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::SymmetricKey,
alg: "ChaCha-256",
codec: &[0xa4, 0x01],
key_length: KeyLength::Fixed(32),
},
),
(
"ed25519-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "Ed25519",
codec: &[0xed, 0x01],
key_length: KeyLength::Fixed(32),
},
),
(
"x25519-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "X25519",
codec: &[0xec, 0x01],
key_length: KeyLength::Fixed(32),
},
),
(
"p256-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "P-256",
codec: &[0x80, 0x24],
key_length: KeyLength::Fixed(33),
},
),
(
"p384-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "P-384",
codec: &[0x81, 0x24],
key_length: KeyLength::Fixed(49),
},
),
(
"p521-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "P-521",
codec: &[0x82, 0x24],
key_length: KeyLength::Fixed(67),
},
),
(
"ed448-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "Ed448",
codec: &[0x83, 0x24],
key_length: KeyLength::Fixed(57),
},
),
(
"rsa-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "RSA",
codec: &[0x85, 0x24],
key_length: KeyLength::Variable,
},
),
(
"secp256k1-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "secp256k1",
codec: &[0xe7, 0x01],
key_length: KeyLength::Fixed(33),
},
),
(
"mldsa-44-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-DSA-44",
codec: &[0x90, 0x24],
key_length: KeyLength::Fixed(1312),
},
),
(
"mldsa-65-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-DSA-65",
codec: &[0x91, 0x24],
key_length: KeyLength::Fixed(1952),
},
),
(
"mldsa-87-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-DSA-87",
codec: &[0x92, 0x24],
key_length: KeyLength::Fixed(2592),
},
),
(
"mlkem-512-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-KEM-512",
codec: &[0x8b, 0x24],
key_length: KeyLength::Fixed(800),
},
),
(
"mlkem-768-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-KEM-768",
codec: &[0x8c, 0x24],
key_length: KeyLength::Fixed(1184),
},
),
(
"mlkem-1024-pub",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PublicKey,
alg: "ML-KEM-1024",
codec: &[0x8d, 0x24],
key_length: KeyLength::Fixed(1568),
},
),
(
"ed25519-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "Ed25519",
codec: &[0x80, 0x26],
key_length: KeyLength::Fixed(32),
},
),
(
"secp256k1-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "secp256k1",
codec: &[0x81, 0x26],
key_length: KeyLength::Fixed(32),
},
),
(
"x25519-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "X25519",
codec: &[0x82, 0x26],
key_length: KeyLength::Fixed(32),
},
),
(
"rsa-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "RSA",
codec: &[0x85, 0x26],
key_length: KeyLength::Variable,
},
),
(
"p256-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "P-256",
codec: &[0x86, 0x26],
key_length: KeyLength::Fixed(32),
},
),
(
"p384-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "P-384",
codec: &[0x87, 0x26],
key_length: KeyLength::Fixed(48),
},
),
(
"p521-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "P-521",
codec: &[0x88, 0x26],
key_length: KeyLength::Fixed(66),
},
),
(
"ed448-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "Ed448",
codec: &[0x91, 0x26],
key_length: KeyLength::Fixed(57),
},
),
(
"mlkem-512-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "ML-KEM-512",
codec: &[0x93, 0x26],
key_length: KeyLength::Fixed(1632),
},
),
(
"mlkem-768-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "ML-KEM-768",
codec: &[0x94, 0x26],
key_length: KeyLength::Fixed(2400),
},
),
(
"mlkem-1024-priv",
CodecSpec {
tag: CodecTag::Key,
key_material: KeyMaterialKind::PrivateKey,
alg: "ML-KEM-1024",
codec: &[0x95, 0x26],
key_length: KeyLength::Fixed(3168),
},
),
(
"aes-gcm-256",
CodecSpec {
tag: CodecTag::Encryption,
key_material: KeyMaterialKind::NotKey,
alg: "AES-256-GCM",
codec: &[0x80, 0x40],
key_length: KeyLength::NotApplicable,
},
),
(
"chacha20-poly1305",
CodecSpec {
tag: CodecTag::Multikey,
key_material: KeyMaterialKind::NotKey,
alg: "ChaCha20-Poly1305",
codec: &[0x80, 0xc0, 0x02],
key_length: KeyLength::NotApplicable,
},
),
];