Skip to content

Commit bfd690d

Browse files
AverPoweraver
andauthored
feat: add issuer field to CertificateInfo (#4)
* add issuer field to CertificateInfo * format fix --------- Co-authored-by: aver <froloff92@mail.ru>
1 parent 03b4d14 commit bfd690d

File tree

8 files changed

+34
-5
lines changed

8 files changed

+34
-5
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ for signature in signatures:
101101
match signature:
102102
case Signature.V1() | Signature.V2() | Signature.V3() | Signature.V31():
103103
for cert in signature.certificates:
104-
print(f"{cert.subject=} {cert.valid_from=} {cert.valid_until=}")
104+
print(f"{cert.subject=} {cert.issuer=} {cert.valid_from=} {cert.valid_until=}")
105105
case Signature.ApkChannelBlock():
106106
print(f"got apk channel block: {signature.value}")
107107
case _:

cli/src/commands/show.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -132,6 +132,7 @@ fn show(path: &Path, show_signatures: &bool) -> Result<()> {
132132
fn print_certificate(certificate: &CertificateInfo) {
133133
println!(" Serial Number: {}", certificate.serial_number.green());
134134
println!(" Subject: {}", certificate.subject.green());
135+
println!(" Issuer: {}", certificate.issuer.green());
135136
println!(" Valid from: {}", certificate.valid_from.green());
136137
println!(" Valid until: {}", certificate.valid_until.green());
137138
println!(" Signature type: {}", certificate.signature_type.green());

crates/zip/src/entry.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -293,7 +293,7 @@ impl ZipEntry {
293293

294294
/// Converts an OpenSSL [`X509Ref`] into a [`CertificateInfo`] struct.
295295
///
296-
/// Extracts common certificate metadata such as serial number, subject,
296+
/// Extracts common certificate metadata such as serial number, subject, issuer,
297297
/// validity period, signature algorithm, and cryptographic fingerprints.
298298
fn get_certificate_info(
299299
&self,
@@ -327,6 +327,20 @@ impl ZipEntry {
327327
}
328328
}
329329

330+
let mut issuer = String::with_capacity(128);
331+
332+
for entry in certificate.issuer_name().entries() {
333+
if let Ok(value) = entry.data().as_utf8() {
334+
if !issuer.is_empty() {
335+
issuer.push(' ');
336+
}
337+
let name = entry.object().nid().short_name().unwrap_or_default();
338+
issuer.push_str(name);
339+
issuer.push('=');
340+
issuer.push_str(value.as_ref());
341+
}
342+
}
343+
330344
let valid_from = certificate.not_before().to_string();
331345
let valid_until = certificate.not_after().to_string();
332346

@@ -345,6 +359,7 @@ impl ZipEntry {
345359
Ok(CertificateInfo {
346360
serial_number,
347361
subject,
362+
issuer,
348363
valid_from,
349364
valid_until,
350365
signature_type,

crates/zip/src/signature.rs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ pub struct CertificateInfo {
103103
/// The subject of the certificate (typically the entity that signed the APK).
104104
pub subject: String,
105105

106+
/// The issuer of the certificate
107+
pub issuer: String,
108+
106109
/// The date and time when the certificate becomes valid.
107110
pub valid_from: String,
108111

examples/signatures.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
match signature:
1515
case Signature.V1() | Signature.V2() | Signature.V3() | Signature.V31():
1616
for cert in signature.certificates:
17-
print(f"{cert.subject=} {cert.valid_from=} {cert.valid_until=}")
17+
print(f"{cert.subject=} {cert.issuer=} {cert.valid_from=} {cert.valid_until=}")
1818
case Signature.ApkChannelBlock():
1919
print(f"got apk channel block: {signature.value}")
2020
case _:

python/README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ for signature in signatures:
7272
match signature:
7373
case Signature.V1() | Signature.V2() | Signature.V3() | Signature.V31():
7474
for cert in signature.certificates:
75-
print(f"{cert.subject=} {cert.valid_from=} {cert.valid_until=}")
75+
print(f"{cert.subject=} {cert.issuer} {cert.valid_from=} {cert.valid_until=}")
7676
case Signature.ApkChannelBlock():
7777
print(f"got apk channel block: {signature.value}")
7878
case _:

python/apk_info.pyi

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -828,6 +828,11 @@ class CertificateInfo:
828828
The subject of the certificate
829829
"""
830830

831+
issuer: str
832+
"""
833+
The issuer of the certificate
834+
"""
835+
831836
valid_from: str
832837
"""
833838
The date and time when the certificate becomes valid

python/src/lib.rs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@ pub struct CertificateInfo {
2727
#[pyo3(get)]
2828
pub subject: String,
2929

30+
#[pyo3(get)]
31+
pub issuer: String,
32+
3033
#[pyo3(get)]
3134
pub valid_from: String,
3235

@@ -51,6 +54,7 @@ impl From<ZipCertificateInfo> for CertificateInfo {
5154
Self {
5255
serial_number: certificate.serial_number,
5356
subject: certificate.subject,
57+
issuer: certificate.issuer,
5458
valid_from: certificate.valid_from,
5559
valid_until: certificate.valid_until,
5660
signature_type: certificate.signature_type,
@@ -65,9 +69,10 @@ impl From<ZipCertificateInfo> for CertificateInfo {
6569
impl CertificateInfo {
6670
fn __repr__(&self) -> String {
6771
format!(
68-
"CertificateInfo(serial_number='{}', subject='{}', valid_from='{}', valid_until='{}', signature_type='{}', md5_fingerprint='{}', sha1_fingerprint='{}', sha256_fingerprint='{}')",
72+
"CertificateInfo(serial_number='{}', subject='{}', issuer='{}' valid_from='{}', valid_until='{}', signature_type='{}', md5_fingerprint='{}', sha1_fingerprint='{}', sha256_fingerprint='{}')",
6973
self.serial_number,
7074
self.subject,
75+
self.issuer,
7176
self.valid_from,
7277
self.valid_until,
7378
self.signature_type,

0 commit comments

Comments
 (0)