From 61ab492d9c56fb7063195dab79f5aa27e1458925 Mon Sep 17 00:00:00 2001 From: Patryk Cisek Date: Wed, 16 Aug 2023 18:41:27 -0700 Subject: [PATCH] Added login data Added ability to read and set login data field. --- card-functionality/src/import.rs | 4 ++++ card-functionality/src/tests.rs | 16 ++++++++++++++++ openpgp-card/src/apdu/commands.rs | 10 ++++++++++ openpgp-card/src/openpgp.rs | 15 +++++++++++++++ 4 files changed, 45 insertions(+) diff --git a/card-functionality/src/import.rs b/card-functionality/src/import.rs index da2346e..b477117 100644 --- a/card-functionality/src/import.rs +++ b/card-functionality/src/import.rs @@ -40,6 +40,10 @@ fn main() -> Result<()> { } }; + println!("Set login data"); + let login_data_out = run_test(&mut card, test_set_login_data, &[])?; + println!(" {login_data_out:x?}"); + for key_file in &key_files { // upload keys print!("Upload key '{key_file}'"); diff --git a/card-functionality/src/tests.rs b/card-functionality/src/tests.rs index ca9f53b..8bac04a 100644 --- a/card-functionality/src/tests.rs +++ b/card-functionality/src/tests.rs @@ -352,6 +352,22 @@ pub fn test_set_user_data(pgp: &mut OpenPgp, _param: &[&str]) -> Result Result { + let mut pgpt = pgp.transaction()?; + + pgpt.verify_pw3(b"12345678")?; + + let test_login = b"someone@somewhere.com"; + pgpt.set_login(test_login)?; + + // Read the previously set login data + let read_login_data = pgpt.login_data()?; + + assert_eq!(read_login_data, test_login.to_vec()); + + Ok(vec![]) +} + pub fn test_private_data(pgp: &mut OpenPgp, _param: &[&str]) -> Result { let mut pgpt = pgp.transaction()?; diff --git a/openpgp-card/src/apdu/commands.rs b/openpgp-card/src/apdu/commands.rs index fc05677..c59fd99 100644 --- a/openpgp-card/src/apdu/commands.rs +++ b/openpgp-card/src/apdu/commands.rs @@ -47,6 +47,11 @@ pub(crate) fn url() -> Command { get_data(Tags::Url) } +/// GET DO "Login Data" +pub(crate) fn login_data() -> Command { + get_data(Tags::LoginData) +} + /// GET DO "Cardholder related data" pub(crate) fn cardholder_related_data() -> Command { get_data(Tags::CardholderRelatedData) @@ -131,6 +136,11 @@ pub(crate) fn put_private_use_do(num: u8, data: Vec) -> Command { } } +/// PUT DO Login Data +pub(crate) fn put_login_data(login_data: Vec) -> Command { + put_data(Tags::LoginData, login_data) +} + /// PUT DO Name pub(crate) fn put_name(name: Vec) -> Command { put_data(Tags::Name, name) diff --git a/openpgp-card/src/openpgp.rs b/openpgp-card/src/openpgp.rs index 1b198b4..1fcfd3f 100644 --- a/openpgp-card/src/openpgp.rs +++ b/openpgp-card/src/openpgp.rs @@ -110,6 +110,15 @@ impl<'a> OpenPgpTransaction<'a> { Ok(resp.data()?.to_vec()) } + /// Get Login Data (5e) + pub fn login_data(&mut self) -> Result, Error> { + log::info!("OpenPgpTransaction: login_data"); + + let resp = apdu::send_command(self.tx(), commands::login_data(), true)?; + + Ok(resp.data()?.to_vec()) + } + /// Get cardholder related data (65) pub fn cardholder_related_data(&mut self) -> Result { log::info!("OpenPgpTransaction: cardholder_related_data"); @@ -717,6 +726,12 @@ impl<'a> OpenPgpTransaction<'a> { Ok(resp.data()?.to_vec()) } + pub fn set_login(&mut self, login: &[u8]) -> Result<(), Error> { + log::info!("OpenPgpTransaction: set_login"); + let put_login_data = commands::put_login_data(login.to_vec()); + apdu::send_command(self.tx(), put_login_data, false)?.try_into() + } + pub fn set_name(&mut self, name: &[u8]) -> Result<(), Error> { log::info!("OpenPgpTransaction: set_name");