📄 3s.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 + -