From 881e3f64458c57c73cde8a12af59139964dfb727 Mon Sep 17 00:00:00 2001
From: zhoubin <2023106681@qq.com>
Date: Tue, 10 Aug 2021 16:01:09 +0800
Subject: [PATCH] =?UTF-8?q?=E6=95=B4=E5=90=88=E5=85=B6=E4=BB=96=E5=88=86?=
=?UTF-8?q?=E6=94=AF=E7=9A=84=E6=8E=A5=E5=8F=A3=EF=BC=8C=E5=B9=B6=E7=BB=99?=
=?UTF-8?q?=E6=B2=A1=E6=9C=89=E6=B3=A8=E9=87=8A=E7=9A=84=E6=8E=A5=E5=8F=A3?=
=?UTF-8?q?=E6=B7=BB=E5=8A=A0=E6=B3=A8=E9=87=8A?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
DProto/A8.xml | 2 -
src/main/java/com/sunyard/SydApi.java | 8 +-
src/main/java/com/sunyard/inf/SydCertApi.java | 12 +
.../java/com/sunyard/inf/SydCryptionApi.java | 148 +++-
src/main/java/com/sunyard/inf/SydGenApi.java | 54 +-
src/main/java/com/sunyard/inf/SydPledge.java | 6 +-
src/main/java/com/sunyard/inf/SydSVApi.java | 40 +-
.../com/sunyard/inf/customize/SydHAApi.java | 18 +-
.../java/racal/sunyard/main/SydApi4j.java | 774 ++++++++++++++----
.../sunyard/sydapi/sample/ASYMEnDeTest.java | 2 +-
.../sydapi/sample/InputOutputKeyTest.java | 2 +-
.../com/sunyard/sydapi/sample/MACTest.java | 2 +-
.../sydapi/sample/RSAP1SignVerify.java | 2 +-
.../java/com/sunyard/sydapi/sample/Test.java | 2 +-
.../java/com/sunyard/sydapi/sample/Test2.java | 2 +-
.../sunyard/sydapi/sample/TestKeyPair.java | 2 +-
.../java/com/sunyard/sydapi/test/MACTest.java | 2 +-
.../com/sunyard/sydapi/test/PBOCTest.java | 2 +-
.../com/sunyard/sydapi/test/PledgeTest.java | 2 +-
.../com/sunyard/sydapi/test/PledgeTest2.java | 2 +-
.../com/sunyard/sydapi/test/PrintTest.java | 2 +-
.../java/com/sunyard/sydapi/test/TestCB.java | 2 +-
.../com/sunyard/sydapi/test/TestGongYin.java | 2 +-
.../com/sunyard/sydapi/test/TestUtil.java | 68 ++
24 files changed, 922 insertions(+), 236 deletions(-)
diff --git a/DProto/A8.xml b/DProto/A8.xml
index da11321..4be8bec 100644
--- a/DProto/A8.xml
+++ b/DProto/A8.xml
@@ -19,8 +19,6 @@
LMK 加密的密钥。
- 27 位的索引号:16 位机构号+3 位密钥类型+8 位密钥
- 索引号
diff --git a/src/main/java/com/sunyard/SydApi.java b/src/main/java/com/sunyard/SydApi.java
index 8311bb3..3db809f 100644
--- a/src/main/java/com/sunyard/SydApi.java
+++ b/src/main/java/com/sunyard/SydApi.java
@@ -84,10 +84,12 @@ public interface SydApi extends SydRawApi, SydCertApi, SydCryptionApi, SydGenApi
// 单例可以不实现
void error();
-
/**
- * 获取加密机状态
- * @return CPU/MEM/DISK
+ * 获取加密机cpu,内存,磁盘使用状况
+ * @return
+ * CPU: cpu 使用率,百分比状态
+ * MEM: 内存使用率, 百分比状态
+ * DISK: 磁盘使用率,单位 MB
*/
RetWrap getStatus();
diff --git a/src/main/java/com/sunyard/inf/SydCertApi.java b/src/main/java/com/sunyard/inf/SydCertApi.java
index 34a53f5..830f66a 100644
--- a/src/main/java/com/sunyard/inf/SydCertApi.java
+++ b/src/main/java/com/sunyard/inf/SydCertApi.java
@@ -32,6 +32,12 @@ public interface SydCertApi {
byte[] dn
);
+ /**
+ * 通过索引获取公钥
+ * @param userId 16位机构号
+ * @param nKeyTypes 密钥类型
+ * @return 公钥
+ */
String RSAGetPublicKeyC(
String userId,
int nKeyTypes
@@ -91,6 +97,12 @@ public interface SydCertApi {
* 查询所有证书
* @param dataFlag 数据包标志 0:起始包 1:中间包 2:结束包
* @return
+ * dataFlag: 数据包标志 0:起始包 1:中间包 2:结束包
+ * certAllNum: 证书总数
+ * realCertNum: 实际证书个数
+ * dataAttrFlag: 数据包属性标志
+ * certLenMax: 证书最大长度
+ * certDNs: 证书DN
*/
RetWrap getAllCert(int dataFlag) throws UnsupportedEncodingException;
diff --git a/src/main/java/com/sunyard/inf/SydCryptionApi.java b/src/main/java/com/sunyard/inf/SydCryptionApi.java
index 409e86f..ec63a67 100644
--- a/src/main/java/com/sunyard/inf/SydCryptionApi.java
+++ b/src/main/java/com/sunyard/inf/SydCryptionApi.java
@@ -19,32 +19,32 @@ interface SydHashApi {
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
- *
- * @param publicKey 公钥(可以为空)
- * @param data 原始数据
- * @param mac 上一轮 mac 值
+ * @param publicKey 公钥的 DER 编码(可以为空)
+ * @param msg 原始数据,二进制的消息块
+ * @param block 消息块标志
+ * @param mac 上一轮 mac 值,当 mac 不是 null,长度不为 0,则直接从第二包开始。
* @return HASH 值,32 个 Bytes.
*/
- byte[] SM3Hash(String publicKey, byte[] data, int i, byte[] mac);
+ byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac);
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
*
* @param publicKey 公钥(可以为空)
- * @param data 原始数据
+ * @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
- byte[] SM3Hash(String publicKey, byte[] data);
+ byte[] SM3Hash(String publicKey, byte[] msg);
/**
* 输入对指定的原始数据 (无公钥),通过 SM3 算法计算数据的散列值。
*
- * @param data 原始数据
+ * @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
- byte[] SM3Hash(byte[] data);
+ byte[] SM3Hash(byte[] msg);
public byte[] MACCalc(int alg, int keyType, int fullmode, int maclen, String key, byte[] infoData);
@@ -91,16 +91,13 @@ interface SydASYMApi {
* @param pEnData 加密的数据,base64 编码。
* @return 明文数据。
*/
- byte[] SM2DecryptC(
- String userId,
- String pEnData
- );
+ byte[] SM2DecryptC(String userId, String pEnData);
/**
* 使用外部私钥解密
- * @param sk
- * @param enData
- * @return
+ * @param sk LMK下加密的私钥
+ * @param enData 密文数据(DER 编码)
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT)
*/
byte[] SM2Decrypt(byte[] sk, String enData);
@@ -140,32 +137,31 @@ interface SydASYMApi {
/**
* 非对称公钥加密
- * @param alg
- * @param pk
- * @param data
- * @return
+ * @param alg 算法标识,0 = RSA 1 = SM2
+ * @param pk 公钥的 DER 编码
+ * @param data 数据
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT).
*/
public byte[] encryptByPk(int alg, String pk, byte[] data);
-
/**
* 非对称私钥解密
- * @param alg
- * @param sk 私钥值
- * @param data
- * @return
+ * @param alg 算法标识:0 = RSA 1 = SM2
+ * @param sk 私钥值,LMK下加密的私钥
+ * @param data 密文数据(DER 编码)
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT)
*/
public byte[] decryptBySk(int alg, String sk, byte[] data);
/**
* 非对称私钥解密
- * @param alg
- * @param user
- * @param data
- * @return
+ * @param alg 算法标识:0 = RSA 1 = SM2
+ * @param userId 16位机构号
+ * @param data 密文数据(DER 编码)
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT).
*/
- public byte[] decryptBySkC(int alg, String user, byte[] data);
+ public byte[] decryptBySkC(int alg, String userId, byte[] data);
}
@@ -174,26 +170,57 @@ interface SydASYMApi {
*/
interface SydSYMApi {
- public RetWrap SYMEnDeData(Boolean isEn, int nAlg, String seesionKey, int roundmod, int fullMode, byte[] pInData, byte[] iv, int block);
+ /**
+ * E0 指令复合接口
+ * @param isEn 指定加解密,true为加密,false为解密
+ * @param nAlg 密钥模式,当isEn为true时,默认为SM4加密,0为DES加密,1为AES256 加密。当isEn为false时,默认为SM4解密,0为DES解密,1为AES256解密
+ * @param seesionKey 密钥
+ * @param roundmod 轮模式,密钥加密模式:1=ECB,2=CBC,3=CFB,4=OFB
+ * @param fullMode 填充模式:0为饥饿模式,1为贪婪模式
+ * @param pInData 消息数据
+ * @param iv IV
+ * @return
+ * iv: IV 数据域
+ * msg_all: 消息数据
+ */
+ RetWrap SYMEnDeData(Boolean isEn, int nAlg, String seesionKey, int roundmod, int fullMode, byte[] pInData, byte[] iv, int block);
+ /**
+ * 用输入的会话密钥,对指定报文数据进行加密处理。填充模式为1
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。
+ * @return 输出的报文密文, 长度为报文明文 + 16
+ */
+ byte[] SYMEncryptData(int nAlg, String seesionKey, byte[] pINdata);
+
/**
* 用输入的会话密钥,对指定报文数据进行加密处理。
*
- * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
- * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
- * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式
+ * @param pINdata 要加密的报文明文。必须是 8 或16 的倍数。
* @return 输出的报文密文, 长度为报文明文 + 16
*/
- byte[] SYMEncryptData(int nAlg, String seesionKey, byte[] pINdata);
byte[] SYMEncryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata);
+ /**
+ * 用输入的会话密钥,对指定报文数据进行加密处理。
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param pInData 要加密的报文明文。必须是 8 或16 的倍数。
+ * @return 输出的报文密文, 长度为报文明文 + 16
+ */
byte[] SYMEncryptData_nofill(int nAlg, String seesionKey, byte[] pInData);
/**
- * 用输入的会话密钥,对指定报文数据进行解密处理。
+ * 用输入的会话密钥,对指定报文数据进行解密处理。填充模式为1
*
* @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
* @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
@@ -201,10 +228,36 @@ interface SydSYMApi {
* @return 输出的报文明文。
*/
byte[] SYMDecryptData(int nAlg, String seesionKey, byte[] pINdata);
+
+ /**
+ * 用输入的会话密钥,对指定报文数据进行解密处理。
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式
+ * @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。
+ * @return 输出的报文明文。
+ */
byte[] SYMDecryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata);
+ /**
+ * 用输入的会话密钥,对指定报文数据进行解密处理。
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param pInData 要解密的报文密文。长度必须是8 或16 的倍数。
+ * @return 输出的报文明文。
+ */
byte[] SYMDecryptData_nofill(int nAlg, String seesionKey, byte[] pInData);
+ /**
+ * 加解密数据(E1)
+ * @param nAlg 密钥模式,默认为SM4解密,0:DES加密,1:AES256 解密
+ * @param seesionKey 密钥
+ * @param inputPath 输入消息数据的文件路径
+ * @param outputPath 输出消息数据的文件路径
+ * @return
+ */
boolean SYMDecryptDataWithFile(int nAlg, String seesionKey, String inputPath, String outputPath) throws Exception;
/**
@@ -216,7 +269,17 @@ interface SydSYMApi {
* @return 输出的报文密文, 长度为报文明文 + 16
*/
byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, byte[] pINdata);
- public byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
+
+ /**
+ * 用输入的会话密钥,对指定报文数据进行加密处理。
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式
+ * @param pInData 要加密的报文明文。必须是 8 或16 的倍数。
+ * @return 输出的报文密文, 长度为报文明文 + 16
+ */
+ byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
/**
* 用输入的会话密钥,对指定报文数据进行解密处理。
@@ -227,7 +290,16 @@ interface SydSYMApi {
* @return 输出的报文明文。
*/
byte[] SYMDecryptDataCBC(int nAlg, String seesionKey, byte[] pINdata);
- public byte[] SYMDecryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
+ /**
+ * 用输入的会话密钥,对指定报文数据进行解密处理。
+ *
+ * @param nAlg 算法标识.,0x00:3DES,0x01:SM4。
+ * @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
+ * @param fullmode 填充模式:0为饥饿模式,1为贪婪模式
+ * @param pInData 要解密的报文密文。长度必须是8 或16 的倍数。
+ * @return 输出的报文明文。
+ */
+ byte[] SYMDecryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
/**
* 用输入的会话密钥,对指定报文数据进行解密处理。
diff --git a/src/main/java/com/sunyard/inf/SydGenApi.java b/src/main/java/com/sunyard/inf/SydGenApi.java
index 0aaf87a..8aa105f 100644
--- a/src/main/java/com/sunyard/inf/SydGenApi.java
+++ b/src/main/java/com/sunyard/inf/SydGenApi.java
@@ -39,10 +39,53 @@ public interface SydGenApi {
*
*/
RetWrap genSymmetricKey(String keyType,char solution);
+
+ /**
+ * 生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥)
+ * @param mode 是否产生ZMK加密下的密钥
+ * @param keyType 密钥类型
+ * @param solution 密钥方案(LMK) 密钥长度/LMK下加密密钥的方案。
+ * @param zmk zmk
+ * @return RetWrap 包含
+ * lmkKey LMK LMK加密密钥
+ * zmkKey ZMK加密密钥
+ * keyCheck 密钥校验值
+ */
+ RetWrap genSymKey(int mode, String keyType, char solution, String zmk);
+
+ /**
+ * 生成一个密钥并以分开的成份形式打印(=)
+ * @param keyType 密钥类型
+ * @param solution 密钥长度/LMK 下加密密钥的方案。
+ * @return RetWrap
+ * lmkKey LMK 加密下的密钥。
+ * keyCheck 密钥校验值
+ */
RetWrap genAndPrintSplit(String keyType,char solution);
+ /**
+ * 输出一个ZMK下加密的密钥
+ * @param keyType 密钥类型
+ * @param solution 密钥方案(ZMK) 加密输出密钥的密钥方案
+ * @param zmk 27 位的索引号: 16 位机构号+3 位密钥类型+8 位密钥索引号
+ * @param key LMK 加密的密钥。
+ * @return
+ * key lmk 头 + LMK 加密下的密钥。
+ * keyCheck 密钥校验值
+ */
public RetWrap outputKey(String keyType, char solution, String zmk, String key);
+
+ /**
+ * 输入一个ZMK下加密的密钥。转换为LMK下加密
+ * @param keyType 密钥类型
+ * @param solution 加密输出密钥的密钥方案
+ * @param zmk zmk 27 位的索引号: 16 位机构号+3 位密钥类型+8 位密钥索引号
+ * @param key ZMK 加密下的密钥。
+ * @return RetWrap
+ * key lmk 头 + LMK 加密下的密钥。
+ * keyCheck 密钥校验值
+ */
public RetWrap inputKey(String keyType, char solution, String zmk, String key);
/**
@@ -56,6 +99,13 @@ public interface SydGenApi {
*
*/
RetWrap genComposeKey(String keyType,char keySolution,String keyClearPattern);
+
+ /**
+ * 由2到9个加密的成份组成一个密钥,同时返回一个LMK对(04-05)下加密的ZMK以及校验值
+ * @param keys 已加密的多个ZMK成份
+ * @return
+ *
+ */
RetWrap genComposeKey(String[] keys);
/**
* SM2 非对称密钥产生和存储
@@ -68,7 +118,7 @@ public interface SydGenApi {
/**
- * 此函数用于会话密钥的产生,用发起端。
+ * 此函数用于会话密钥的产生,用于发起端。
* 加密机产生随机会话密钥,输出两类密文:
* 1、 公钥加密的密文,用于密钥的传递。
* 2、 本地 LMK 加密,用于本地应用数据的加解密。
@@ -104,7 +154,7 @@ public interface SydGenApi {
* @param certSerial 对*方 X509 证书的序列号。
* @param nAlg 算法标识,0:AES,1:SM4
- * @return RetWrap 包含 CipherKey SessionKey KCV
+ * @return RetWrap 包含 CipherKey, SessionKey, KCV
* CipherKey 公钥加密的会话密钥 ,BASE64 编码
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。
diff --git a/src/main/java/com/sunyard/inf/SydPledge.java b/src/main/java/com/sunyard/inf/SydPledge.java
index 44b637a..c64bbee 100644
--- a/src/main/java/com/sunyard/inf/SydPledge.java
+++ b/src/main/java/com/sunyard/inf/SydPledge.java
@@ -8,7 +8,7 @@ public interface SydPledge {
* @param Alg SydApi.NALG_3DES/SydApi.NALG_SM4
* @param Version 版本号
* @param Data 原始数据
- * @return MAC 长度为 8 的 HEX字符串
+ * @return 所计算出的MAC。MAC 长度为 8 的 HEX字符串
*/
String GenerateMIYA(String AreaCode, int Version, int Alg, byte[] Data);
@@ -16,11 +16,11 @@ public interface SydPledge {
*
* @param AreaCode 地区代码 6 位
* @param Version 版本号
- * @param Alg SydApi.NALG_3DES/SydApi.NALG_SM4
+ * @param Alg MAC 算法,0:3DES,1:SM4
* @param Data 原始数据
* @param fullFlag 填充类型
* @param macLenFlag MAC 长度标识
- * @return
+ * @return 所计算出的MAC。MAC 长度为 8 的 HEX字符串
*/
String GenerateMIYA(String AreaCode, int Version, int Alg, byte[] Data, byte fullFlag, byte macLenFlag);
diff --git a/src/main/java/com/sunyard/inf/SydSVApi.java b/src/main/java/com/sunyard/inf/SydSVApi.java
index be36c1e..65bdfaa 100644
--- a/src/main/java/com/sunyard/inf/SydSVApi.java
+++ b/src/main/java/com/sunyard/inf/SydSVApi.java
@@ -211,7 +211,7 @@ interface SydDetachedSVApi {
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
- * @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
+ * @param dataType 数据模式,输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 输入的数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
@@ -221,13 +221,27 @@ interface SydDetachedSVApi {
byte[] orgData,
String sCertDN
);
- //8024
+
+ /**
+ * 带公钥证书与签名属性的数字签名(遵循 PKCS#7)
+ * @param dataType 数据类型:0,hash 模式,1为非hash模式
+ * @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为数据
+ * @param keyTag 密钥对应的索引号
+ * @return 签名的 DER 编码
+ */
public byte[] detachedSign(
int dataType,
byte[] orgData,
- int sCertDN
+ int keyTag
);
+ /**
+ * 带公钥证书的PKCS#7数字签名(序列号)
+ * @param dataType 数据类型:0,hash 模式,1为非hash模式
+ * @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为要签名的信息
+ * @param certificateNo X509证书序号
+ * @return 符合PKCS7标准的签名结果
+ */
public String detachedSignbysn(
int dataType,
byte[] orgData,
@@ -247,12 +261,30 @@ interface SydDetachedSVApi {
int dataType,
byte[] orgData,
String sign);
- //8025
+
+ /**
+ * 带公钥证书与签名属性的数字签名验签(遵循 PKCS#7)
+ * @param dataType 数据类型:0,hash 模式,1为非hash模式
+ * @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为数据
+ * @param sign 已签名数据
+ * @return 是否正确
+ */
boolean detachedVerify(
int dataType,
byte[] orgData,
byte[] sign);
+ /**
+ * 计算SM3散列值
+ * @param packSn 消息块号,0=仅一块,1=第一块,2=中间块,3=最后块
+ * @param userId 用户 ID,只对“消息块号”为 0、1 时有效
+ * @param publicKey 公钥的 DER 编码
+ * @param msg 二进制的消息块
+ * @param filterData 过渡消息数据,只对“消息块号”为 2、3 时有效
+ * @return
+ * filterData: 过渡消息数据,只对“消息块号”为 2、1 时有效
+ * hash: hash
+ */
RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData);
}
diff --git a/src/main/java/com/sunyard/inf/customize/SydHAApi.java b/src/main/java/com/sunyard/inf/customize/SydHAApi.java
index 41a2785..7517298 100644
--- a/src/main/java/com/sunyard/inf/customize/SydHAApi.java
+++ b/src/main/java/com/sunyard/inf/customize/SydHAApi.java
@@ -99,15 +99,27 @@ public interface SydHAApi {
);
-
- // 外部私钥
+ /**
+ * 用私钥签名(外部私钥)
+ * @param nOrgDataType 签名数据类型,0 : hash 1 : 原数据
+ * @param privateKey LMK34-35 下加密的私钥
+ * @param orgData “签名数据类型”为 0 时:HASH 值。“签名数据类型”为 1 时:要签名的信息
+ * @return 签名的 base64 编码
+ */
public String SM2Sign(
int nOrgDataType,
byte[] privateKey,
byte[] orgData
);
- // SYD_SM2_Verify_HA
+ /**
+ * 用指定的公钥对指定的原始数据进行数字签名验证(PKCS#1)
+ * @param nOrgDataType 签名数据类型,SydApi.DATA_ORIGIN(1) 原始数据 SydApi.DATA_HASH(0) : hash 后的类型
+ * @param publicKey 公钥串,DER编码,HEX格式
+ * @param orgData 待签名的原始数据,“签名数据类型”为 0 时:HASH 值。“签名数据类型”为 1 时:要签名的信息
+ * @param base64Sign 签名数据 (DER 编码 + Base64 编码)
+ * @return 验签是否通过
+ */
public boolean SM2Verify(
int nOrgDataType,
byte[] publicKey,
diff --git a/src/main/java/racal/sunyard/main/SydApi4j.java b/src/main/java/racal/sunyard/main/SydApi4j.java
index 1817c17..4b22325 100644
--- a/src/main/java/racal/sunyard/main/SydApi4j.java
+++ b/src/main/java/racal/sunyard/main/SydApi4j.java
@@ -692,6 +692,7 @@ public class SydApi4j implements SydApi {
}
+
@Override
public boolean detachedVerify(int dataType, byte[] orgData, byte[] sign) {
Proto8025 proto = new Proto8025(); //pset.getProtocolReqRender("75");
@@ -1741,18 +1742,6 @@ public class SydApi4j implements SydApi {
}
- /**
- * E0 指令复合接口
- *
- * @param isEn
- * @param nAlg
- * @param seesionKey
- * @param roundmod
- * @param fullMode
- * @param pInData
- * @param iv
- * @return
- */
@Override
public RetWrap SYMEnDeData(Boolean isEn, int nAlg, String seesionKey, int roundmod, int fullMode, byte[] pInData, byte[] iv, int block) {
@@ -2281,6 +2270,7 @@ public class SydApi4j implements SydApi {
}
+
@Override
public RetWrap SM3Hash(int packSn, String userId, byte[] publicKey, byte[] msg, byte[] filterData) {
Proto76 proto = new Proto76();
@@ -2453,6 +2443,7 @@ public class SydApi4j implements SydApi {
}
}
+ // todo:未实现
@Override
public byte[] RSASign(String privateKey, int HashMark, int nOrgDataType, byte[] orgData) {
return new byte[0];
@@ -2501,8 +2492,63 @@ public class SydApi4j implements SydApi {
}
}
+ //1.1生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥)
+ public RetWrap genSymKey(int mode, String keyType, char solution, String zmk) {
+ ProtoA0 proto = new ProtoA0();
+ HashMap packet = new HashMap();
+ HashMap data = new HashMap();
+
+ packet.put("data", data);
+ PacketSN sn = PacketSN.gen();
+ packet.put("header", sn.getSn().array());
+ data.put("mode$option", mode);
+ data.put("keyType", keyType);
+ data.put("solution", solution);
+ data.put("zmk", zmk);
+ data.put("keySolution", 'X');
+ data.put("businessKey", 'N');
+
+ ByteBuffer bb = proto.rend(packet);
+
+ synchronized (this) {
+ bb = syncRead(syncSend(bb));
+ }
+
+ Map ret = null;
+ Packet p = proto.parse(bb, packet);
+ ret = p.toMap();
+ if (!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())) {
+ throw new SydApiException("包序号不匹配", -4);
+ } else {
+ ret = (Map) ret.get("data");
+ PacketSection error = (PacketSection) ret.get("error");
+ if (!"00".equals(error.getString())) {
+ throw new SydApiException(error.getInfo(), error.autoInt());
+ } else {
+ RetWrap rw = new RetWrap();
+ byte[] lmks = ((PacketSection) ret.get("lmk")).getBytes();
+ byte[] lmkHeads = ((PacketSection) ret.get("lmkHead")).getBytes();
+ byte[] bs1 = new byte[lmks.length + lmkHeads.length];
+ System.arraycopy(lmkHeads, 0, bs1, 0, lmkHeads.length);
+ System.arraycopy(lmks, 0, bs1, lmkHeads.length, lmks.length);
+ rw.put("lmkKey", bs1);
+ if (1 == mode) {
+ byte[] zmks = ((PacketSection) ret.get("zmk")).getBytes();
+ byte[] zmkHeads = ((PacketSection) ret.get("zmkHead")).getBytes();
+ byte[] bs2 = new byte[zmks.length + zmkHeads.length];
+ System.arraycopy(zmkHeads, 0, bs2, 0, zmkHeads.length);
+ System.arraycopy(zmks, 0, bs2, zmkHeads.length, zmks.length);
+ rw.put("zmkKey", bs2);
+ }
+
+ rw.put("keyCheck", ((PacketSection) ret.get("keyCheck")).getBytes());
+ return rw;
+ }
+ }
+ }
+
@Override
- public String RSAGetPublicKeyC(String userId, int nKeyType) {
+ public String RSAGetPublicKeyC(String userId, int nKeyTypes) {
//ProtocolRender render = pset.getProtocolReqRender("QQ");
ProtoQQ proto = new ProtoQQ();
@@ -2511,7 +2557,7 @@ public class SydApi4j implements SydApi {
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
- data.put("privateKeyTag", SYMUtil.genPrivateKeyMark(userId, 0 == nKeyType ? "000" : "001", "00000001"));
+ data.put("privateKeyTag", SYMUtil.genPrivateKeyMark(userId, 0 == nKeyTypes ? "000" : "001", "00000001"));
// 渲染发送
ByteBuffer bb = proto.rend(packet);
//System.out.println(Util.bytes2HexString(Util.toArray(bb)));
@@ -2582,6 +2628,12 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("publicKey")).getString();
}
+ /**
+ * 通过私钥获取公钥
+ * @param userId 密钥对应的索引号
+ * @param nKeyType
+ * @return 公钥
+ */
public String SM2GetPublicKeyC_QX(int userId, int nKeyType) {
//ProtocolRender render = pset.getProtocolReqRender("QQ");
@@ -3036,6 +3088,13 @@ public class SydApi4j implements SydApi {
}
+ /**
+ * 用私钥加密数据
+ * @param alg 算法标识,0:RSA 1:SM2
+ * @param sk 指示私钥位置的标记,数字为存储私钥的索引,除了全 9 表示使用由命令中提供的密钥。
+ * @param data 数据
+ * @return 密文的 DER 编码(对于 RSA 算法,数据类型为 BIT).
+ */
public byte[] encryptBySk(int alg, String sk, byte[] data) {
byte[] algBin = 0 == alg ? DTO79.Req.Data.AlgorithmKeyOptions.OPVRSA.getBin() : DTO79.Req.Data.AlgorithmKeyOptions.OPVSM2.getBin();
@@ -3069,7 +3128,13 @@ public class SydApi4j implements SydApi {
}
}
-
+ /**
+ * 用公钥解密数据
+ * @param alg 算法标识,0:RSA 1:SM2
+ * @param pk 公钥的 DER 编码
+ * @param data 数据
+ * @return 明文
+ */
public byte[] decryptByPk(int alg, String pk, byte[] data) {
byte[] algBin = 0 == alg ? DTO7A.Req.Data.AlgorithmKeyOptions.OPVRSA.getBin() : DTO7A.Req.Data.AlgorithmKeyOptions.OPVSM2.getBin();
@@ -3102,11 +3167,6 @@ public class SydApi4j implements SydApi {
}
}
- /**
- * @param alg 0 = RSA 1 = SM2
- * @param pk HEX 格式的公钥
- * @return
- */
@Override
public byte[] encryptByPk(int alg, String pk, byte[] data) {
@@ -3140,14 +3200,29 @@ public class SydApi4j implements SydApi {
}
}
+ /**
+ * 非对称公钥加密
+ * @param alg 算法标识,0 = RSA 1 = SM2
+ * @param pk 公钥的 DER 编码
+ * @param data 数据
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT).
+ */
public String encryptBase64ByPk(int alg, String pk, byte[] data) {
return SYMUtil.derEnData2Base64EnData(encryptByPk(alg, pk, data));
}
+ /**
+ * 非对称私钥解密
+ * @param alg 算法标识:0 = RSA 1 = SM2
+ * @param sk 私钥值,LMK下加密的私钥
+ * @param data 密文数据(DER 编码)
+ * @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT)
+ */
public byte[] decryptBase64BySk(int alg, String sk, String data) {
return decryptBySk(alg, sk, SYMUtil.base64EnData2DerEnData(data));
}
+
@Override
public byte[] decryptBySkC(int alg, String userId, byte[] data) {
byte[] algBin = 0 == alg ? DTO78.Req.Data.AlgorithmKeyOptions.OPVRSA.getBin() : DTO78.Req.Data.AlgorithmKeyOptions.OPVSM2.getBin();
@@ -3179,6 +3254,7 @@ public class SydApi4j implements SydApi {
}
}
+
@Override
public byte[] decryptBySk(int alg, String sk, byte[] data) {
@@ -3392,12 +3468,6 @@ public class SydApi4j implements SydApi {
}
- /**
- * @param publicKey
- * @param msg
- * @param mac 当 mac 不是 null,长度不为 0,则直接从第二包开始。
- * @return
- */
@Override
public byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac) {
@@ -3915,6 +3985,7 @@ public class SydApi4j implements SydApi {
tmpOutput.close();
}
+
@Override
public String detachedSignbysn(int dataType, byte[] orgData, String certificateNo) {
Proto8026 proto = new Proto8026();
@@ -3964,6 +4035,17 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("signature")).getString();
}
+ /**
+ * todo:通过密钥加密数据?
+ * @param alg 加密算法,1:DES,2:3DES,3:IDEA,4:SM1,5:AES,6:SM4
+ * @param roundModel 密钥加密模式,1:ECB,2:CBC,3:CFB,4:OFB
+ * @param fullMode 填充模式,0:数据刚好是8的整数倍,不填充;1:在数据后面填充0x00,0x00…;2:在数据后填充0x80,0x00 …
+ * @param DEK DEK秘钥,如果源密钥为外部送入,则为LMK加密,否则为HSM用户密钥存储区。
+ * @param infoData 数据
+ * @param vector 初始向量数据,可选项,当加密模式为CBC,CFB或OFB时才显示此项
+ * @return
+ * infoData: 密文数据
+ */
public byte[] Encrypt_Data(int alg, int roundModel, int fullMode, String DEK, byte[] infoData, byte[] vector) {
ProtoQ1 proto = new ProtoQ1();
@@ -4024,6 +4106,16 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("infoData")).getBytes();
}
+ /**
+ * todo:解密数据
+ * @param alg 解密算法,1:DES,2:3DES,3:IDEA,4:SM1,5:AES,6:SM4
+ * @param roundModel 密钥解密模式,1:ECB,2:CBC,3:CFB,4:OFB
+ * @param fullMode 填充模式,0:数据刚好是8的整数倍,不填充;1:在数据后面填充0x00,0x00…;2:在数据后填充0x80,0x00 …
+ * @param DEK DEK秘钥,如果源密钥为外部送入,则为LMK加密,否则为HSM用户密钥存储区。
+ * @param infoData 数据
+ * @param vector 初始向量数据,可选项,当加密模式为CBC,CFB或OFB时才显示此项
+ * @return 解密后的明文数据
+ */
public byte[] Decrypt_Data(int alg, int roundModel, int fullMode, String DEK, byte[] infoData, byte[] vector) {
ProtoQ2 proto = new ProtoQ2();
@@ -4086,6 +4178,13 @@ public class SydApi4j implements SydApi {
}
+ /**
+ * 8.1生成一个MAC(=)
+ * @param TAK
+ * @param infoData MAC数据,数据长度应该为8的整数倍,如果不是8的整数倍,系统默认在数据后面填充0x00组成8的整数倍。
+ * @param IV IV
+ * @return 所计算出的MAC hex 格式
+ */
public byte[] MAC_Data(String TAK, String infoData, String IV) {
ProtoMA proto = new ProtoMA();
@@ -4139,6 +4238,16 @@ public class SydApi4j implements SydApi {
}
+ /**
+ * 对大消息生成MAC(MAB)(PBOC3.0方式)
+ * @param mode 密钥长度:强填充0x80。0-单倍长度DES密钥,1-双倍长度DES密钥,2 – SM4
+ * @param keyType 密钥类型:0-TAK(终端认证密钥)1-ZAK(区域认证密钥)
+ * @param key 密钥
+ * @param odata MAC数据
+ * @param block 消息块号,0:仅一块。1:第一块。2:中间块。3:最后块。
+ * @param iv IV
+ * @return 所计算出的MAC
+ */
public byte[] _calcPBOCMAC(int mode, int keyType, String key, byte[] odata, int block, byte[] iv) {
ProtoMU proto = new ProtoMU();
@@ -4187,6 +4296,17 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("MAC")).getBytes();
}
+
+ /**
+ * 对大消息生成MAC(MAB)(PBOC3.0方式)
+ * @param mode 密钥长度:强填充0x80。0-单倍长度DES密钥,1-双倍长度DES密钥,2 – SM4
+ * @param keyType 密钥类型:0-TAK(终端认证密钥)1-ZAK(区域认证密钥)
+ * @param key 密钥
+ * @param data MAC数据
+ * @param block 消息块号,0:仅一块。1:第一块。2:中间块。3:最后块。
+ * @param iv IV
+ * @return 所计算出的MAC
+ */
public String calcPBOCMAC(int mode, int keyType, String key, byte[] data, int block, byte[] iv) {
int packSize = 2048;
@@ -4285,14 +4405,13 @@ public class SydApi4j implements SydApi {
/**
- * mac 计算
- *
- * @param alg 0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
- * @param keyType 0-TAK 1-ZAK
- * @param fullMode 0-弱填充 1 强填充
- * @param AK 密钥
- * @param infoData <=1024
- * @param macLen 1=4Byte 2=8Byte 3=16Byte(仅在SM4/AES 下有效)
+ * 生成一个MAC
+ * @param alg 算法,0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
+ * @param keyType 密钥类型,0-TAK 1-ZAK
+ * @param fullMode 填充类型,0-弱填充 1 强填充
+ * @param AK 密钥
+ * @param infoData MAC数据
+ * @param macLen MAC数据长度,1=4Byte 2=8Byte 3=16Byte(仅在SM4/AES 下有效)
* @return mac 值 hex 格式
*/
@Override
@@ -4344,13 +4463,13 @@ public class SydApi4j implements SydApi {
/**
* mac 计算
- *
- * @param alg 0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
- * @param keyType 0-TAK 1-ZAK
- * @param fullMode 0-弱填充 1 强填充
- * @param AK 密钥
- * @param infoData <=1024
- * @param mac 值 hex 格式
+ * 校验一个MAC
+ * @param alg 算法,0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
+ * @param keyType 密钥类型,0-TAK 1-ZAK
+ * @param fullMode 填充类型,0-弱填充 1 强填充
+ * @param AK 密钥
+ * @param infoData MAC数据
+ * @param mac MAC值 hex 格式
* @return
*/
public void MACCheck(int alg, int keyType, String AK, int fullMode, byte[] infoData, String mac) {
@@ -4410,6 +4529,16 @@ public class SydApi4j implements SydApi {
return;
}
+ /**
+ * 分散
+ * @param mainKey LMK下加密的密钥
+ * @param keyType 密钥类型,0: DEK,1: TAK
+ * @param disperseNum 指定对根密钥分散的次数(1-3次)
+ * @param dt 分散数据
+ * @param disperseAlg 分散算法,1:DES,2:3DES,3:IDEA,4:SM1,5:AES,6:SM4
+ * @param keyCheckType 密钥校验值类型,0:KCV 向后兼容,1:KCV 6H
+ * @return 密钥,被保护密钥lmk加密输出
+ */
public String SYD_Disperse(String mainKey, int keyType, int disperseNum, byte[] dt, int disperseAlg, int keyCheckType) {
ProtoYA proto = new ProtoYA();
@@ -4491,15 +4620,15 @@ public class SydApi4j implements SydApi {
/**
- * 先锋定制特例
+ * 先锋定制特例-生成MAC
*
- * @param DEK
+ * @param DEK LMK下加密的密钥
* @param infoData 生成MAC的数据
- * @param factor
- * @param IV
+ * @param factor 分散数据
+ * @param IV IV
* @param disperseNum 指定对根密钥分散的次数(1-3次)
- * @param disperseAlg 分散算法
- * @return
+ * @param disperseAlg 分散算法,1:DES,2:3DES,3:IDEA,4:SM1,5:AES,6:SM4
+ * @return 所计算出的MAC hex 格式
*/
public byte[] SYD_MAC_Data(String DEK, String infoData, byte[] factor, String IV, int disperseNum, int disperseAlg) {
String ss = SYD_Disperse(DEK, 1, disperseNum, factor, disperseAlg, 0);
@@ -4731,6 +4860,14 @@ public class SydApi4j implements SydApi {
}
+ /**
+ * 生成并打印一个成份
+ * 生成一个随机的成份,在与HSM相连接的打印机上打印出来并将加密值返回给主机
+ * @param keyType 密钥类型
+ * @param solution 密钥方案(LMK)密钥长度/LMK 下加密密钥的方案
+ * @return RetWrap
+ * lmkKey lmk 头 + LMK 加密下的密钥。
+ */
public RetWrap genAndPrint(String keyType, String solution) {
ProtoA2 proto = new ProtoA2();
@@ -4783,6 +4920,10 @@ public class SydApi4j implements SydApi {
return retWrap;
}
+ /**
+ * 打印
+ * @param format 打印格式
+ */
public void setPrintFormat(String format) {
ProtoPA proto = new ProtoPA();
@@ -5005,7 +5146,16 @@ public class SydApi4j implements SydApi {
return retWrap;
}
-
+ /**
+ * 生成一个MAC
+ * @param alg 算法,0=DES 1=3DES 2=SM4 3=AES 4=IDEA 5=SM1 6=3DES-X9.19
+ * @param keyType 密钥类型,0-TAK 1-ZAK
+ * @param fullmode 填充类型,0-弱填充 1 强填充
+ * @param maclen MAC数据长度,1=4Byte 2=8Byte 3=16Byte(仅在SM4/AES 下有效)
+ * @param key 密钥
+ * @param infoData MAC数据
+ * @return mac 值
+ */
public byte[] MACCalc(int alg, int keyType, int fullmode, int maclen, String key, byte[] infoData) {
ProtoMA proto = new ProtoMA();
@@ -5063,12 +5213,13 @@ public class SydApi4j implements SydApi {
// }
/**
- * @Description 转换秘钥方案 -> pass
- * @Param [keyType秘钥类型, key秘钥, solution秘钥方案]
- * @Return com.sunyard.RetWrap
- * @Author wp
- * @Date 2020/9/29 12:36
- **/
+ * 转换秘钥方案,转换一个现有的密钥到一个新的密钥方案。这个命令支持从32H,X和Y格式转换
+ * @param keyType 秘钥类型
+ * @param key LMK 加密下的密钥。
+ * @param solution 密钥长度/LMK 下加密密钥的方案
+ * @return RetWrap
+ * lmkkey lmk 头 + LMK 加密下的密钥。
+ */
public RetWrap conversionKey(String keyType, String key, char solution) {
ProtoB0 proto = new ProtoB0();
@@ -5121,12 +5272,13 @@ public class SydApi4j implements SydApi {
}
/**
- * @Description 将ZMK由ZMK转为LMK加密(+) -> pass
- * @Param [zmki, zmk]
- * @Return com.sunyard.RetWrap
- * @Author wp
- * @Date 2020/9/29 18:16
- **/
+ * 将ZMK由ZMK转为LMK加密(+)
+ * @param zmki LMK 对(04-05)下加密的 ZMKi
+ * @param zmk ZMKi 下加密的 ZMK
+ * @return
+ * zmkKey: ZMK 加密下的ZPK
+ * keyCheck: 密钥校验值。
+ */
public RetWrap changZMK2LMK(String zmki, String zmk) {
ProtoBY proto = new ProtoBY();
@@ -5175,13 +5327,16 @@ public class SydApi4j implements SydApi {
}
+
/**
- * @Description 加密机版本号 -> pass
- * @Param [num]
- * @Return com.sunyard.RetWrap
- * @Author wp
- * @Date 2020/9/30 16:42
- **/
+ * 获取加密机设备信息
+ * @param num 授权响应码
+ * @return
+ * NAME: 设备生产厂商名称
+ * MODEL: 设备型号
+ * EQUIPNO: 设备机具号
+ * SOFTVERSION: 设备内部软件版本号
+ */
public RetWrap getVersion(String num) {
ProtoHV proto = new ProtoHV();
@@ -5223,7 +5378,18 @@ public class SydApi4j implements SydApi {
return retWrap;
}
- //22.1计算HASH散列值(HMAC-MD5\SHA1\SHA256)(+) ->高性能支持 ,test暂未通过
+ /**
+ * 22.1计算HASH散列值(HMAC-MD5\SHA1\SHA256)(+) ->高性能支持 ,test暂未通过
+ * @param key 秘钥数据
+ * @param hashType HASH类型,指示用于哈希证书数据的哈希算法的类型.1 - SHA1, 2 - SHA256, 3 - SHA384, 4 - SHA512, 5 - SM3
+ * @param contextInfo 输入的散列上下文信息,加密机输出,原文传入
+ * @param infoData 二进制的消息块
+ * @return
+ * contextInfo_Length: 上下文信息长度
+ * contextInfo: 上下文信息
+ * HMAC_LEN: HMAC结果长度
+ * HAMC: HMAC结果
+ */
public RetWrap calcHash(String key, int hashType, String contextInfo, byte[] infoData) {
Proto82 proto = new Proto82();
HashMap packet = new HashMap();
@@ -5266,7 +5432,16 @@ public class SydApi4j implements SydApi {
}
}
- //19.1解密数据并由公钥加密输出 ->: code = 19 ( 0x13 ) msg = 数据解密错(C3) (服务器代码问题)
+ /**
+ * 19.1解密数据并由公钥加密输出 ->: code = 19 ( 0x13 ) msg = 数据解密错(C3) (服务器代码问题)
+ * @param DEK DEK,LMK对(36-37)下加密的DEK。
+ * @param infoData 密文数据
+ * @param alg 算法标识,0:RSA 1:SM2
+ * @param publicKey 公钥的DER编码
+ * @return
+ * keyLen: 公钥加密的密文长度
+ * key: 公钥加密的密文的DER编码
+ */
public RetWrap decryptAndEncryptByP(String DEK, byte[] infoData, int alg, byte[] publicKey) {
// 获取协议
Proto68 proto = new Proto68();
@@ -5314,7 +5489,15 @@ public class SydApi4j implements SydApi {
return rw;
}
- //19.2由私钥解密密文数据并经过DEK加密后输出 ->code = 21 ( 0x15 ) msg = 输入的数据格式错误,等待19.1解决
+ /**
+ * 19.2由私钥解密密文数据并经过DEK加密后输出 ->code = 21 ( 0x15 ) msg = 输入的数据格式错误,等待19.1解决
+ * @param DEK DEK,LMK对(36-37)下加密的DEK。
+ * @param infoData 公钥加密的密文的DER编码
+ * @param privatekey LMK加密的私钥
+ * @return
+ * keyLen: 密文数据的字节长度
+ * key: 密文数据
+ */
public RetWrap decryptAndEncryptByS(String DEK, byte[] infoData, String privatekey) {
// 获取协议
Proto69 proto = new Proto69();
@@ -5362,7 +5545,14 @@ public class SydApi4j implements SydApi {
return rw;
}
- //18.1加押指令(+) -> pass
+ /**
+ * 18.1加押指令(+) -> pass
+ * @param keyType 秘钥类型
+ * @param key LMK加密下的应用密钥
+ * @param infoData 加押数据
+ * @return
+ * MAC: 密押,默认为8H
+ */
public RetWrap impose(String keyType, String key, byte[] infoData) {
// 获取协议
Proto62 proto = new Proto62();
@@ -5406,7 +5596,14 @@ public class SydApi4j implements SydApi {
return rw;
}
- //18.2核押指令(+) -> pass
+ /**
+ * 18.2核押指令(+) -> pass
+ * @param keyType 密钥类型
+ * @param key LMK加密下的应用密钥
+ * @param secret 需要验证的密押
+ * @param infoData 加押数据
+ * @return 是否正确
+ */
public Boolean verifyImpose(String keyType, String key, byte[] secret, byte[] infoData) {
// 获取协议
Proto63 proto = new Proto63();
@@ -5449,7 +5646,15 @@ public class SydApi4j implements SydApi {
return true;
}
- //18.3加解密指令(+) -> pass
+ /**
+ * 18.3加解密指令(+) -> pass
+ * @param keyType 密钥类型
+ * @param key LMK加密下的应用密钥
+ * @param infoData 信息数据
+ * @return
+ * infoLen: 返回原数据长度
+ * info: 信息数据
+ */
public RetWrap encryAndDecry(String keyType, String key, byte[] infoData) {
// 获取协议
Proto64 proto = new Proto64();
@@ -5495,7 +5700,16 @@ public class SydApi4j implements SydApi {
return rw;
}
- //18.4转加密指令(+) -> pass
+ /**
+ * 18.4转加密指令(+) -> pass
+ * @param keyType 密钥类型
+ * @param srcKey 源应用秘钥,LMK加密下的应用密钥
+ * @param aimKey 目的应用秘钥,LMK加密下的应用密钥
+ * @param infoData 密文数据
+ * @return
+ * infoLen: 密文数据长度
+ * info: 密文数据
+ */
public RetWrap switchEncry(String keyType, String srcKey, String aimKey, byte[] infoData) {
// 获取协议
Proto65 proto = new Proto65();
@@ -5540,7 +5754,12 @@ public class SydApi4j implements SydApi {
return rw;
}
- //18.5 PIN加解密指令(+) -> pass
+ /**
+ * 18.5 PIN加解密指令(+) -> pass
+ * @param key LMK(06-07)加密下的ZPK
+ * @param pin PIN数据
+ * @return PIN数据
+ */
public byte[] encryAndDecry4PIN(String key, byte[] pin) {
// 获取协议
Proto66 proto = new Proto66();
@@ -5582,7 +5801,13 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("info")).getBytes();
}
- //18.6 PIN转加密指令(+) -> pass
+ /**
+ * 18.6 PIN转加密指令(+) -> pass
+ * @param srcKey 源ZPK,LMK(06-07)加密下的ZPK
+ * @param aimKey 目的ZPK,LMK(06-07)加密下的ZPK
+ * @param infoData 密文PIN
+ * @return 密文PIN
+ */
public byte[] switchEncry4PIN(String srcKey, String aimKey, byte[] infoData) {
// 获取协议
Proto67 proto = new Proto67();
@@ -5624,7 +5849,12 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("info")).getBytes();
}
- //17.8 获取传输保护密钥(+) -> code = 18 ( 0x12 ) msg = 未定义的错误
+ /**
+ * 17.8 获取传输保护密钥(+) -> code = 18 ( 0x12 ) msg = 未定义的错误
+ * @return
+ * DK: LMK14-15 加密下的密钥
+ * keyCheck: 密钥校验值
+ */
public RetWrap getTransmissionKey() {
// 获取协议
Proto60 proto = new Proto60();
@@ -5661,7 +5891,14 @@ public class SydApi4j implements SydApi {
return rw;
}
- //16.7 LMK加密密钥转公钥加密输出 ->pass
+ /**
+ * 16.7 LMK加密密钥转公钥加密输出 ->pass
+ * @param pk 公钥
+ * @param key LMK30-31下加密的密钥
+ * @return
+ * keyLength: 公钥加密的密文长度
+ * key: 公钥加密的密文的DER编码
+ */
public RetWrap LMK2SM2(byte[] pk, String key) {
// 获取协议
Proto71 proto = new Proto71();
@@ -5702,7 +5939,14 @@ public class SydApi4j implements SydApi {
return rw;
}
- //16.8 ECC密钥生成 -> code = 129 ( 0x81 ) msg = 未定义的错误 (服务器代码问题)
+ /**
+ * 16.8 ECC密钥生成 -> code = 129 ( 0x81 ) msg = 未定义的错误 (服务器代码问题)
+ * @param nid 曲线nid
+ * @param index 索引
+ * @return
+ * PublicKey: 公钥的 DER 编码
+ * PrivateKey: LMK 加密下的私钥(LMK34-35)
+ */
public RetWrap genKeyPair(int nid, int index) {
//ProtocolRender render = pset.getProtocolReqRender("E2");
ProtoE4 proto = new ProtoE4();
@@ -5752,7 +5996,16 @@ public class SydApi4j implements SydApi {
return rw;
}
- //15.7计算HASH散列值(MD5\SHA1\SHA256)(+) -> pass
+ /**
+ * 15.7计算HASH散列值(MD5\SHA1\SHA256)(+) -> pass
+ * @param hashType HASH类型。0: SHA1,1: SHA256,2: MD5
+ * @param packSn 消息块号。0=仅一块,1=第一块,2=中间块,3=最后块
+ * @param msg 二进制的消息块
+ * @param filterData 过渡消息数据,只对“消息块号”为 2、3 时有效
+ * @return
+ * filterData: 过渡消息数据.只对“消息块号”为 2、1 时有效
+ * hash: hash
+ */
public RetWrap conutHash(int hashType, int packSn, byte[] msg, byte[] filterData) {
Proto7D proto = new Proto7D();
HashMap packet = new HashMap();
@@ -5793,7 +6046,13 @@ public class SydApi4j implements SydApi {
}
}
- //10.1装载对称密钥至用户存储区(=) -> pass
+ /**
+ * 10.1装载对称密钥至用户存储区(=) -> pass
+ * @param index 索引地址,指示用户密钥存储区的27位地址。
+ * @param key 被加密的密钥
+ * @param checkValue 校验值
+ * @return 是否成功
+ */
public Boolean loadKey(String index, String key, String checkValue) {
ProtoLB proto = new ProtoLB();
HashMap packet = new HashMap();
@@ -5843,7 +6102,12 @@ public class SydApi4j implements SydApi {
return true;
}
- //10.2从用户存储区读取对称密钥(=) -> pass(秘钥校验值暂时无法获取)
+ /**
+ * 10.2从用户存储区读取对称密钥(=) -> pass(秘钥校验值暂时无法获取)
+ * @param index 索引地址,指示用户密钥存储区的27位地址
+ * @return
+ * key: 被加密的密钥
+ */
public RetWrap readKey(String index) {
ProtoLF proto = new ProtoLF();
HashMap packet = new HashMap();
@@ -5885,9 +6149,15 @@ public class SydApi4j implements SydApi {
}
}
- //10.3更新对称密钥至用户存储区(=) -> pass
+ /**
+ * 10.3更新对称密钥至用户存储区(=) -> pass
+ * @param index 索引地址,指示用户密钥存储区的27位地址
+ * @param key 被加密的密钥
+ * @param checkValue 校验值
+ * @return
+ */
public Boolean updateKey(String index, String key, String checkValue) {
- ProtoLB proto = new ProtoLB();
+ ProtoLG proto = new ProtoLG();
HashMap packet = new HashMap();
HashMap data = new HashMap();
@@ -5997,7 +6267,17 @@ public class SydApi4j implements SydApi {
}
}
- //8.3用对大消息生成MAC(MAB)(*) -> pass
+ /**
+ * 8.3用对大消息生成MAC(MAB)(*) -> pass
+ * @param packSn 消息块号,0:仅一块。1:第一块。2:中间块。3:最后块。
+ * @param keyType 密钥类型:0-TAK(终端认证密钥)1-ZAK(区域认证密钥)
+ * @param mode 密钥长度:0-单倍长度DES密钥.Ansi X9.9, 1-双倍长度DES密钥,Ansi X9.19, 2 – SM4-CBC,弱填充0x00,银联, 3—3DES-CBC, ,弱填充0x00,银联
+ * @param key 密钥
+ * @param iv IV
+ * @param msg 消息块
+ * @return
+ * MAB: 当消息块号为“1”或“2”时,作为下一块的IV。当消息块号为“0”或“3”时,用于消息认证。
+ */
public RetWrap genMAB(int packSn, int keyType, int mode, String key, byte[] iv, byte[] msg) {
ProtoMS proto = new ProtoMS();
HashMap packet = new HashMap();
@@ -6040,7 +6320,11 @@ public class SydApi4j implements SydApi {
}
}
- //7.1生成一个随机的PIN(=) -> pass 不能传算法标识和加密算法这两项,否则报错
+ /**
+ * 7.1生成一个随机的PIN(=) -> pass 不能传算法标识和加密算法这两项,否则报错
+ * @param account 账号中去除校验位的最右 12 位
+ * @return LMK 对(02-03)下加密的导出 PINBLOCK。(PINBLOCK格式默认为 01 格式)
+ */
public String genPIN(String account) {
ProtoJA proto = new ProtoJA();
HashMap packet = new HashMap();
@@ -6076,7 +6360,14 @@ public class SydApi4j implements SydApi {
}
}
- //7.2解密PINBLOCK, 并打印PIN 明文(=) -> : code = -2 ( 0xfffffffe ) msg = 接收数据超时
+ /**
+ * 7.2解密PINBLOCK, 并打印PIN 明文(=) -> : code = -2 ( 0xfffffffe ) msg = 接收数据超时
+ * @param fileType 文档类型 A:“two-up”格式中的第一个信封。B:“two-up”格式中的第二个信封。C:1步格式。
+ * @param account 账号,账号中去除校验位的最右 12 位
+ * @param encryptionAlg 加密算法 0:DES, 1:3DES(默认), 2:SM4
+ * @param pinBlock PIN 块,LMK 对(02-03)下加密的导出 PINBLOCK。(PINBLOCK格式默认为 01 格式)
+ * @return
+ */
public Boolean decryPINBAndPrint(char fileType, String account, int encryptionAlg, String pinBlock) {
ProtoPE proto = new ProtoPE();
@@ -6125,7 +6416,18 @@ public class SydApi4j implements SydApi {
return true;
}
- //7.3将PINBLOCK从一个ZPK翻译到另一个ZPK(*) -> ->pass
+ /**
+ * 7.3将PINBLOCK从一个ZPK翻译到另一个ZPK(*) -> ->pass
+ * @param zpk1 源 ZPK,当前加密 PIN 块的 ZPK
+ * @param zpk2 目的 ZPK,将要加密 PIN 块的 ZPK;LMK 对(06-07)下加密
+ * @param sca 源算法 SCA,1:3DES, 2:SM4
+ * @param dca 目的算法DCA, 1:3DES, 2:SM4
+ * @param spt
+ * @param dpt
+ * @param pin 源 PIN 块,源 ZPK 下加密的源 PIN 块
+ * @param account 账号中去除校验位的最右 12 位
+ * @return 目的 ZPK 下加密的目的 PIN 块
+ */
@Override
public String transPINFromZPKToZPK(String zpk1, String zpk2, int sca, int dca, int spt, int dpt, String pin, String account) {
@@ -6178,7 +6480,16 @@ public class SydApi4j implements SydApi {
}
- //7.4将PINBLOCK从ZPK翻译到LMK(*) ->pass (
+ /**
+ * 7.4将PINBLOCK从ZPK翻译到LMK(*) ->pass
+ * @param zpk 当前加密 PIN 块的 ZPK;LMK 对(06-07)下加密
+ * @param sca 源算法 SCA,1:3DES, 2:SM4
+ * @param dca 目的算法DCA, 1:3DES, 2:SM4
+ * @param pt PIN 块格式,源 PIN 块的格式代码。01:带主帐号的 ANSI9.8 格式; 02: Docutel ATM;03: Diebold and IBM ATM,;04: Plus Network;05: ISO9564-1-1 格式,1NP..PR...R06:不带主帐号的 ANSI9.8 格式
+ * @param pin 源 ZPK 下加密的源 PIN 块
+ * @param account 账号中去除校验位的最右 12 位
+ * @return PIN 块,LMK 对(02-03)下加密的 PIN
+ */
public String transPINFromZPKToLMK(String zpk, int sca, int dca, int pt, String pin, String account) {
ProtoJE proto = new ProtoJE();
@@ -6226,7 +6537,16 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("pinBlock")).getString();
}
- //7.5将PINBLOCK从LMK翻译到ZPK(*) ->pass
+ /**
+ * 7.5将PINBLOCK从LMK翻译到ZPK(*) ->pass
+ * @param zpk 当前加密 PIN 块的 ZPK;LMK 对(06-07)下加密
+ * @param sca 源算法 SCA,1:3DES, 2:SM4
+ * @param dca 目的算法DCA, 1:3DES, 2:SM4
+ * @param pt PIN 块格式,源 PIN 块的格式代码。01:带主帐号的 ANSI9.8 格式; 02: Docutel ATM;03: Diebold and IBM ATM,;04: Plus Network;05: ISO9564-1-1 格式,1NP..PR...R06:不带主帐号的 ANSI9.8 格式
+ * @param pin 源 ZPK 下加密的源 PIN 块
+ * @param account 账号中去除校验位的最右 12 位
+ * @return PIN 块,LMK 对(02-03)下加密的 PIN
+ */
public String transPINFromLMKToZPK(String zpk, int sca, int dca, int pt, String pin, String account) {
ProtoJG proto = new ProtoJG();
@@ -6274,7 +6594,18 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("pinBlock")).getString();
}
- //7.6将PINBLOCK从TPK翻译到ZPK(=) -> pass
+ /**
+ * 7.6将PINBLOCK从TPK翻译到ZPK(=) -> pass
+ * @param tpk 当前加密 PIN 块的 ZPK;LMK 对(06-07)下加密。
+ * @param zpk 将要加密 PIN 块的 ZPK;LMK 对(06-07)下加密。
+ * @param sca 源算法 SCA,1:3DES(默认), 2:SM4
+ * @param dca 目的算法DCA, 1:3DES(默认), 2:SM4
+ * @param spt 源PIN 块的格式代码。01:带主帐号的 ANSI9.8 格式; 02: Docutel ATM;03: Diebold and IBM ATM,;04: Plus Network;05: ISO9564-1-1 格式,1NP..PR...R; 06:不带主帐号的 ANSI9.8 格式
+ * @param dpt 目的 PIN 块的格式代码。01:带主帐号的 ANSI9.8 格式; 02: Docutel ATM;03: Diebold and IBM ATM,;04: Plus Network;05: ISO9564-1-1 格式,1NP..PR...R; 06:不带主帐号的 ANSI9.8 格式
+ * @param pin 源 ZPK 下加密的源 PIN 块
+ * @param account 账号中去除校验位的最右 12 位
+ * @return 目的 ZPK 下加密的目的 PIN 块
+ */
public String transPINFromTPKToZPK(String tpk, String zpk, int sca, int dca, int spt, int dpt, String pin, String account) {
ProtoCA proto = new ProtoCA();
@@ -6324,7 +6655,16 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("purposePinBlock")).getString();
}
- //7.7将PINBLOCK从TPK翻译到LMK(=) -> pass
+ /**
+ * 7.7将PINBLOCK从TPK翻译到LMK(=) -> pass
+ * @param zpk 当前加密 PIN 块的 ZPK;LMK 对(06-07)下加密。
+ * @param sca 源算法 SCA,1:3DES(默认), 2:SM4
+ * @param dca 目的算法DCA, 1:3DES(默认), 2:SM4
+ * @param pt 源PIN 块的格式代码。01:带主帐号的 ANSI9.8 格式; 02: Docutel ATM;03: Diebold and IBM ATM,;04: Plus Network;05: ISO9564-1-1 格式,1NP..PR...R; 06:不带主帐号的 ANSI9.8 格式
+ * @param pin 源 ZPK 下加密的源 PIN 块
+ * @param account 账号中去除校验位的最右 12 位
+ * @return LMK 对(02-03)下加密的 PIN
+ */
public String transPINFromTPKToLMK(String zpk, int sca, int dca, int pt, String pin, String account) {
ProtoJC proto = new ProtoJC();
@@ -6372,7 +6712,13 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("pinBlock")).getString();
}
- //7.8加密一个明文的PIN(*) -> pass
+ /**
+ * 7.8加密一个明文的PIN(*) -> pass
+ * @param alg 算法标识,0:3DES,1:SM4
+ * @param pin 左对齐的形式的文本PIN,后面附加字符“X’F”直至已加密PIN的长度。其值在安全配置“CS”命令中设置(范围为5至13)。例如:PIN:123456,此字段应该为06123456FFFFFFFF(8字节分组算法)
+ * @param account 账号中去除校验位的最右12位
+ * @return LMK 对(02-03)下加密的 PIN
+ */
public String encryPIN(int alg, String pin, String account) {
ProtoBA proto = new ProtoBA();
@@ -6415,7 +6761,14 @@ public class SydApi4j implements SydApi {
return ((PacketSection) ret.get("pinBlock")).getString();
}
- //7.9解密一个已加密的PIN(*) -> 只解出原PIn,缺少参考数这一项
+
+ /**
+ * 7.9解密一个已加密的PIN(*) -> 只解出原PIn,缺少参考数这一项
+ * @param alg 算法标识,0:3DES,1:SM4
+ * @param PINBLOCK LMK对(02-03)下加密的PIN。
+ * @param account 账号中去除校验位的最右12位。
+ * @return PIN
+ */
public String decryPIN(int alg, String PINBLOCK, String account) {
ProtoNG proto = new ProtoNG();
@@ -6458,7 +6811,19 @@ public class SydApi4j implements SydApi {
}
}
- //7.10将PINBLOCK从一个密钥翻译到另一个密钥 -> pass
+
+ /**
+ * 7.10将PINBLOCK从一个密钥翻译到另一个密钥 -> pass
+ * @param srcKeyType 源秘钥类型(查看密钥类型表)
+ * @param desKeyType 目的秘钥类型(查看密钥类型表)
+ * @param srcKey 源秘钥,当前加密PIN块的密钥;LMK加密的密文
+ * @param desKey 目的秘钥,将要加密PIN块的密钥;LMK加密的密文
+ * @param sca 源算法SCA,1:3DES,2:SM4
+ * @param dca 目的算法DCA, 1:3DES,2:SM4
+ * @param sPin 源PIN块, 源密钥加密的源PIN块,源算法3DES时16H,源算法SM4时32H。
+ * @param primaryAccount 主账号,账号中去除校验位的最右12位。
+ * @return 目的PIN块,目的秘钥下加密的目的PIN块
+ */
public String transPinFrOneKeyToAno(String srcKeyType, String desKeyType, String srcKey, String desKey, int sca, int dca, String sPin, String primaryAccount) {
ProtoCB proto = new ProtoCB();
HashMap packet = new HashMap();
@@ -6502,7 +6867,15 @@ public class SydApi4j implements SydApi {
}
}
- //6.1生成一个TAK(=) -> pass
+ /**
+ * 6.1生成一个TAK(=) -> pass
+ * 生成一个随机的密钥,然后在TMK(TPK或PVK)和LMK对16-17下加密
+ * @param tmk LMK 对(14-15)下加密的 TMK
+ * @return
+ * lmkKey: LMK 对 16-17 下加密的密钥
+ * tmkKey: TMK 下加密的随机的 TAK
+ * keyCheck: 密钥校验值
+ */
public RetWrap genTAK(String tmk) {
ProtoHA proto = new ProtoHA();
HashMap packet = new HashMap();
@@ -6556,7 +6929,14 @@ public class SydApi4j implements SydApi {
}
}
- //6.2将TAK从ZMK转为LMK加密(=) -> PASS
+ /**
+ * 6.2将TAK从ZMK转为LMK加密(=) -> PASS
+ * @param zmk LMK 对(04-05)下加密的 ZMK
+ * @param tak ZMK 下加密的 TAK
+ * @return
+ * lmkKey: LMK 对 16-17 下加密的 TAK
+ * keyCheck: 密钥校验值
+ */
public RetWrap transTAKFromZMKToLMK(String zmk, String tak) {
ProtoMF proto = new ProtoMF();
HashMap packet = new HashMap();
@@ -6603,7 +6983,14 @@ public class SydApi4j implements SydApi {
}
}
- //6.3将TAK从LMK转为ZMK加密(=) -> PASS
+ /**
+ * 6.3将TAK从LMK转为ZMK加密(=) -> PASS
+ * @param zmk LMK 对(04-05)下加密的 ZMK
+ * @param tak LMK 对(16-17)下加密的 TAK
+ * @return
+ * zmkKey: ZMK 下加密的 TAK
+ * keyCheck: 密钥校验值
+ */
public RetWrap transTAKFromLMKToZMK(String zmk, String tak) {
ProtoMG proto = new ProtoMG();
HashMap packet = new HashMap();
@@ -6650,7 +7037,14 @@ public class SydApi4j implements SydApi {
}
}
- //6.4将TAK从LMK转为TMK加密(=) -> PASS
+ /**
+ * 6.4将TAK从LMK转为TMK加密(=) -> PASS
+ * @param tmk LMK 对(14-15)下加密的 TMK
+ * @param tak LMK 对(16-17)下加密的 TAK
+ * @return
+ * tmkKey: 转换后的 TAK;TMK 下加密
+ * keyCheck: 密钥校验值
+ */
public RetWrap transTAKFromLMKToTMK(String tmk, String tak) {
ProtoAG proto = new ProtoAG();
HashMap packet = new HashMap();
@@ -6697,7 +7091,15 @@ public class SydApi4j implements SydApi {
}
}
- //5.1生成一个TMK、TPK或PVK加密下的新密钥(=) -> PASS
+
+ /**
+ * 5.1生成一个TMK、TPK或PVK加密下的新密钥(=) -> PASS
+ * @param tmk LMK 对(14-15)下加密的 TMK、TPK 或 PVK
+ * @return
+ * lmkKey: LMK下加密的新密钥
+ * tmkKey: 当前的TMK (TPK或PVK)下加密的新密钥
+ * keyCheck: 密钥校验值
+ */
public RetWrap genKeyByTMKOrTPKOrPVK(String tmk) {
ProtoHC proto = new ProtoHC();
HashMap packet = new HashMap();
@@ -6752,7 +7154,15 @@ public class SydApi4j implements SydApi {
}
}
- //5.2将TMK、TPK或PVK从LMK转为另一TMK、TPK或PVK加密(+) -> PASS
+ /**
+ * 5.2将TMK、TPK或PVK从LMK转为另一TMK、TPK或PVK加密(+)
+ * 将TMK、TPK或PVK从LMK对(14-15)下转为另一TMK、TPK或PVK下加密
+ * @param tmkNow LMK 对(14-15)下加密的当前 TMK、 TPK 或 PVK
+ * @param tmkStorage LMK 对(14-15)下加密的存储 TMK、 TPK 或 PVK
+ * @return
+ * tmkKey: 当前密钥下加密的存储密钥
+ * keyCheck: 密钥校验值
+ */
public RetWrap tranKeyByTMKToAno(String tmkNow, String tmkStorage) {
ProtoAE proto = new ProtoAE();
HashMap packet = new HashMap();
@@ -6799,7 +7209,14 @@ public class SydApi4j implements SydApi {
}
}
- //5.3将TMK、TPK或PVK从ZMK转为LMK加密(=) -> PASS
+ /**
+ * 5.3将TMK、TPK或PVK从ZMK转为LMK加密(=) -> PASS
+ * @param zmk LMK 对(04-05)下加密的 ZMK
+ * @param tmk ZMK 下加密的 TMK、 TPK 或 PVK
+ * @return
+ * tmkKey: 当前密钥下加密的存储密钥
+ * keyCheck: 密钥校验值。
+ */
public RetWrap tranKeyByTMKFromZMKToLMK(String zmk, String tmk) {
ProtoFC proto = new ProtoFC();
HashMap packet = new HashMap();
@@ -6847,7 +7264,14 @@ public class SydApi4j implements SydApi {
}
}
- //5.4将TMK、TPK或PVK从LMK转为ZMK加密(=) -> PASS
+ /**
+ * 5.4将TMK、TPK或PVK从LMK转为ZMK加密(=) -> PASS
+ * @param zmk LMK 对(04-05)下加密的 ZMK
+ * @param tmk LMK 对(14-15)下加密的 TMK、TPK 或 PVK
+ * @return
+ * tmkKey: 当前密钥下加密的存储密钥
+ * keyCheck: 密钥校验值
+ */
public RetWrap tranKeyByTMKFromLMKToZMK(String zmk, String tmk) {
ProtoFE proto = new ProtoFE();
HashMap packet = new HashMap();
@@ -6895,7 +7319,15 @@ public class SydApi4j implements SydApi {
}
}
- //4.1生成一个ZEK/ZAK(=) -> pass
+ /**
+ * 生成一个ZEK或ZAK
+ * @param key 标识 0为ZEK,1为ZAK。
+ * @param zmk LMK 对(04-05)加密的 ZMK
+ * @return
+ * lmkKey: 转换后的 ZPK
+ * zmkKey: 转换后的 ZPK
+ * keyCheck: 密钥校验值。
+ */
public RetWrap genZEKOrZAK(int key, String zmk) {
ProtoFI proto = new ProtoFI();
HashMap packet = new HashMap();
@@ -6967,7 +7399,15 @@ public class SydApi4j implements SydApi {
}
}
- //4.2将ZEK/ZAK从ZMK转为LMK加密(=) -> pass
+ /**
+ * 4.2将ZEK/ZAK从ZMK转为LMK加密(=) -> pass
+ * @param key 标识 0为ZEK,1为ZAK
+ * @param zmk LMK 对(04-05)加密的 ZMK
+ * @param zekOrzak ZMK 下加密的 ZEK 或 ZAK
+ * @return
+ * lmkKey: 当标志位为1时为LMK26-27对下加密的ZAK,当标志位为0时为LMK30-31对下加密的ZEK。
+ * keyCheck: 密钥校验值。
+ */
public RetWrap tranZEAKFromZMKToLMK(int key, String zmk, String zekOrzak) {
ProtoFK proto = new ProtoFK();
HashMap packet = new HashMap();
@@ -7025,7 +7465,15 @@ public class SydApi4j implements SydApi {
}
}
- //4.3将ZEK/ZAK从LMK转为ZMK加密(=) -> pass
+ /**
+ * 4.3将ZEK/ZAK从LMK转为ZMK加密(=) -> pass
+ * @param key 标识 0为ZEK,1为ZAK
+ * @param zmk LMK 对(04-05)加密的 ZMK
+ * @param zekOrzak ZMK 下加密的 ZEK 或 ZAK,标志位为 0 时为 ZEK,1 为 ZAK
+ * @return
+ * zmkKey: 转换后的 ZPK。
+ * keyCheck: 密钥校验值。
+ */
public RetWrap tranZEAKFromLMKToZMK(int key, String zmk, String zekOrzak) {
ProtoFM proto = new ProtoFM();
HashMap packet = new HashMap();
@@ -7083,7 +7531,14 @@ public class SydApi4j implements SydApi {
}
}
- //3.1生成一个ZPK(=) -> pass
+ /**
+ * 3.1生成一个ZPK(=)
+ * 生成一个随机的ZPK,同时返回主机为传输给另一群体的而由ZMK加密的ZPK和为存储在主机数据库中而由LMK加密的ZPK
+ * @param zmk LMK对(04-05)加密的ZMK。
+ * @return
+ * zmkKey: zmk 头 + ZMK 加密下的ZPK。
+ * keyCheck: 密钥校验值
+ */
public RetWrap genZPK(String zmk) {
ProtoIA proto = new ProtoIA();
HashMap packet = new HashMap();
@@ -7139,7 +7594,14 @@ public class SydApi4j implements SydApi {
}
}
- //3.2将ZPK由ZMK转为LMK加密(=) -> pass
+ /**
+ * 3.2将ZPK由ZMK转为LMK加密(=)
+ * @param zmk LMK 对(04-05)加密的 ZMK。
+ * @param zpk ZMK 下加密的 ZPK
+ * @return
+ * zpkKey: 转换后的 ZPK;由 LMK06-07 对加密
+ * keyCheck: 密钥校验值
+ */
public RetWrap tranZPKFromZMKToLMK(String zmk, String zpk) {
ProtoFA proto = new ProtoFA();
HashMap packet = new HashMap();
@@ -7188,7 +7650,14 @@ public class SydApi4j implements SydApi {
}
}
- //3.3将ZPK由LMK转为ZMK加密 -> pass
+ /**
+ * 3.3将ZPK由LMK转为ZMK加密 -> pass
+ * @param zmk LMK 对(04-05)加密的 ZMK
+ * @param zpk LMK 对(06-07)下加密的 ZPK
+ * @return
+ * zpkKey: 转换后的 ZPK;
+ * keyCheck: 密钥校验值
+ */
public RetWrap tranZPKFromLMKToZMK(String zmk, String zpk) {
ProtoGC proto = new ProtoGC();
HashMap packet = new HashMap();
@@ -7237,7 +7706,12 @@ public class SydApi4j implements SydApi {
}
}
- //2.1生成并打印一个ZMK成份(=) -> : code = 23 ( 0x17 ) msg = 未定义的错误
+ /**
+ * 2.1生成并打印一个ZMK成份
+ * 生成一个随机的ZMK成份,在连接到HSM的打印机上打印并将加密值返回给主机
+ * @return
+ * lmkKey: zmk 头 + LMK对04-05变种下加密的ZMK成份
+ */
public RetWrap genZMKAndPrint() {
ProtoOC proto = new ProtoOC();
@@ -7292,7 +7766,14 @@ public class SydApi4j implements SydApi {
return retWrap;
}
- //1.4由2-9个密钥成份组成一个密钥(=) -> : code = 23 ( 0x17 ) msg = 未定义的错误
+ /**
+ * 1.4 由2-9个密钥成份组成一个密钥(=) -> : code = 23 ( 0x17 ) msg = 未定义的错误
+ * @param keyType 密钥类型
+ * @param keys 所有成分
+ * @return
+ * lmkKey: lmk 头 + LMK 加密下的密钥。
+ * keyCheck:
+ */
public RetWrap composeKey(String keyType, String[] keys) {
ProtoA4 proto = new ProtoA4();
@@ -7355,62 +7836,13 @@ public class SydApi4j implements SydApi {
}
- //1.1生成一个对称密钥(*) -> pass (对比之前添加了可产生ZMK加密下的密钥)
- public RetWrap genSymKey(int mode, String keyType, char solution, String zmk) {
- ProtoA0 proto = new ProtoA0();
- HashMap packet = new HashMap();
- HashMap data = new HashMap();
-
- packet.put("data", data);
- PacketSN sn = PacketSN.gen();
- packet.put("header", sn.getSn().array());
- data.put("mode$option", mode);
- data.put("keyType", keyType);
- data.put("solution", solution);
- data.put("zmk", zmk);
- data.put("keySolution", 'X');
- data.put("businessKey", 'N');
-
- ByteBuffer bb = proto.rend(packet);
-
- synchronized (this) {
- bb = syncRead(syncSend(bb));
- }
-
- Map ret = null;
- Packet p = proto.parse(bb, packet);
- ret = p.toMap();
- if (!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())) {
- throw new SydApiException("包序号不匹配", -4);
- } else {
- ret = (Map) ret.get("data");
- PacketSection error = (PacketSection) ret.get("error");
- if (!"00".equals(error.getString())) {
- throw new SydApiException(error.getInfo(), error.autoInt());
- } else {
- RetWrap rw = new RetWrap();
- byte[] lmks = ((PacketSection) ret.get("lmk")).getBytes();
- byte[] lmkHeads = ((PacketSection) ret.get("lmkHead")).getBytes();
- byte[] bs1 = new byte[lmks.length + lmkHeads.length];
- System.arraycopy(lmkHeads, 0, bs1, 0, lmkHeads.length);
- System.arraycopy(lmks, 0, bs1, lmkHeads.length, lmks.length);
- rw.put("lmkKey", bs1);
- if (1 == mode) {
- byte[] zmks = ((PacketSection) ret.get("zmk")).getBytes();
- byte[] zmkHeads = ((PacketSection) ret.get("zmkHead")).getBytes();
- byte[] bs2 = new byte[zmks.length + zmkHeads.length];
- System.arraycopy(zmkHeads, 0, bs2, 0, zmkHeads.length);
- System.arraycopy(zmks, 0, bs2, zmkHeads.length, zmks.length);
- rw.put("zmkKey", bs2);
- }
-
- rw.put("keyCheck", ((PacketSection) ret.get("keyCheck")).getBytes());
- return rw;
- }
- }
- }
-
- //17.9 角色认证(+) -> -> : code = 2 ( 0x2 ) msg = 签名验证错误
+ /**
+ * 17.9 角色认证(+) -> -> : code = 2 ( 0x2 ) msg = 签名验证错误
+ * @param roleInfo 角色信息,IC 卡内存放的角色信息密文(LMK14-15)
+ * @return
+ * roleType: 角色类型,1:系统管理员,2:密钥管理员,3: 配置管理员
+ * roleId: 角色ID, 1:管理员1,2:管理员2
+ */
public RetWrap roleVerify(String roleInfo) {
Proto61 proto = new Proto61();
HashMap packet = new HashMap();
@@ -7497,7 +7929,15 @@ public class SydApi4j implements SydApi {
return rw;
}
- //17.11 获取应用密钥明文(+) -> PASS
+ /**
+ * 17.11 获取应用密钥明文(+) -> PASS
+ * @param key 密钥(LMK)
+ * @param checkAlg 校验值算法,0:3DES,1:SM4
+ * @return
+ * keyCheck: 密钥明文的校验值
+ * key1: 密钥明文分量1
+ * key2: 密钥明文分量2
+ */
public RetWrap getPlainText(String key, int checkAlg) {
ProtoAB proto = new ProtoAB();
diff --git a/src/test/java/com/sunyard/sydapi/sample/ASYMEnDeTest.java b/src/test/java/com/sunyard/sydapi/sample/ASYMEnDeTest.java
index c8ce083..17a1284 100644
--- a/src/test/java/com/sunyard/sydapi/sample/ASYMEnDeTest.java
+++ b/src/test/java/com/sunyard/sydapi/sample/ASYMEnDeTest.java
@@ -10,7 +10,7 @@ import java.util.Arrays;
public class ASYMEnDeTest {
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("非对称密钥加解密");
byte[] testData = new byte[100];
diff --git a/src/test/java/com/sunyard/sydapi/sample/InputOutputKeyTest.java b/src/test/java/com/sunyard/sydapi/sample/InputOutputKeyTest.java
index 2f07b72..fbbf4ff 100644
--- a/src/test/java/com/sunyard/sydapi/sample/InputOutputKeyTest.java
+++ b/src/test/java/com/sunyard/sydapi/sample/InputOutputKeyTest.java
@@ -16,7 +16,7 @@ import java.util.Arrays;
public class InputOutputKeyTest
{
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("密钥导入导出功能测试");
diff --git a/src/test/java/com/sunyard/sydapi/sample/MACTest.java b/src/test/java/com/sunyard/sydapi/sample/MACTest.java
index 41beede..958e3c7 100644
--- a/src/test/java/com/sunyard/sydapi/sample/MACTest.java
+++ b/src/test/java/com/sunyard/sydapi/sample/MACTest.java
@@ -5,7 +5,7 @@ import racal.sunyard.main.SydApiBuilder;
public class MACTest {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
SydApi api = new SydApiBuilder()
.setIp("172.16.17.162")
diff --git a/src/test/java/com/sunyard/sydapi/sample/RSAP1SignVerify.java b/src/test/java/com/sunyard/sydapi/sample/RSAP1SignVerify.java
index 27373a8..427e245 100644
--- a/src/test/java/com/sunyard/sydapi/sample/RSAP1SignVerify.java
+++ b/src/test/java/com/sunyard/sydapi/sample/RSAP1SignVerify.java
@@ -41,7 +41,7 @@ public class RSAP1SignVerify {
}
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
SydApi4j api = (SydApi4j) new SydApiBuilder()
.setIp("192.168.1.226")
.useDebugMode()
diff --git a/src/test/java/com/sunyard/sydapi/sample/Test.java b/src/test/java/com/sunyard/sydapi/sample/Test.java
index 1e5ac55..b8d0360 100644
--- a/src/test/java/com/sunyard/sydapi/sample/Test.java
+++ b/src/test/java/com/sunyard/sydapi/sample/Test.java
@@ -13,7 +13,7 @@ import java.util.Arrays;
public class Test
{
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("工银亚洲测试功能测试");
byte[] testData = new byte[17000];
diff --git a/src/test/java/com/sunyard/sydapi/sample/Test2.java b/src/test/java/com/sunyard/sydapi/sample/Test2.java
index 0773e61..159dbf0 100644
--- a/src/test/java/com/sunyard/sydapi/sample/Test2.java
+++ b/src/test/java/com/sunyard/sydapi/sample/Test2.java
@@ -73,7 +73,7 @@ import java.util.Arrays;
*/
public class Test2 {
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("工银亚洲测试功能测试");
byte[] testData = new byte[17000];
diff --git a/src/test/java/com/sunyard/sydapi/sample/TestKeyPair.java b/src/test/java/com/sunyard/sydapi/sample/TestKeyPair.java
index 41c0018..b04c469 100644
--- a/src/test/java/com/sunyard/sydapi/sample/TestKeyPair.java
+++ b/src/test/java/com/sunyard/sydapi/sample/TestKeyPair.java
@@ -11,7 +11,7 @@ import java.util.Arrays;
public class TestKeyPair
{
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("非对称密钥生成");
byte[] testData = new byte[17000];
diff --git a/src/test/java/com/sunyard/sydapi/test/MACTest.java b/src/test/java/com/sunyard/sydapi/test/MACTest.java
index 734b4b9..8370989 100644
--- a/src/test/java/com/sunyard/sydapi/test/MACTest.java
+++ b/src/test/java/com/sunyard/sydapi/test/MACTest.java
@@ -8,7 +8,7 @@ import racal.sunyard.main.SydApiBuilder;
import java.util.Arrays;
public class MACTest {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("MAC 测试");
diff --git a/src/test/java/com/sunyard/sydapi/test/PBOCTest.java b/src/test/java/com/sunyard/sydapi/test/PBOCTest.java
index 94adfc8..4483c4d 100644
--- a/src/test/java/com/sunyard/sydapi/test/PBOCTest.java
+++ b/src/test/java/com/sunyard/sydapi/test/PBOCTest.java
@@ -5,7 +5,7 @@ import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class PBOCTest {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("PBOC MAC 测试");
diff --git a/src/test/java/com/sunyard/sydapi/test/PledgeTest.java b/src/test/java/com/sunyard/sydapi/test/PledgeTest.java
index 7be542c..1f9542a 100644
--- a/src/test/java/com/sunyard/sydapi/test/PledgeTest.java
+++ b/src/test/java/com/sunyard/sydapi/test/PledgeTest.java
@@ -9,7 +9,7 @@ public class PledgeTest {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
byte[] testData = "1234567812345678".getBytes();
//testData = new byte[8];
diff --git a/src/test/java/com/sunyard/sydapi/test/PledgeTest2.java b/src/test/java/com/sunyard/sydapi/test/PledgeTest2.java
index 32f279d..021d630 100644
--- a/src/test/java/com/sunyard/sydapi/test/PledgeTest2.java
+++ b/src/test/java/com/sunyard/sydapi/test/PledgeTest2.java
@@ -9,7 +9,7 @@ public class PledgeTest2 {
- public static void main(String[] args) {
+ public static void main(String[] args) throws IllegalAccessException, InstantiationException, ClassNotFoundException {
byte[] testData = "1234567812345678".getBytes();
//testData = new byte[8];
diff --git a/src/test/java/com/sunyard/sydapi/test/PrintTest.java b/src/test/java/com/sunyard/sydapi/test/PrintTest.java
index 246da7f..9cdf46a 100644
--- a/src/test/java/com/sunyard/sydapi/test/PrintTest.java
+++ b/src/test/java/com/sunyard/sydapi/test/PrintTest.java
@@ -10,7 +10,7 @@ import java.io.UnsupportedEncodingException;
public class PrintTest {
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
// 连接加密机
SydApi4j api = (SydApi4j) new SydApiBuilder()
.setIp("172.16.17.161")
diff --git a/src/test/java/com/sunyard/sydapi/test/TestCB.java b/src/test/java/com/sunyard/sydapi/test/TestCB.java
index 9e7a26e..f6d9b2e 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestCB.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestCB.java
@@ -13,7 +13,7 @@ import java.io.UnsupportedEncodingException;
public class TestCB
{
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("SydApi 测试程序启动");
diff --git a/src/test/java/com/sunyard/sydapi/test/TestGongYin.java b/src/test/java/com/sunyard/sydapi/test/TestGongYin.java
index 225ace4..e58880a 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestGongYin.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestGongYin.java
@@ -13,7 +13,7 @@ import java.util.Arrays;
public class TestGongYin
{
- public static void main(String[] args) throws UnsupportedEncodingException {
+ public static void main(String[] args) throws UnsupportedEncodingException, IllegalAccessException, InstantiationException, ClassNotFoundException {
System.out.println("工银亚洲测试功能测试");
byte[] testData = new byte[17000];
diff --git a/src/test/java/com/sunyard/sydapi/test/TestUtil.java b/src/test/java/com/sunyard/sydapi/test/TestUtil.java
index 67ac437..5a311bd 100644
--- a/src/test/java/com/sunyard/sydapi/test/TestUtil.java
+++ b/src/test/java/com/sunyard/sydapi/test/TestUtil.java
@@ -1,8 +1,14 @@
package com.sunyard.sydapi.test;
import com.sunyard.trans.PacketSN;
+import org.junit.Test;
+import racal.sunyard.main.SydApi4j;
+import java.lang.reflect.Method;
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
import java.text.SimpleDateFormat;
+import java.util.Arrays;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
@@ -42,4 +48,66 @@ public class TestUtil {
}
+
+ /**
+ * 获取所有方法
+ */
+ @Test
+ public void getMethod() {
+ Class jClass = SydApi4j.class;
+
+ Method[] dm = jClass.getDeclaredMethods();
+
+ System.out.println(dm.length);
+
+ for (int i = 0; i < dm.length; i++) {
+ Type[] types = dm[i].getGenericParameterTypes();
+ System.out.print(dm[i].getName() + "(");
+ for (int j = 0; j < types.length; j++) {
+ Type type = types[j];
+
+ System.out.print(getRealTypeName(type));
+ if (j != types.length - 1) {
+ System.out.print(", ");
+ }
+ }
+ System.out.println(")");
+ }
+ }
+
+ public String getRealTypeName(Type type) {
+
+ String resultName = "";
+ if (type instanceof ParameterizedType) {
+
+ resultName = getRealName(type.getTypeName()) + "<";
+
+ Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
+
+ for (int z = 0; z < actualTypes.length; z++) {
+ resultName += getRealName(actualTypes[z].getTypeName());
+ if (z != actualTypes.length - 1) {
+ resultName += ", ";
+ }
+ }
+ resultName += ">";
+ } else {
+ resultName = getRealName(type.getTypeName());
+ }
+
+ return resultName.replace("$", ".");
+ }
+
+ public String getRealName(String typeName) {
+ if (typeName.contains(".") && typeName.contains("<")) {
+ typeName = typeName.substring(0, typeName.indexOf("<"));
+ return typeName.substring(typeName.lastIndexOf(".") + 1);
+ }
+
+ if (typeName.contains(".")) {
+ return typeName.substring(typeName.lastIndexOf(".") + 1);
+ }
+
+ return typeName;
+ }
}