⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 3s.h

📁 在SCO UNIX制定界面程序 可根据文件配制菜单,而不必修改源程序,非常方便
💻 H
字号:
#include "3s_pub.h"

/*
				3S 接口说明
*/

/*
1. 初始化口令

(1) 3S 出厂时提供四组口令 PWD_A, PWD_B, PWD_C, PWD_D.
    PWD_A 与 PWD_B 同时作用于控制对每个 LMK 的注入
    PWD_C 与 PWD_D 同时作用于控制对每个 KKM 的产生与注入.
(2) 3S 提供更改每一口令的功能.
*/

int	change_pwd (			/* 入口参数 */
	char	pwd_id,			/* 被修改口令组号 'A', 'B', 'C', 'D' */
	uchar	old_pwd [ PWD_LEN ],	/* 原口令值 */
	uchar	new_pwd [ PWD_LEN ]	/* 新口令值 */
	);



/*
2. 密钥的注入( Key Store )
*/
/*
(1) 密钥的注入, 即将用户输入的密钥保存在 3S 中.
(2) 需注入的密钥有三类:

第一类	LMK:	由用户自行产生, 用于加密存储所有其他密钥.
		每个 LMK 分为两个分量( Key Component ), 分别由两人输入,
		由 3S 计算后产生最终密钥, 明文存放于 3S 中.
		PWD_A 与 PWD_B 同时正确, 方能注入一个 LMK 的两个分量.
*/

int	LMK_store (			/* 入口参数 */
	uchar	pwd_1 [ PWD_LEN ],	/* PWD_A */
	uchar	pwd_2 [ PWD_LEN ],	/* PWD_B */
	uchar	component_1 [ D_LEN ],	/* component input by MANAGER_A */
	uchar	component_2 [ D_LEN ],	/* component input by MANAGER_B */
					/* 出口参数 */
	int	* lmk_id		/* 密钥序号 */
	);


/*
第二类	KKM:	由密钥分配中心分配, 人工分发, 用于加密需线路传送的密钥.
		每个 KKM 分为两个分量( Key Component ), 分别由两人输入,
		由 3S 计算后产生最终密钥, 由 LMK 加密存储于 3S 中.
		PWD_C 与 PWD_D 同时正确, 方能注入一个 KKM 的两个分量.
*/

int	ZMK_store (			/* 入口参数 */
	int	lmk_id,			/* 加密用的 LMK */
	uchar	pwd_1 [ PWD_LEN ],	/* PWD_C */
	uchar	pwd_2 [ PWD_LEN ],	/* PWD_D */
	uchar	component_1 [ D_LEN ],	/* component input by or MANAGER_C */
	uchar	component_2 [ D_LEN ],	/* component input by or MANAGER_D */
	char	length,			/* key length */
					/* 出口参数 */
	int	* zmk_id		/* 密钥序号 */
	);


/*
第三类	KK/KD:	一般密钥, 加密后通过线路传送, 由 LMK 加密存储于 3S 中.
*/

int	key_store (			/* 入口参数 */
	char	key_length,		/* 'S': Single, 'D': Double */
	uchar	key_kek [ D_LEN ],	/* 由 kek 加密的 key 的密文 */
	int	kek_id,			/* 加密 key 的密钥 kek 的序号 */
	uchar	kek_counter [ CT_LEN ],	/* kek 的计数器 */
	int	lmk_id,			/* 加密 key 用的 LMK 序号 */
					/* 出口参数 */
	int	* key_id		/* 密钥序号 */
	);



/*
3. 密钥的产生及删除( Key Generate and Remove )

(1) 密钥的产生, 即由 3S 产生一个随机数作为一个密钥,
    并选用一个 LMK 加密后存放在 3S 中.
(2) 应可由用户输入指定加密用的 LMK.
(3) 应可由用户输入指定产生单倍长密钥或双倍长密钥.
*/

int	key_generate (			/* 入口参数 */
	int	lmk_id,			/* 加密用的 LMK */
	char	key_length,		/* 'S': Single, 'D': Double */
					/* 出口参数 */
	int	* key_id		/* 密钥序号 */
	);

int	key_remove (			/* 入口参数 */
	int	key_id,			/* 密钥序号 */
	uchar	pwd_1 [ PWD_LEN ],	/* PWD_A or PWD_C */
	uchar	pwd_2 [ PWD_LEN ]	/* PWD_B or PWD_D */
	);


/*
4. 密钥的变换 ( Key Translate )

(1) 3S 应能将用户输入的一个用 LMK 密钥加密的密钥, 先解密成明文,
    再用用户指定的密钥 B 加密后输出.
(2) 3S 应能将一个密钥与用户输入的数据进行计算后的值作为密钥使用.
*/

int	key_translate (			/* 入口参数 */
	int	key_id,			/* 密钥 key 的序号 */
	int	kek_id,			/* 加密 key 的密钥 kek 的序号 */
	uchar	kek_counter [ CT_LEN ],	/* kek 的计数器 */
					/* 出口参数 */
	uchar	key_kek [ D_LEN ]	/* kek 加密的 key */
	);



/*
5. PIN 加密/解密与校验 ( PIN Encrypt/Decrypt and Verify )

(1) PIN 的加密采用 ANSI X9.8 算法. 用户输入 PIN 的明文及卡号,
    由 3S 计算出 PINBLOCK, 并使用用户指定的密钥加密后输出.
*/

int	PIN_encrypt (			/* 入口参数 */
	uchar	pin [ PIN_LEN ],	/* pin 明文 */
	int	pin_length,		/* pin 长度 */
	uchar	card_no [ CARD_LEN ],	/* 卡号 */
	int	pinkey_id,		/* pinkey 的序号 */
					/* 出口参数 */
	uchar	pinblock_pinkey [ S_LEN ]	/* pinkey 加密后的 pinblock */
	);

/*
(2) PIN 的解密采用 ANSI X9.8 算法. 用户输入 PINBLOCK 的密文及卡号,
    并指定 PIN KEY, 由 3S 计算出 PIN 明文.
*/

int	PIN_decrypt (			/* 入口参数 */
	uchar	pinblock_pinkey [ S_LEN ],	/* pinkey 加密后的 pinblock */
	uchar	card_no [ CARD_LEN ],	/* 卡号 */
	int	pinkey_id,		/* pinkey 的序号 */
					/* 出口参数 */
	uchar	pin [ PIN_LEN ],	/* pin 明文 */
	int	* pin_length		/* pin 长度 */
	);

/*
(3) PIN 的校验是将 3S 计算出的 PIN 密文与用户输入的 PIN 密文值比较,
    输出比较结果.
*/

int	PIN_verify (			/* 入口参数 */
	uchar	pinblock_pinkey [ S_LEN ],	/* pinkey 加密后的 pinblock */
	uchar	card_no [ CARD_LEN ],	/* 卡号 */
	uchar	offset [ OFFSET_LEN ],	/* pin offset */
	int	pinkey_id,		/* pinkey 的序号 */
	int	pvk_id,			/* pin verify key 的序号 */
					/* 出口参数 */
	char	* yorn			/* 'Y': valid, 'N': invalid */
	);

/*
6. MAC 计算与校验 ( MAC Generate and Verify )

(1) MAC 的计算采用 ANSI X9.9 算法. 用户输入数据包,
    由 3S 计算出 MAC, 并使用用户指定的密钥加密后输出.
*/

int	MAC_generate (			/* 入口参数 */
	uchar	* data,			/* 数据内容 */
	int	data_length,		/* 数据长度 */
	int	mackey_id,		/* MAC key 的序号 */
					/* 出口参数 */
	uchar	mac [ S_LEN ]		/* MAC 值 */
	);

/*
(2) MAC 的校验是将 3S 计算出的 MAC 与用户输入的 MAC 值比较,
    输出比较结果.
*/

int	MAC_verify (			/* 入口参数 */
	uchar	* data,			/* 数据内容 */
	int	data_length,		/* 数据长度 */
	int	mackey_id,		/* MAC key 的序号 */
	uchar	mac [ S_LEN ],		/* MAC 值 */
					/* 出口参数 */
	char	* yorn			/* 'Y': valid, 'N': invalid */
	);



/*
7. 随机数产生 ( Random Number Generate )
	
(1) 随机数的产生, 即由 3S 产生一个随机数输出.
(2) 应可由用户输入指定产生 8 字节 或 16 字节随机数.
*/

int	RN_generate (			/* 入口参数 */
	char	RN_length,		/* 'S': Single, 'D': Double */
					/* 出口参数 */
	uchar	RN [ D_LEN ]		/* 产生的随机数 */
	);



/*
8. 数据加密及解密 ( Data Encrypt and Decrypt )

(1) 用户输入数据并指定密钥, 3S 将加密结果输出.
*/

int	data_encrypt (			/* 入口参数 */
	uchar	data [ D_LEN ],		/* 明文 */
	char	data_length,		/* 'S': 8 bytes, 'D': 16 bytes */
	int	key_id, 		/* 加密用的密钥的序号  */
					/* 出口参数 */
	uchar	data_key [ D_LEN ]	/* key 加密后的数据 */
	);


/*
(2) 用户输入数据并指定密钥, 3S 将加密结果输出.
*/

int	data_decrypt (			/* 入口参数 */
	uchar	data_key [ D_LEN ],	/* key 加密的数据 */
	char	data_length,		/* 'S': 8 bytes, 'D': 16 bytes */
	int	key_id, 		/* 解密用的密钥的序号  */
					/* 出口参数 */
	uchar	data [ D_LEN ]		/* 明文 */
	);


/*
(3) 3S 应能将用户输入的一个用 A 密钥加密的数据, 先解密成明文,
    再用用户指定的密钥 B 加密后输出.
    PIN Translate 可用此功能实现.
*/

int	data_translate (		/* 入口参数 */
	uchar	data_oldkey [ D_LEN ],	/* 用 oldkey 加密的数据 */
	char	data_length,		/* 'S': 8 bytes, 'D': 16 bytes */
	int	oldkey_id,		/* 原加密密钥的序号  */
	int	newkey_id,		/* 新加密密钥的序号  */
					/* 出口参数 */
	uchar	data_newkey [ D_LEN ]	/* 用 newkey 加密的数据 */
	);


/*
函数返回值:	
	0 	-- 操作完成
	其他	-- 操作错误码
*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -