Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
10 changes: 10 additions & 0 deletions src/info.rs
Original file line number Diff line number Diff line change
Expand Up @@ -238,6 +238,7 @@ pub(crate) fn empty_public_params_info(kind: &str) -> PublicParamsInfo {
curve_oid: None,
curve_alias: None,
curve_bits: None,
dsa_bits: None,
rsa_bits: None,
secret_key_length: None,
is_supported: None,
Expand All @@ -263,6 +264,9 @@ pub(crate) fn public_params_info_from_params(params: &PgpPublicParams) -> Public
PgpPublicParams::RSA(params) => {
info.rsa_bits = u32::try_from(params.key.n().bits()).ok();
}
PgpPublicParams::DSA(params) => {
info.dsa_bits = u32::try_from(params.key.components().p().bits()).ok();
}
PgpPublicParams::ECDSA(params) => match params {
PgpEcdsaPublicParams::P256 { .. } => {
set_curve_metadata(&mut info, &ECCCurve::P256);
Expand Down Expand Up @@ -927,6 +931,7 @@ pub(crate) struct PublicParamsInfo {
pub(crate) curve_oid: Option<String>,
pub(crate) curve_alias: Option<String>,
pub(crate) curve_bits: Option<u16>,
pub(crate) dsa_bits: Option<u32>,
pub(crate) rsa_bits: Option<u32>,
pub(crate) secret_key_length: Option<usize>,
pub(crate) is_supported: Option<bool>,
Expand Down Expand Up @@ -967,6 +972,11 @@ impl PublicParamsInfo {
self.curve_bits
}

#[getter]
fn dsa_bits(&self) -> Option<u32> {
self.dsa_bits
}

/// The encoded RSA modulus size in bits, when this key uses RSA public parameters.
#[getter]
fn rsa_bits(&self) -> Option<u32> {
Expand Down
2 changes: 2 additions & 0 deletions src/openpgp/_openpgp.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -260,6 +260,8 @@ class PublicParamsInfo:
@property
def curve_bits(self) -> Optional[int]: ...
@property
def dsa_bits(self) -> Optional[int]: ...
@property
def rsa_bits(self) -> Optional[int]: ...
@property
def secret_key_length(self) -> Optional[int]: ...
Expand Down
29 changes: 29 additions & 0 deletions tests/test_key_generation.py
Original file line number Diff line number Diff line change
Expand Up @@ -379,6 +379,34 @@ def test_legacy_curve25519_public_params_expose_curve_metadata() -> None:
assert reparsed_public.subkey_bindings()[0].public_params.curve == "curve25519"


def test_dsa_public_params_expose_prime_size_for_generated_and_parsed_keys() -> None:
secret_key = (
SecretKeyParamsBuilder()
.created_at(FIXED_PRIMARY_CREATED_AT)
.key_type(KeyType.dsa(1024))
.can_certify(True)
.can_sign(True)
.primary_user_id("alice")
.build()
.generate()
)
public_key = secret_key.to_public_key()

for key in (secret_key, public_key):
params = key.public_params
assert params.kind == "dsa"
assert params.dsa_bits == 1024
assert params.rsa_bits is None
assert params.curve is None
assert params.curve_bits is None
assert params.secret_key_length is None

reparsed_secret, _ = SecretKey.from_armor(secret_key.to_armored())
reparsed_public, _ = PublicKey.from_armor(public_key.to_armored())
assert reparsed_secret.public_params.dsa_bits == 1024
assert reparsed_public.public_params.dsa_bits == 1024


def test_rsa_public_params_expose_modulus_size_for_generated_and_parsed_keys() -> None:
secret_key = (
SecretKeyParamsBuilder()
Expand All @@ -396,6 +424,7 @@ def test_rsa_public_params_expose_modulus_size_for_generated_and_parsed_keys() -
params = key.public_params
assert params.kind == "rsa"
assert params.rsa_bits == 2048
assert params.dsa_bits is None
assert params.curve is None
assert params.curve_bits is None
assert params.secret_key_length is None
Expand Down
Loading