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

WinSCard FFI implementation #205

Merged
merged 55 commits into from
Feb 5, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
55 commits
Select commit Hold shift + click to select a range
f2d5b21
feat(ffi-types): make SCardBeginTransactionFn and SCardEndTransaction…
TheBestTvarynka Sep 28, 2023
d0983a1
feat(ffi): winscard: implement SCardBeginTransactionFn and SCardEndTr…
TheBestTvarynka Sep 28, 2023
59cab04
feat(ffi): winscard: implement SCardControl
TheBestTvarynka Sep 28, 2023
50b8d12
feat(ffi): winscard: implement SCardIsValidContext
TheBestTvarynka Sep 28, 2023
b34d6e2
feat(ffi): implement SCardAccessStartedEvent and SCardReleaseStartedE…
TheBestTvarynka Sep 29, 2023
ec89b9a
feat(ffi): implement SCardTransmit
TheBestTvarynka Sep 29, 2023
36e70bf
feat(ffi): implement SCardGetReaderIconA/W
TheBestTvarynka Sep 29, 2023
8c24247
feat(ffi): implement SCardGetDeviceTypeIdA/W
TheBestTvarynka Sep 29, 2023
ff4ea04
feat(ffi): implement SCardConnectA/W
TheBestTvarynka Sep 29, 2023
945543a
feat(ffi): implement SCardDisconnect
TheBestTvarynka Sep 29, 2023
4873d9b
feat(ffi): implement SCardStatusA/W
TheBestTvarynka Sep 29, 2023
3bf8443
feat(ffi): implement SCardListReadersA/W
TheBestTvarynka Sep 29, 2023
997225e
feat(ffi): implement SCardReleaseContext
TheBestTvarynka Sep 29, 2023
191ec9f
feat(ffi): implement SCardFreeMemory
TheBestTvarynka Oct 3, 2023
185fa10
feat(sspi): replaced todos with UnsupportedFunction error code in unu…
TheBestTvarynka Oct 3, 2023
744c5a3
feat(winscard-ffi): implemented SCardEstablishContext, SCardGetStatus…
TheBestTvarynka Oct 3, 2023
4019ab0
synced with remote branch: ffi-types
TheBestTvarynka Feb 1, 2024
8f948c6
synced with remote branch: ffi/winscard
TheBestTvarynka Feb 1, 2024
386fa1f
synced with remote branch: winscard-rs
TheBestTvarynka Feb 1, 2024
f59da97
remove undded file
TheBestTvarynka Feb 1, 2024
811ab4e
fixed: ffi
TheBestTvarynka Jan 31, 2024
f2f90fa
fix(ffi-types): winscard: make ScardReaderStateW fields public
TheBestTvarynka Jan 31, 2024
9d1e2fb
fix(ffi): winscard: SCardGetStatusChangeW;
TheBestTvarynka Jan 31, 2024
7e1afad
winscard + sspi: ffi
TheBestTvarynka Jan 31, 2024
854437d
refac(winscard): export ATR
TheBestTvarynka Feb 2, 2024
e56dae0
refac(ffi): winscard: SCardGetStatusChangeW/A
TheBestTvarynka Feb 2, 2024
ff28a66
refac(ffi): winscard: SCardGetReaderIconW/A
TheBestTvarynka Feb 1, 2024
85b7c86
refac(ffi): winscard: SCardStatusW/A
TheBestTvarynka Feb 1, 2024
7309dcb
refac(ffi): winscard: SCardGetDeviceTypeIdW/A
TheBestTvarynka Feb 1, 2024
fd00038
refac(ffi): winscard: remove SCardDlgExtendedError function
TheBestTvarynka Feb 1, 2024
7fe989d
refac(ffi): winscard: SCardWriteCacheW/A
TheBestTvarynka Feb 1, 2024
cecad79
refac(ffi): winscard: SCardReadCacheW/A
TheBestTvarynka Feb 1, 2024
1a5a688
refac(ffi): winscard: SCardControl
TheBestTvarynka Feb 1, 2024
f68ff44
refac(ffi): winscard: SCardTransmit
TheBestTvarynka Feb 1, 2024
d6b5edd
refac(ffi): winscard: SCardGetCardTypeProviderNameW/A
TheBestTvarynka Feb 1, 2024
7bfd39c
refac(ffi): winscard: SCardListCardsW/A
TheBestTvarynka Feb 1, 2024
73a25be
refac(ffi): winscard: SCardListReadersW/A
TheBestTvarynka Feb 1, 2024
1fb899b
refac(ffi): winscard: SCardEstablishContext. feat(winscard): SmartCar…
TheBestTvarynka Feb 2, 2024
dce1291
refac(ffi): winscard: improve memoty management. fix memoty errors;
TheBestTvarynka Feb 2, 2024
4eb98cb
refac(ffi): winscard: small refactoring
TheBestTvarynka Feb 2, 2024
9761b90
refac(ffi): winscard: small refactoring
TheBestTvarynka Feb 2, 2024
f433724
winscard: refactoring
TheBestTvarynka Feb 2, 2024
1852dce
winscard: refactoring
TheBestTvarynka Feb 2, 2024
9d9a9bc
refac(ffi): winscard: simplify SCardStatusA/W
TheBestTvarynka Feb 2, 2024
e42614f
small ffi refactoring
TheBestTvarynka Feb 2, 2024
cb51897
refac(ffi): winscard: small refactoring;
TheBestTvarynka Feb 2, 2024
2c5ca22
refac(winscard): doc comments
TheBestTvarynka Feb 2, 2024
f011eb0
refac(ffi): small refactoring;
TheBestTvarynka Feb 2, 2024
6e69b42
refac(ffi): winscard: improve error handling
TheBestTvarynka Feb 2, 2024
c21ef72
fix(winscard): format import
TheBestTvarynka Feb 2, 2024
201d8d3
fix(ffi): library name
TheBestTvarynka Feb 2, 2024
be477e7
refactor(ffi): revert cargo.toml formatting
TheBestTvarynka Feb 5, 2024
938d397
refactor: improve doc comments summary
TheBestTvarynka Feb 5, 2024
8e96e66
refactor(ffi): winscard: rename module buff_alloc -> buf_alloc
TheBestTvarynka Feb 5, 2024
b94ece4
refactor(ffi): winscard: added explicit unsafe block. add unsafe_op_i…
TheBestTvarynka Feb 5, 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
30 changes: 20 additions & 10 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

83 changes: 52 additions & 31 deletions crates/ffi-types/src/winscard/functions.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,26 @@ use crate::{
Handle, LpByte, LpCByte, LpCGuid, LpCStr, LpCVoid, LpCWStr, LpDword, LpGuid, LpStr, LpUuid, LpVoid, LpWStr,
};

pub type SCardEstablishContextFn = extern "system" fn(u32, *const c_void, *const c_void, LpScardContext) -> ScardStatus;
pub type SCardReleaseContextFn = extern "system" fn(ScardContext) -> ScardStatus;
pub type SCardIsValidContextFn = extern "system" fn(ScardContext) -> ScardStatus;
pub type SCardEstablishContextFn =
unsafe extern "system" fn(u32, *const c_void, *const c_void, LpScardContext) -> ScardStatus;
pub type SCardReleaseContextFn = unsafe extern "system" fn(ScardContext) -> ScardStatus;
pub type SCardIsValidContextFn = unsafe extern "system" fn(ScardContext) -> ScardStatus;
pub type SCardListReaderGroupsAFn = extern "system" fn(ScardContext, LpStr, LpDword) -> ScardStatus;
pub type SCardListReaderGroupsWFn = extern "system" fn(ScardContext, LpWStr, LpDword) -> ScardStatus;
pub type SCardListReadersAFn = extern "system" fn(ScardContext, LpCStr, LpStr, LpDword) -> ScardStatus;
pub type SCardListReadersWFn = extern "system" fn(ScardContext, LpCWStr, LpWStr, LpDword) -> ScardStatus;
pub type SCardListCardsAFn = extern "system" fn(ScardContext, LpCByte, LpCGuid, u32, *mut u8, LpDword) -> ScardStatus;
pub type SCardListCardsWFn = extern "system" fn(ScardContext, LpCByte, LpCGuid, u32, *mut u16, LpDword) -> ScardStatus;
pub type SCardListReadersAFn = unsafe extern "system" fn(ScardContext, LpCStr, LpStr, LpDword) -> ScardStatus;
pub type SCardListReadersWFn = unsafe extern "system" fn(ScardContext, LpCWStr, LpWStr, LpDword) -> ScardStatus;
pub type SCardListCardsAFn =
unsafe extern "system" fn(ScardContext, LpCByte, LpCGuid, u32, *mut u8, LpDword) -> ScardStatus;
pub type SCardListCardsWFn =
unsafe extern "system" fn(ScardContext, LpCByte, LpCGuid, u32, *mut u16, LpDword) -> ScardStatus;
pub type SCardListInterfacesAFn = extern "system" fn(ScardContext, LpCStr, LpGuid, LpDword) -> ScardStatus;
pub type SCardListInterfacesWFn = extern "system" fn(ScardContext, LpCWStr, LpGuid, LpDword) -> ScardStatus;
pub type SCardGetProviderIdAFn = extern "system" fn(ScardContext, LpCStr, LpGuid) -> ScardStatus;
pub type SCardGetProviderIdWFn = extern "system" fn(ScardContext, LpCWStr, LpGuid) -> ScardStatus;
pub type SCardGetCardTypeProviderNameAFn =
extern "system" fn(ScardContext, LpCStr, u32, *mut u8, LpDword) -> ScardStatus;
unsafe extern "system" fn(ScardContext, LpCStr, u32, *mut u8, LpDword) -> ScardStatus;
pub type SCardGetCardTypeProviderNameWFn =
extern "system" fn(ScardContext, LpCWStr, u32, *mut u16, LpDword) -> ScardStatus;
unsafe extern "system" fn(ScardContext, LpCWStr, u32, *mut u16, LpDword) -> ScardStatus;
CBenoit marked this conversation as resolved.
Show resolved Hide resolved
pub type SCardIntroduceReaderGroupAFn = extern "system" fn(ScardContext, LpCStr) -> ScardStatus;
pub type SCardIntroduceReaderGroupWFn = extern "system" fn(ScardContext, LpCWStr) -> ScardStatus;
pub type SCardForgetReaderGroupAFn = extern "system" fn(ScardContext, LpCStr) -> ScardStatus;
Expand All @@ -45,54 +48,71 @@ pub type SCardSetCardTypeProviderNameAFn = extern "system" fn(ScardContext, LpCS
pub type SCardSetCardTypeProviderNameWFn = extern "system" fn(ScardContext, LpCWStr, u32, LpCWStr) -> ScardStatus;
pub type SCardForgetCardTypeAFn = extern "system" fn(ScardContext, LpCStr) -> ScardStatus;
pub type SCardForgetCardTypeWFn = extern "system" fn(ScardContext, LpCWStr) -> ScardStatus;
pub type SCardFreeMemoryFn = extern "system" fn(ScardContext, LpCVoid) -> ScardStatus;
pub type SCardFreeMemoryFn = unsafe extern "system" fn(ScardContext, LpCVoid) -> ScardStatus;
pub type SCardAccessStartedEventFn = extern "system" fn() -> Handle;
pub type SCardReleaseStartedEventFn = extern "system" fn() -> c_void;
pub type SCardReleaseStartedEventFn = extern "system" fn();
pub type SCardLocateCardsAFn = extern "system" fn(ScardContext, LpCStr, LpScardReaderStateA, u32) -> ScardStatus;
pub type SCardLocateCardsWFn = extern "system" fn(ScardContext, LpCWStr, LpScardReaderStateW, u32) -> ScardStatus;
pub type SCardLocateCardsByATRAFn =
extern "system" fn(ScardContext, LpScardAtrMask, u32, LpScardReaderStateA, u32) -> ScardStatus;
pub type SCardLocateCardsByATRWFn =
extern "system" fn(ScardContext, LpScardAtrMask, u32, LpScardReaderStateW, u32) -> ScardStatus;
pub type SCardGetStatusChangeAFn = extern "system" fn(ScardContext, u32, LpScardReaderStateA, u32) -> ScardStatus;
pub type SCardGetStatusChangeWFn = extern "system" fn(ScardContext, u32, LpScardReaderStateW, u32) -> ScardStatus;
pub type SCardGetStatusChangeAFn =
unsafe extern "system" fn(ScardContext, u32, LpScardReaderStateA, u32) -> ScardStatus;
pub type SCardGetStatusChangeWFn =
unsafe extern "system" fn(ScardContext, u32, LpScardReaderStateW, u32) -> ScardStatus;
pub type SCardCancelFn = extern "system" fn(ScardContext) -> ScardStatus;
pub type SCardReadCacheAFn = extern "system" fn(ScardContext, LpUuid, u32, LpStr, LpByte, LpDword) -> ScardStatus;
pub type SCardReadCacheWFn = extern "system" fn(ScardContext, LpUuid, u32, LpWStr, LpByte, LpDword) -> ScardStatus;
pub type SCardWriteCacheAFn = extern "system" fn(ScardContext, LpUuid, u32, LpStr, LpByte, u32) -> ScardStatus;
pub type SCardWriteCacheWFn = extern "system" fn(ScardContext, LpUuid, u32, LpWStr, LpByte, u32) -> ScardStatus;
pub type SCardGetReaderIconAFn = extern "system" fn(ScardContext, LpCStr, LpByte, LpDword) -> ScardStatus;
pub type SCardGetReaderIconWFn = extern "system" fn(ScardContext, LpCWStr, LpByte, LpDword) -> ScardStatus;
pub type SCardReadCacheAFn =
unsafe extern "system" fn(ScardContext, LpUuid, u32, LpStr, LpByte, LpDword) -> ScardStatus;
pub type SCardReadCacheWFn =
unsafe extern "system" fn(ScardContext, LpUuid, u32, LpWStr, LpByte, LpDword) -> ScardStatus;
pub type SCardWriteCacheAFn = unsafe extern "system" fn(ScardContext, LpUuid, u32, LpStr, LpByte, u32) -> ScardStatus;
pub type SCardWriteCacheWFn = unsafe extern "system" fn(ScardContext, LpUuid, u32, LpWStr, LpByte, u32) -> ScardStatus;
pub type SCardGetReaderIconAFn = unsafe extern "system" fn(ScardContext, LpCStr, LpByte, LpDword) -> ScardStatus;
pub type SCardGetReaderIconWFn = unsafe extern "system" fn(ScardContext, LpCWStr, LpByte, LpDword) -> ScardStatus;
pub type SCardGetDeviceTypeIdAFn = unsafe extern "system" fn(ScardContext, LpCStr, LpDword) -> ScardStatus;
pub type SCardGetDeviceTypeIdWFn = unsafe extern "system" fn(ScardContext, LpCWStr, LpDword) -> ScardStatus;
pub type SCardGetReaderDeviceInstanceIdAFn = extern "system" fn(ScardContext, LpCStr, LpStr, LpDword) -> ScardStatus;
pub type SCardGetReaderDeviceInstanceIdWFn = extern "system" fn(ScardContext, LpCWStr, LpWStr, LpDword) -> ScardStatus;
pub type SCardListReadersWithDeviceInstanceIdAFn =
extern "system" fn(ScardContext, LpCStr, LpStr, LpDword) -> ScardStatus;
pub type SCardListReadersWithDeviceInstanceIdWFn =
extern "system" fn(ScardContext, LpCWStr, LpWStr, LpDword) -> ScardStatus;
pub type SCardAuditFn = extern "system" fn(ScardContext, u32) -> ScardStatus;
pub type SCardConnectAFn = extern "system" fn(ScardContext, LpCStr, u32, u32, LpScardHandle, LpDword) -> ScardStatus;
pub type SCardConnectWFn = extern "system" fn(ScardContext, LpCWStr, u32, u32, LpScardHandle, LpDword) -> ScardStatus;
pub type SCardConnectAFn =
unsafe extern "system" fn(ScardContext, LpCStr, u32, u32, LpScardHandle, LpDword) -> ScardStatus;
pub type SCardConnectWFn =
unsafe extern "system" fn(ScardContext, LpCWStr, u32, u32, LpScardHandle, LpDword) -> ScardStatus;
pub type SCardReconnectFn = extern "system" fn(ScardHandle, u32, u32, u32, LpDword) -> ScardStatus;
pub type SCardDisconnectFn = extern "system" fn(ScardHandle, u32) -> ScardStatus;
pub type SCardBeginTransactionFn = extern "system" fn(ScardHandle) -> ScardStatus;
pub type SCardEndTransactionFn = extern "system" fn(ScardHandle, u32) -> ScardStatus;
pub type SCardDisconnectFn = unsafe extern "system" fn(ScardHandle, u32) -> ScardStatus;
pub type SCardBeginTransactionFn = unsafe extern "system" fn(ScardHandle) -> ScardStatus;
pub type SCardEndTransactionFn = unsafe extern "system" fn(ScardHandle, u32) -> ScardStatus;
pub type SCardCancelTransactionFn = extern "system" fn(ScardHandle) -> ScardStatus;
pub type SCardStateFn = extern "system" fn(ScardHandle, LpDword, LpDword, LpByte, LpDword) -> ScardStatus;
pub type SCardStatusAFn =
extern "system" fn(ScardHandle, LpStr, LpDword, LpDword, LpDword, LpByte, LpDword) -> ScardStatus;
unsafe extern "system" fn(ScardHandle, LpStr, LpDword, LpDword, LpDword, LpByte, LpDword) -> ScardStatus;
pub type SCardStatusWFn =
extern "system" fn(ScardHandle, LpWStr, LpDword, LpDword, LpDword, LpByte, LpDword) -> ScardStatus;
pub type SCardTransmitFn =
extern "system" fn(ScardHandle, LpScardIoRequest, LpCByte, u32, LpScardIoRequest, LpByte, LpDword) -> ScardStatus;
unsafe extern "system" fn(ScardHandle, LpWStr, LpDword, LpDword, LpDword, LpByte, LpDword) -> ScardStatus;
pub type SCardTransmitFn = unsafe extern "system" fn(
ScardHandle,
LpScardIoRequest,
LpCByte,
u32,
LpScardIoRequest,
LpByte,
LpDword,
) -> ScardStatus;
pub type SCardGetTransmitCountFn = extern "system" fn(ScardHandle, LpDword) -> ScardStatus;
pub type SCardControlFn = extern "system" fn(ScardHandle, u32, LpCVoid, u32, LpVoid, u32, LpDword) -> ScardStatus;
pub type SCardControlFn =
unsafe extern "system" fn(ScardHandle, u32, LpCVoid, u32, LpVoid, u32, LpDword) -> ScardStatus;
pub type SCardGetAttribFn = extern "system" fn(ScardHandle, u32, LpByte, LpDword) -> ScardStatus;
pub type SCardSetAttribFn = extern "system" fn(ScardHandle, u32, LpCByte, u32) -> ScardStatus;
pub type SCardUIDlgSelectCardAFn = extern "system" fn(LpOpenCardNameExA) -> ScardStatus;
pub type SCardUIDlgSelectCardWFn = extern "system" fn(LpOpenCardNameExW) -> ScardStatus;
pub type GetOpenCardNameAFn = extern "system" fn(LpOpenCardNameA) -> ScardStatus;
pub type GetOpenCardNameWFn = extern "system" fn(LpOpenCardNameW) -> ScardStatus;
pub type SCardDlgExtendedErrorFn = extern "system" fn() -> i32;
// Not a part of the standard winscard.h API
pub type GetSCardApiFunctionTableFn = extern "system" fn() -> PSCardApiFunctionTable;

// https://github.com/FreeRDP/FreeRDP/blob/88f79c5748f4031cb50dfae3ebadcc6619b69f1c/winpr/include/winpr/smartcard.h#L1114
#[repr(C)]
Expand Down Expand Up @@ -161,13 +181,14 @@ pub struct SCardApiFunctionTable {
pub SCardUIDlgSelectCardW: SCardUIDlgSelectCardWFn,
pub GetOpenCardNameA: GetOpenCardNameAFn,
pub GetOpenCardNameW: GetOpenCardNameWFn,
pub SCardDlgExtendedError: SCardDlgExtendedErrorFn,
pub SCardReadCacheA: SCardReadCacheAFn,
pub SCardReadCacheW: SCardReadCacheWFn,
pub SCardWriteCacheA: SCardWriteCacheAFn,
pub SCardWriteCacheW: SCardWriteCacheWFn,
pub SCardGetReaderIconA: SCardGetReaderIconAFn,
pub SCardGetReaderIconW: SCardGetReaderIconWFn,
pub SCardGetDeviceTypeIdA: SCardGetDeviceTypeIdAFn,
pub SCardGetDeviceTypeIdW: SCardGetDeviceTypeIdWFn,
pub SCardGetReaderDeviceInstanceIdA: SCardGetReaderDeviceInstanceIdAFn,
pub SCardGetReaderDeviceInstanceIdW: SCardGetReaderDeviceInstanceIdWFn,
pub SCardListReadersWithDeviceInstanceIdA: SCardListReadersWithDeviceInstanceIdAFn,
Expand Down
29 changes: 15 additions & 14 deletions crates/ffi-types/src/winscard/mod.rs
Original file line number Diff line number Diff line change
Expand Up @@ -36,12 +36,12 @@ pub type LpOcnDscProc = Option<unsafe extern "system" fn(_: ScardContext, _: Sca
/// ```
#[repr(C)]
pub struct ScardReaderStateA {
sz_reader: LpCStr,
pv_user_data: LpVoid,
dw_current_state: u32,
dw_event_state: u32,
cb_atr: u32,
rgb_atr: [u8; 36],
pub sz_reader: LpCStr,
pub pv_user_data: LpVoid,
pub dw_current_state: u32,
pub dw_event_state: u32,
pub cb_atr: u32,
pub rgb_atr: [u8; 36],
}

pub type LpScardReaderStateA = *mut ScardReaderStateA;
Expand All @@ -58,14 +58,15 @@ pub type LpScardReaderStateA = *mut ScardReaderStateA;
/// BYTE rgbAtr[36];
/// } SCARD_READERSTATEW, *PSCARD_READERSTATEW, *LPSCARD_READERSTATEW;
/// ```
#[derive(Debug)]
#[repr(C)]
pub struct ScardReaderStateW {
sz_reader: LpCWStr,
pv_user_data: LpVoid,
dw_current_state: u32,
dw_event_state: u32,
cb_atr: u32,
rgb_atr: [u8; 36],
pub sz_reader: LpCWStr,
pub pv_user_data: LpVoid,
pub dw_current_state: u32,
pub dw_event_state: u32,
pub cb_atr: u32,
pub rgb_atr: [u8; 36],
}

pub type LpScardReaderStateW = *mut ScardReaderStateW;
Expand Down Expand Up @@ -98,8 +99,8 @@ pub type LpScardAtrMask = *mut ScardAtrMask;
/// ```
#[repr(C)]
pub struct ScardIoRequest {
dw_protocol: u32,
cb_pci_length: u32,
pub dw_protocol: u32,
pub cb_pci_length: u32,
}

pub type LpScardIoRequest = *mut ScardIoRequest;
Expand Down
10 changes: 10 additions & 0 deletions crates/winscard/src/env.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
/// Emulated smart card PIN code.
pub const WINSCARD_PIN_ENV: &str = "WINSCARD_PIN";
/// Path to the user certificate to be used in emulated smart card.
pub const WINSCARD_CERT_PATH_ENV: &str = "WINSCARD_CERT_PATH";
/// Path to the certificate private key.
pub const WINSCARD_PK_PATH_ENV: &str = "WINSCARD_PK_PATH";
/// Emulated smart card container name.
pub const WINSCARD_CONTAINER_NAME_ENV: &str = "WINSCARD_CONTAINER";
/// Emulated smart card reader name.
pub const WINSCARD_READER_NAME_ENV: &str = "WINSCARD_READER";
20 changes: 18 additions & 2 deletions crates/winscard/src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -5,11 +5,17 @@
#[macro_use]
extern crate tracing;

#[macro_use]
mod macros;

mod ber_tlv;
mod card_capability_container;
mod chuid;
mod compression;
mod dummy_rng;
/// Contains env variables names that represent smart card credentials.
#[cfg(feature = "std")]
pub mod env;
mod piv_cert;
mod scard;
mod scard_context;
Expand All @@ -23,13 +29,14 @@ extern crate alloc;
use alloc::format;
use alloc::string::String;
use alloc::vec::Vec;
use core::num::TryFromIntError;
use core::{fmt, result};

pub use ber_tlv::ber_tlv_length_encoding;
use iso7816_tlv::TlvError;
use picky::key::KeyError;
pub use scard::{SmartCard, PIV_AID};
pub use scard_context::{Reader, ScardContext};
pub use scard::{SmartCard, ATR, PIV_AID};
pub use scard_context::{Reader, ScardContext, SmartCardInfo};

/// The [WinScardResult] type.
pub type WinScardResult<T> = result::Result<T, Error>;
Expand Down Expand Up @@ -125,6 +132,15 @@ impl From<TlvError> for Error {
}
}

impl From<TryFromIntError> for Error {
fn from(value: TryFromIntError) -> Self {
Error::new(
ErrorKind::InsufficientBuffer,
format!("error: can not convert integers: {}", value),
)
}
}

/// [Smart Card Return Values](https://learn.microsoft.com/en-us/windows/win32/secauthn/authentication-return-values).
#[derive(Debug, PartialEq)]
#[repr(u32)]
Expand Down
10 changes: 10 additions & 0 deletions crates/winscard/src/macros.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
macro_rules! env {
($name:expr) => {{
std::env::var($name).map_err(|_| {
crate::Error::new(
crate::ErrorKind::InvalidParameter,
format!("The {} env var is not present or invalid", $name),
)
})
}};
}
Loading
Loading