#![allow(dead_code)]
mod engine;
mod error;
pub mod helper;
pub mod spec;
use skf_api::native::types::{ECCPrivateKeyBlob, ECCPublicKeyBlob, ECCSignatureBlob, HANDLE};
use std::fmt::Debug;
use std::time::Duration;
pub type Error = error::Error;
pub type Result<T> = std::result::Result<T, Error>;
pub type Engine = engine::Engine;
pub type LibLoader = engine::LibLoader;
#[derive(Debug)]
pub struct PluginEvent {
pub device_name: String,
pub event: u8,
}
pub type HASH256 = [u8; 32];
#[derive(Debug)]
pub struct ECCEncryptedData {
pub ec_x: [u8; 64],
pub ec_y: [u8; 64],
pub hash: HASH256,
pub cipher: Vec<u8>,
}
impl Default for ECCEncryptedData {
fn default() -> Self {
Self {
ec_x: [0; 64],
ec_y: [0; 64],
hash: [0; 32],
cipher: vec![],
}
}
}
#[derive(Debug)]
pub struct EnvelopedKeyData {
pub version: u32,
pub sym_alg_id: u32,
pub bits: u32,
pub encrypted_pri_key: [u8; 64],
pub pub_key: ECCPublicKeyBlob,
pub ecc_cipher: ECCEncryptedData,
}
impl Default for EnvelopedKeyData {
fn default() -> Self {
Self {
version: 0,
sym_alg_id: 0,
bits: 0,
encrypted_pri_key: [0u8; 64],
pub_key: ECCPublicKeyBlob::default(),
ecc_cipher: ECCEncryptedData::default(),
}
}
}
#[derive(Debug, Default)]
pub struct Version {
pub major: u8,
pub minor: u8,
}
#[derive(Debug)]
pub struct DeviceInformation {
pub version: Version,
pub manufacturer: String,
pub issuer: String,
pub label: String,
pub serial_number: String,
pub hw_version: Version,
pub firmware_version: Version,
pub alg_sym_cap: u32,
pub alg_asym_cap: u32,
pub alg_hash_cap: u32,
pub dev_auth_alg_id: u32,
pub total_space: u32,
pub free_space: u32,
pub max_ecc_buffer_size: u32,
pub max_buffer_size: u32,
pub reserved: [u8; 64],
}
pub const DEV_STATE_ABSENT: u32 = 0;
pub const DEV_STATE_PRESENT: u32 = 1;
pub const DEV_STATE_UNKNOWN: u32 = 2;
pub trait DeviceManager {
fn enumerate_device_name(&self, presented_only: bool) -> Result<Vec<String>>;
fn device_state(&self, device_name: &str) -> Result<u32>;
fn wait_plug_event(&self) -> Result<Option<PluginEvent>>;
fn cancel_wait_plug_event(&self) -> Result<()>;
fn connect(&self, device_name: &str) -> Result<Box<dyn SkfDevice>>;
fn connect_selected(
&self,
selector: fn(Vec<&str>) -> Option<&str>,
) -> Result<Box<dyn SkfDevice>>;
}
pub trait DeviceCtl {
fn set_label(&self, label: &str) -> Result<()>;
fn info(&self) -> Result<DeviceInformation>;
fn lock(&self, timeout: Option<Duration>) -> Result<()>;
fn unlock(&self) -> Result<()>;
fn transmit(&self, command: &[u8], recv_capacity: usize) -> Result<Vec<u8>>;
}
pub trait DeviceCrypto {
fn gen_random(&self, len: usize) -> Result<Vec<u8>>;
fn set_symmetric_key(&self, alg_id: u32, key: &[u8]) -> Result<Box<dyn ManagedKey>>;
fn ext_ecc_encrypt(&self, key: &ECCPublicKeyBlob, data: &[u8]) -> Result<ECCEncryptedData>;
fn ext_ecc_decrypt(
&self,
key: &ECCPrivateKeyBlob,
cipher: &ECCEncryptedData,
) -> Result<Vec<u8>>;
fn ext_ecc_sign(&self, key: &ECCPrivateKeyBlob, data: &[u8]) -> Result<ECCSignatureBlob>;
fn ext_ecc_verify(
&self,
key: &ECCPublicKeyBlob,
data: &[u8],
signature: &ECCSignatureBlob,
) -> Result<()>;
fn ecc_verify(
&self,
key: &ECCPublicKeyBlob,
hash: &[u8],
signature: &ECCSignatureBlob,
) -> Result<()>;
fn ecc_gen_session_key(
&self,
agreement_key: &dyn ManagedKey,
responder_key: &ECCPublicKeyBlob,
responder_tmp_key: &ECCPublicKeyBlob,
responder_id: &[u8],
) -> Result<Box<dyn ManagedKey>>;
}
#[derive(Debug, Default)]
pub struct AppAttr {
pub admin_pin: String,
pub admin_pin_retry_count: u32,
pub user_pin: String,
pub user_pin_retry_count: u32,
pub create_file_rights: u32,
}
pub trait AppManager {
fn enumerate_app_name(&self) -> Result<Vec<String>>;
fn create_app(&self, name: &str, attr: &AppAttr) -> Result<Box<dyn SkfApp>>;
fn open_app(&self, name: &str) -> Result<Box<dyn SkfApp>>;
fn delete_app(&self, name: &str) -> Result<()>;
}
pub trait DeviceAuth {
fn device_auth(&self, data: &[u8]) -> Result<()>;
fn change_device_auth_key(&self, key: &[u8]) -> Result<()>;
}
pub trait SkfDevice: DeviceCtl + DeviceAuth + AppManager + DeviceCrypto {
fn block_cipher(&self) -> Result<Box<dyn SkfBlockCipher + Send + Sync>>;
fn name(&self) -> &str;
}
pub const PIN_TYPE_ADMIN: u8 = 0;
pub const PIN_TYPE_USER: u8 = 1;
#[derive(Debug, Default)]
pub struct PinInfo {
pub max_retry_count: u32,
pub remain_retry_count: u32,
pub default_pin: bool,
}
pub trait AppSecurity {
fn change_pin(&self, pin_type: u8, old_pin: &str, new_pin: &str) -> Result<()>;
fn verify_pin(&self, pin_type: u8, pin: &str) -> Result<()>;
fn pin_info(&self, pin_type: u8) -> Result<PinInfo>;
fn unblock_pin(&self, admin_pin: &str, new_pin: &str) -> Result<()>;
fn clear_secure_state(&self) -> Result<()>;
}
pub const FILE_PERM_NONE: u32 = 0x00000000;
pub const FILE_PERM_ADMIN: u32 = 0x00000001;
pub const FILE_PERM_USER: u32 = 0x00000010;
pub const FILE_PERM_EVERYONE: u32 = 0x000000FF;
#[derive(Debug, Default)]
pub struct FileAttr {
pub file_name: String,
pub file_size: usize,
pub read_rights: u32,
pub write_rights: u32,
}
#[derive(Debug)]
pub struct FileAttrBuilder {
file_name: String,
file_size: usize,
read_rights: u32,
write_rights: u32,
}
pub trait FileManager {
fn enumerate_file_name(&self) -> Result<Vec<String>>;
fn create_file(&self, attr: &FileAttr) -> Result<()>;
fn delete_file(&self, name: &str) -> Result<()>;
fn read_file(&self, name: &str, offset: u32, size: usize) -> Result<Vec<u8>>;
fn write_file(&self, name: &str, offset: u32, data: &[u8]) -> Result<()>;
fn get_file_info(&self, name: &str) -> Result<FileAttr>;
}
pub trait ContainerManager {
fn enumerate_container_name(&self) -> Result<Vec<String>>;
fn create_container(&self, name: &str) -> Result<Box<dyn SkfContainer>>;
fn open_container(&self, name: &str) -> Result<Box<dyn SkfContainer>>;
fn delete_container(&self, name: &str) -> Result<()>;
}
pub trait SkfApp: AppSecurity + FileManager + ContainerManager {
fn name(&self) -> &str;
}
const CONTAINER_TYPE_UNKNOWN: u32 = 0;
const CONTAINER_TYPE_RSA: u32 = 0;
const CONTAINER_TYPE_ECC: u32 = 0;
pub trait SkfContainer {
fn name(&self) -> &str;
fn get_type(&self) -> Result<u32>;
fn import_certificate(&self, signer: bool, data: &[u8]) -> Result<()>;
fn export_certificate(&self, signer: bool) -> Result<Vec<u8>>;
fn ecc_gen_key_pair(&self, alg_id: u32) -> Result<ECCPublicKeyBlob>;
fn ecc_import_key_pair(&self, enveloped_key: &EnvelopedKeyData) -> Result<()>;
fn ecc_export_public_key(&self, sign_part: bool) -> Result<Vec<u8>>;
fn ecc_sign(&self, hash: &[u8]) -> Result<ECCSignatureBlob>;
fn sk_gen_agreement_data(
&self,
alg_id: u32,
id: &[u8],
) -> Result<(ECCPublicKeyBlob, Box<dyn ManagedKey>)>;
fn sk_gen_agreement_data_and_key(
&self,
alg_id: u32,
initiator_key: &ECCPublicKeyBlob,
initiator_tmp_key: &ECCPublicKeyBlob,
initiator_id: &[u8],
responder_id: &[u8],
) -> Result<(ECCPublicKeyBlob, Box<dyn ManagedKey>)>;
fn sk_import(&self, alg_id: u32, key_data: &[u8]) -> Result<Box<dyn ManagedKey>>;
fn sk_export(
&self,
alg_id: u32,
key: &ECCPublicKeyBlob,
) -> Result<(Box<dyn ManagedKey>, ECCEncryptedData)>;
}
pub type Hash256 = [u8; 32];
#[derive(Debug, Default)]
pub struct BlockCipherParameter {
pub iv: Vec<u8>,
pub padding_type: u8,
pub feed_bit_len: u32,
}
pub trait ManagedKey: AsRef<HANDLE> {}
pub trait SkfBlockCipher {
fn encrypt_init(&self, key: &dyn ManagedKey, param: &BlockCipherParameter) -> Result<()>;
fn encrypt(&self, key: &dyn ManagedKey, data: &[u8], buffer_size: usize) -> Result<Vec<u8>>;
fn encrypt_update(
&self,
key: &dyn ManagedKey,
data: &[u8],
buffer_size: usize,
) -> Result<Vec<u8>>;
fn encrypt_final(&self, key: &dyn ManagedKey, buffer_size: usize) -> Result<Vec<u8>>;
fn decrypt_init(&self, key: &dyn ManagedKey, param: &BlockCipherParameter) -> Result<()>;
fn decrypt(&self, key: &dyn ManagedKey, data: &[u8], buffer_size: usize) -> Result<Vec<u8>>;
fn decrypt_update(
&self,
key: &dyn ManagedKey,
data: &[u8],
buffer_size: usize,
) -> Result<Vec<u8>>;
fn decrypt_final(&self, key: &dyn ManagedKey, buffer_size: usize) -> Result<Vec<u8>>;
}