Implement get_security_support_template()

This commit is contained in:
Heiko Schaefer 2021-08-21 20:22:03 +02:00
parent 09ee8f4792
commit c14664b9d5
3 changed files with 39 additions and 6 deletions

View file

@ -35,7 +35,7 @@ use openpgp_card::algorithm::{Algo, AlgoInfo, Curve};
use openpgp_card::card_do::{ use openpgp_card::card_do::{
ApplicationId, ApplicationRelatedData, Cardholder, ExtendedCap, ApplicationId, ApplicationRelatedData, Cardholder, ExtendedCap,
ExtendedLengthInfo, Features, Fingerprint, Historical, KeySet, PWStatus, ExtendedLengthInfo, Features, Fingerprint, Historical, KeySet, PWStatus,
Sex, SecuritySupportTemplate, Sex,
}; };
use openpgp_card::crypto_data::{ use openpgp_card::crypto_data::{
CardUploadableKey, Cryptogram, EccKey, EccType, Hash, PrivateKeyMaterial, CardUploadableKey, Cryptogram, EccKey, EccType, Hash, PrivateKeyMaterial,
@ -684,7 +684,9 @@ impl CardBase {
} }
// --- security support template (7a) --- // --- security support template (7a) ---
pub fn get_security_support_template(&mut self) -> Result<Vec<u8>> { pub fn get_security_support_template(
&mut self,
) -> Result<SecuritySupportTemplate> {
self.card_app.get_security_support_template() self.card_app.get_security_support_template()
} }

View file

@ -10,7 +10,9 @@ use anyhow::{anyhow, Result};
use crate::algorithm::{Algo, AlgoInfo, AlgoSimple, RsaAttrs}; use crate::algorithm::{Algo, AlgoInfo, AlgoSimple, RsaAttrs};
use crate::apdu::{commands, response::Response}; use crate::apdu::{commands, response::Response};
use crate::card_do::{ApplicationRelatedData, Cardholder, Sex}; use crate::card_do::{
ApplicationRelatedData, Cardholder, SecuritySupportTemplate, Sex,
};
use crate::crypto_data::{ use crate::crypto_data::{
CardUploadableKey, Cryptogram, EccType, Hash, PublicKeyMaterial, CardUploadableKey, Cryptogram, EccType, Hash, PublicKeyMaterial,
}; };
@ -159,14 +161,30 @@ impl CardApp {
} }
// --- security support template (7a) --- // --- security support template (7a) ---
// FIXME: parse data into a proper data structure pub fn get_security_support_template(
pub fn get_security_support_template(&mut self) -> Result<Vec<u8>> { &mut self,
) -> Result<SecuritySupportTemplate> {
let sst = commands::get_security_support_template(); let sst = commands::get_security_support_template();
let resp = apdu::send_command(&mut self.card_client, sst, true)?; let resp = apdu::send_command(&mut self.card_client, sst, true)?;
resp.check_ok()?; resp.check_ok()?;
let tlv = Tlv::try_from(resp.data()?)?; let tlv = Tlv::try_from(resp.data()?)?;
Ok(tlv.serialize()) let res = tlv
.find(&Tag::from([0x93]))
.ok_or(anyhow!("Couldn't get SecuritySupportTemplate DO"))?;
if let TlvEntry::S(data) = res {
let mut data = data.to_vec();
assert_eq!(data.len(), 3);
data.insert(0, 0); // prepend a zero
let data: [u8; 4] = data.try_into().unwrap();
let dsc: u32 = u32::from_be_bytes(data);
Ok(SecuritySupportTemplate { dsc })
} else {
Err(anyhow!("Failed to process SecuritySupportTemplate"))
}
} }
// DO "Algorithm Information" (0xFA) // DO "Algorithm Information" (0xFA)

View file

@ -168,6 +168,19 @@ impl ApplicationRelatedData {
} }
} }
#[derive(Debug)]
pub struct SecuritySupportTemplate {
// Digital signature counter [3 bytes]
// (counts usage of Compute Digital Signature command)
pub(crate) dsc: u32,
}
impl SecuritySupportTemplate {
pub fn get_signature_count(&self) -> u32 {
self.dsc
}
}
/// An OpenPGP key generation Time /// An OpenPGP key generation Time
#[derive(Clone, Eq, PartialEq, Debug)] #[derive(Clone, Eq, PartialEq, Debug)]
pub struct KeyGeneration(u32); pub struct KeyGeneration(u32);