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; + } }