Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: C509 AlgorithmIdentifier for subjectPublicKeyAlgorithm and issuerSignatureAlgorithm #610

Merged
merged 199 commits into from
Jul 12, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
199 commits
Select commit Hold shift + click to select a range
76d78b2
feat: setup c509 lib
bkioshn Apr 8, 2024
ef76f02
fix: update toml file
bkioshn Apr 9, 2024
19db45e
feat: add earthfile
bkioshn Apr 9, 2024
bc5b859
Merge branch 'main' into feat/setup-c509-lib
bkioshn Apr 9, 2024
083c8e7
fix: remove blank line
bkioshn Apr 9, 2024
a25c041
Merge branch 'feat/m3' into feat/setup-c509-lib
bkioshn Apr 10, 2024
34ea755
docs: Add CatalystDataGatewayRepository docs (#388)
coire1 Apr 10, 2024
805482c
adds one more worker and compression for catgateway logs (#400)
kukkok3 Apr 11, 2024
bb245a1
feat: Collect flutter code coverage (#404)
dtscalac Apr 12, 2024
0f8916e
Merge branch 'main' into feat/m3
Mr-Leshiy Apr 15, 2024
6365ce9
refactor: update schema_validation check (#414)
Mr-Leshiy Apr 15, 2024
aaf6809
Merge branch 'feat/m3' into feat/setup-c509-lib
bkioshn Apr 16, 2024
8ebd6ce
fix: update wasm testing
bkioshn Apr 19, 2024
1388eff
fix: remove clippy toml
bkioshn Apr 19, 2024
84ae2c7
Merge branch 'main' into feat/setup-c509-lib
bkioshn Apr 19, 2024
4226d49
fix: update cargo toml
bkioshn Apr 19, 2024
0106768
fix: spelling
bkioshn Apr 19, 2024
3c89375
fix: revert test report
bkioshn Apr 19, 2024
a0ac9ab
chore: add comment
bkioshn Apr 19, 2024
9ad1978
chore: update message
bkioshn Apr 19, 2024
06ae7c5
fix: update cargo.toml
bkioshn Apr 19, 2024
0c61614
chore: fix format
bkioshn Apr 19, 2024
8c045f9
fix: linter
bkioshn Apr 19, 2024
51e5b6e
fix: update cargo toml
bkioshn Apr 19, 2024
6eb77b0
fix: update cargo toml
bkioshn Apr 19, 2024
68e8566
Merge branch 'main' into feat/setup-c509-lib
bkioshn Apr 19, 2024
64622fc
fix: update project dic
bkioshn Apr 19, 2024
842d5d9
fix: remove wasm-pack install
bkioshn Apr 19, 2024
672166a
feat: add config
bkioshn Apr 19, 2024
70485dc
fix: earthly for c509
bkioshn Apr 19, 2024
4127344
Merge branch 'main' into feat/setup-c509-lib
bkioshn Apr 22, 2024
fc5caa4
feat: add regex dependency
bkioshn Apr 22, 2024
43c6ab5
feat: implement c509 type name
bkioshn Apr 22, 2024
1b2180d
fix: clean up lib.rs
bkioshn Apr 23, 2024
0ddf1a2
fix: add c509 cert module
bkioshn Apr 23, 2024
00c0dbf
feat: add x690 der
bkioshn Apr 23, 2024
de1366a
feat: wip TLV extract value
bkioshn May 2, 2024
3bad134
chore: add comment on TLV length
bkioshn May 2, 2024
ffdcb8a
fix (wip): update der parser
bkioshn May 4, 2024
cb95f63
fix (wip): update der parser
bkioshn May 6, 2024
9edb93d
fix (wip): update der parser
bkioshn May 7, 2024
1301ff9
fix (wip): update der parser
bkioshn May 7, 2024
e50f046
fix (wip): dependencies
bkioshn May 20, 2024
668bf5c
feat(wip): add c509 enum
bkioshn May 20, 2024
8fcc891
feat(wip): add cbor encode helper
bkioshn May 20, 2024
79aa5b5
feat(wip): add c509 cert helper
bkioshn May 20, 2024
14c5d13
fix(wip): modify lib
bkioshn May 20, 2024
91eebf6
feat(wip): add subject public key encoder
bkioshn May 26, 2024
4629bc9
fix: add thiserror
bkioshn May 28, 2024
f8b3d10
fix: cbor encode biguint and type name
bkioshn May 28, 2024
f587d7a
fix: cbor encode time
bkioshn May 28, 2024
d86fa68
fix: cleanup
bkioshn May 28, 2024
8c5bc12
fix: add oid crate
bkioshn May 28, 2024
7c63a33
feat: add extensions
bkioshn May 28, 2024
9e52c8d
feat: add alt name
bkioshn May 28, 2024
c6cb9cb
chore: remove fixme
bkioshn May 28, 2024
36d5ea2
fix: clean up c509 enum
bkioshn May 29, 2024
6181188
fix: rewrite cbor encoder
bkioshn May 29, 2024
5f7bd50
fix: move c509 crate folder
bkioshn May 29, 2024
d453981
feat: add gitignore
bkioshn May 29, 2024
ef70902
fix: cargo toml
bkioshn May 29, 2024
e6cc3f2
fix: cbor encoder
bkioshn May 29, 2024
b9c1da1
fix: remove der encoding
bkioshn May 29, 2024
3037e53
feat: add eid encoder
bkioshn May 30, 2024
d3e2e62
fix: ssp encoder
bkioshn Jun 3, 2024
5685716
feat: create genc509cert function
bkioshn Jun 3, 2024
d1c04d2
feat: add sigalgo registry
bkioshn Jun 3, 2024
a0fc33e
fix: altname type visibility
bkioshn Jun 3, 2024
32ed35c
fix: altname encoder
bkioshn Jun 3, 2024
613fd66
feat: add extension encoding func
bkioshn Jun 3, 2024
c079a17
fix: lib.rs
bkioshn Jun 3, 2024
7c3ebf5
fix: gen c509 function
bkioshn Jun 4, 2024
780d02f
fix: cbor encoder
bkioshn Jun 4, 2024
39a2f9c
fix: alt name
bkioshn Jun 4, 2024
7f28e94
fix: extensions
bkioshn Jun 4, 2024
326fe78
Merge branch 'main' into feat/c509-cert
bkioshn Jun 5, 2024
4b19b7a
Merge branch 'main' into feat/c509-cert
stevenj Jun 6, 2024
39b5111
Merge branch 'main' into feat/c509-cert
stevenj Jun 6, 2024
16f3643
Merge branch 'main' into feat/c509-cert
stevenj Jun 6, 2024
6878fe0
docs: update c509 docs
bkioshn Jun 11, 2024
42eb95a
Merge branch 'main' into feat/c509-cert
bkioshn Jun 11, 2024
862013b
fix: name
bkioshn Jun 11, 2024
4f8e63d
chore: remove unnecessary comments
bkioshn Jun 12, 2024
1d21b94
fix: macro definitions location
bkioshn Jun 14, 2024
db8b292
fix: earthly version and cspell
bkioshn Jun 14, 2024
c8fefb2
fix: update rust config file to match cat-ci stdcfg
bkioshn Jun 14, 2024
06ec613
fix: macro definitions location
bkioshn Jun 14, 2024
81e3dd8
feat: add oid encode/decode
bkioshn Jun 16, 2024
a80f477
fix: naming and test
bkioshn Jun 17, 2024
1c36a5d
fix: naming
bkioshn Jun 17, 2024
f740b4a
fix: implement encode and decode trait
bkioshn Jun 17, 2024
867836f
fix: test
bkioshn Jun 17, 2024
ccc6700
feat: add OID PEN encode and decode
bkioshn Jun 18, 2024
091670d
fix: merge
stevenj Jun 18, 2024
2e7b117
fix: merge
stevenj Jun 18, 2024
d572d0d
wip
stevenj Jun 18, 2024
eb6519c
fix: pen decode and encode
bkioshn Jun 18, 2024
4304d91
Merge branch 'main' into feat/c509-cert
stevenj Jun 18, 2024
7fdc8a6
fix: rewrite PEN encode and decode
bkioshn Jun 19, 2024
faeed8a
chore: add comments
bkioshn Jun 20, 2024
48beb67
fix: update c509 extensions
bkioshn Jun 21, 2024
70e5816
fix: add once cell
bkioshn Jun 24, 2024
f7761ca
fix: oid registry and oid extension implementation
bkioshn Jun 24, 2024
34dc486
fix (wip): extension value encoding
bkioshn Jun 24, 2024
d7716ec
fix: value encode and test
bkioshn Jun 25, 2024
dbb9a9a
fix: add decode extension
bkioshn Jun 25, 2024
d9dab5b
fix: extension decode value
bkioshn Jun 25, 2024
2107753
fix: delete files
bkioshn Jun 25, 2024
a0d0f16
Merge branch 'main' into feat/c509-cert
bkioshn Jun 25, 2024
e061532
fix(wip): handle extensions
bkioshn Jun 26, 2024
755c7af
fix: disable extensions encode and decode
bkioshn Jun 26, 2024
95c8db6
fix: cargo toml and add num-derive
bkioshn Jun 27, 2024
27d54e4
fix(wip): refactor tables
bkioshn Jun 27, 2024
d3a8473
feat(wip): add encode decode general name
bkioshn Jun 27, 2024
1c41054
fix: name and type
bkioshn Jun 27, 2024
285ef15
fix(wip): decode and encode generalnames
bkioshn Jun 27, 2024
c9234b1
fix(wip): gn value encode decode
bkioshn Jun 27, 2024
23e60a7
fix: remove unused crate
bkioshn Jun 29, 2024
f69b188
fix: gns encode and decode
bkioshn Jun 29, 2024
090a2ac
fix: remove unused table
bkioshn Jun 29, 2024
1639683
fix: oid lifetime to static
bkioshn Jun 29, 2024
2412156
fix: create extensions mod
bkioshn Jun 29, 2024
97d7aff
fix: general name visibility
bkioshn Jun 30, 2024
3a500fa
feat: add alt name
bkioshn Jun 30, 2024
eb053d9
feat: add alternative name encode and decode
bkioshn Jun 30, 2024
81120b0
fix: minor fixes + cleanup
bkioshn Jun 30, 2024
043171f
chore: use super in test
bkioshn Jul 1, 2024
d62b57f
fix: remove unused ctx type C
bkioshn Jul 1, 2024
581eeec
fix(wip): extensions
bkioshn Jul 2, 2024
0d060d6
feat: add strum crate
bkioshn Jul 3, 2024
1332865
fix: tables
bkioshn Jul 3, 2024
77fb568
fix: extensions
bkioshn Jul 3, 2024
88b9060
fix: general name
bkioshn Jul 3, 2024
59f4737
fix: table
bkioshn Jul 3, 2024
094bef6
fix: alt name
bkioshn Jul 3, 2024
b5faf7c
fix: extensions
bkioshn Jul 3, 2024
520227a
Merge branch 'main' into feat/c509-cert
bkioshn Jul 3, 2024
04cc102
fix: refactor
bkioshn Jul 4, 2024
1ae27dc
feat(wip): add eid
bkioshn Jul 4, 2024
8063042
chore: spelling
bkioshn Jul 4, 2024
d5de46c
chore: spelling
bkioshn Jul 4, 2024
e79c6ea
chore: revert back to main
bkioshn Jul 4, 2024
9c12734
chore: restore file in main
bkioshn Jul 4, 2024
b875235
fix: update rust stdconfig and earthfile
bkioshn Jul 4, 2024
efab558
fix: earthfile
bkioshn Jul 4, 2024
e72f1dc
fix: earthfile
bkioshn Jul 4, 2024
5c2ad44
fix: earthfile
bkioshn Jul 4, 2024
3084934
fix: wrong earthfile
bkioshn Jul 4, 2024
573929c
fix: doc link
bkioshn Jul 4, 2024
660fd6b
Update catalyst-gateway-crates/c509-certificate/src/c509_extensions/m…
Mr-Leshiy Jul 4, 2024
c76e705
Update catalyst-gateway-crates/c509-certificate/src/c509_extensions/m…
Mr-Leshiy Jul 4, 2024
aabe2ab
bump cat-ci
Mr-Leshiy Jul 4, 2024
5817c25
bump deny.toml
Mr-Leshiy Jul 4, 2024
bfda52f
fix fmt
Mr-Leshiy Jul 4, 2024
df01198
fix machete
Mr-Leshiy Jul 4, 2024
093bae5
fix
Mr-Leshiy Jul 4, 2024
f45a151
fix: minor fix and update doc
bkioshn Jul 5, 2024
c59cd19
chore: code format
bkioshn Jul 5, 2024
d68f562
Merge branch 'main' into feat/c509-cert
bkioshn Jul 5, 2024
6b40c22
bump cat-ci
Mr-Leshiy Jul 5, 2024
3830062
update build
Mr-Leshiy Jul 5, 2024
eb87664
fix: doc
bkioshn Jul 5, 2024
608d5fc
test: new cliipy ci fix
bkioshn Jul 5, 2024
4b11a8b
test: new cliipy ci fix fix cargo toml
bkioshn Jul 5, 2024
4606bfe
fix: orphan module
bkioshn Jul 5, 2024
87747e3
fix: remove EID
bkioshn Jul 5, 2024
3349817
fix: comment out wasm pack build
bkioshn Jul 5, 2024
0ccab68
Merge branch 'main' into feat/c509-cert
bkioshn Jul 6, 2024
3476b0a
fix: add chaining
bkioshn Jul 7, 2024
0665f46
fix: linter
bkioshn Jul 7, 2024
b77cf7d
fix: PR comment
bkioshn Jul 8, 2024
7817f8c
fix: move code section
bkioshn Jul 8, 2024
45d14ee
chore: fix name and comment
bkioshn Jul 8, 2024
ab586ee
fix: format
bkioshn Jul 8, 2024
b405496
test: add zero extensions
bkioshn Jul 8, 2024
b8b2a2a
fix: format
bkioshn Jul 8, 2024
9409cf2
fix: gn type naming
bkioshn Jul 8, 2024
0b3296d
chore: remove unused file
bkioshn Jul 9, 2024
2b069b2
test: add test case for multiples gn type
bkioshn Jul 9, 2024
a8ff97d
fix: dns gn decode special case
bkioshn Jul 9, 2024
bae088a
fix: format
bkioshn Jul 9, 2024
db23d96
fix: data tables
bkioshn Jul 9, 2024
6492464
fix: alt name test case
bkioshn Jul 9, 2024
325430a
fix: cspell
bkioshn Jul 9, 2024
06130fc
fix: table functions
bkioshn Jul 10, 2024
800688a
fix: format
bkioshn Jul 10, 2024
1107588
chore: fix test comment
bkioshn Jul 10, 2024
1d08dc3
Merge branch 'main' into feat/c509-algo-iden
bkioshn Jul 11, 2024
c406ad3
feat: implement algorithm identifier
bkioshn Jul 11, 2024
fbfc909
fix: add test case for algo iden
bkioshn Jul 11, 2024
144e90d
Merge branch 'main' into feat/c509-algo-iden
bkioshn Jul 11, 2024
e8ec464
fix: comment and syntax
bkioshn Jul 11, 2024
52844d4
fix: spelling and naming
bkioshn Jul 11, 2024
ae29210
fix: cspell
bkioshn Jul 11, 2024
a440109
Merge branch 'main' into feat/c509-algo-iden
bkioshn Jul 12, 2024
f9085c3
fix: data table struct
bkioshn Jul 12, 2024
b210d3f
fix: getter func
bkioshn Jul 12, 2024
1045df7
fix: getter func
bkioshn Jul 12, 2024
955cd8c
fix: getter func
bkioshn Jul 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
//! C509 Algorithm Identifier
//! This module handle the `AlgorithmIdentifier` type where OID does not fall into the
//! table.
//!
//! ```cddl
//! AlgorithmIdentifier = int / ~oid / [ algorithm: ~oid, parameters: bytes ]
//! ```
//!
//! For more information about `AlgorithmIdentifier`,
//! visit [C509 Certificate](https://datatracker.ietf.org/doc/draft-ietf-cose-cbor-encoded-cert/09/)

use asn1_rs::Oid;
use minicbor::{encode::Write, Decode, Decoder, Encode, Encoder};

use crate::c509_oid::C509oid;

/// A struct represents the `AlgorithmIdentifier` type.
#[derive(Debug, Clone, PartialEq)]
pub struct AlgorithmIdentifier {
/// A `C509oid`
oid: C509oid,
/// An optional parameter string
param: Option<String>,
}

impl AlgorithmIdentifier {
/// Create new instance of `AlgorithmIdentifier`.
#[must_use]
pub fn new(oid: Oid<'static>, param: Option<String>) -> Self {
Self {
oid: C509oid::new(oid),
param,
}
}

/// Get the OID.
pub(crate) fn get_oid(&self) -> Oid<'static> {
self.oid.clone().get_oid()
}

/// Get the parameter.
pub(crate) fn get_param(&self) -> &Option<String> {
&self.param
}
}

impl Encode<()> for AlgorithmIdentifier {
fn encode<W: Write>(
&self, e: &mut Encoder<W>, ctx: &mut (),
) -> Result<(), minicbor::encode::Error<W::Error>> {
match &self.param {
// [ algorithm: ~oid, parameters: bytes ]
Some(p) => {
e.array(2)?;
self.oid.encode(e, ctx)?;
e.bytes(p.as_bytes())?;
},
// ~oid
None => {
self.oid.encode(e, ctx)?;
},
}
Ok(())
}
}

impl Decode<'_, ()> for AlgorithmIdentifier {
fn decode(d: &mut Decoder<'_>, ctx: &mut ()) -> Result<Self, minicbor::decode::Error> {
// [ algorithm: ~oid, parameters: bytes ]
if d.datatype()? == minicbor::data::Type::Array {
let len = d.array()?.ok_or(minicbor::decode::Error::message(
"Failed to get array length",
))?;
if len != 2 {
return Err(minicbor::decode::Error::message("Array length must be 2"));
}
let c509_oid = C509oid::decode(d, ctx)?;
let param =
String::from_utf8(d.bytes()?.to_vec()).map_err(minicbor::decode::Error::message)?;
Ok(AlgorithmIdentifier::new(c509_oid.get_oid(), Some(param)))
// ~oid
} else {
let oid = C509oid::decode(d, ctx)?;
Ok(AlgorithmIdentifier::new(oid.get_oid(), None))
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
//! Signature algorithm data provides a necessary information for encoding and decoding of
//! C509 `issuerSignatureAlgorithm`. See [C509 Certificate](https://datatracker.ietf.org/doc/draft-ietf-cose-cbor-encoded-cert/09/)
//! Section 9.10 C509 Signature Algorithms Registry for more information.

// cspell: words RSASSA XMSS

use anyhow::Error;
use asn1_rs::{oid, Oid};
use once_cell::sync::Lazy;

use crate::tables::IntegerToOidTable;

/// Type of algorithm data
/// INT | OID | Name
type AlgorithmDataTuple = (i16, Oid<'static>, &'static str);

/// Signature algorithm data table.
#[rustfmt::skip]
const SIG_ALGO_DATA: [AlgorithmDataTuple; 24] = [
// Int | OID | Name
(-256, oid!(1.2.840.113549.1.1.5), "RSASSA-PKCS1-v1_5 with SHA-1"),
(-255, oid!(1.2.840.10045.4.1), "ECDSA with SHA-1"),
(0, oid!(1.2.840.10045.4.3.2), "ECDSA with SHA-256"),
(1, oid!(1.2.840.10045.4.3.3), "ECDSA with SHA-384"),
(2, oid!(1.2.840.10045.4.3.4), "ECDSA with SHA-512"),
(3, oid!(1.3.6.1.5.5.7.6.32), "ECDSA with SHAKE128"),
(4, oid!(1.3.6.1.5.5.7.6.33), "ECDSA with SHAKE256"),
(12, oid!(1.3.101.112), "Ed25519"),
(13, oid!(1.3.101.113), "Ed448"),
(14, oid!(1.3.6.1.5.5.7.6.26), "SHA-256 with HMAC-SHA256"),
(15, oid!(1.3.6.1.5.5.7.6.27), "SHA-384 with HMAC-SHA384"),
(16, oid!(1.3.6.1.5.5.7.6.28), "SHA-512 with HMAC-SHA512"),
(23, oid!(1.2.840.113549.1.1.11), "RSASSA-PKCS1-v1_5 with SHA-256"),
(24, oid!(1.2.840.113549.1.1.12), "RSASSA-PKCS1-v1_5 with SHA-384"),
(25, oid!(1.2.840.113549.1.1.13), "RSASSA-PKCS1-v1_5 with SHA-512"),
(26, oid!(1.2.840.113549.1.1.10), "RSASSA-PSS with SHA-256"),
(27, oid!(1.2.840.113549.1.1.10), "RSASSA-PSS with SHA-384"),
(28, oid!(1.2.840.113549.1.1.10), "RSASSA-PSS with SHA-512"),
(29, oid!(1.3.6.1.5.5.7.6.30), "RSASSA-PSS with SHAKE128"),
(30, oid!(1.3.6.1.5.5.7.6.3), "RSASSA-PSS with SHAKE256"),
(42, oid!(1.2.840.113549.1.9.16.3.17), "HSS / LMS"),
(43, oid!(0.4.0.127.0.15.1.1.13.0), "XMSS"),
(44, oid!(0.4.0.127.0.15.1.1.14.0), "XMSS^MT"),
(45, oid!(1.2.156.10197.1.501), "SM2 with SM3"),
];

/// A struct of data that contains lookup table of integer to OID in
/// bidirectional way for `IssuerSignatureAlgorithm`.
pub(crate) struct IssuerSigAlgoData(IntegerToOidTable);

impl IssuerSigAlgoData {
/// Get the `IntegerToOidTable`
pub(crate) fn get_int_to_oid_table(&self) -> &IntegerToOidTable {
&self.0
}
}

/// Define static lookup for issuer signature algorithm table
static ISSUER_SIG_ALGO_TABLE: Lazy<IssuerSigAlgoData> = Lazy::new(|| {
let mut int_to_oid_table = IntegerToOidTable::new();

for data in SIG_ALGO_DATA {
int_to_oid_table.add(data.0, data.1);
}

IssuerSigAlgoData(int_to_oid_table)
});

/// Static reference to the `IssuerSigAlgoData` lookup table.
pub(crate) static ISSUER_SIG_ALGO_LOOKUP: &Lazy<IssuerSigAlgoData> = &ISSUER_SIG_ALGO_TABLE;
Mr-Leshiy marked this conversation as resolved.
Show resolved Hide resolved

/// Get the OID from the int value.
pub(crate) fn get_oid_from_int(i: i16) -> Result<Oid<'static>, Error> {
ISSUER_SIG_ALGO_TABLE
.get_int_to_oid_table()
.get_map()
.get_by_left(&i)
.ok_or(Error::msg(format!(
"OID not found in the signature algorithms registry table given int {i}"
)))
.cloned()
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,144 @@
//! C509 Issuer Signature Algorithm as a part of `TBSCertificate` used in C509
//! Certificate.
//!
//! ```cddl
//! issuerSignatureAlgorithm: AlgorithmIdentifier
//! ```

mod data;
use asn1_rs::Oid;
use data::{get_oid_from_int, ISSUER_SIG_ALGO_LOOKUP};
use minicbor::{encode::Write, Decode, Decoder, Encode, Encoder};

use crate::{c509_algo_identifier::AlgorithmIdentifier, c509_oid::C509oidRegistered};

/// A struct represents the `IssuerSignatureAlgorithm`
#[derive(Debug, Clone, PartialEq)]
pub struct IssuerSignatureAlgorithm {
/// The registered OID of the `IssuerSignatureAlgorithm`.
registered_oid: C509oidRegistered,
/// An `AlgorithmIdentifier` type
algo_identifier: AlgorithmIdentifier,
}

impl IssuerSignatureAlgorithm {
/// Create new instance of `IssuerSignatureAlgorithm` where it registered with
/// Issuer Signature Algorithm lookup table.
pub fn new(oid: Oid<'static>, param: Option<String>) -> Self {
Self {
registered_oid: C509oidRegistered::new(
oid.clone(),
ISSUER_SIG_ALGO_LOOKUP.get_int_to_oid_table(),
),
algo_identifier: AlgorithmIdentifier::new(oid, param),
}
}
}

impl Encode<()> for IssuerSignatureAlgorithm {
fn encode<W: Write>(
&self, e: &mut Encoder<W>, ctx: &mut (),
) -> Result<(), minicbor::encode::Error<W::Error>> {
if let Some(&i) = self
.registered_oid
.get_table()
.get_map()
.get_by_right(&self.registered_oid.get_c509_oid().get_oid())
{
e.i16(i)?;
} else {
AlgorithmIdentifier::encode(&self.algo_identifier, e, ctx)?;
}
Ok(())
}
}

impl Decode<'_, ()> for IssuerSignatureAlgorithm {
fn decode(d: &mut Decoder<'_>, ctx: &mut ()) -> Result<Self, minicbor::decode::Error> {
match d.datatype()? {
// Check i16 for -256 and -256
minicbor::data::Type::U8 | minicbor::data::Type::I16 => {
let i = d.i16()?;
let oid = get_oid_from_int(i).map_err(minicbor::decode::Error::message)?;
Ok(Self::new(oid, None))
},
_ => {
let algo_identifier = AlgorithmIdentifier::decode(d, ctx)?;
Ok(IssuerSignatureAlgorithm::new(
algo_identifier.get_oid(),
algo_identifier.get_param().clone(),
))
},
}
}
}

// ------------------Test----------------------

#[cfg(test)]
mod test_issuer_signature_algorithm {
use asn1_rs::oid;

use super::*;

#[test]
fn test_registered_oid() {
let mut buffer = Vec::new();
let mut encoder = Encoder::new(&mut buffer);

let isa = IssuerSignatureAlgorithm::new(oid!(1.3.101 .112), None);
isa.encode(&mut encoder, &mut ())
.expect("Failed to encode IssuerSignatureAlgorithm");

// Ed25519 - int 12: 0x0c
assert_eq!(hex::encode(buffer.clone()), "0c");

let mut decoder = Decoder::new(&buffer);
let decoded_isa = IssuerSignatureAlgorithm::decode(&mut decoder, &mut ())
.expect("Failed to decode IssuerSignatureAlgorithm");
assert_eq!(decoded_isa, isa);
}

#[test]
fn test_unregistered_oid() {
let mut buffer = Vec::new();
let mut encoder = Encoder::new(&mut buffer);

let isa = IssuerSignatureAlgorithm::new(oid!(2.16.840 .1 .101 .3 .4 .2 .1), None);
isa.encode(&mut encoder, &mut ())
.expect("Failed to encode IssuerSignatureAlgorithm");

// 2.16.840 .1 .101 .3 .4 .2 .1: 0x49608648016503040201
assert_eq!(hex::encode(buffer.clone()), "49608648016503040201");

let mut decoder = Decoder::new(&buffer);
let decoded_isa = IssuerSignatureAlgorithm::decode(&mut decoder, &mut ())
.expect("Failed to decode IssuerSignatureAlgorithm");
assert_eq!(decoded_isa, isa);
}

#[test]
fn test_unregistered_oid_with_param() {
let mut buffer = Vec::new();
let mut encoder = Encoder::new(&mut buffer);

let isa = IssuerSignatureAlgorithm::new(
oid!(2.16.840 .1 .101 .3 .4 .2 .1),
Some("example".to_string()),
);
isa.encode(&mut encoder, &mut ())
.expect("Failed to encode IssuerSignatureAlgorithm");
// Array of 2 items: 0x82
// 2.16.840 .1 .101 .3 .4 .2 .1: 0x49608648016503040201
// bytes "example": 0x476578616d706c65
assert_eq!(
hex::encode(buffer.clone()),
"8249608648016503040201476578616d706c65"
);

let mut decoder = Decoder::new(&buffer);
let decoded_isa = IssuerSignatureAlgorithm::decode(&mut decoder, &mut ())
.expect("Failed to decode IssuerSignatureAlgorithm");
assert_eq!(decoded_isa, isa);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
//! Public key algorithm data provides a necessary information for encoding and decoding
//! of C509 `subjectPublicKeyAlgorithm`. See [C509 Certificate](https://datatracker.ietf.org/doc/draft-ietf-cose-cbor-encoded-cert/09/)
//! Section 9.11 C509 Public Key Algorithms Registry for more information.

// cspell: words Weierstraß secp XMSS brainpool

use anyhow::Error;
use asn1_rs::{oid, Oid};
use once_cell::sync::Lazy;

use crate::tables::IntegerToOidTable;

/// Type of algorithm data
/// INT | OID | Name
type AlgorithmDataTuple = (i16, Oid<'static>, &'static str);

/// Public key algorithm data table.
#[rustfmt::skip]
const PUB_KEY_ALGO_DATA: [AlgorithmDataTuple; 16] = [
// Int | OID | Name
(0, oid!(1.2.840.113549.1.1.1), "RSA"),
(1, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with secp256r1"),
(2, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with secp384r1"),
(3, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with secp521r1"),
(8, oid!(1.3.101.110), "X25519 (Montgomery)"),
(9, oid!(1.3.101.111), "X448 (Montgomery)"),
(10, oid!(1.3.101.112), "Ed25519 (Twisted Edwards)"),
(11, oid!(1.3.101.113), "Ed448 (Edwards)"),
(16, oid!(1.2.840.113549.1.9.16.3.17), "HSS / LMS"),
(17, oid!(0.4.0.127.0.15.1.1.13.0), "XMSS"),
(18, oid!(0.4.0.127.0.15.1.1.14.0), "XMSS^MT"),
(24, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with brainpoolP256r1"),
(25, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with brainpoolP384r1"),
(26, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with brainpoolP512r1"),
(27, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with FRP256v1"),
(28, oid!(1.2.840.10045.2.1), "EC Public Key (Weierstraß) with sm2p256v1"),
];

/// A struct of data that contains lookup table of integer to OID in
/// bidirectional way for `SubjectPublicKeyAlgorithm`.
pub(crate) struct SubjectPubKeyAlgoData(IntegerToOidTable);

impl SubjectPubKeyAlgoData {
/// Get the `IntegerToOidTable`
pub(crate) fn get_int_to_oid_table(&self) -> &IntegerToOidTable {
&self.0
}
}

/// Define static lookup for subject publickey table
static SUBJECT_PUB_KEY_ALGO_TABLE: Lazy<SubjectPubKeyAlgoData> = Lazy::new(|| {
let mut int_to_oid_table = IntegerToOidTable::new();

for data in PUB_KEY_ALGO_DATA {
int_to_oid_table.add(data.0, data.1);
}

SubjectPubKeyAlgoData(int_to_oid_table)
});

/// Static reference to the `SubjectPubKeyAlgoData` lookup table.
pub(crate) static SUBJECT_PUB_KEY_ALGO_LOOKUP: &Lazy<SubjectPubKeyAlgoData> =
Mr-Leshiy marked this conversation as resolved.
Show resolved Hide resolved
&SUBJECT_PUB_KEY_ALGO_TABLE;

/// Get the OID from the int value.
pub(crate) fn get_oid_from_int(i: i16) -> Result<Oid<'static>, Error> {
SUBJECT_PUB_KEY_ALGO_TABLE
.get_int_to_oid_table()
.get_map()
.get_by_left(&i)
.ok_or(Error::msg(format!(
"OID not found in the public key algorithms registry table given int {i}"
)))
.cloned()
}
Loading
Loading