13 Commits
Author SHA1 Message Date
Cheney Wong b5968c5245 版本兼容修改 2025-07-03 10:01:35 +08:00
Cheney Wong 73c315f714 版本兼容修改 2025-07-02 17:59:26 +08:00
chuzhenyang b74443f38b 修改异常类 2022-09-05 16:07:58 +08:00
junj2.liang b2d5103176 修改异常类 2022-08-24 16:46:24 +08:00
junj2.liang d34d5ff8e0 日志问题 2022-08-04 14:13:49 +08:00
cheney c7324ba414 日志接口 2022-08-04 09:38:53 +08:00
cheney 041f992992 提交打包规则 2022-07-22 17:40:26 +08:00
cheney 22b7929e40 E0 优化 2022-07-22 09:33:28 +08:00
cheney 954e5fb637 sm4 长数据速传接口 2022-07-21 16:26:54 +08:00
cheney 3abf5021a3 MAC(SM4+CBC) 2022-07-21 15:17:12 +08:00
cheney dc450dcdb5 添加 SM3 接口变种
(cherry picked from commit 6daefe5d48)
2022-07-21 10:59:08 +08:00
cheney aacd927fbf 忽略临时文档 2022-07-18 16:42:59 +08:00
cheney e18cfab77d 更新脚本 2022-07-15 14:35:45 +08:00
117 changed files with 6366 additions and 13153 deletions
-2
View File
@@ -11,6 +11,4 @@
/.DS_Store /.DS_Store
src/test/java/com/sunyard/sydapi/sample/*.* src/test/java/com/sunyard/sydapi/sample/*.*
*.p7 *.p7
~$*
/pack/ /pack/
/.logs/
+10 -58
View File
@@ -20,9 +20,6 @@
<option cn="PKCS7_SM2_SM4_ECB"> <option cn="PKCS7_SM2_SM4_ECB">
<hex>3</hex> <hex>3</hex>
</option> </option>
<option cn="RSA2048_AES256_CBC">
<hex>4</hex>
</option>
</options> </options>
</alg> </alg>
@@ -55,12 +52,12 @@
可选项,只针对“证书模式”为 1时有。 可选项,只针对“证书模式”为 1时有。
</certificateDn> </certificateDn>
<orgDataLen len="4" :value="dataLen()" :if="3 == $packet.data.alg$option||4 == $packet.data.alg$option" cn="数据长度"> <orgDataLen len="4" :value="dataLen()" :if="3 == $packet.data.alg$option" cn="数据长度">
只针对算法标识为3、4时传入 只针对算法标识为3时传入
</orgDataLen> </orgDataLen>
<orgData :if="3 == $packet.data.alg$option||4== $packet.data.alg$option" cn="数据长度"> <orgData :if="3 == $packet.data.alg$option" cn="数据长度">
只针对算法标识为3、4时传入 只针对算法标识为3时传入
</orgData> </orgData>
<keyType len="1" cn="加密密钥方案"> <keyType len="1" cn="加密密钥方案">
@@ -75,30 +72,6 @@
公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在 公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在
</orgCode> </orgCode>
<!-- 新增功能-->
<pSignFlag len="1" required="false" cn="可选字段">
签名数字信封标识符,存在则为P
</pSignFlag>
<signCertificateLen len="4" :value="signCertificateLen()" :if="hasOrgCN()" cn="签名证书DN长度">
可选项,只针对"可选字段"为P时存在。
</signCertificateLen>
<signCertificateDn :len="strlen()" :if="hasOrgCN()" cn="签名证书DN">
可选项,只针对“证书模式”为1时有,只针对"可选字段"为P时存在。
</signCertificateDn>
<signCertificateModel len="1" :if="hasOrgCN()" cn="是否附带公钥信息">
<options>
<option cn="无需附带">
<hex>0</hex>
</option>
<option cn="附带公钥信息">
<hex>1</hex>
</option>
</options>
</signCertificateModel>
<tailSep len="1" :if=" null != $packet.data.tail " cn="尾分隔"> <tailSep len="1" :if=" null != $packet.data.tail " cn="尾分隔">
可选项。如果显示消息尾域,则该域必须显示。值为 可选项。如果显示消息尾域,则该域必须显示。值为
“X’19”。 “X’19”。
@@ -199,35 +172,24 @@
} }
} }
function signCertificateLen(){
var data = $packet.data;
if( 'P' == $packet.data.pSignFlag ){
return data.signCertificateDn.length
}
return null;
}
function getKeyLen() { function getKeyLen() {
return Util.a2i( $final.getSection('data').getSection('keyLen') ); return Util.a2i( $final.getSection('data').getSection('keyLen') )
} }
function lmkLen() { function lmkLen() {
if( Arrays.equals("L".getBytes(), if( Arrays.equals("L".getBytes(),
$final.getSection('data').getSection('lmkHead').getValue() $final.getSection('data').getSection('lmkHead').getValue()
) ){ ) ){
return 64; return 64
}else{ }else{
return 32; return 32
} }
} }
function dataLen() { function dataLen() {
return $packet.data.orgData.length return $packet.data.orgData.length()
} }
<![CDATA[ <![CDATA[
function hasOrgCode() { function hasOrgCode() {
if(2 == $packet.data.alg$option && 'P' == $packet.data.pFlag) { if(2 == $packet.data.alg$option && 'P' == $packet.data.pFlag) {
@@ -237,21 +199,11 @@
return false; return false;
} }
function hasOrgCN() {
if(1 == $packet.data.certificateModel$option && 'P' == $packet.data.pSignFlag) {
return true;
}
return false;
}
function orgCodeLen() { function orgCodeLen() {
def len = $packet.data.orgCode.length(); def len = $packet.data.orgCode.length();
def data = new byte[2]; def data = new byte[2];
data[0] = (byte)(len >> 8 & 0xFF); data[0] = (byte)(len >> 8 & 0xFF)
data[1] = (byte)(len & 0xFF); data[1] = (byte)(len & 0xFF)
return data; return data;
} }
+9 -40
View File
@@ -11,18 +11,6 @@
可选,如果输入P代表使用PKCS7_SM2_SM4_ECB模式解密数字信封 可选,如果输入P代表使用PKCS7_SM2_SM4_ECB模式解密数字信封
</pFlag> </pFlag>
<!--新增-->
<pSignFlag len="1" required="false" if="'P' == $packet.data.pFlag" cn="可选字段2">
如果输入P代表进行解封签名数字信封模式,必须当可选字段1为P时才可选
</pSignFlag>
<signCertificateLen len="4" :value="signCertificateLen()" if="'P' == $packet.data.pSignFlag" cn="签名证书内容长度">
根据证书模式,需要输入内容项的长度n,只针对可选字段2为P时存在
</signCertificateLen>
<signCertificateDn :if="hasSign()" cn="签名证书DN">
X509证书的subject可选项,只针对“证书模式”为1时有,只针对可选字段2为P时存在
</signCertificateDn>
<certificateModel len="1" cn="证书模式"> <certificateModel len="1" cn="证书模式">
<options> <options>
<option cn="证书序号"> <option cn="证书序号">
@@ -48,16 +36,14 @@
可选项,只针对“证书模式”为 1时有。 可选项,只针对“证书模式”为 1时有。
</certificateDn> </certificateDn>
<keyLen len="4" :value="keyLen()" cn="密钥密文长度"> <keyLen len="4" :value="keyLen()" cn="密钥密文长度">
公钥加密的密钥密文长度 公钥加密的密钥密文长度
</keyLen> </keyLen>
<key :len="getKeyLen()" cn="密钥密文"> <key :len="getKeyLen()" cn="密钥密文">
公钥加密的密钥密文的 BASE64 编码 公钥加密的密钥密文的 BASE64 编码
</key> </key>
<keyType len="1" cn="加密密钥方案"> <keyType len="1" cn="加密密钥方案">
LMK 下加密密钥的方案。 LMK 下加密密钥的方案。
</keyType> </keyType>
@@ -71,8 +57,6 @@
<tail maxLen="32" required="false" cn="尾部"> <tail maxLen="32" required="false" cn="尾部">
可选项。最大长度为 32个字符。 可选项。最大长度为 32个字符。
</tail> </tail>
</data> </data>
</req> </req>
@@ -142,7 +126,7 @@
对称密钥的密文,由 LMK30-31 保护。 对称密钥的密文,由 LMK30-31 保护。
</lmk> </lmk>
<keyCheck len="32" cn="密钥校验值"> <keyCheck len="16" cn="密钥校验值">
密钥校验值 密钥校验值
</keyCheck> </keyCheck>
@@ -171,30 +155,15 @@
function certificateLen(){ function certificateLen(){
var data = $packet.data; var data = $packet.data;
if( 0 == data.certificateModel$option ){ if( 0 == data.certificateModel$option ){
return data.certificateSn.length return data.certificateSn.length()
} }
if( 1 == data.certificateModel$option ){ if( 1 == data.certificateModel$option ){
return data.certificateDn.length return data.certificateDn.length()
} }
} }
function signCertificateLen(){
var data = $packet.data;
return data.signCertificateDn.length
}
<![CDATA[
function hasSign() {
if(1 == $packet.data.certificateModel$option && 'P' == $packet.data.pSignFlag) {
return true;
}
return false;
}
]]>
function keyLen() { function keyLen() {
return $packet.data.key.length; return $packet.data.key.length()
} }
@@ -206,17 +175,17 @@
if( Arrays.equals("L".getBytes(), if( Arrays.equals("L".getBytes(),
$final.getSection('data').getSection('lmkHead').getValue() $final.getSection('data').getSection('lmkHead').getValue()
) ){ ) ){
return 64; return 64
}else{ }else{
return 32; return 32
} }
} }
function orgCodeLen() { function orgCodeLen() {
return Util.a2i( $final.getSection('data').getSection('orgCodeLen') ); return Util.a2i( $final.getSection('data').getSection('orgCodeLen') )
} }
function oDataLen() { function oDataLen() {
return Util.a2i( $final.getSection('data').getSection('oDataLen') ); return Util.a2i( $final.getSection('data').getSection('oDataLen') )
} }
</script> </script>
</packet> </packet>
-191
View File
@@ -1,191 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<packet extend="base">
<req>
<command>
<hex>6B</hex>
</command>
<data extend="data">
<pFlag len="1" required="false" cn="P标志">
可选,如果输入P代表使用PKCS7_SM2_SM4_ECB模式解密数字信封
</pFlag>
<certificateModel len="1" cn="证书模式">
<options>
<option cn="证书序号">
<hex>0</hex>
</option>
<option cn="证书 DN">
<hex>1</hex>
</option>
</options>
</certificateModel>
<certificateLen len="4" :value="certificateLen()" cn="证书内容长度">
根据证书模式,需要输入内容项的长度 n
</certificateLen>
<certificateSn :len="strlen()" :if="0 == $packet.data.certificateModel$option" cn="X509 证书序号">
可选项,只针对“证书模式”为 0时有。
</certificateSn>
<certificateDn :if="1 == $packet.data.certificateModel$option" cn="X509 证书的 subject">
可选项,只针对“证书模式”为 1时有。
</certificateDn>
<keyLen len="4" :value="keyLen()" cn="密钥密文长度">
公钥加密的密钥密文长度
</keyLen>
<key :len="getKeyLen()" cn="密钥密文">
公钥加密的密钥密文的 BASE64 编码
</key>
<keyType len="1" cn="加密密钥方案">
LMK 下加密密钥的方案。
</keyType>
<tailSep len="1" :if=" null != $packet.data.tail " cn="尾分隔">
可选项。如果显示消息尾域,则该域必须显示。值为
“X’19”。
<hex>19</hex>
</tailSep>
<tail maxLen="32" required="false" cn="尾部">
可选项。最大长度为 32个字符。
</tail>
</data>
</req>
<res>
<command>
<hex>6C</hex>
</command>
<data>
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
<options>
<option cn="无错误">
<hex>00</hex>
</option>
<option cn="公钥不符合编码规则">
<hex>04</hex>
</option>
<option cn="无效的加密标识">
<hex>06</hex>
</option>
<option cn="无效的附加模式标识">
<hex>07</hex>
</option>
<option cn="密钥奇偶校验错误">
<hex>10</hex>
</option>
<option cn="LMK 错误">
LMK 错误;报告给管理员。
<hex>13</hex>
</option>
<option cn="输入数据错">
<hex>15</hex>
</option>
<option cn="输入的数据格式错误">
<hex>21</hex>
</option>
<option cn="DSP 错误">
DSP 错误;报告给管理员。
<hex>47</hex>
</option>
<option cn="密钥块长度错误">
<hex>76</hex>
</option>
<option cn="输入数据长度错误">
<hex>80</hex>
</option>
</options>
</error>
<oDataLen len="4" cn="明文数据长度">
明文原始数据长度(只针对P存在时,无P时为0)
</oDataLen>
<oData :len="oDataLen()" cn="明文数据">
原始数据(只针对P存在时,无P时不存在)
</oData>
<!--<keyLen len="4" cn="密钥密文长度">-->
<!--公钥加密的密钥密文长度-->
<!--</keyLen>-->
<lmkHead len="1" cn="lmk 头">
如果是 'L' ,lmk 32 个字节长,否则 lmk 64 个字节长。
</lmkHead>
<lmk :len="lmkLen()" cn="对称密钥的密文">
对称密钥的密文,由 LMK30-31 保护。
</lmk>
<keyCheck len="16" cn="密钥校验值">
密钥校验值
</keyCheck>
<orgCodeLen len="4" cn="机构码长度">
公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在
</orgCodeLen>
<orgCode :len="orgCodeLen()" cn="机构码长度">
公钥加密的密钥格式3所需机构码长度,仅当格式3以及'P'存在时存在
</orgCode>
<tailSep len="1" required="false" cn="尾分隔">
可选项。如果显示消息尾域,则该域必须显示。值为 “X’19”。
<hex>19</hex>
</tailSep>
<tail maxLen="32" required="false" cn="尾部">
可选项。最大长度为 32个字符。
</tail>
</data>
</res>
<script>
function certificateLen(){
var data = $packet.data;
if( 0 == data.certificateModel$option ){
return data.certificateSn.length
}
if( 1 == data.certificateModel$option ){
return data.certificateDn.length
}
}
function keyLen() {
return $packet.data.key.length
}
function getKeyLen() {
return Util.a2i( $final.getSection('data').getSection('keyLen') )
}
function lmkLen() {
if( Arrays.equals("L".getBytes(),
$final.getSection('data').getSection('lmkHead').getValue()
) ){
return 64
}else{
return 32
}
}
function orgCodeLen() {
return Util.a2i( $final.getSection('data').getSection('orgCodeLen') )
}
function oDataLen() {
return Util.a2i( $final.getSection('data').getSection('oDataLen') )
}
</script>
</packet>
-3
View File
@@ -6,9 +6,6 @@
<hex>72</hex> <hex>72</hex>
</command> </command>
<data extend="data"> <data extend="data">
<pFlag len="1" required="false" cn="RSA标志符">
可选,存在,则固定值为‘R’
</pFlag>
<publicKeyLength len="4" :value="publicKeyLen()" cn="公钥长度"> <publicKeyLength len="4" :value="publicKeyLen()" cn="公钥长度">
公钥长度 公钥长度
+1 -12
View File
@@ -75,7 +75,7 @@
</error> </error>
<hash :len="hashLen()" :if="0 == $packet.data.packSn$option || 3 == $packet.data.packSn$option" cn="hash"></hash> <hash len="32" :if="0 == $packet.data.packSn$option || 3 == $packet.data.packSn$option" cn="hash"></hash>
<filterDataLen len="4" :value="filterDataLength()" :if="2 == $packet.data.packSn$option || 1 == $packet.data.packSn$option" cn="过渡数据长度"> <filterDataLen len="4" :value="filterDataLength()" :if="2 == $packet.data.packSn$option || 1 == $packet.data.packSn$option" cn="过渡数据长度">
只对“消息块号”为 2、1 时有效 只对“消息块号”为 2、1 时有效
@@ -108,17 +108,6 @@ function filterDataLength(){
var data = $packet.data; var data = $packet.data;
return data.filterData.length; return data.filterData.length;
} }
function hashLen(){
if (0 == $packet.data.hashType$option){
return 20;
}
if (1== $packet.data.hashType$option){
return 32;
}
if (2 == $packet.data.hashType$option){
return 16;
}
}
function getFilterDataLen() { function getFilterDataLen() {
return Util.a2i( $final.getSection('data').getSection('filterDataLen') ) return Util.a2i( $final.getSection('data').getSection('filterDataLen') )
+2 -22
View File
@@ -6,10 +6,6 @@
<bin>8003</bin> <bin>8003</bin>
</command> </command>
<data extend="data"> <data extend="data">
<algFlag len="1" :value="algFlag()" cn="算法标记">
</algFlag>
<signatureDataType len="1" cn="获取公私钥标记位"> <signatureDataType len="1" cn="获取公私钥标记位">
<options> <options>
<option cn="索引方式"> <option cn="索引方式">
@@ -25,17 +21,11 @@
若上面的标志为1,则此域为证书DN,若为0,则此域为两个字节的证书索引; 若上面的标志为1,则此域为证书DN,若为0,则此域为两个字节的证书索引;
</DN> </DN>
<hashFlag len="1" :if="null != $packet.data.hash" :value="flag()" cn="外部 hash 标记"> <dataLength len="2" :value="dataLen()" cn="待签名数据长度">
</hashFlag>
<hash len="32" :if="null != $packet.data.hash" cn="外部 hash">
</hash>
<dataLength len="2" :value="dataLen()" :if="null == $packet.data.hash" cn="待签名数据长度">
待签名数据长度 待签名数据长度
</dataLength> </dataLength>
<signData cn="待签名数据" :if="null == $packet.data.hash"> <signData cn="待签名数据">
待签名数据 待签名数据
</signData> </signData>
@@ -122,16 +112,6 @@
</res> </res>
<script type="javascript"><![CDATA[ <script type="javascript"><![CDATA[
function algFlag(){
if( 'P' == $packet.data.rFlag ) {
return ''
} else {
$packet.data.rFlag
}
}
function flag(){
return $packet.data.rFlag;
}
function dataLen(){ function dataLen(){
def len = $packet.data.signData.length def len = $packet.data.signData.length
def ret = new byte[2] def ret = new byte[2]
+2 -22
View File
@@ -6,10 +6,6 @@
<bin>8004</bin> <bin>8004</bin>
</command> </command>
<data extend="data"> <data extend="data">
<algFlag len="1" :value="algFlag()" cn="算法标记">
</algFlag>
<signatureDataType len="1" cn="获取公私钥标记位"> <signatureDataType len="1" cn="获取公私钥标记位">
<options> <options>
<option cn="索引方式"> <option cn="索引方式">
@@ -36,17 +32,12 @@
标志为2 时存在 标志为2 时存在
</organizationNum> </organizationNum>
<hashFlag len="1" :if="null != $packet.data.hash" :value="flag()" cn="外部 hash 标记">
</hashFlag>
<hash len="32" :if="null != $packet.data.hash" cn="外部 hash"> <dataLength len="2" :value="dataLen()" cn="待签名数据长度">
</hash>
<dataLength len="2" :if="null == $packet.data.hash" :value="dataLen()" cn="待签名数据长度">
待签名数据长度 待签名数据长度
</dataLength> </dataLength>
<odata cn="待签名数据" :if="null == $packet.data.hash"> <odata cn="待签名数据">
待签名数据 待签名数据
</odata> </odata>
@@ -135,17 +126,6 @@
</res> </res>
<script><![CDATA[ <script><![CDATA[
function algFlag(){
if( 'P' == $packet.data.rFlag ) {
return ''
} else {
$packet.data.rFlag
}
}
function flag(){
return $packet.data.rFlag;
}
function dataLen(){ function dataLen(){
def len = $packet.data.odata.length def len = $packet.data.odata.length
def ret = new byte[2] def ret = new byte[2]
+3 -6
View File
@@ -6,9 +6,6 @@
<bin>8005</bin> <bin>8005</bin>
</command> </command>
<data extend="data"> <data extend="data">
<rFlag len="1" required="false" cn="RSA算法标志">
可选,存在,则固定值为‘P’
</rFlag>
<DN len="256" cn="证书 DN"> <DN len="256" cn="证书 DN">
X509证书序号 X509证书序号
@@ -16,13 +13,13 @@
<hashFlag cn="是否为 hash 模式" len="1" required="false"></hashFlag> <hashFlag cn="是否为 hash 模式" len="1" required="false"></hashFlag>
<hash cn="hash 值" :if="null != $packet.data.hashFlag"></hash> <hash cn="hash 值" :if="'P' == $packet.data.hashFlag"></hash>
<dataLen :if="null == $packet.data.hashFlag" len="2" format="X" :value="dataLength()" cn="数据长度"> <dataLen :if="'P' != $packet.data.hashFlag" len="2" format="X" :value="dataLength()" cn="数据长度">
数据长度 数据长度
</dataLen> </dataLen>
<infoData :if="null == $packet.data.hashFlag" cn="数据"> <infoData :if="'P' != $packet.data.hashFlag" cn="数据">
数据 数据
</infoData> </infoData>
+4 -6
View File
@@ -6,18 +6,16 @@
<bin>8006</bin> <bin>8006</bin>
</command> </command>
<data extend="data"> <data extend="data">
<rFlag len="1" required="false" cn="RSA算法标志">
可选,存在,则固定值为‘P’
</rFlag>
<hashFlag cn="是否为 hash 模式" len="1" required="false"></hashFlag> <hashFlag cn="是否为 hash 模式" len="1" required="false"></hashFlag>
<hash cn="hash 值" :if="null != $packet.data.hashFlag"></hash> <hash cn="hash 值" :if="'P' == $packet.data.hashFlag"></hash>
<originLen :if=" null == $packet.data.hashFlag" len="2" :value="orginLength()" cn="待签名数据长度"> <originLen :if="'P' != $packet.data.hashFlag" len="2" :value="orginLength()" cn="待签名数据长度">
待签名数据长度 待签名数据长度
</originLen> </originLen>
<originData :if="null == $packet.data.hashFlag" cn="待签名数据"> <originData :if="'P' != $packet.data.hashFlag" cn="待签名数据">
待签名数据 待签名数据
</originData> </originData>
+16 -4
View File
@@ -7,9 +7,18 @@
</command> </command>
<data extend="data"> <data extend="data">
<dataFlag len="4" cn="数据包标志"> <dataFlag len="1" cn="数据包标志">
0:起始包 <options>
其他:传入上一个包返回的数据标志 <option cn="起始包">
<bin>00</bin>
</option>
<option cn="中间包">
<bin>01</bin>
</option>
<option cn="结束包">
<bin>02</bin>
</option>
</options>
</dataFlag> </dataFlag>
<sqlite3 cn="Sqlite3 查询条件"> <sqlite3 cn="Sqlite3 查询条件">
@@ -66,7 +75,10 @@
</error> </error>
<dataFlag len="4" cn="数据包标志"> <dataFlag len="4" cn="数据包标志">
已返回证书个数 0:起始包
1:中间包
2:结束包
(可能hi因为字节对此,后三字节为垃圾值)
</dataFlag> </dataFlag>
<certAllNum len="4" cn="证书总数"> <certAllNum len="4" cn="证书总数">
-64
View File
@@ -1,64 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<packet extend="base">
<req>
<command>
<bin>8011</bin>
</command>
<data extend="data">
<certDn cn="证书dn">
</certDn>
</data>
</req>
<res>
<command>
<bin>8012</bin>
</command>
<data>
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
<options>
<option cn="无错误">
<hex>00</hex>
</option>
<option cn="公钥不符合编码规则">
<hex>04</hex>
</option>
<option cn="无效的加密标识">
<hex>06</hex>
</option>
<option cn="无效的附加模式标识">
<hex>07</hex>
</option>
<option cn="密钥奇偶校验错误">
<hex>10</hex>
</option>
<option cn="LMK 错误">
LMK 错误;报告给管理员。
<hex>13</hex>
</option>
<option cn="输入数据错">
<hex>15</hex>
</option>
<option cn="DSP 错误">
DSP 错误;报告给管理员。
<hex>47</hex>
</option>
<option cn="私钥错误">
私钥错误;报告给管理员。
<hex>49</hex>
</option>
<option cn="密钥块长度错误">
<hex>76</hex>
</option>
<option cn="输入数据长度错误">
<hex>80</hex>
</option>
</options>
</error>
</data>
</res>
<script> </script>
</packet>
-3
View File
@@ -5,9 +5,6 @@
<bin>8018</bin> <bin>8018</bin>
</command> </command>
<data extend="data"> <data extend="data">
<rFlag len="1" required="false" cn="RSA标志">
可选,存在,则固定值为‘P’
</rFlag>
<DN len="256" cn="证书 DN"> <DN len="256" cn="证书 DN">
X509证书序号 X509证书序号
-66
View File
@@ -1,66 +0,0 @@
<?xml version="1.0" encoding="UTF-8" ?>
<packet extend="base">
<req>
<command>
<hex>GN</hex>
</command>
<data extend="data">
<Esign len="1" cn="E值">
<text>1</text>
</Esign>
<keyLen len="4" cn="密钥长度">
<text>2048</text>
</keyLen>
<sk len="27" cn="私钥索引"></sk>
<startTime len="8" cn="启用时间"></startTime>
<endTime len="8" cn="到期时间"></endTime>
</data>
</req>
<res>
<command>
<hex>QO</hex>
</command>
<data>
<error len="2" cn="错误码" format="X" :catch="catchError('%s')">
<options>
<option cn="无错误">
<hex>00</hex>
</option>
<option cn="无效的哈希标识">
<hex>05</hex>
</option>
<option cn="输入数据错">
<hex>15</hex>
</option>
<option cn="DSP 错误">
DSP 错误;报告给管理员。
<hex>47</hex>
</option>
<option cn="输入数据长度错误">
<hex>80</hex>
</option>
</options>
</error>
<pk len="270" cn="公钥"></pk>
<sk len="2824" cn="私钥"></sk>
</data>
</res>
<script> </script>
</packet>
+1
View File
@@ -0,0 +1 @@
~$*
Binary file not shown.
Binary file not shown.
+21 -38
View File
@@ -1,16 +1,16 @@
{ {
"vars": { "vars": {
"version": "%project.git_branch_version%", "version": "%project.git_branch_version%",
"out_path": "./pack" "out_path": "./pack",
"target_f1": "./target/sydapi4j-jar-with-dependencies.jar",
"target_t1": "%out_path%/sydapi4j-jar-with-dependencies.jar",
"target_f2": "./target/sydapi4j.jar",
"target_t2": "%out_path%/sydapi4j.jar"
}, },
"clear": [ "clear": [
{ {
"func": "rm", "func": "rmdir",
"path": "%out_path%" "path": "%out_path%"
},
{
"func": "rm",
"path": "./logs"
} }
], ],
"init": [ "init": [
@@ -31,13 +31,17 @@
"path": "%out_path%/doc" "path": "%out_path%/doc"
} }
], ],
"dependencies": [{
"func" : "pom",
"xml" : "%out_path%/jar"
}, {
"shell" : "mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=%out_path%/jar/dependences",
"check": "BUILD SUCCESS"
}],
"gen" : [{ "gen" : [{
"cmd" : "dproto" "shell" : "dproto"
}], }],
"build": [ "build": [
{
"cmd": "clear"
},
{ {
"cmd" : "init" "cmd" : "init"
}, },
@@ -47,43 +51,22 @@
}, },
{ {
"func": "cp", "func": "cp",
"from": "./target/sydapi4j.jar", "from": "%target_f1%",
"to": "%out_path%/jar/sydapi4j.jar" "to": "%target_t1%"
}, },
{ {
"func": "cp", "func": "cp",
"from": "./target/sydapi4j-jar-with-dependencies.jar", "from": "%target_f2%",
"to": "%out_path%/jar/sydapi4j-jar-with-dependencies.jar" "to": "%target_t2%"
},
{
"shell" : "mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=%out_path%/jar/dependences",
"check": "BUILD SUCCESS"
},
{
"func": "cp",
"from": "./doc",
"to": "%out_path%/doc"
},
{
"func": "cp",
"from": "./src/test/java/sample",
"to": "%out_path%/sample"
},
{
"func": "cp",
"from": "./˵Ã÷.txt",
"to": "%out_path%/˵Ã÷.txt"
}, },
{ {
"func": "zip", "func": "zip",
"from": "%out_path%/*", "from": "%out_path%",
"to": "%out_path%/sydapi-%version%.%project.git_commit_hash%.zip", "to": "%out_path%/sydapi-%version%.zip"
"vc" : "10M"
}, },
{ {
"func": "open", "func": "open",
"path": "%out_path%/" "path": "%out_path%"
} }
] ]
+114 -102
View File
@@ -4,7 +4,7 @@
<groupId>com.sunyard</groupId> <groupId>com.sunyard</groupId>
<artifactId>sydapi4j</artifactId> <artifactId>sydapi4j</artifactId>
<version>1.13.20220909-1</version> <version>1.15.20250701</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<name>sydapi4j</name> <name>sydapi4j</name>
@@ -26,19 +26,79 @@
<version>4.12</version> <version>4.12</version>
<scope>test</scope> <scope>test</scope>
</dependency> </dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-api</artifactId>
<version>2.17.0</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.17.0</version>
</dependency>
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/org.apache.commons/commons-pool2 &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>org.apache.commons</groupId>-->
<!-- <artifactId>commons-pool2</artifactId>-->
<!-- <version>2.11.1</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-test</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- <scope>test</scope>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/dom4j/dom4j &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>dom4j</groupId>-->
<!-- <artifactId>dom4j</artifactId>-->
<!-- <version>1.6.1</version>-->
<!-- </dependency>-->
<!-- &lt;!&ndash; https://mvnrepository.com/artifact/com.alibaba/fastjson &ndash;&gt;-->
<!-- <dependency>-->
<!-- <groupId>com.alibaba</groupId>-->
<!-- <artifactId>fastjson</artifactId>-->
<!-- <version>1.2.80</version>-->
<!-- </dependency>-->
<!-- <dependency>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-stdlib-jdk8</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- </dependency>-->
<!--<dependency>-->
<!--<groupId>com.sunyard</groupId>-->
<!--<artifactId>Converter</artifactId>-->
<!--<version>[1.0.201807251700, 1.1-SNAPSHOT)</version>-->
<!--</dependency>-->
<dependency> <dependency>
<groupId>com.sunyard</groupId> <groupId>com.sunyard</groupId>
<artifactId>proto</artifactId> <artifactId>proto</artifactId>
<version>1.0.20221215</version> <version>1.0-20220905</version>
</dependency> </dependency>
<dependency> <dependency>
<groupId>org.apache.jmeter</groupId> <groupId>org.codehaus.groovy</groupId>
<artifactId>ApacheJMeter_java</artifactId> <artifactId>groovy</artifactId>
<version>5.4.3</version> <version>2.4.15</version>
<scope>provided</scope>
</dependency> </dependency>
<!--<dependency>-->
<!--<groupId>club.fullstack</groupId>-->
<!--<artifactId>serialize</artifactId>-->
<!--<version>[1.0.201806051035, 1.1.SNAPSHOT)</version>-->
<!--</dependency>-->
<!-- https://mvnrepository.com/artifact/com.github.wvengen/proguard-maven-plugin -->
<!-- https://mvnrepository.com/artifact/com.github.wvengen/proguard-maven-plugin -->
</dependencies> </dependencies>
<build> <build>
<finalName>sydapi4j</finalName> <finalName>sydapi4j</finalName>
@@ -92,73 +152,57 @@
</dependencies> </dependencies>
</plugin> </plugin>
<plugin> <!-- <plugin>-->
<groupId>org.apache.maven.plugins</groupId> <!-- <groupId>org.apache.maven.plugins</groupId>-->
<artifactId>maven-javadoc-plugin</artifactId> <!-- <artifactId>maven-javadoc-plugin</artifactId>-->
<version>3.1.1</version> <!-- <version>3.1.1</version>-->
<configuration> <!-- <configuration>-->
<reportOutputDirectory>./public/</reportOutputDirectory> <!-- <reportOutputDirectory>./public/</reportOutputDirectory>-->
<destDir>html</destDir> <!-- <destDir>html</destDir>-->
<additionalOptions>html5</additionalOptions> <!-- <additionalOptions>html5</additionalOptions>-->
<excludePackageNames>com.sunyard.SydApi:com.sunyard.inf.*:com.sunyard.cert.*</excludePackageNames> <!-- <excludePackageNames>com.sunyard.SydApi:com.sunyard.inf.*:com.sunyard.cert.*</excludePackageNames>-->
</configuration> <!-- </configuration>-->
</plugin> <!-- </plugin>-->
<plugin> <!-- <plugin>-->
<groupId>org.apache.maven.plugins</groupId> <!-- <groupId>org.apache.maven.plugins</groupId>-->
<artifactId>maven-source-plugin</artifactId> <!-- <artifactId>maven-source-plugin</artifactId>-->
<version>2.4</version> <!-- <version>2.4</version>-->
<!-- 进行package命令时就可以将源码同时进行打包 --> <!-- &lt;!&ndash; 进行package命令时就可以将源码同时进行打包 &ndash;&gt;-->
<!-- 所以我们需要绑定source插件到我们default生命周期的package阶段 --> <!-- &lt;!&ndash; 所以我们需要绑定source插件到我们default生命周期的package阶段 &ndash;&gt;-->
<executions> <!-- <executions>-->
<execution> <!-- <execution>-->
<!-- 定义一个阶段,这个阶段是package --> <!-- &lt;!&ndash; 定义一个阶段,这个阶段是package &ndash;&gt;-->
<phase>package</phase> <!-- <phase>package</phase>-->
<goals> <!-- <goals>-->
<goal>jar-no-fork</goal> <!-- <goal>jar-no-fork</goal>-->
</goals> <!-- </goals>-->
</execution> <!-- </execution>-->
</executions> <!-- </executions>-->
</plugin> <!-- </plugin>-->
<!-- <plugin>-->
<!-- <groupId>org.apache.maven.plugins</groupId>-->
<plugin> <!-- <artifactId>maven-dependency-plugin</artifactId>-->
<groupId>org.apache.maven.plugins</groupId> <!-- <configuration>-->
<artifactId>maven-jar-plugin</artifactId> <!-- <includeScope>runtime</includeScope>-->
<configuration> <!-- </configuration>-->
<archive> <!-- <executions>-->
<manifest> <!-- <execution>-->
<addClasspath>true</addClasspath> <!-- <id>copy</id>-->
<classpathPrefix>lib/</classpathPrefix> <!-- <phase>package</phase>-->
<mainClass>com.xxx.uploadFile</mainClass> <!-- <goals>-->
</manifest> <!-- <goal>copy-dependencies</goal>-->
</archive> <!-- </goals>-->
</configuration> <!-- <configuration>-->
</plugin> <!-- <outputDirectory>-->
<!-- ${project.build.directory}/lib-->
<plugin> <!-- </outputDirectory>-->
<groupId>org.apache.maven.plugins</groupId> <!-- </configuration>-->
<artifactId>maven-dependency-plugin</artifactId> <!-- </execution>-->
<configuration> <!-- </executions>-->
<includeScope>runtime</includeScope> <!-- </plugin>-->
</configuration>
<executions>
<execution>
<id>copy</id>
<phase>package</phase>
<goals>
<goal>copy-dependencies</goal>
</goals>
<configuration>
<outputDirectory>
${project.build.directory}/lib
</outputDirectory>
</configuration>
</execution>
</executions>
</plugin>
<plugin> <plugin>
@@ -182,38 +226,6 @@
</execution> </execution>
</executions> </executions>
</plugin> </plugin>
<!-- <plugin>-->
<!-- <groupId>org.jetbrains.kotlin</groupId>-->
<!-- <artifactId>kotlin-maven-plugin</artifactId>-->
<!-- <version>${kotlin.version}</version>-->
<!-- <executions>-->
<!-- <execution>-->
<!-- <id>compile</id>-->
<!-- <phase>compile</phase>-->
<!-- <goals>-->
<!-- <goal>compile</goal>-->
<!-- </goals>-->
<!-- <configuration>-->
<!-- <sourceDirs>-->
<!-- <source>src/main/java</source>-->
<!-- </sourceDirs>-->
<!-- </configuration>-->
<!-- </execution>-->
<!-- <execution>-->
<!-- <id>test-compile</id>-->
<!-- <phase>test-compile</phase>-->
<!-- <goals>-->
<!-- <goal>test-compile</goal>-->
<!-- </goals>-->
<!-- </execution>-->
<!-- </executions>-->
<!-- <configuration>-->
<!-- <jvmTarget>1.6</jvmTarget>-->
<!-- </configuration>-->
<!-- </plugin>-->
</plugins> </plugins>
<!-- 主资源目录 --> <!-- 主资源目录 -->
<resources> <resources>
+31
View File
@@ -0,0 +1,31 @@
// console.log('\x1B[36m%s\x1B[0m', info); //cyan
// console.log('\x1B[33m%s\x1b[0m:', path); //yellow
var styles = {
'bold' : ['\x1B[1m', '\x1B[22m'],
'italic' : ['\x1B[3m', '\x1B[23m'],
'underline' : ['\x1B[4m', '\x1B[24m'],
'inverse' : ['\x1B[7m', '\x1B[27m'],
'strikethrough' : ['\x1B[9m', '\x1B[29m'],
'white' : ['\x1B[37m', '\x1B[39m'],
'grey' : ['\x1B[90m', '\x1B[39m'],
'black' : ['\x1B[30m', '\x1B[39m'],
'blue' : ['\x1B[34m', '\x1B[39m'],
'cyan' : ['\x1B[36m', '\x1B[39m'],
'green' : ['\x1B[32m', '\x1B[39m'],
'magenta' : ['\x1B[35m', '\x1B[39m'],
'red' : ['\x1B[31m', '\x1B[39m'],
'yellow' : ['\x1B[33m', '\x1B[39m'],
'whiteBG' : ['\x1B[47m', '\x1B[49m'],
'greyBG' : ['\x1B[49;5;8m', '\x1B[49m'],
'blackBG' : ['\x1B[40m', '\x1B[49m'],
'blueBG' : ['\x1B[44m', '\x1B[49m'],
'cyanBG' : ['\x1B[46m', '\x1B[49m'],
'greenBG' : ['\x1B[42m', '\x1B[49m'],
'magentaBG' : ['\x1B[45m', '\x1B[49m'],
'redBG' : ['\x1B[41m', '\x1B[49m'],
'yellowBG' : ['\x1B[43m', '\x1B[49m']
};
module.exports = styles
+269
View File
@@ -0,0 +1,269 @@
const l = require("./log")
const os = require("os");
const fs = require('fs');
const path = require('path');
const util = require('util');
const { exec } = require('child_process')
function sync( cmds , options = {}){
if ( options.detached ) {
throw "sync 不支持 detached"
}
options = Object.assign({
// cwd : os.tmpdir(),
encoding: 'buffer'
}, options)
// 支持多命令
let cmd = cmds
// win 乱码问题
let encode = "win32" === os.platform() ? 'cp936' : "utf-8"
return new Promise(function (resolve, reject) {
let process = exec( cmd , options , function (e, stdout, stderr) {
// console.log( e,
// iconv.decode( stdout, 'cp936'),
// iconv.decode( stderr, 'cp936')
// )
if ( e ) {
reject( e )
} else {
resolve( stdout.toString() , stderr.toString() )
// resolve({
// pid : process.pid,
// exitCode : process.exitCode,
// stdout : stdout.toString(),
// stderr : stderr.toString()
// })
}
})
console.log( "process", process.pid )
})
}
var version = ""
const project_path = path.join(__dirname, "../")
const out_path = path.join(project_path, "public")
// 用户文档
const man = "说明.txt"
function prepareDir(){
return new Promise(function (cbok, cberr) {
if ( fs.existsSync( out_path ) ){
l.i("存在旧文件,清空旧文件")
}
sync("rd /s/q .\\public").catch(function (reason) {
// pass
}).finally(function () {
l.i("创建新文件")
fs.mkdirSync( out_path )
fs.mkdirSync( path.join( out_path, "jar" ))
fs.mkdirSync( path.join( out_path, "jar", "dependences"))
// fs.mkdirSync( path.join( out_path, "doc" ))
// fs.mkdirSync( path.join( out_path, "html" ))
// fs.mkdirSync( path.join( out_path, "sample" ))
l.i("目录准备完成")
cbok()
})
})
}
function mvn(){
l.i("调用 maven 打包,可能需要好几分钟。")
return new Promise(function (cbok, cberr) {
sync('mvn package -DskipTests').then(function (value, error) {
if ( error ) {
throw error
}
l.d( value )
if ( value.indexOf("BUILD SUCCESS") < 0 ){
throw new Error("请检查 maven package 命令")
}
// 移动文件到发布目录
fs.renameSync(path.join(project_path, "target", "sydapi4j-jar-with-dependencies.jar")
, path.join(out_path, "jar", "sydapi4j-jar-with-dependencies.jar"))
fs.renameSync(path.join(project_path, "target", "sydapi4j.jar")
, path.join(out_path, "jar", "sydapi4j.jar"))
cbok()
})
})
}
function doc(){
return sync('mvn javadoc:javadoc').then(function (value, error) {
l.d( value )
// if ( value.indexOf("BUILD SUCCESS") < 0 ){
// throw new Error("请检查 maven doc 命令")
// }
}).catch(function (reason) {
l.d("忽略文档生成错误")
})
}
function zipjar(){
return sync("7z a .\\public\\sydapi-"+ version +".zip .\\public\\jar\\").then(function (value, error) {
l.d( value )
if ( value.indexOf("Everything is Ok") < 0 ){
throw new Error("请检查 7z 命令")
}
})
}
function zipsample(){
return sync("7z a .\\public\\sydapi-"+ version +".zip .\\src\\test\\java\\com\\sunyard\\sydapi\\sample").then(function (value, error) {
l.d( value )
if ( value.indexOf("Everything is Ok") < 0 ){
throw new Error("请检查 7z 命令")
}
})
}
function zipdoc(){
return sync("7z a .\\public\\sydapi-"+ version +".zip " + man).then(function (value, error) {
l.d( value )
if ( value.indexOf("Everything is Ok") < 0 ){
throw new Error("请检查 7z 命令")
}
})
}
function dependencies(){
return sync('mvn dependency:copy-dependencies -DincludeScope=runtime -DoutputDirectory=./public/jar/dependences').then(function (value, error) {
l.d( value )
if ( value.indexOf("BUILD SUCCESS") < 0 ){
throw new Error("请检查 maven dependencies 命令")
}
})
}
async function main() {
l.i("项目目录 : " + project_path )
sync('git status').then(function (value, error) {
l.d( value )
if ( value.indexOf("Command failed") > 0 ){
throw new Error("请检查 git 命令")
}
if ( value.indexOf("Changes not staged for commit") > 0){
throw new Error("项目有文件未保存")
}
if ( value.indexOf("Changes to be committed") > 0 ){
throw new Error("项目有文件未提交")
}
// 匹配分支,获取前两位版本
var r = /^On branch dev-(?<version>\S+)$/gm.exec(value)
l.i( r.groups.version )
version = r.groups.version
return sync('git log -1')
}).then(function (value) {
l.d( value )
var r = /^commit\s(?<id>\S+)$/gm.exec(value)
l.i( r.groups.id )
// 缩短 HASH
var short = r.groups.id.substr(0, 6)
version += "." + short
l.i("目前版本: " + version )
return prepareDir()
}).then(function (value) {
return mvn()
}).then(function (value) {
return dependencies()
}).then(function (value) {
var pom = fs.readFileSync("pom.xml", { encoding : "UTF-8" })
var head = pom.indexOf("<dependencies>")
var tail = pom.indexOf("</dependencies>") + 15
var dependencies = pom.substring( head, tail )
fs.writeFileSync( path.join( out_path, "jar", "dependences.xml") , dependencies )
}).then(function (value) {
return zipjar()
}).then(function (value) {
return zipsample()
}).then(function (value) {
return zipdoc()
}).then(function () {
l.i("打包完成!")
sync('cd .\\public && start .')
}).catch(function (reason) {
l.e( reason )
})
}
main()
+31
View File
@@ -0,0 +1,31 @@
const style = require("./color")
const info = style.green
const error = style.red
const debug = style.cyan
const l = {
o : console.log,
i : function ( msg ) {
console.log('%s%s%s', info[0], msg , info[1]);
},
d : function ( msg ) {
console.log('%s%s%s', debug[0], msg , debug[1]);
},
e : function ( msg ) {
console.log('%s%s%s', error[0], msg , error[1]);
},
}
l.show = function () {
l.i("info")
l.d("debug")
l.e("error")
}
module.exports = l
+5
View File
@@ -0,0 +1,5 @@
v1.11 版本
- 修正不规范接口 GenerateRandom 返回值更改为 String 类型。老版本为 bool 类型,仅于活性检测。
v1.12 版本
- 新增编押验押接口/人行定制接口。
-141
View File
@@ -1,141 +0,0 @@
package com.Sample;
import com.sunyard.RetWrap;
import com.sunyard.proto.Util;
import com.sunyard.util.Configure;
import java.io.IOException;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class TestDemo {
public static String sign(SydApi4j api, String certDn, String orgData) {
byte[] nakedSign = api.SYD_NakedSignAll(2, orgData.getBytes(), certDn);
System.out.println("签名数据:"+ Util.bytes2HexString(nakedSign));
return Util.bytes2HexString(nakedSign);
}
public static Boolean signVer(SydApi4j api, String certDn, String orgData, String sign) {
boolean nakedVerify = api.SYD_NakedVerifyAll(2, orgData.getBytes(), Util.hexString2Bytes(sign), certDn);
System.out.println("验签结果:"+ nakedVerify);
return nakedVerify;
}
public static String enData(SydApi4j api, String certDn, String orgData) {
RetWrap genSM2 = api.generateDEByDnAll(3, certDn, orgData.getBytes());
byte[] cipherKey = (byte[])genSM2.get("CipherKey");
System.out.println("加密结果:"+ new String(cipherKey));
return new String(cipherKey);
}
public static String deData(SydApi4j api, String certDn, String sign) {
RetWrap denSM2 = api.decryptDEByDNAll(3, certDn, sign.getBytes());
byte[] oData = (byte[])denSM2.get("oData");
System.out.println("解密数据:"+ new String(oData));
return new String(oData);
}
public static String detachSign(SydApi4j api, String certDn, String orgData) {
String sign = api.detachedSignAll(2, orgData.getBytes(), certDn);
System.out.println("detach签名结果:"+ sign);
return sign;
}
public static Boolean detachSignVer(SydApi4j api, String orgData, String sign) {
boolean signVerify = api.detachedVerifyAll(2, orgData.getBytes(), sign);
System.out.println("detach验签:"+ signVerify);
return signVerify;
}
public static String snSign(SydApi4j api, String sn, String orgData) {
String sign = api.SM2SignCustomized(sn,orgData.getBytes());
System.out.println("sn签名结果:"+ sign);
return sign;
}
public static Boolean snSignVer(SydApi4j api, String sn,String orgData, String sign) {
boolean signVerify = api.SM2VerifyCustomized(sn, orgData.getBytes(), sign);
System.out.println("sn验签:"+ signVerify);
return signVerify;
}
public static String sm3hash(SydApi4j api,String pk,String orgData) {
byte[] hash = api.SM3Hash(pk, orgData.getBytes());
System.out.println("hash计算:"+ Util.bytes2HexString(hash));
return Util.bytes2HexString(hash);
}
public static void testAll(SydApi4j api, String certDn, String orgData) {
byte[] nakedSign = api.SYD_NakedSignAll(2, orgData.getBytes(), certDn);
System.out.println("签名数据:"+ Util.bytes2HexString(nakedSign));
boolean nakedVerify = api.SYD_NakedVerifyAll(2, orgData.getBytes(), nakedSign, certDn);
System.out.println("验签结果:"+ nakedVerify);
RetWrap genSM2 = api.generateDEByDnAll(3, certDn, orgData.getBytes());
byte[] cipherKey = (byte[])genSM2.get("CipherKey");
System.out.println("加密结果:"+ new String(cipherKey));
RetWrap denSM2 = api.decryptDEByDNAll(3, certDn, cipherKey);
byte[] oData = (byte[])denSM2.get("oData");
System.out.println("解密数据:"+ new String(oData));
String sign = api.detachedSignAll(2, orgData.getBytes(), certDn);
System.out.println("detach签名结果:"+ sign);
boolean signVerify = api.detachedVerifyAll(2, orgData.getBytes(), sign);
System.out.println("detach验签:"+ signVerify);
}
public static void main(String[] args) throws InterruptedException {
try {
String ip = Configure.getKey("ip");
System.out.println("ip:"+ ip);
int port = Integer.parseInt(Configure.getKey("port"));
System.out.println("port:"+ port);
int timeout = Integer.parseInt(Configure.getKey("timeout"));
System.out.println(""+ timeout);
String certDn = Configure.getKey("certDn");
System.out.println("certDn:"+ certDn);
String signorenData = Configure.getKey("signorenData");
System.out.println("signorenData:"+ signorenData);
String orgData = Configure.getKey("orgData");
System.out.println("orgData:"+ orgData);
int type = Integer.parseInt(Configure.getKey("type"));
System.out.println("type:"+ type);
SydApiBuilder builder = (new SydApiBuilder()).setIp(ip).setPort(port).setTimeout(timeout);
SydApi4j api = (SydApi4j)builder.build();
switch (type) {
case 1:
sign(api, certDn, orgData);
break;
case 2:
signVer(api, certDn, orgData, signorenData);
break;
case 3:
enData(api, certDn, orgData);
break;
case 4:
deData(api, certDn, signorenData);
break;
case 5:
detachSign(api, certDn, orgData);
break;
case 6:
detachSignVer(api, orgData, signorenData);
break;
case 7:
snSign(api, certDn, orgData);
break;
case 8:
snSignVer(api, certDn,orgData, signorenData);
break;
case 9:
sm3hash(api, certDn,orgData);
break;
case 0:
testAll(api, certDn, orgData);
break;
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
}
@@ -1,217 +0,0 @@
package com.jmeter.test;
import com.sunyard.SydApiException;
import com.sunyard.proto.Util;
import org.apache.jmeter.config.Arguments;
import org.apache.jmeter.protocol.java.sampler.AbstractJavaSamplerClient;
import org.apache.jmeter.protocol.java.sampler.JavaSamplerContext;
import org.apache.jmeter.samplers.SampleResult;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.nio.charset.StandardCharsets;
public class Test4Jemter extends AbstractJavaSamplerClient {
private String SM2dn ;
private String RSAdn ;
private String ip ;
private String ip2 ;
private String oData;
private String sign;
private byte[] orgData;
private int type;
private static ThreadLocal<SydApi4j> api;
/**
* 定义默认的参数,在jmeter中会自动显示在这里定义的默认参数
* @return Arguments对象
*/
@Override
public Arguments getDefaultParameters() {
Arguments arguments = new Arguments();
arguments.addArgument("SM2dn", "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1");
arguments.addArgument("RSAdn", "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001");
arguments.addArgument("orgData", "12345678");
arguments.addArgument("ip", "192.168.0.166");
// arguments.addArgument("ip2", "172.16.17.161");
arguments.addArgument("type", "1");
arguments.addArgument("sign", "12345678");
return arguments;
}
/**
* 在执行测试之前执行,只执行一次,可以获取传递过来的参数,一般用来做初始化操作
* @param context 可以获取jmeter传递过来的参数
*/
@Override
public void setupTest(JavaSamplerContext context) {
//对成员变量初始化
SM2dn = context.getParameter("SM2dn");
RSAdn = context.getParameter("RSAdn");
oData = context.getParameter("orgData");
ip = context.getParameter("ip");
// ip2 = context.getParameter("ip2");
type = context.getIntParameter("type");
sign = context.getParameter("sign");
System.setProperty("com.sunyard.dnsort", "false");
api = new ThreadLocal<SydApi4j>() {
public SydApi4j initialValue() {
SydApiBuilder builder = new SydApiBuilder().setIp(ip);
final SydApi4j api = (SydApi4j) builder.build();
return api;
}
};
}
/**
* 真正的测试代码块,jmeter按照配置的逻辑执行该方法
* @param javaSamplerContext 上下文对象,可以获取jmeter传递的参数
* @return SampleResult对象用于封装结果
*/
@Override
public SampleResult runTest(JavaSamplerContext javaSamplerContext) {
SampleResult sr = new SampleResult();
//设置标签
sr.setSampleLabel("testDemo");
//设置开始标志,否则无法统计tps等
sr.sampleStart();
try {
orgData = oData.getBytes(); //SM2裸签
//执行业务逻辑
switch(type){
case 1:
api.get().SYD_NakedSign(SM2dn, orgData, (byte[]) null);
sr.setResponseCodeOK();
//sr.setResponseData(Util.encodeBase64(nakedSign1), StandardCharsets.UTF_8.displayName());
break;
case 2:
api.get().SYD_NakedVerify(SM2dn, Util.decodeBase64(sign), orgData, (byte[])null) ;
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(nakedVerify1), StandardCharsets.UTF_8.displayName());
break;
case 3:
//RSA裸签
api.get().SYD_NakedSign(1, RSAdn,orgData,(byte[])null);
sr.setResponseCodeOK();
//sr.setResponseData(Util.encodeBase64(nakedSign2), StandardCharsets.UTF_8.displayName());
break;
case 4:
api.get().SYD_NakedVerify(1, RSAdn,Util.decodeBase64(sign),orgData ,(byte[])null);
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(nakedVerify2), StandardCharsets.UTF_8.displayName());
break;
case 5:
api.get().detachedSign(1, orgData, SM2dn);
sr.setResponseCodeOK();
//sr.setResponseData(detSign1, StandardCharsets.UTF_8.displayName());
break;
case 6:
api.get().detachedVerify(1, orgData, sign);
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(detV1), StandardCharsets.UTF_8.displayName());
break;
case 7:
api.get().detachedSign(2,1, orgData, RSAdn);
sr.setResponseCodeOK();
//sr.setResponseData(detSign2, StandardCharsets.UTF_8.displayName());
break;
case 8:
api.get().detachedVerify(2,2, orgData, sign);
sr.setResponseCodeOK();
//sr.setResponseData(String.valueOf(detV2), StandardCharsets.UTF_8.displayName());
break;
case 9:
api.get().attachedSignHsm(orgData, SM2dn);
sr.setResponseCodeOK();
//sr.setResponseData(attSign1, StandardCharsets.UTF_8.displayName());
break;
case 10:
api.get().attachedVerify( sign.getBytes());
sr.setResponseCodeOK();
// sr.setResponseData(String.valueOf(attV1), StandardCharsets.UTF_8.displayName());
break;
case 11:
api.get().attachedSignRSAHsm(2, orgData, RSAdn);
sr.setResponseCodeOK();
// sr.setResponseData(attSign2, StandardCharsets.UTF_8.displayName());
break;
case 12:
api.get().attachedVerifyRSA(2, sign);
sr.setResponseCodeOK();
// sr.setResponseData(String.valueOf(attV2), StandardCharsets.UTF_8.displayName());
break;
case 13:
api.get().generateDE(SM2dn.getBytes(), 3, 1, orgData);
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
sr.setResponseCodeOK();
// sr.setResponseData(new String(cipherKey), StandardCharsets.UTF_8.displayName());
break;
case 14:
api.get().decryptDE(true, 1, SM2dn.getBytes(), sign);;
// byte[] oData = (byte[]) denSM2.get("oData");
sr.setResponseCodeOK();
// sr.setResponseData(new String(oData), StandardCharsets.UTF_8.displayName());
break;
case 15:
api.get(). generateDE(RSAdn.getBytes(), 4, 1, orgData);
// byte[] cipherKeyRSA = (byte[]) genRSA.get(SydApi.RET_CIPHER_KEY);
sr.setResponseCodeOK();
//sr.setResponseData(new String(cipherKeyRSA), StandardCharsets.UTF_8.displayName());
break;
case 16:
api.get().decryptDERSA(true, 1, RSAdn.getBytes(), sign);
// byte[] oDataRSA = (byte[]) denRSA.get("oData");
sr.setResponseCodeOK();
//sr.setResponseData(new String(oDataRSA), StandardCharsets.UTF_8.displayName());
break;
default:
sr.setResponseCodeOK();
sr.setResponseData("请选择测试组", StandardCharsets.UTF_8.displayName());
break;
}
sr.setSuccessful(true);
}catch (SydApiException e){
e.printStackTrace();
sr.setResponseCode(String.valueOf(e.getRetCode()));
sr.setResponseData(e.getMessage(), StandardCharsets.UTF_8.displayName());
sr.setSuccessful(false);
}finally {
sr.sampleEnd();
}
return sr;
}
/**
* 测试完成后执行,一般用于关闭资源
* @param context 上下文对象,可用于获取jmeter传递的参数
*/
@Override
public void teardownTest(JavaSamplerContext context) {
System.runFinalization();
}
}
@@ -1,109 +0,0 @@
package com.sunyard;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
/**
* 管理多线程间对象
* 类似 ThreadLocal
* @param <T>
*/
public class MutiThreadHander<T> {
private static class Handler<T> {
private T obj = null;
private long creatAt = System.currentTimeMillis();
private long lastGetAt = System.currentTimeMillis();
public Handler(T obj) {
this.obj = obj;
}
public T getObj() {
return obj;
}
public long getCreatAt() {
return creatAt;
}
public long getLastGetAt() {
return lastGetAt;
}
}
private final Map<Thread, Handler> handers = new HashMap<Thread, Handler>();
private ScheduledExecutorService gcThread = Executors.newScheduledThreadPool(1);
private long maxLiveMillis = 8 * 3600 * 1000;
private long maxIdleMillis = 3600 * 1000;
private long checkEveryMillis = 5 * 60 * 1000;
public MutiThreadHander() {
gcThread.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
try {
if ( handers.size() <= 0 ) {
return;
}
long now = System.currentTimeMillis();
Iterator<Map.Entry<Thread, Handler>>it = handers.entrySet().iterator();
while ( it.hasNext() ){
Map.Entry<Thread, Handler> entry = it.next();
// check maxLiveMillis
if ( entry.getValue().getCreatAt() - now > maxLiveMillis ){
synchronized ( handers ){
it.remove();
}
}
// check maxIdleMillis
if ( entry.getValue().getLastGetAt() - now > maxIdleMillis ){
synchronized ( handers ){
it.remove();
}
}
}
} catch ( Exception e) {
e.printStackTrace();
}
}
}, checkEveryMillis, checkEveryMillis, TimeUnit.MILLISECONDS );
}
protected T initialValue() {
return null;
}
public void clear(){
synchronized ( handers ) {
handers.remove( Thread.currentThread() );
}
}
public void set(T obj){
synchronized ( handers ) {
handers.put( Thread.currentThread() , new Handler(obj));
}
}
public T get(){
synchronized ( handers ) {
Handler hander = handers.get( Thread.currentThread() );
if ( null == hander ) {
T o = initialValue();
hander = new Handler( o );
handers.put( Thread.currentThread(), hander );
}
return (T) hander.getObj();
}
}
}
+3 -21
View File
@@ -1,8 +1,7 @@
package com.sunyard; package com.sunyard;
import com.sunyard.inf.cryption.*;
import com.sunyard.inf.*; import com.sunyard.inf.*;
import com.sunyard.inf.customize.Syd4DigitalEnvelope;
import com.sunyard.inf.customize.SydHAApi; import com.sunyard.inf.customize.SydHAApi;
import com.sunyard.inf.customize.SydQNUCApi; import com.sunyard.inf.customize.SydQNUCApi;
import com.sunyard.inf.customize.SydUnionPayApi; import com.sunyard.inf.customize.SydUnionPayApi;
@@ -13,9 +12,9 @@ import racal.sunyard.main.SydApiBuilder;
* 程序调用接口 * 程序调用接口
*/ */
public interface SydApi extends public interface SydApi extends
SydRawApi, SydCertApi, SydGenApi, SydSYMApi, SydASYMApi, SydHashApi, SydRawApi, SydCertApi, SydCryptionApi, SydGenApi,
SydSVApi, SydHAApi, SydQNUCApi, SydPledge, SydPINOpt, SydSVApi, SydHAApi, SydQNUCApi, SydPledge, SydPINOpt,
SydManufactureApi, SydZYOption, SydUnionPayApi ,Syd4DigitalEnvelope{ SydManufactureApi, SydZYOption, SydUnionPayApi {
byte ALG_AES = 0x30; byte ALG_AES = 0x30;
byte ALG_SM4 = 0x31; byte ALG_SM4 = 0x31;
@@ -72,18 +71,6 @@ public interface SydApi extends
*/ */
SydApi connect(String ip, int port, String pwd, int connectTimeout, int readTimeout); SydApi connect(String ip, int port, String pwd, int connectTimeout, int readTimeout);
/**
* 建立到指定地址和端口号的加密设备的TCP/IP 连接,返回 TCP/IP 连接句柄。
* @param ip 加密机 ip
* @param port 加密机端口
* @param pwd 加密机密码,无密码写 null
* @param connectTimeout 网络连接时超时时间
* @param readTimeout 网络通信时,socket 超时时间
* @param retryWhenNetError 网络失败时重试次数
* @return
*/
SydApi connect(String ip, int port, String pwd, int connectTimeout, int readTimeout , int retryWhenNetError);
void init(SydApiBuilder builder); void init(SydApiBuilder builder);
/** /**
@@ -102,7 +89,6 @@ public interface SydApi extends
// 单例可以不实现 // 单例可以不实现
void error(); void error();
/** /**
* 获取加密机cpu,内存,磁盘使用状况 * 获取加密机cpu,内存,磁盘使用状况
* *
@@ -113,8 +99,4 @@ public interface SydApi extends
RetWrap getStatus(); RetWrap getStatus();
byte[] directBytes(byte[] data); byte[] directBytes(byte[] data);
public Object getBindObject();
public void setBindObject(Object bindObject);
} }
+35 -59
View File
@@ -13,134 +13,110 @@ public class SydApiException extends RuntimeException{
return retCode; return retCode;
} }
private static String transMsg(int code){
String msg = "未定义的错误"; public void transMsg(){
switch (code){ switch (this.retCode){
case -1: case -1:
case -2: case -2:
case -3: case -3:
msg = "网络错误"; this.msg = "网络错误";
break; break;
case -4: case -4:
msg = "返回包的序列号有误"; this.msg = "返回包的序列号有误";
break; break;
case -5: case -5:
msg = "返回包的命令码有误"; this.msg = "返回包的命令码有误";
break; break;
case -6: case -6:
msg = "输出缓冲区预留太小"; this.msg = "输出缓冲区预留太小";
break; break;
case -25: case -25:
msg = "输入的 HASH 值长度应该为 32 个字节"; this.msg = "输入的 HASH 值长度应该为 32 个字节";
break; break;
case -26: case -26:
msg = "用户标识超长(应该<=16) "; this.msg = "用户标识超长(应该<=16) ";
break; break;
case -27: case -27:
msg = "数据类型不合法 "; this.msg = "数据类型不合法 ";
break; break;
case 33: case 33:
msg = "检索的数据或密钥不存在"; this.msg = "检索的数据或密钥不存在";
break; break;
case 4: case 4:
msg = "DER 编码格式错误(公钥) "; this.msg = "DER 编码格式错误(公钥) ";
break; break;
case 21: case 21:
msg = "输入的数据格式错误 "; this.msg = "输入的数据格式错误 ";
break; break;
case 19: case 19:
msg = "数据解密错(C3) "; this.msg = "数据解密错(C3) ";
break; break;
case 2: case 2:
msg = "签名验证错误 "; this.msg = "签名验证错误 ";
break; break;
case 129: case 129:
msg = "没有该指令"; this.msg = "没有该指令";
break; break;
case 0x8006 : { case 0x8006 : {
msg = "输入的数据格式错误"; this.msg = "输入的数据格式错误";
break;
}
case 0x7007 : {
msg = "实体白名单未添加";
break; break;
} }
case 32770: case 32770:
msg = "签名验证错误(P7) "; this.msg = "签名验证错误(P7) ";
break; break;
case 32773: case 32773:
msg = "证书不可信"; this.msg = "证书不可信";
break; break;
case 32884: case 32884:
msg = "证书或签名数据的格式错"; this.msg = "证书或签名数据的格式错";
break; break;
case 36868: case 36868:
msg = "DN 所指向的实体不存在"; this.msg = "DN 所指向的实体不存在";
break; break;
case 40000: case 40000:
msg = "输入的大数据处理异常"; this.msg = "输入的大数据处理异常";
break; break;
case 56300: case 56300:
msg = "证书导入错误"; this.msg = "证书导入错误";
break; break;
case 56307: case 56307:
msg = "证书删除错误"; this.msg = "证书删除错误";
break; break;
case 0xC101 :
msg = "证书识别异常";
break;
default: default:
msg = "未定义的错误"; this.msg = "未定义的错误";
} }
return msg;
}
public void transMsg(){
this.msg = transMsg( this.retCode );
} }
public SydApiException(int retCode) { public SydApiException(int retCode) {
super("SydApiException(" + "code = "+String.format("%04x", retCode) + ")" ); super("SydApiException(" + "code = "+String.format("%d", retCode) + ")" );
this.retCode = retCode; this.retCode = retCode;
transMsg(); transMsg();
} }
public SydApiException(int retCode, Exception e) { public SydApiException(String msg, int ret, Throwable e){
super("SydApiException(" + "code = "+String.format("%04x", retCode) + ")" , e); super("SydApiException(" +"code ="+ String.format(" %d", ret) + " : "+"msg ="+ (null == msg ? "未定义的错误" : msg) +")" , e);
this.retCode = retCode; this.retCode = ret;
transMsg();
}
public SydApiException(String msg, int retCode){
super("SydApiException(" + String.format(" %04X", retCode) + ":" + ( null == msg ? transMsg(retCode) : msg ) + ")" );
this.retCode = retCode;
if (null == msg || "".equals(msg)){ if (null == msg || "".equals(msg)){
transMsg(); transMsg();
}else { }else {
this.msg = msg; this.msg = msg;
} }
} }
public SydApiException(String msg, int ret){
public SydApiException(String msg, int ret, Throwable e) { super("SydApiException(" +"code ="+ String.format(" %d", ret) + " : "+"msg ="+ (null == msg ? "未定义的错误" : msg) +")" );
super("SydApiException(code =" + String.format(" %04x", ret) + " : " + "msg =" + (msg == null ? "未定义的错误" : msg) + ")", e);
this.retCode = ret; this.retCode = ret;
if (msg != null && !"".equals(msg)) { if (null == msg || "".equals(msg)){
this.msg = msg; transMsg();
}else { }else {
this.transMsg(); this.msg = msg;
} }
} }
public static SydApiException fromBin( byte[] b , String msg){ public static SydApiException fromBin( byte[] b , String msg){
@@ -159,7 +135,7 @@ public class SydApiException extends RuntimeException{
sb.append(Integer.toHexString(this.retCode)); sb.append(Integer.toHexString(this.retCode));
sb.append(" ) "); sb.append(" ) ");
sb.append(" msg = "); sb.append(" msg = ");
sb.append(msg); sb.append(this.msg);
return sb.toString(); return sb.toString();
} }
} }
@@ -1,16 +0,0 @@
package com.sunyard.constant;
/**
* 证书用途
*/
public enum CertUsage {
digitalSignature,
nonRepudiation,
keyEncipherment,
dataEncipherment,
keyAgreement,
keyCertSign,
cRLSign,
encipherOnly,
decipherOnly
}
@@ -3,10 +3,8 @@ package com.sunyard.inf;
import com.sunyard.RetWrap; import com.sunyard.RetWrap;
import com.sunyard.cert.X509; import com.sunyard.cert.X509;
import com.sunyard.constant.CertUsage;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.List;
/** /**
* 证书操作相关接口 * 证书操作相关接口
@@ -103,14 +101,6 @@ public interface SydCertApi {
String sign String sign
); );
/**
* 查询所有证书
* @return
* certDNs: 证书DN
*/
List<String> getAllCert() throws UnsupportedEncodingException;
/** /**
* 查询所有证书 * 查询所有证书
* @param dataFlag 数据包标志 0:起始包 1:中间包 2:结束包 * @param dataFlag 数据包标志 0:起始包 1:中间包 2:结束包
@@ -124,55 +114,20 @@ public interface SydCertApi {
*/ */
RetWrap getAllCert(int dataFlag) throws UnsupportedEncodingException; RetWrap getAllCert(int dataFlag) throws UnsupportedEncodingException;
/**
* 查询所有证书
* @param dataFlag 数据包标志 0:起始包 1:中间包 2:结束包
* @param sqlite 查询条件,默认查询所有"1=1"
* @return
* dataFlag: 数据包标志 0:起始包 1:中间包 2:结束包
* certAllNum: 证书总数
* realCertNum: 实际证书个数
* dataAttrFlag: 数据包属性标志
* certLenMax: 证书最大长度
* certDNs: 证书DN
*/
RetWrap getAllCert(int dataFlag,String sqlite) throws UnsupportedEncodingException;
/** /**
* 上传指定证书到加密设备 * 上传指定证书到加密设备
* @param certData 证书的字节数组 * @param certData 证书的字节数组
* @param organizationId 机构号的字节数组 * @param organizationId 机构号的字节数组
* @param us 白名单类型
* @return * @return
*/ */
RetWrap importCert(byte[] certData, byte[] organizationId, CertUsage... us);
RetWrap importCert(byte[] certData, byte[] organizationId); RetWrap importCert(byte[] certData, byte[] organizationId);
/**
* 从加密设备中删除指定 DN 的公钥证书
* @param dn:传入的证书
*
* @return
*/
boolean deleteCert(String dn);
/** /**
* 上传指定证书到加密设备,并在证书前后加上begin和end * 上传指定证书到加密设备,并在证书前后加上begin和end
* @param certData 证书的字节数组 * @param certData 证书的字节数组
* @param organizationId 机构号的字节数组 * @param organizationId 机构号的字节数组
* @param us 白名单类型
* @return * @return
*/ */
RetWrap importCertAddHT(String certData, byte[] organizationId, CertUsage... us);
RetWrap importCertAddHT(String certData, byte[] organizationId); RetWrap importCertAddHT(String certData, byte[] organizationId);
String getCertByDn(String dn) throws UnsupportedEncodingException;
String getCertByDn(String dn,int type) throws UnsupportedEncodingException;
public String getCertByDn(byte[] dnBytes);
} }
@@ -275,7 +275,7 @@ interface SydSYMApi {
byte[] SYMEncryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata); byte[] SYMEncryptData(int nAlg, String seesionKey, int fullmode, byte[] pINdata);
List<byte[]> SYMEncryptDecryptBatchData(int nAlg, String[] seesionKey, int fullmode, List<byte[]> pINdata); // List<byte[]> SYMEncryptDecryptBatchData(int nAlg, String[] seesionKey, int fullmode, List<byte[]> pINdata);
/** /**
* 用输入的会话密钥,对指定报文数据进行加密处理。 * 用输入的会话密钥,对指定报文数据进行加密处理。
@@ -1,216 +0,0 @@
package com.sunyard.inf;
import com.sunyard.RetWrap;
import com.sunyard.cert.X509;
/**
* 不带原文的签名验签
*/
public interface SydDetachedSVApi {
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean SYD_DetachedVerify(
byte[] orgData,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String SYD_DetachedSign(
byte[] orgData,
String sCertDN
);
/**
* 人行项目需要RSA支持
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String SYD_DetachedSign(
int rFlag,
byte[] orgData,
String sCertDN
);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String sm3AndDetachedSign(
byte[] orgData,
String publicKey,
String sCertDN
);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行 sm3 ,然后做 Detach 验签
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean sm3AndDetachedVerify(
byte[] orgData,
String publicKey,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行不带公钥的 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
String sm3WithoutPKDetachedSign(byte[] orgData, String sCertDN);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行无公钥的 sm3 ,然后做 Detach 验签
*
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean sm3WithoutPKDetachedVerify(byte[] orgData, String sign);
/**
*
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 数据模式,输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 输入的数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String detachedSign(
int dataType,
byte[] orgData,
String sCertDN
);
//SM2与RSA兼容
public String detachedSignAll(int rFlag,byte[] orgData, String sCertDN);
//SM2与RSA兼容
public boolean detachedVerifyAll(int rFlag,byte[] orgData, String sign);
/**
* 带公钥证书与签名属性的数字签名(遵循 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 keyTag
);
public String detachedSign(int rFlag,int dataType, byte[] orgData, String sCertDN);
/**
* 带公钥证书的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,
String certificateNo);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
String sign);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
*
* @param rFlag RSA标识
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean detachedVerify(
int rFlag,
int dataType,
byte[] orgData,
String sign);
/**
* 带公钥证书与签名属性的数字签名验签(遵循 PKCS#7)
* @param dataType 数据类型:0,hash 模式,1为非hash模式
* @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为数据
* @param sign 已签名数据
* @return 是否正确
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
byte[] sign);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)返回证书信息
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 证书
*/
X509 detachedVerifyAndGetX509(int dataType,
byte[] orgData,
String 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);
}
+4 -33
View File
@@ -132,18 +132,6 @@ public interface SydGenApi {
*/ */
RetWrap SM2GenSessionKey(String publicKey); RetWrap SM2GenSessionKey(String publicKey);
/**
* 此函数用于会话密钥的产生,用于发起端。
* 加密机产生随机会话密钥,输出两类密文:
* 1、 RSA公钥加密的密文,用于密钥的传递。
* 2、 本地 LMK 加密,用于本地应用数据的加解密。
*
* @param publicKey 公钥串,DER 编码,HEX 格式。
* @return CipherKey 公钥加密的会话密钥,DER 编码,HEX 格式, SessionKey 本地LMK 加密的会话密钥,HEX 格式 , KCV 会话密钥的检验值,HEX 格式,长度为 16H
*/
RetWrap RSAGenSessionKey(String publicKey);
/** /**
* 生成数字信封 * 生成数字信封
* @param publicKey 公钥 * @param publicKey 公钥
@@ -238,9 +226,7 @@ public interface SydGenApi {
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/ */
RetWrap generateDEByDn(String certSerial, byte[] oData); RetWrap generateDEByDn(String certSerial, String oData);
RetWrap generateDEByDnRSA(int alg,String certSerial, byte[] oData);
/** /**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * 产生对称密钥,通过公钥加密生成网联格式的数字信封。
@@ -254,7 +240,7 @@ public interface SydGenApi {
* SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
* KCV 会话密钥的检验值,HEX 格式,长度为 32H。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。
*/ */
RetWrap generateDE(byte[] certSerial, int alg, int model, byte[] oData); RetWrap generateDE(byte[] certSerial, int alg, int model, String oData);
/** /**
* 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * 产生对称密钥,通过公钥加密生成网联格式的数字信封。
@@ -322,8 +308,8 @@ public interface SydGenApi {
* KCV 会话密钥的检验值,HEX 格式,长度为 36H。 * KCV 会话密钥的检验值,HEX 格式,长度为 36H。
* orgCode 如果有机构码的话会返回机构码 * orgCode 如果有机构码的话会返回机构码
*/ */
RetWrap decryptDEByDN(String certSerial, byte[] pCipherKey); RetWrap decryptDEByDN(String certSerial, String pCipherKey);
RetWrap decryptDEByDNRSA(int alg,String certSerial, byte[] pCipherKey);
/** /**
* 接收用私钥解密数字信封,还原对称密钥。 * 接收用私钥解密数字信封,还原对称密钥。
* *
@@ -339,21 +325,6 @@ public interface SydGenApi {
*/ */
RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey); RetWrap decryptDE(boolean pFlag, int model, byte[] certSerial, String pCipherKey);
/**
* 接收用RSA私钥解密数字信封,还原对称密钥。
*
* @param pFlag 输入。 p标识,如果为true,则传入R
* @param model 输入。 证书模式,0:证书序号,1:证书 DN
* @param certSerial 输入。 对方 X509 证书的序列号或DN。
* @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码
* @return RetWrap 包含 SessionKey KCV
* oData 如果有机构码的话会返回原数据
* SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文
* KCV 会话密钥的检验值,HEX 格式,长度为 36H。
* orgCode 如果有机构码的话会返回机构码
*/
RetWrap decryptDERSA(boolean pFlag, int model, byte[] certSerial, String pCipherKey);
/** /**
* 产生要求长度的随即数据串,可用于身份认证 * 产生要求长度的随即数据串,可用于身份认证
* *
@@ -1,122 +0,0 @@
package com.sunyard.inf;
import com.sunyard.SydApiException;
/**
* 不经过 CA 授信
* 直接使用公私钥对签名验签
*/
interface SydNakedSVApi {
/**
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制裸签名(遵循 PKCS#1)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public byte[] SYD_NakedSign(
byte[] orgData,
String sCertDN
);
/**
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制裸签名(遵循 PKCS#1)
* 人行项目增加RSA
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public byte[] SYD_NakedSign(
int rFlag,
byte[] orgData,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerify(
byte[] orgData,
byte[] sign,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerify(
int rFlag,
byte[] orgData,
byte[] sign,
String sCertDN
);
/**
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制裸签名(遵循 PKCS#1)
* @param rFlag 摘要算法 1—DIGEST_ALGO_MD5 M
* 2—DIGEST_ALGO_SHA1 S
* 3—DIGEST_ALGO_SHA256 R
* 4-SM2 国密证书,SM3算法
* S代表RSA-SHA1进行签名,如果为R代表RSA-SHA256进行签名,如果为M代表RSA-MD5进行签名
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public byte[] SYD_NakedSignAll(
int rFlag,
byte[] orgData,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
* @param rFlag 摘要算法 1—DIGEST_ALGO_MD5 M
* * 2—DIGEST_ALGO_SHA1 S
* * 3—DIGEST_ALGO_SHA256 R
* 4-SM2 国密证书,SM3算法
* * S代表RSA-SHA1进行签名,如果为R代表RSA-SHA256进行签名,如果为M代表RSA-MD5进行签名
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerifyAll(
int rFlag,
byte[] orgData,
byte[] sign,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1) 安徽农信定制接口
* @param cert 上传证书
* @param rFlag 摘要算法 1—DIGEST_ALGO_MD5 M
* * 2—DIGEST_ALGO_SHA1 S
* * 3—DIGEST_ALGO_SHA256 R
* 4-SM2 国密证书,SM3算法
* * S代表RSA-SHA1进行签名,如果为R代表RSA-SHA256进行签名,如果为M代表RSA-MD5进行签名
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerifyAll4NX (
String cert,
int rFlag,
byte[] orgData,
byte[] sign,
String sCertDN
) ;
}
+384 -3
View File
@@ -3,9 +3,6 @@ package com.sunyard.inf;
import com.sunyard.RetWrap; import com.sunyard.RetWrap;
import com.sunyard.cert.X509; import com.sunyard.cert.X509;
import com.sunyard.inf.sva.SydAttachedSVApi;
import java.io.UnsupportedEncodingException;
/** /**
* 签名验签相关接口 * 签名验签相关接口
@@ -14,5 +11,389 @@ public interface SydSVApi extends SydNakedSVApi, SydAttachedSVApi, SydDetachedSV
} }
/**
* 不经过 CA 授信
* 直接使用公私钥对签名验签
*/
interface SydNakedSVApi {
/**
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制裸签名(遵循 PKCS#1)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public byte[] SYD_NakedSign(
byte[] orgData,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerify(
byte[] orgData,
byte[] sign,
String sCertDN
);
}
/**
* 带原文的签名验签
*/
interface SydAttachedSVApi {
/**
* sm2私钥签名
* 用户id默认为1234567812345678
* 签名结果R/S序列串先进行der编码,再进行base64编码
*
* @param flag 私钥标志位,当为1时第二个参数传入存储私钥的索引,当为0时第二个参数传入私钥
* @param privateKey 当私钥标志位为1时传入存储私钥的索引,当为0时传入私钥
* @param publicKey 公钥
* @param orgData 要签名的信息
* @return 签名结果
*/
String SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData);
String SM2SignC(int flag, String pUserID, String privateKey, byte[] publicKey, byte[] orgData);
/**
* SM2 私钥签名
* @param pUserID 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param certNo 证书号
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据
* @param publicKey 公钥的 DER 编码
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
String SM2SignC(
String pUserID,
String certNo,
int nOrgDataType,
byte[] publicKey,
byte[] orgData
);
/**
* RSA 私钥签名
* @param HashMark 哈希标识 指示用于哈希证书数据的哈希算法的标识。0: SHA1 1: SHA256 2: MD5。
* @param privateKeyTag 私钥标记 指示私钥位置的标记。数字为存储私钥的索引,除了全9表示使用由命令中提供的密钥。
* 27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
byte[] RSASignC(
String privateKeyTag,
int HashMark,
int nOrgDataType,
byte[] orgData);
byte[] RSASign(
String privateKey,
int HashMark,
int nOrgDataType,
byte[] orgData);
/**
* 采用 RSA 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param HashMark 哈希标识
* @param nOrgDataType 签名方式
* @param publicKey 公钥
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean RSAVerify(
int HashMark,
int nOrgDataType,
byte[] publicKey,
byte[] orgData,
byte[] sign);
/**
* sm2验签
* 用户id默认为1234567812345678
*
* @param publicKey 公钥的 DER 编码
* @param orgData 要签名的信息
* @param base64Sign 计算的签名,签名结果R/S序列串先进行der编码,再进行base64编码后的结果
* @return true 验签成功,false 验签失败
*/
boolean SM2Verify(byte[] publicKey, byte[] orgData, String base64Sign);
/**
* 采用 SM2 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param certNo id 用于计算SM3-HASH
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据,用1.2.3章节限定符亦可
* @param publicKey 公钥
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean SM2Verify(
String certNo,
int nOrgDataType,
byte[] publicKey,
byte[] orgData,
String sign
);
/**
* SM2 私钥签名
* @param certNo 证书号
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
String SM2SignCustomized(
String certNo,
byte[] orgData
);
/**
* 采用 SM2 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param certNo 证书号
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean SM2VerifyCustomized(
String certNo,
byte[] orgData,
String sign
);
/**
* 带公钥证书与原始数据的数字签名(遵循 PKCS#7)
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制带公钥证书的数字签名(遵循 PKCS#7)。
*
* @param orgData 待签名数据
* @param sCertDN 证书DN
* @return
* 符合PKCS7标准的签名结果
*/
String attachedSign(byte[] orgData, String sCertDN);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return true 验签通过 false 验签失败
*/
boolean attachedVerify(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return 成功返回签名的原数据,失败则报错
*/
String attachedVerifyRD(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
X509 attachedVerifyAndGetX509(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
RetWrap attachedVerifyAndGetAll(String sign);
}
/**
* 不带原文的签名验签
*/
interface SydDetachedSVApi {
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean SYD_DetachedVerify(
byte[] orgData,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String SYD_DetachedSign(
byte[] orgData,
String sCertDN
);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String sm3AndDetachedSign(
byte[] orgData,
String publicKey,
String sCertDN
);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行 sm3 ,然后做 Detach 验签
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean sm3AndDetachedVerify(
byte[] orgData,
String publicKey,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行不带公钥的 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
String sm3WithoutPKDetachedSign(byte[] orgData, String sCertDN);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行无公钥的 sm3 ,然后做 Detach 验签
*
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean sm3WithoutPKDetachedVerify(byte[] orgData, String sign);
/**
*
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 数据模式,输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 输入的数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String detachedSign(
int dataType,
byte[] orgData,
String sCertDN
);
/**
* 带公钥证书与签名属性的数字签名(遵循 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 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,
String certificateNo);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
String sign);
/**
* 带公钥证书与签名属性的数字签名验签(遵循 PKCS#7)
* @param dataType 数据类型:0,hash 模式,1为非hash模式
* @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为数据
* @param sign 已签名数据
* @return 是否正确
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
byte[] sign);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)返回证书信息
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 证书
*/
X509 detachedVerifyAndGetX509(int dataType,
byte[] orgData,
String 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);
}
@@ -1,135 +0,0 @@
package com.sunyard.inf.cryption;
public interface SydASYMApi {
/**
* 非对称加解密接口
*/
/**
* 用指定的 SM2 公钥对指定的密文数据进行加密。
*
* @param publicKey 公钥钥串,DER 编码,HEX 格式。
* @param pOrgData 加密的数据。
* @return 加密的数据 base64 编码。
*/
String SM2Encrypt(
byte[] publicKey,
byte[] pOrgData
);
/**
* 用指定的 SM2 公钥对指定的密文数据进行加密。
*
* @param publicKey 公钥钥串,DER 编码,HEX 格式。
* @param pOrgData 加密的数据。
* @return 加密的数据 der 编码。
*/
byte[] SYD_SM2_Encrypt(byte[] publicKey, byte[] pOrgData);
/**
* 用指定的 SM2 公钥对指定的密文数据进行加密。
* 输出的sm2密文结构为C1C2C3格式
* @param publicKey 公钥钥串,DER 编码,HEX 格式。
* @param pOrgData 加密的数据。
* @return 加密的数据 base64 编码。
*/
String SM2EncryptOrder(byte[] publicKey, byte[] pOrgData);
/**
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
*
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param pEnData 加密的数据,base64 编码。
* @return 明文数据。
*/
byte[] SM2DecryptC(String userId, String pEnData);
/**
* 使用外部私钥解密
* @param sk LMK下加密的私钥
* @param enData 密文数据(base64 编码)
* @return 解密结果
*/
byte[] SM2Decrypt(byte[] sk, String enData);
/**
* 使用外部私钥解密
* @param sk LMK下加密的私钥
* @param enData 密文数据(DER 编码)
* @return 解密结果
*/
byte[] SYD_SM2_Decrypt(byte[] sk, byte[] enData);
/**
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
* 输入的sm2密文结构为C1C2C3格式
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param enData 加密的数据,base64 编码。
* @param keyType 密钥类型,0:签名证书, 1:加密证书。
* @return 明文数据。
*/
byte[] SM2DecryptOrder(String userId, String enData, int keyType);
/**
* 用指定的 RSA 私钥对指定的密文数据进行加密。
*
* @param publicKey 私钥串,DER 编码,HEX 格式。
* @param pOrgData 加密的数据。
* @return 加密的数据 base64 编码。
*/
String RSAEncrypt(
String publicKey,
byte[] pOrgData
);
/**
* 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
*
* @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param pEnData 加密的数据,base64 编码。
* @return 明文数据。
*/
byte[] RSADecryptC(
String userId,
String pEnData
) throws Exception;
/**
* 使用外部私钥解密
* @param sk
* @param enData
* @return
*/
public byte[] RSADecrypt(String sk, String enData) throws Exception;
/**
* 非对称公钥加密
* @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 算法标识: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 算法标识:0 = RSA 1 = SM2
* @param userId 16位机构号
* @param data 密文数据(DER 编码)
* @return 公钥加密的密文的 DER 编码(对于 RSA 算法,数据类型为 BIT).
*/
public byte[] decryptBySkC(int alg, String userId, byte[] data);
}
@@ -1,77 +0,0 @@
package com.sunyard.inf.cryption;
import com.sunyard.RetWrap;
/**
* Hash 算法接口
*/
public interface SydHashApi {
/**
* 计算SM3散列值
* @param sn 证书序号
* @param userId 用户ID
* @param msg 原始数据,二进制的消息块
* @return
*/
// byte[] SM3HashSNaId(String sn, String userId, byte[] msg);
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
* @param publicKey 公钥的 DER 编码(可以为空)
* @param msg 原始数据,二进制的消息块
* @param block 消息块标志
* @param mac 上一轮 mac 值,当 mac 不是 null,长度不为 0,则直接从第二包开始。
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac);
/**
* 计算SM3散列值
* @param publicKey 公钥的 DER 编码 (03420004 开头)
* @param userId 用户ID
* @param msg 原始数据,二进制的消息块
* @return
*/
byte[] SM3Hash(String publicKey, String userId, byte[] msg);
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
*
* @param publicKey 公钥(可以为空)
* @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(String publicKey, byte[] msg);
/**
* 输入对指定的原始数据 (无公钥),通过 SM3 算法计算数据的散列值。
*
* @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(byte[] msg);
public byte[] MACCalc(int alg, int keyType, int fullmode, int maclen, String key, byte[] infoData);
/**
* 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 下有效)
* @return mac 值 hex 格式
*/
public String MACCalc(int alg, int keyType, String AK, int fullMode, byte[] infoData, int macLen);
public void MACCheck(int alg, int keyType, String AK, int fullMode, byte[] infoData, String mac);
public String calcPBOCMAC(int mode, int keyType, String key, byte[] data, int block, byte[] iv);
public RetWrap countHash(int hashType, int packSn, byte[] msg, byte[] filterData);
public byte[] itHash(int hashType, byte[] orgData);
}
@@ -1,282 +0,0 @@
package com.sunyard.inf.cryption;
import com.sunyard.RetWrap;
import java.io.UnsupportedEncodingException;
/**
* 对称加解密接口
*/
public interface SydSYMApi {
/**
* 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
* @param block 消息块号
* @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);
/**
* 对指定报文数据进行SM4加密
* @param type 密钥类型。0: ZEK,1: TEK
* @param userId 生成密钥时的机构号。
* @param index 密钥索引
* @param data 待加密的数据
* @return
*/
byte[] SYMSM4EncDataByIndex(int type, String userId, String index, byte[] data);
/**
* 用输入的会话密钥,对指定报文数据进行加密处理。
*
* @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, int fullmode, byte[] pINdata);
// List<byte[]> SYMEncryptDecryptBatchData(int nAlg, String[] seesionKey, int fullmode, List<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 格式
* @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。
* @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;
/**
* 使用SM4算法进行加密,其中加密模式为CBC,
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING 。
* @param keyType 密钥类型 0: ZEK,1: TEK
* @param key 密钥
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
* @param outType 输出消息类型 0:二进制 1:扩展十六进制
* @param inFilePath 需要加密的数据文件所在的路径
* @param outFilePath 加密后的密文数据将要保存的文件路径
* @return 加密是否成功。false为失败,true为成功
*/
boolean SM4EncryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath);
/**
* 使用SM4算法进行加密,其中加密模式为CBC,
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING 。
* @param keyType 密钥类型 0: ZEK,1: TEK
* @param key 密钥
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
* @param outType 输出消息类型 0:二进制 1:扩展十六进制
* @param msg 消息数据
* @return 输出的报文密文
*/
byte[] SM4EncryptDataCBC(int keyType, String key, int inType, int outType, byte[] msg);
/**
* 使用SM4算法进行解密,其中加密模式为CBC,
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING 。
* @param keyType 密钥类型 0: ZEK,1: TEK
* @param key 密钥
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
* @param outType 输出消息类型 0:二进制 1:扩展十六进制
* @param inFilePath 加密后的密文数据将要保存的文件路径
* @param outFilePath 解密后的数据文件所在的路径
* @return 解密是否成功。false为失败,true为成功
*/
boolean SM4DecryptFileDataCBC(int keyType, String key, int inType, int outType, String inFilePath, String outFilePath) throws UnsupportedEncodingException;
/**
* 使用SM4算法进行解密,其中加密模式为CBC,
* Ⅳ使用缺省值0X 00000000000000000000000000000000,
* 补位模式为 PKCS5 PADDING 。
* @param keyType 密钥类型 0: ZEK,1: TEK
* @param key 密钥
* @param inType 输入消息类型 0:二进制 1:扩展十六进制
* @param outType 输出消息类型 0:二进制 1:扩展十六进制
* @param msg 加密后的消息数据
* @return 输出的报文明文
*/
byte[] SM4DecryptDataCBC(int keyType, String key, int inType, int outType, byte[] msg);
/**
* 用输入的会话密钥,对指定报文数据进行加密处理。
*
* @param nAlg  算法标识.,0x00:3DES,0x01:SM4。
* @param seesionKey  本地LMK 加密的会话密钥,HEX 格式
* @param pINdata  要加密的报文明文。必须是 8 或16 的倍数。
* @return 输出的报文密文, 长度为报文明文 + 16
*/
byte[] SYMEncryptDataCBC(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 输出的报文密文, 长度为报文明文 + 16
*/
byte[] SYMEncryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
/**
* 用输入的会话密钥,对指定报文数据进行解密处理。
*
* @param nAlg  算法标识.,0x00:3DES,0x01:SM4。
* @param seesionKey 本地LMK 加密的会话密钥,HEX 格式
* @param pINdata 要解密的报文密文。长度必须是8 或16 的倍数。
* @return 输出的报文明文。
*/
byte[] SYMDecryptDataCBC(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[] SYMDecryptDataCBC(int nAlg, String seesionKey, int fullmode, byte[] pInData);
/**
* 用输入的会话密钥,对指定报文数据进行解密处理。
*
* @param srcKey  源秘钥.十六进制字符串。
* @param desKey  目的秘钥.十六进制字符串。
* @param sca  源算法SCA.Int类型。
* @param sPin  源PIN块.十六进制字符串。
* @param primaryAccount  主账号.十六进制字符串。
* @return 目的Pin块。
*/
byte[] transPinFrOneKeyToAno(String srcKey, String desKey, int sca, String sPin, String primaryAccount);
/**
* 用一把DEK密钥加密数据, 报文总长度不大于8192
*
* @param alg 加密算法
* @param DEK DEK密钥
* @param infoData 数据
* @param vector 初始向量数据 可选项,当加密模式为CBC,CFB或OFB时才显示此项
* @param disperseAlg 分散算法
* @return 密文数据
*/
byte[] SYD_Encrypt_Data(int alg, String DEK, byte[] infoData, byte[] vector, int disperseAlg, byte[] factor);
/**
* 用DEK密钥解密数据, 报文总长度不大于8192
*
* @param alg 解密算法
* @param DEK DEK密钥
* @param infoData 数据密文
* @param vector 初始向量数据 可选项,当加密模式为CBC,CFB或OFB时才显示此项
* @param disperseAlg 分散算法
* @return 解密后的明文数据
*/
byte[] SYD_Decrypt_Data(int alg, String DEK, byte[] infoData, byte[] vector, int disperseAlg, byte[] factor);
/**
* 对于给定的数据生成一个MAC
*
* @param key LMK对(16-17)下加密的TAK
* @param infoData 生成MAC的数据
* @param IV
* @param disperseNum 指定对根密钥分散的次数(1-3次)
* @param disperseAlg 分散算法
* @return 所计算出的MAC
*/
byte[] SYD_MAC_Data(String key, String infoData, byte[] factor, String IV, int disperseNum, int disperseAlg);
/**
* 对称加密数据
* @param key 索引地址,指示用户密钥存储区的27位地址
* @param intPutData 消息数据
* @return
* iv: IV 数据域
* msg_all: 消息数据
*/
public String SYMEncrytByKeyIndex( String key, String intPutData);
/**
* 对称解密数据
* @param key 索引地址,指示用户密钥存储区的27位地址
* @param intPutData 消息数据
* @return 消息数据
*/
public String SYMDecrytByKeyIndex(String key,String intPutData);
//通过索引读取对称秘钥
RetWrap readKey(String index);
}
@@ -1,31 +0,0 @@
package com.sunyard.inf.customize;
/**
* 上清所数字信封类接口
*/
public interface Syd4DigitalEnvelope {
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 上清所
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign:会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
public String SYD_SignDigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
/**
* 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。
* 上清所
* @param pcDnDe: 会员的私钥证书
* @param pcDnVerify: 清算所公钥证书
* @param pcSignData: 签名数字信封数据。
* @return pcData:原数据
*/
public byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
}
@@ -117,16 +117,9 @@ public interface SydHAApi {
* @param nOrgDataType 签名数据类型,SydApi.DATA_ORIGIN(1) 原始数据 SydApi.DATA_HASH(0) : hash 后的类型 * @param nOrgDataType 签名数据类型,SydApi.DATA_ORIGIN(1) 原始数据 SydApi.DATA_HASH(0) : hash 后的类型
* @param publicKey 公钥串,DER编码,HEX格式 * @param publicKey 公钥串,DER编码,HEX格式
* @param orgData 待签名的原始数据,“签名数据类型”为 0 时:HASH 值。“签名数据类型”为 1 时:要签名的信息 * @param orgData 待签名的原始数据,“签名数据类型”为 0 时:HASH 值。“签名数据类型”为 1 时:要签名的信息
* @param sign S+R * @param base64Sign 签名数据 (DER 编码 + Base64 编码)
* @return 验签是否通过 * @return 验签是否通过
*/ */
public boolean SM2Verify(
int nOrgDataType,
byte[] publicKey,
byte[] orgData,
byte[] sign
);
public boolean SM2Verify( public boolean SM2Verify(
int nOrgDataType, int nOrgDataType,
byte[] publicKey, byte[] publicKey,
@@ -0,0 +1,185 @@
package com.sunyard.inf.customize;
import com.sunyard.SydApiException;
import com.sunyard.cert.X509;
import com.sunyard.proto.Packet;
import com.sunyard.proto.PacketSection;
import com.sunyard.proto.Util;
import com.sunyard.trans.PacketSN;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.proto.Proto8003;
import racal.sunyard.main.proto.Proto8004;
import racal.sunyard.main.proto.Proto8012;
import java.io.UnsupportedEncodingException;
import java.nio.ByteBuffer;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class SydSDNXApiImpl extends SydApi4j implements SydSDNXApi {
public String nakedSign(byte[] orgData, String sCertDN) {
Proto8003 proto = new Proto8003(); //pset.getProtocolReqRender("75");
byte[] dn = new byte[256];
byte[] s = null;
try {
s = sCertDN.getBytes("GBK");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
System.arraycopy(s, 0, dn, 0, s.length);
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("signatureDataType$option", 1);
data.put("DN", dn);
data.put("data", orgData);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
Packet p = proto.parse(bb);
Map<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if (
(0 != (be[0] ^ be[1]))) {
throw new SydApiException(error.getInfo(), error.autoInt());
}
return Util.encodeBase64(((PacketSection) ret.get("signature")).getBytes());
//return ((PacketSection) ret.get("signature")).getBytes();
}
@Override
public boolean SYD_NakedVerify(byte[] orgData, String sign, String organizationNum) {
Proto8004 proto = new Proto8004(); //pset.getProtocolReqRender("75");
byte[] dn = new byte[256];
byte[] s = null;
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("signatureDataType$option", 2);
data.put("organizationNum", organizationNum);
data.put("data", orgData);
data.put("signature", Util.decodeBase64(sign));
data.put("returnSign$option", 0);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
Packet p = proto.parse(bb, packet);
Map<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if ((0 != (be[0] ^ be[1]))) {
throw new SydApiException(error.getInfo(), error.autoInt());
}
return true;
}
@Override
public X509 SYD_Get_X509_CertInfo_HA(String bNumber, byte[] orgData, String sign) {
Proto8012 proto = new Proto8012(); //pset.getProtocolReqRender("75");
// 填充数据
HashMap<String, Object> packet = new HashMap<String, Object>();
HashMap<String, Object> data = new HashMap<String, Object>();
packet.put("data", data);
PacketSN sn = PacketSN.gen();
packet.put("header", sn.getSn().array());
data.put("originData", orgData);
data.put("signData", sign.getBytes());
data.put("flag$option", 2);
data.put("organizationNum", bNumber);
// 渲染发送
ByteBuffer bb = proto.rend(packet);
synchronized (this) {
// 响应解析
bb = syncRead(syncSend(bb));
}
Packet p = proto.parse(bb, packet);
Map<String, Object> ret = p.toMap();
if (
!Arrays.equals(sn.getSn().array(), ((PacketSection) ret.get("header")).getBytes())
) {
throw new SydApiException("包序号不匹配", -4);
}
ret = (Map<String, Object>) ret.get("data");
PacketSection error = (PacketSection) ret.get("error");
byte[] be = error.getBytes();
if ((0 != (be[0] ^ be[1]))) {
throw new SydApiException(error.getInfo(), error.autoInt());
}
PacketSection info = (PacketSection) ret.get("info");
byte[] pCertInfo = info.getBytes();
// X509 cinfo = new X509();
// cinfo.setIssuer(Util.toCleanString(pCertInfo, 0, 257));
// cinfo.setSerialNumber(Util.toCleanString(pCertInfo, 257, 65));
// cinfo.setSubject(Util.toCleanString(pCertInfo, 257 + 65, 257));
// cinfo.setNotBefore(Util.toCleanString(pCertInfo, 257 + 65 + 257, 15));
// cinfo.setNotAfter(Util.toCleanString(pCertInfo, 257 + 65 + 257 + 15, 15));
// byte[] blen = new byte[]{pCertInfo[257 + 65 + 257 + 15 + 15], pCertInfo[257 + 65 + 257 + 15 + 16]};
// int len = Util.b2i(blen);
// byte[] pem = new byte[len];
// System.arraycopy(pCertInfo, 257 + 65 + 257 + 15 + 17, pem, 0, len);
// String pp = new String(pem);
// 解析证书
return GetX509CertInfo(new String(pCertInfo));
}
}
@@ -1,212 +0,0 @@
package com.sunyard.inf.sva;
import com.sunyard.RetWrap;
import com.sunyard.cert.X509;
import java.io.UnsupportedEncodingException;
/**
* 带原文的签名验签
*/
public interface SydAttachedSVApi {
/**
* sm2私钥签名
* 用户id默认为1234567812345678
* 签名结果R/S序列串先进行der编码,再进行base64编码
*
* @param flag 私钥标志位,当为1时第二个参数传入存储私钥的索引,当为0时第二个参数传入私钥
* @param privateKey 当私钥标志位为1时传入存储私钥的索引,当为0时传入私钥
* @param publicKey 公钥
* @param orgData 要签名的信息
* @return 签名结果
*/
byte[] SM2SignC(int flag, String privateKey, byte[] publicKey, byte[] orgData);
byte[] SM2SignC(int flag, String pUserID, String privateKey, byte[] publicKey, byte[] orgData);
/**
* SM2 私钥签名
* @param pUserID 使用者的 ID,最大长度为 16 位数字,右对齐。
* @param certNo 证书号
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据
* @param publicKey 公钥的 DER 编码
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
String SM2SignC(
String pUserID,
String certNo,
int nOrgDataType,
byte[] publicKey,
byte[] orgData
);
/**
* RSA 私钥签名
* @param HashMark 哈希标识 指示用于哈希证书数据的哈希算法的标识。0: SHA1 1: SHA256 2: MD5。
* @param privateKeyTag 私钥标记 指示私钥位置的标记。数字为存储私钥的索引,除了全9表示使用由命令中提供的密钥。
* 27位的索引号:16位机构号+3位密钥类型+8位密钥索引号
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
byte[] RSASignC(
String privateKeyTag,
int HashMark,
int nOrgDataType,
byte[] orgData);
byte[] RSASign(
String privateKey,
int HashMark,
int nOrgDataType,
byte[] orgData);
/**
* 采用 RSA 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param HashMark 哈希标识
* @param nOrgDataType 签名方式
* @param publicKey 公钥
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean RSAVerify(
int HashMark,
int nOrgDataType,
byte[] publicKey,
byte[] orgData,
byte[] sign);
/**
* sm2验签
* 用户id默认为1234567812345678
*
* @param publicKey 公钥的 DER 编码
* @param orgData 要签名的信息
* @param base64Sign 计算的签名,签名结果R/S序列串先进行der编码,再进行base64编码后的结果
* @return true 验签成功,false 验签失败
*/
boolean SM2Verify(byte[] publicKey, byte[] orgData, String base64Sign);
/**
* 采用 SM2 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param certNo id 用于计算SM3-HASH
* @param nOrgDataType 原始数据类型 0 : hash 1 : 原数据,用1.2.3章节限定符亦可
* @param publicKey 公钥
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean SM2Verify(
String certNo,
int nOrgDataType,
byte[] publicKey,
byte[] orgData,
byte[] sign
);
/**
* SM2 私钥签名
* @param certNo 证书号
* @param orgData 原始数据
* @return 签名的 base64 编码
*/
String SM2SignCustomized(
String certNo,
byte[] orgData
);
/**
* 采用 SM2 算法,用指定的公钥对指定的原始数据进行数字签名验证。
* @param certNo 证书号
* @param orgData 原始数据
* @param sign base64 格式的签名
* @return true 验签通过 false 验签失败
*/
boolean SM2VerifyCustomized(
String certNo,
byte[] orgData,
String sign
);
/**
* 带公钥证书与原始数据的数字签名(遵循 PKCS#7)
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制带公钥证书的数字签名(遵循 PKCS#7)。
*
* @param orgData 待签名数据
* @param sCertDN 证书DN
* @return
* 符合PKCS7标准的签名结果
*/
String attachedSign(byte[] orgData, String sCertDN) throws UnsupportedEncodingException;
byte[] attachedSignC(byte[] orgData, String sCertDN);
/**
* 人行项目需要需要支持RSA
* 带公钥证书与原始数据的数字签名(遵循 PKCS#7)
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制带公钥证书的数字签名(遵循 PKCS#7)。
*
* @param orgData 待签名数据
* @param sCertDN 证书DN
* @return
* 符合PKCS7标准的签名结果
*/
String attachedSignRSA(int rFlag,byte[] orgData, String sCertDN) throws UnsupportedEncodingException;
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return true 验签通过 false 验签失败
*/
boolean attachedVerify(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return true 验签通过 false 验签失败
*/
boolean attachedVerifyRSA(int rFlag,String sign);
boolean attachedVerify(byte[] sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return 成功返回签名的原数据,失败则报错
*/
byte[] attachedVerifyRD(byte[] sign);
byte[] attachedVerifyRD(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
X509 attachedVerifyAndGetX509(byte[] sign);
X509 attachedVerifyAndGetX509(String sign);
/**
* 带公钥证书与原始数据的数字签名验签(遵循 PKCS#7)
* 对指定的原始数据核验其带公钥证书签名。如签名有效(含证书无效)且需返回签名者公钥证书信息时,同时返回签名者公钥证书信息。
*
* @param sign 已签名数据
* @return
* 若发送报文返回证书信息标志位为0,则返回已签名数据,
* 若发送报文返回证书信息标志位为1,则返回CERT_INFO结构的证书数据
*/
RetWrap attachedVerifyAndGetAll(byte[] sign);
}
@@ -1,178 +0,0 @@
package com.sunyard.inf.sva;
import com.sunyard.RetWrap;
import com.sunyard.cert.X509;
/**
* 不带原文的签名验签
*/
public interface SydDetachedSVApi {
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean SYD_DetachedVerify(
byte[] orgData,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String SYD_DetachedSign(
byte[] orgData,
String sCertDN
);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String sm3AndDetachedSign(
byte[] orgData,
String publicKey,
String sCertDN
);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行 sm3 ,然后做 Detach 验签
* @param orgData 待签名的原始数据
* @param publicKey sm3 hash 所用的公钥
* @param sign 签名数据
* @return 验签是否通过
*/
public boolean sm3AndDetachedVerify(
byte[] orgData,
String publicKey,
String sign);
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 待签名的原始数据将在接口内部进行不带公钥的 sm3 ,然后做 Detach 签名
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
String sm3WithoutPKDetachedSign(byte[] orgData, String sCertDN);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 原始数据将在接口内部进行无公钥的 sm3 ,然后做 Detach 验签
*
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean sm3WithoutPKDetachedVerify(byte[] orgData, String sign);
/**
*
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 数据模式,输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 输入的数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public String detachedSign(
int dataType,
byte[] orgData,
String sCertDN
);
/**
* 带公钥证书与签名属性的数字签名(遵循 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 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,
String certificateNo);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 验签是否通过
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
String sign);
/**
* 带公钥证书与签名属性的数字签名验签(遵循 PKCS#7)
* @param dataType 数据类型:0,hash 模式,1为非hash模式
* @param orgData 当为hash模式时,值为hash值,当为非hash模式时,值为数据
* @param sign 已签名数据
* @return 是否正确
*/
boolean detachedVerify(
int dataType,
byte[] orgData,
byte[] sign);
/**
* 对指定的原始数据核验其带公钥证书签名(PKCS#7)返回证书信息
* 数据模式可选 DATA_HASH 或 DATA_ORIGIN
*
* @param dataType 输入的数据为 HASH 后的数据 DATA_HASH = 0 ,输入的数据为原始数据库 DATA_ORIGIN = 1
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @return 证书
*/
X509 detachedVerifyAndGetX509(int dataType,
byte[] orgData,
String 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);
}
@@ -1,32 +0,0 @@
package com.sunyard.inf.sva;
/**
* 不经过 CA 授信
* 直接使用公私钥对签名验签
*/
public interface SydNakedSVApi {
/**
* 使用指定的证书 DN,从加密设备获取对应的私钥证书,对指定的原始数据编制裸签名(遵循 PKCS#1)
* @param orgData 待签名的原始数据
* @param sCertDN 签名者证书 DN
* @return 签名数据
*/
public byte[] SYD_NakedSign(
byte[] orgData,
String sCertDN
);
/**
* 使用指定的证书 DN,对指定的原始数据编制裸验签(遵循PKCS#1)
* @param orgData 待签名的原始数据
* @param sign 签名数据
* @param sCertDN 签名者证书 DN
* @return 验签是否通过
*/
public boolean SYD_NakedVerify(
byte[] orgData,
byte[] sign,
String sCertDN
);
}
@@ -1,5 +1,5 @@
package com.sunyard.log; package com.sunyard.log;
public interface ILogFactory { public interface ILogFactory {
ILogger getLogger(Class cls); ILogger getLogger(Class var1);
} }
+6 -4
View File
@@ -1,11 +1,13 @@
package com.sunyard.log; package com.sunyard.log;
public interface ILogger { public interface ILogger {
int getCurrentLogLevel();
public int getCurrentLogLevel(); void error(String var1, Object... var2);
public void error(String msg, Object ...params); void info(String var1, Object... var2);
public void info(String msg, Object ...params);
public void debug(String msg, Object ...params);
void debug(String var1, Object... var2);
boolean isDebugEnabled();
} }
@@ -1,4 +1,10 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.sunyard.log; package com.sunyard.log;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
@@ -8,110 +14,87 @@ import java.util.concurrent.Executor;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
public class SydLogFactory implements ILogFactory { public class SydLogFactory implements ILogFactory {
// 日期格式
private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); private static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
// 日志目录
public static String pcLogPath = "./sydapi-logs/"; public static String pcLogPath = "./sydapi-logs/";
// 日志名
public static final String logName = "sydapi-log"; public static final String logName = "sydapi-log";
// 日志级别
public static int iLogLevel = 0; public static int iLogLevel = 0;
private static ConcurrentLinkedQueue<SydLogInfo> queue = new ConcurrentLinkedQueue();
// 日志队列
private static ConcurrentLinkedQueue<SydLogInfo> queue = new ConcurrentLinkedQueue<SydLogInfo>();
// 调试标记
public static boolean debug = false; public static boolean debug = false;
// 后台打印进程
private static Executor executor = Executors.newSingleThreadExecutor(); private static Executor executor = Executors.newSingleThreadExecutor();
static { static {
executor.execute(new Runnable() { executor.execute(new Runnable() {
@Override
public void run() { public void run() {
String logFileName = ""; String logFileName = "";
FileOutputStream logFos = null; FileOutputStream logFos = null;
while(true) {
while(true) {
while(true) { while(true) {
try { try {
if (SydLogFactory.queue.isEmpty()) {
if (queue.isEmpty()) { Thread.sleep(500L);
// 释放 CPU } else {
Thread.sleep(500); String mayLogFileName = String.format("%s_%s.log", "sydapi-log", SydLogFactory.format.format(new Date()));
continue;
}
// 有日志
// 确认日期
String mayLogFileName = String.format("%s_%s.log", logName, format.format( new Date()));
if (!logFileName.equals(mayLogFileName)) { if (!logFileName.equals(mayLogFileName)) {
logFileName = mayLogFileName; logFileName = mayLogFileName;
if ( null != logFos ) { if (logFos != null) {
logFos.flush(); logFos.flush();
logFos.close(); logFos.close();
} }
File folder = new File( pcLogPath );
File folder = new File(SydLogFactory.pcLogPath);
if (!folder.exists()) { if (!folder.exists()) {
folder.mkdirs(); folder.mkdirs();
} }
File f = new File( pcLogPath, logFileName ); File f = new File(SydLogFactory.pcLogPath, logFileName);
if (!f.exists()) { if (!f.exists()) {
f.createNewFile(); f.createNewFile();
} }
logFos = new FileOutputStream(f, true); logFos = new FileOutputStream(f, true);
} }
while (!queue.isEmpty()) { while(!SydLogFactory.queue.isEmpty()) {
SydLogInfo info = queue.poll(); SydLogInfo info = (SydLogInfo)SydLogFactory.queue.poll();
logFos.write(String.format("[%d:%s <%s-%d>] %s\r\n", logFos.write(String.format("[%d:%s <%s-%d>] %s\r\n", info.getLevel(), SydLogFactory.format.format(new Date(info.getDatatime())), info.getTname(), info.getTid(), info.getMsg()).getBytes());
info.getLevel(),
format.format( new Date(info.getDatatime()) ),
info.getTname(),
info.getTid(),
info.getMsg()
).getBytes()
);
} }
logFos.flush();
} catch (Exception e) { logFos.flush();
}
} catch (Exception var9) {
Exception e = var9;
e.printStackTrace(); e.printStackTrace();
} finally { } finally {
closeFileOutputStream(logFos); SydLogFactory.closeFileOutputStream(logFos);
logFileName = ""; logFileName = "";
} }
} }
}
}
} }
}); });
} }
private static void closeFileOutputStream(FileOutputStream fos) { private static void closeFileOutputStream(FileOutputStream fos) {
if ( null != fos ) { if (fos != null) {
try { try {
fos.flush(); fos.flush();
}catch (Exception e) { } catch (Exception var2) {
//pass
} }
try { try {
fos.close(); fos.close();
}catch (Exception e) { } catch (Exception var1) {
//pass
} }
} }
} }
private SydLogFactory() { private SydLogFactory() {
} }
@Override
public ILogger getLogger(Class cls) { public ILogger getLogger(Class cls) {
return new SydLogger(queue); return new SydLogger(queue);
} }
+11 -7
View File
@@ -1,5 +1,9 @@
package com.sunyard.log; //
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.sunyard.log;
public class SydLogInfo { public class SydLogInfo {
private int level; private int level;
@@ -19,26 +23,26 @@ public class SydLogInfo {
} }
public int getLevel() { public int getLevel() {
return level; return this.level;
} }
public long getDatatime() { public long getDatatime() {
return datatime; return this.datatime;
} }
public String getTname() { public String getTname() {
return tname; return this.tname;
} }
public long getTid() { public long getTid() {
return tid; return this.tid;
} }
public String getMsg() { public String getMsg() {
return msg; return this.msg;
} }
public Object[] getObjects() { public Object[] getObjects() {
return objects; return this.objects;
} }
} }
+13 -8
View File
@@ -1,36 +1,42 @@
//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by FernFlower decompiler)
//
package com.sunyard.log; package com.sunyard.log;
import java.util.concurrent.ConcurrentLinkedQueue; import java.util.concurrent.ConcurrentLinkedQueue;
public class SydLogger implements ILogger { public class SydLogger implements ILogger {
private ConcurrentLinkedQueue<SydLogInfo> queue; private ConcurrentLinkedQueue<SydLogInfo> queue;
SydLogger(ConcurrentLinkedQueue<SydLogInfo> queue) { SydLogger(ConcurrentLinkedQueue<SydLogInfo> queue) {
this.queue = queue; this.queue = queue;
} }
@Override
public void debug(String msg, Object... params) { public void debug(String msg, Object... params) {
if (SydLogFactory.iLogLevel == 3) { if (SydLogFactory.iLogLevel == 3) {
this.queue.add(new SydLogInfo(3, msg, params)); this.queue.add(new SydLogInfo(3, msg, params));
} else {
return;
} }
} }
@Override
public boolean isDebugEnabled() {
return SydLogFactory.iLogLevel == 3;
}
@Override
public void info(String msg, Object... params) { public void info(String msg, Object... params) {
if (SydLogFactory.iLogLevel >= 2) { if (SydLogFactory.iLogLevel >= 2) {
this.queue.add(new SydLogInfo(2, msg, params)); this.queue.add(new SydLogInfo(2, msg, params));
} else {
return;
} }
} }
@Override
public void error(String msg, Object... params) { public void error(String msg, Object... params) {
if (SydLogFactory.iLogLevel >= 1) { if (SydLogFactory.iLogLevel >= 1) {
this.queue.add(new SydLogInfo(1, msg, params)); this.queue.add(new SydLogInfo(1, msg, params));
} else {
return;
} }
} }
@@ -38,5 +44,4 @@ public class SydLogger implements ILogger{
public int getCurrentLogLevel() { public int getCurrentLogLevel() {
return SydLogFactory.iLogLevel; return SydLogFactory.iLogLevel;
} }
} }
@@ -1,63 +0,0 @@
package com.sunyard.pool;
/**
* 到加密机的链接信息
*/
public class HsmLinkInfo {
private String pcIp;
private int iPort;
private int iConnectTimeOut;
private int iDealTimeOut;
public HsmLinkInfo(String pcIp, int iPort, int iConnectTimeOut, int iDealTimeOut) {
this.pcIp = pcIp;
this.iPort = iPort;
this.iConnectTimeOut = iConnectTimeOut;
this.iDealTimeOut = iDealTimeOut;
}
public static HsmLinkInfo[] mutiHsmLinkInfo(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iAllDealTimeOut) {
if (null == pcIpList &&
null == iPortList &&
pcIpList.length != iPortList.length) {
throw new IllegalArgumentException("入参错误");
}
if ( iAllDealTimeOut < pcIpList.length) {
throw new IllegalArgumentException("入参错误");
}
// 交易时间进行处理
int iDealTimeOut = iAllDealTimeOut / pcIpList.length;
HsmLinkInfo[]hsms = new HsmLinkInfo[ pcIpList.length ];
for ( int i = 0 ; i < pcIpList.length ; i++ ) {
hsms[ i ] = new HsmLinkInfo( pcIpList[i], iPortList[i], iConnectTimeOut, iDealTimeOut );
}
return hsms;
}
public String getPcIp() {
return pcIp;
}
public int getiPort() {
return iPort;
}
public int getiConnectTimeOut() {
return iConnectTimeOut;
}
public int getiDealTimeOut() {
return iDealTimeOut;
}
}
@@ -1,28 +0,0 @@
package com.sunyard.pool;
public class ObjectInPool<T> {
private T object;
private long lasUseAt = System.currentTimeMillis();
public ObjectInPool(T object) {
this.object = object;
}
public T getObjectForCheck() {
return this.object;
}
public void updateLastUseTime(){
this.lasUseAt = System.currentTimeMillis();
}
public T getObject() {
this.lasUseAt = System.currentTimeMillis();
return this.object;
}
public long getLasUseAt() {
return this.lasUseAt;
}
}
@@ -1,26 +0,0 @@
package com.sunyard.pool;
public class PoolConfig {
// 最大空闲时间
private long maxIdle = 5 * 60 *1000; // 5 分钟
// 最大无用时间
private long maxUseless = 30 * 60 * 1000; // 30 分钟
public long getMaxIdle() {
return maxIdle;
}
public void setMaxIdle(long maxIdle) {
this.maxIdle = maxIdle;
}
public long getMaxUseless() {
return maxUseless;
}
public void setMaxUseless(long maxUseless) {
this.maxUseless = maxUseless;
}
}
@@ -1,84 +0,0 @@
package com.sunyard.pool;
import com.sunyard.SydApi;
import com.sunyard.SydApiException;
import com.sunyard.proxy.ProxyInvocationHandler;
import racal.sunyard.main.SydApi4j;
public class SydApiPool extends ThreadBasedConnectPool<SydApi> {
private HsmLinkInfo[] linkInfos;
public SydApiPool(HsmLinkInfo[] linkInfos) {
this.linkInfos = linkInfos;
}
protected SydApi initialValue() {
SydApi4j[] apis = new SydApi4j[this.linkInfos.length];
boolean connected = false;
for(int i = 0; i < apis.length; ++i) {
HsmLinkInfo info = this.linkInfos[i];
try {
apis[i] = (SydApi4j)(new SydApi4j()).connect(info.getPcIp(), info.getiPort(), (String)null, info.getiConnectTimeOut(), info.getiDealTimeOut());
connected = true;
} catch (Exception var6) {
}
}
if (!connected) {
throw new SydApiException("连接错误", -1);
} else {
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler(apis, this.linkInfos, false);
return proxyInvocationHandler.getProxy();
}
}
public boolean check(SydApi s) {
boolean ret = super.check(s);
if (!ret) {
return false;
} else {
ProxyInvocationHandler o = (ProxyInvocationHandler)s.getBindObject();
try {
SydApi4j[] hsms = o.getApis();
boolean canUse = false;
int length = hsms.length;
for(int i = 0; i < length; ++i) {
if (null != hsms[i]) {
try {
synchronized(hsms[i]) {
hsms[i].GenerateRandom(1);
canUse = true;
}
} catch (Exception var12) {
hsms[i] = null;
}
} else {
HsmLinkInfo[] infos = o.getApisInfos();
HsmLinkInfo info = infos[i];
try {
hsms[i] = (SydApi4j)(new SydApi4j()).connect(info.getPcIp(), info.getiPort(), (String)null, info.getiConnectTimeOut(), info.getiDealTimeOut());
canUse = true;
} catch (Exception e) {
}
}
}
return canUse;
} catch (Exception e) {
return false;
}
}
}
protected void free(SydApi o) {
if (null != o) {
o.disconnect();
}
}
}
@@ -1,125 +0,0 @@
package com.sunyard.pool;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
public class ThreadBasedConnectPool<T> {
// ThreadLocal
private final Map<Thread, ObjectInPool<T>> map = new HashMap<Thread, ObjectInPool<T>>();
// 守护
private final ScheduledExecutorService threadPool = Executors.newScheduledThreadPool(1);
// 配置
private PoolConfig config;
public ThreadBasedConnectPool(final PoolConfig config) {
this.config = config;
threadPool.scheduleAtFixedRate(new Runnable() {
@Override
public void run() {
// 检测和回收逻辑
Iterator<Map.Entry<Thread, ObjectInPool<T>>> it = map.entrySet().iterator();
while (it.hasNext()) {
Map.Entry<Thread, ObjectInPool<T>> entry = it.next();
ObjectInPool<T> oip = entry.getValue();
if (System.currentTimeMillis() - oip.getLasUseAt() < config.getMaxIdle()) {
// 空闲时间不足,免检。
continue;
}
if (System.currentTimeMillis() - oip.getLasUseAt() > config.getMaxUseless()) {
// 长时间未使用,回收链接
it.remove();
try {
free(oip.getObject());
} catch (Exception e) {
}
continue;
}
boolean checkPass = false;
try {
checkPass = check(entry.getValue().getObjectForCheck());
} catch (Exception e) {
checkPass = false;
}
finally {
}
if ( ! checkPass) {
// 检查未通过
it.remove();
try {
free(oip.getObject());
} catch (Exception e) {
}
continue;
}
}
}
}, config.getMaxIdle(), config.getMaxIdle(), TimeUnit.MILLISECONDS);
}
public ThreadBasedConnectPool() {
this(new PoolConfig());
}
// 继承 初始化
protected T initialValue() {
return null;
}
// 保活接口
protected boolean check(T o) {
return null != o;
}
// 释放
protected void free(T o) {
}
// 获取
public T get() {
ObjectInPool<T> o = map.get(Thread.currentThread());
if (null != o) {
return o.getObject();
}
return setInitialValue();
}
// 设置
public void set(T o) {
map.put(Thread.currentThread(), new ObjectInPool<T>(o));
}
// 清除
public void remove() {
map.remove(Thread.currentThread());
}
protected void afterInit(ObjectInPool oip, T value ){
}
private T setInitialValue() {
T value = initialValue();
ObjectInPool opi = new ObjectInPool<T>(value);
map.put(Thread.currentThread(), opi);
afterInit( opi , value);
return value;
}
}
@@ -1,165 +0,0 @@
package com.sunyard.proxy;
import com.sunyard.SydApi;
import com.sunyard.SydApiException;
import com.sunyard.log.ILogFactory;
import com.sunyard.log.ILogger;
import com.sunyard.pool.HsmLinkInfo;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiMuti;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
public class ProxyInvocationHandler implements InvocationHandler {
private static Map<String, SydApiException> innerFuncs = new HashMap<String, SydApiException>();
static {
innerFuncs.put("connect", new SydApiException("集群连接模式,不需要该连接", 0));
}
private SydApi4j[] apis;
private HsmLinkInfo[] apisInfos;
private boolean isShortLinkMode = true;
public ProxyInvocationHandler(SydApi4j[] apis) {
this.apis = apis;
}
public ProxyInvocationHandler(SydApi4j[] apis, HsmLinkInfo[] info, boolean isShortLinkMode) {
this.apis = apis;
this.apisInfos = info;
this.isShortLinkMode = isShortLinkMode;
}
public SydApi4j[] getApis() {
return apis;
}
public HsmLinkInfo[] getApisInfos() {
return apisInfos;
}
public SydApi getProxy() {
SydApi api = (SydApi) Proxy.newProxyInstance(
SydApi4j.class.getClassLoader(),
new Class[]{SydApi.class},
this
);
api.setBindObject( this );
return api;
}
public void disconnect() {
if (null != apis && isShortLinkMode) {
for (SydApi4j api4j : this.apis) {
try {
if (null != api4j) {
api4j.disconnect();
}
} catch (Exception e) {
// pass
}
}
}
}
//处理代理实例并返回结果
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
SydApiException le = null;
if ("disconnect".equals(method.getName())) {
this.disconnect();
}
// 屏蔽部分非业务接口
if ("connect".equals(method.getName())) {
throw new RuntimeException("不允许使用此接口");
}
if (innerFuncs.containsKey(method.getName())) {
innerFuncs.get(method.getName());
}
if ("deleteCert".equals(method.getName()) || "SYD_Get_X509_CertInfo_HA".equals(method.getName())) {
for (SydApi4j api : apis) {
if (null == api) {
if ("deleteCert".equals(method.getName())) {
throw new SydApiException("删除失败",56307);
} else {
throw new SydApiException("导入失败",56300);
}
}
try {
Object ret = method.invoke(api, args);
if ( ret instanceof Boolean ) {
if ( ! ( Boolean ) ret ) {
throw new RuntimeException("结果错误");
}
}
} catch (SydApiException e) {
if ("deleteCert".equals(method.getName())) {
throw new SydApiException("删除失败",56307);
} else {
throw new SydApiException("导入失败",56300);
}
}
}
}
for (SydApi4j api : apis) {
if (null == api) {
continue;
}
if ( isShortLinkMode ) {
try {
return method.invoke(api, args);
} catch (SydApiException e) {
le = e;
if (e.getRetCode() < 0) {
continue;
}
throw e;
}
} else {
synchronized (api) {
try {
return method.invoke(api, args);
} catch (SydApiException e) {
le = e;
if (e.getRetCode() < 0) {
continue;
}
throw e;
} catch ( Exception e ) {
ILogFactory factory = SydApi4j.getLogFactory();
if ( null != factory ) {
ILogger logger = factory.getLogger(ProxyInvocationHandler.class);
logger.error( "调用方法 {} 失败", method.getName() );
}
throw e;
}
}
}
}
throw le;
}
}
@@ -1,72 +0,0 @@
package com.sunyard.util;
import cn.hutool.core.bean.BeanUtil;
import com.sunyard.RetWrap;
import com.sunyard.proto.R;
import com.sunyard.proto.Util;
import org.bouncycastle.asn1.*;
import java.io.IOException;
public class ASN1Util {
public static byte[] alignSignDer(byte[] der) {
String base64 = Util.encodeBase64(der);
return SYMUtil.base64SignAsDerSign(base64);
}
public static RetWrap takeOutOriginDataFromPKCS7Sign(String sign) throws IOException {
RetWrap ret = new RetWrap();
ASN1Sequence seq = ASN1Sequence.getInstance( Util.decodeBase64( sign ) );
ASN1TaggedObject tag = (ASN1TaggedObject) seq.getObjectAt(1).toASN1Primitive();
ASN1Sequence seq2 = (ASN1Sequence) tag.getObject();
ASN1Sequence seq3 = null;
try {
seq3 = (ASN1Sequence) seq2.getObjectAt( 2 ).toASN1Primitive();
ASN1TaggedObject tag2 = (ASN1TaggedObject) seq3.getObjectAt( 1 );
DEROctetString o = (DEROctetString) tag2.getObject();
ret.put( "orgData", o.getOctets() );
} catch (Exception e) {
}
ASN1TaggedObject tag3 = (ASN1TaggedObject) seq2.getObjectAt(3).toASN1Primitive();
ASN1Sequence seq4 = (ASN1Sequence) tag3.getObject();
ret.put("cert", CertUtil.encodeBase64(seq4.getEncoded()));
ASN1Sequence seq5 = (ASN1Sequence) seq4.getObjectAt( 0 ).toASN1Primitive();
ASN1Sequence seq6 = (ASN1Sequence) seq5.getObjectAt( 6 ).toASN1Primitive();
DERBitString pk = (DERBitString) seq6.getObjectAt( 1 ).toASN1Primitive();
ret.put("pk", pk.getEncoded() );
ASN1Encodable[] elements = seq3.toArray();
ASN1Encodable[] elements2 = new ASN1Encodable[ elements.length - 1];
for ( int i = 0; i < elements.length -1 ; i++ ){
elements2[i] = elements[i];
}
BeanUtil.setProperty( seq3, "elements", elements2);
ret.put("sign", Util.encodeBase64(seq.getEncoded()) );
return ret;
}
public static String addOriginDataToPKCS7Sign( byte[] originData, String sign) throws IOException {
ASN1Sequence seq = ASN1Sequence.getInstance( Util.decodeBase64( sign ) );
ASN1TaggedObject tag = (ASN1TaggedObject) seq.getObjectAt(1).toASN1Primitive();
ASN1Sequence seq2 = (ASN1Sequence) tag.getObject();
ASN1Sequence seq3 = (ASN1Sequence) seq2.getObjectAt( 2 ).toASN1Primitive();
ASN1Encodable[] elements = seq3.toArray();
ASN1Encodable[] elements2 = new ASN1Encodable[ elements.length + 1];
for ( int i = 0; i < elements.length ; i++ ){
elements2[i] = elements[i];
}
elements2[ elements.length ] = new DERTaggedObject(true, 0, new DEROctetString( originData ));
BeanUtil.setProperty( seq3, "elements", elements2);
return Util.encodeBase64(seq.getEncoded());
}
}
@@ -1,149 +0,0 @@
package com.sunyard.util;
import cn.hutool.core.codec.Base64;
import com.sunyard.RetWrap;
import com.sunyard.SydApiException;
import com.sunyard.constant.CertUsage;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import sun.misc.BASE64Encoder;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.security.NoSuchProviderException;
import java.security.Security;
import java.security.cert.CertificateEncodingException;
import java.security.cert.CertificateException;
import java.security.cert.CertificateFactory;
import java.security.cert.X509Certificate;
import java.util.HashSet;
import java.util.Set;
public class CertUtil {
public static String encodeBase64(byte[] data) {
return new BASE64Encoder().encode(data);
}
static {
Security.addProvider(new BouncyCastleProvider());
}
public static X509Certificate convertToX509Cert(String certificateString) throws CertificateException, NoSuchProviderException {
// X509Certificate certificate = null;
// CertificateFactory cf = null;
// try {
// if (certificateString != null && !certificateString.trim().isEmpty()) {
// certificateString = certificateString.replace("-----BEGIN CERTIFICATE-----\n", "")
// .replace("-----END CERTIFICATE-----", ""); // NEED FOR PEM FORMAT CERT STRING
// byte[] certificateData = Base64.decode(certificateString);
// cf = CertificateFactory.getInstance("X509");
// certificate = (X509Certificate) cf.generateCertificate(new ByteArrayInputStream(certificateData));
// }
// } catch (CertificateException e) {
// throw new CertificateException(e);
// }
// return certificate;
CertificateFactory CF = CertificateFactory.getInstance("X.509", "BC"); // 从证书工厂中获取X.509的单例类
return (X509Certificate) CF.generateCertificate(new ByteArrayInputStream(certificateString.getBytes())); // 将文件流的证书转化为证书类
}
public static String convertToPem(X509Certificate cert) throws CertificateEncodingException {
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
String end_cert = "\n-----END CERTIFICATE-----";
byte[] derCert = cert.getEncoded();
String pemCertPre = new String(Base64.encode(derCert, true));
String pemCert = cert_begin + pemCertPre + end_cert;
return pemCert;
// StringWriter sw = new StringWriter();
// PemWriter pw = new PemWriter(sw);
// try {
// pw.writeObject(new JcaMiscPEMGenerator(cert));
// }catch ( Exception e ) {
// e.printStackTrace();
// }finally {
// if (null == pw) {
// try {
// pw.close();
// } catch (IOException e) {
// e.printStackTrace();
// }
// }
// }
// return sw.toString();
}
/**
* 判断正式是否是国密证书
*
* @param cert 证书 base64 字符
* @return true 国密, false 非国密
*/
public static boolean isSM2Cert(String cert) {
String pemCert;
if(cert.contains("-----BEGIN CERTIFICATE-----")){
pemCert =cert;
}else {
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
String end_cert = "\n-----END CERTIFICATE-----";
pemCert = cert_begin + cert + end_cert;
}
X509Certificate certificate = null;
try {
certificate = convertToX509Cert(pemCert);
} catch (Exception e) {
throw new SydApiException( 0xC101, e );
}
String signAlg = certificate.getSigAlgName();
return signAlg.toUpperCase().indexOf("SM2") >= 0;
}
/**
* 判断 p7 是否是国密证书签的
*
* @param pkcs7 pkcs7
* @return true 国密, false 非国密
*/
public static boolean isSignedBySM2Cert(String pkcs7) throws IOException, CertificateException, NoSuchProviderException {
RetWrap ret = ASN1Util.takeOutOriginDataFromPKCS7Sign(pkcs7);
//return isSM2Cert((String) ret.get("cert"));
String cert =(String) ret.get("cert");
if(cert.contains("-----BEGIN CERTIFICATE-----")){
return isSM2Cert(cert);
}else{
String cert_begin = "-----BEGIN CERTIFICATE-----\n";
String end_cert = "\n-----END CERTIFICATE-----";
String pemCert = cert_begin + cert + end_cert;
return isSM2Cert(pemCert);
}
}
public static boolean certUsageCheck(String cert , CertUsage... us ) throws CertificateException, NoSuchProviderException {
if ( null == us || us.length == 0) {
return true;
}
X509Certificate certificate = convertToX509Cert(cert);
boolean[] usage = certificate.getKeyUsage();
if ( null == usage ) {
return false;
}
boolean checkRet = true;
Set<Integer> uset = new HashSet<Integer>();
for ( CertUsage u : us ) {
uset.add( u.ordinal() );
}
for ( int i = 0; i < usage.length; i++ ) {
if ( usage[ i ] ) {
checkRet &= uset.contains( i );
}
}
return checkRet;
}
}
@@ -1,18 +0,0 @@
package com.sunyard.util;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Properties;
public class Configure {
public static String getKey(String key) throws IOException {
Properties p = new Properties();
InputStream in = new FileInputStream("./sunyard.properties");
InputStreamReader sr = new InputStreamReader(in, "UTF-8");
p.load(sr);
String value = p.getProperty(key).trim();
return value;
}
}
@@ -1,46 +0,0 @@
package com.sunyard.util;
import java.util.LinkedHashMap;
import java.util.List;
public class DnUtil {
public static LinkedHashMap<String, String> dnToMap(String dn) {
LinkedHashMap<String, String> map = new LinkedHashMap<String, String>();
String[] kvs = dn.split(",");
for (String kv : kvs) {
String[] ps = kv.split("=");
map.put(ps[0].trim(), ps[1].trim());
}
return map;
}
public static String verifyDn(String dn) {
if ( "true".equals(System.getProperty("com.sunyard.dnsort", "true"))) {
if (dn.startsWith("C=") || dn.startsWith("c=")) {
return dn;
}
// 反转顺序
String[] kvs = dn.split(",");
StringBuilder sb = new StringBuilder();
for (String kv : kvs) {
if (sb.length() > 0) {
sb.insert(0, ",");
}
sb.insert(0, kv);
// if ( sb.length() > 0 ) {
// sb.append(",");
// }
// sb.append( key + "=" + map.get( key ) );
}
return sb.toString();
}
else return dn;
}
}
@@ -1,139 +0,0 @@
package org.bouncycastle.cms;
import com.sunyard.SydApiException;
import org.bouncycastle.asn1.*;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.asn1.cms.EncryptedContentInfo;
import org.bouncycastle.asn1.cms.OriginatorInfo;
import org.bouncycastle.asn1.x509.AlgorithmIdentifier;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;
public class SydCmsUtil {
public static Object readContentInfo(
byte[] input) {
ASN1InputStream is = new ASN1InputStream(input);
Object v = null;
try {
v = is.readObject();
} catch (IOException e) {
e.printStackTrace();
}
return v;
}
public static Map<String, Object> getEncryptedContentInfo(ASN1Encodable obj){
Map<String, Object>map = new HashMap<String, Object>();
ASN1Sequence seq = ASN1Sequence.getInstance(obj );
if (seq.size() < 2)
{
throw new IllegalArgumentException("Truncated Sequence Found");
}
ASN1ObjectIdentifier contentType = (ASN1ObjectIdentifier)seq.getObjectAt(0);
map.put( "contentType", contentType );
AlgorithmIdentifier contentEncryptionAlgorithm = AlgorithmIdentifier.getInstance(
seq.getObjectAt(1));
map.put( "contentEncryptionAlgorithm", contentEncryptionAlgorithm );
if (seq.size() > 2)
{
ASN1OctetString encryptedContent = ASN1OctetString.getInstance(
(ASN1TaggedObject)seq.getObjectAt(2), false);
map.put( "encryptedContent", encryptedContent );
}
return map;
}
public static Map<String, Object> getOriginatorInfo(ASN1TaggedObject obj,
boolean explicit){
Map<String, Object>map = new HashMap<String, Object>();
ASN1Sequence seq = ASN1Sequence.getInstance(obj, explicit);
switch (seq.size())
{
case 0: // empty
break;
case 1:
ASN1TaggedObject o = (ASN1TaggedObject)seq.getObjectAt(0);
switch (o.getTagNo())
{
case 0 :
ASN1Set certs = ASN1Set.getInstance(o, false);
map.put("certs", certs);
break;
case 1 :
ASN1Set crls = ASN1Set.getInstance(o, false);
map.put("crls", crls);
break;
default:
throw new IllegalArgumentException("Bad tag in OriginatorInfo: " + o.getTagNo());
}
break;
case 2:
ASN1Set certs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(0), false);
map.put("certs", certs);
ASN1Set crls = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(1), false);
map.put("crls", crls);
break;
default:
throw new IllegalArgumentException("OriginatorInfo too big");
}
return map;
}
public static ContentInfo getContentInfo( byte[] input ) {
Object content = readContentInfo( input );
ASN1Sequence seq = ASN1Sequence.getInstance( content );
return new ContentInfo(seq);
}
public static Map<String, Object> readCmsInfo( byte[] input ) throws CMSException {
Map<String, Object>map = new HashMap<String, Object>();
Object content = readContentInfo( input );
ASN1Sequence seq = ASN1Sequence.getInstance( content );
ASN1ObjectIdentifier oid = (ASN1ObjectIdentifier) seq.getObjectAt(0);
map.put("oid", oid);
seq = ASN1Sequence.getInstance((ASN1TaggedObject) seq.getObjectAt(1), true);
int index = 0;
ASN1Integer version = (ASN1Integer)seq.getObjectAt(index++);
map.put( "version", version );
Object tmp = seq.getObjectAt(index++);
if (tmp instanceof ASN1TaggedObject)
{
OriginatorInfo originatorInfo = OriginatorInfo.getInstance((ASN1TaggedObject)tmp, false);
// Map<String, Object>originatorInfo = getOriginatorInfo((ASN1TaggedObject)tmp, false);
map.put( "originatorInfo", originatorInfo );
tmp = seq.getObjectAt(index++);
}
ASN1Set recipientInfos = ASN1Set.getInstance(tmp);
map.put( "recipientInfos", recipientInfos );
EncryptedContentInfo encryptedContentInfo = EncryptedContentInfo.getInstance( seq.getObjectAt(index++) );
// Map<String, Object> encryptedContentInfo = getEncryptedContentInfo(seq.getObjectAt(index++));
map.put( "encryptedContentInfo", encryptedContentInfo );
if(seq.size() > index)
{
ASN1Set unprotectedAttrs = ASN1Set.getInstance((ASN1TaggedObject)seq.getObjectAt(index), false);
map.put( "unprotectedAttrs", unprotectedAttrs );
}
return map;
}
}
@@ -1,45 +0,0 @@
package racal.sunyard.main;
import java.util.ArrayList;
import java.util.List;
public class BytesList {
private List<byte[]> bytes = new ArrayList<byte[]>();
public BytesList(){
}
public BytesList(byte[] b){
this.append( b );
}
public void append( byte[] b ) {
bytes.add( b );
}
public byte[] toBytes(){
int len = 0;
if(1== bytes.size()){
return bytes.get(0);
}
for ( byte[] b : bytes ) {
len += b.length;
}
if ( 0 == len ) {
return new byte[0];
}
byte[] buff = new byte[ len ];
int idx = 0;
for ( byte[] b : bytes ) {
System.arraycopy( b, 0, buff, idx, b.length );
idx += b.length;
}
return buff;
}
}
File diff suppressed because it is too large Load Diff
@@ -1,42 +0,0 @@
package racal.sunyard.main;
import com.sunyard.SydApi;
import com.sunyard.SydApiException;
import com.sunyard.proxy.ProxyInvocationHandler;
public class SydApiClusterBuilder {
public static SydApi SYD_Short_Connect_Ex(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int allDealTimeOut) {
if (pcIpList.length != iPortList.length) {
throw new IllegalArgumentException("ip与端口数量不一致");
}
SydApi4j[] apis = new SydApi4j[pcIpList.length];
int iDealTimeOut = allDealTimeOut / pcIpList.length;
boolean connected = false;
SydApi4j sydApi4j = new SydApi4j();
for (int i = 0; i < pcIpList.length; i++) {
try {
apis[i] = (SydApi4j) sydApi4j.connect(pcIpList[i], iPortList[i], null, iConnectTimeOut, iDealTimeOut);
connected = true;
} catch (Exception e) {
// 忽略错误
// log.error("网络连接错误 {} {} - 忽略", pcIpList[i], iPortList[i]);
}
}
if (!connected) {
// TODO
throw new SydApiException("连接错误", -1);
}
// hsms = apis;
// isShortLinkMode = true;
ProxyInvocationHandler proxyInvocationHandler = new ProxyInvocationHandler(apis);
return proxyInvocationHandler.getProxy();
}
}
@@ -1,4 +0,0 @@
package racal.sunyard.main;
public class SydApiMuti extends SydApi4j {
}
@@ -1,43 +0,0 @@
package racal.sunyard.main;
import com.sunyard.SydApi;
import com.sunyard.pool.HsmLinkInfo;
import com.sunyard.pool.SydApiPool;
public class SydApiPoolBuilder {
private SydApiPool pool;
public SydApiPoolBuilder(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut){
this(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut, true);
}
public SydApiPoolBuilder(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut, boolean warmup) {
HsmLinkInfo[] linkInfo = HsmLinkInfo.mutiHsmLinkInfo(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut);
this.pool = new SydApiPool(linkInfo);
if ( warmup ) {
this.warmUp(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut);
}
}
public SydApi build() {
return (SydApi)this.pool.get();
}
public SydApiPool getPool() {
return pool;
}
private void warmUp(String[] pcIpList, int[] iPortList, int iConnectTimeOut, int iDealTimeOut) {
// SydApi4j api = null;
SydApi api = null;
try {
// api = new SydApi4j();
api = SydApiClusterBuilder.SYD_Short_Connect_Ex(pcIpList, iPortList, iConnectTimeOut, iDealTimeOut);
} catch (Exception e) {
} finally {
if (null != api) {
api.disconnect();
}
}
}
}
@@ -1,69 +0,0 @@
package racal.sunyard.main;
public interface SydHashApiTest {
/**
* 计算SM3散列值
* @param sn 证书序号
* @param userId 用户ID
* @param msg 原始数据,二进制的消息块
* @return
*/
byte[] SM3HashSNaId(String sn, String userId, byte[] msg);
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
* @param publicKey 公钥的 DER 编码(可以为空)
* @param msg 原始数据,二进制的消息块
* @param block 消息块标志
* @param mac 上一轮 mac 值,当 mac 不是 null,长度不为 0,则直接从第二包开始。
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(String publicKey, byte[] msg, int block, byte[] mac);
/**
* 计算SM3散列值
* @param publicKey 公钥的 DER 编码 (03420004 开头)
* @param userId 用户ID
* @param msg 原始数据,二进制的消息块
* @return
*/
byte[] SM3Hash(String publicKey, String userId, byte[] msg);
/**
* 输入对指定的原始数据和公钥,通过 SM3 算法计算数据的散列值。
*
* @param publicKey 公钥(可以为空)
* @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(String publicKey, byte[] msg);
/**
* 输入对指定的原始数据 (无公钥),通过 SM3 算法计算数据的散列值。
*
* @param msg 原始数据
* @return HASH 值,32 个 Bytes.
*/
byte[] SM3Hash(byte[] msg);
public byte[] MACCalc(int alg, int keyType, int fullmode, int maclen, String key, byte[] infoData);
/**
* 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 下有效)
* @return mac 值 hex 格式
*/
public String MACCalc(int alg, int keyType, String AK, int fullMode, byte[] infoData, int macLen);
public void MACCheck(int alg, int keyType, String AK, int fullMode, byte[] infoData, String mac);
public String calcPBOCMAC(int mode, int keyType, String key, byte[] data, int block, byte[] iv);
}
@@ -1,45 +0,0 @@
package com.sunyard.sydapi;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
/**
* 传化签名验签demo
* */
public class ChuanhuaDemo1 {
public static void main(String[] args) {
// 调试模式
System.setProperty("com.sunyard.sydapi4j.debug", "true");
// 建立链接(单台)
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
try {
final String testSN1 = "1004282451";
final String testSN2 = "1004282452";
byte[] testData = "1234567812345678信达雅SUNYARDsunyard".getBytes("UTF-8");
System.out.println("\n\n----- 用指定的证书私钥对指定的数据进行数字签名。 -----");
String signPri = api.netSign(testSN1, testData);
System.out.print("sign : ");
System.out.println(signPri);
// 验签传原始数据
System.out.println("\n\n----- 用指定的证书私钥对指定的数据进行数字验证。 -----");
if (api.netVerify(testSN1, testData, signPri)) {
System.out.println("验证通过");
} else {
System.out.println("验证失败");
}
}catch (Exception e){
e.printStackTrace();
}finally {
api.disconnect();
}
}
}
@@ -1,65 +0,0 @@
package com.sunyard.sydapi;
import com.sunyard.proto.Util;
import org.junit.Assert;
import racal.sunyard.main.SydApi4j;
/**
* 传化国密加解密demo
* */
public class ChuanhuaDemo2 {
/*public static void write(String file, byte[] content) {
try {
File f = new File(file);
if (!f.exists()) {
f.createNewFile();
}
FileOutputStream fos = new FileOutputStream(f);
fos.write(content);
} catch (Exception e) {
System.out.println("写入文件 " + file + " 异常");
}
}*/
public static void main(String[] args){
// 调试模式
System.setProperty("com.sunyard.sydapi4j.debug", "true");
// 建立链接(单台)
// SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000);
try{
// final String testSN1 = "1004282451";//签名
// final String testSN2 = "1004282452";//加密
final String userId = "1747";
byte[] testData = "1234567812345678信达雅SUNYARDsunyard@!#$%^加密s".getBytes("GBK");
String pk = api.SM2GetPublicKeyC(userId, 1);
System.out.println("pk= " + pk);
System.out.println("\n\n----- 用输入的会话密钥,对指定报文数据进行加密处理。 SM2 -----");
String sdata = api.SM2Encrypt(Util.hexString2Bytes(pk), testData);
System.out.println("加密后的数据: " + sdata);
System.out.println("\n\n----- 用输入的会话密钥,对指定报文数据进行解密处理。 SM2 -----");
byte[] data = api.SM2DecryptC(userId, sdata);
Assert.assertArrayEquals(testData, data);
System.out.println("解密后的数据: " + new String(data));
// write("./data.txt",data);
}catch (Exception e){
e.printStackTrace();
}finally {
api.disconnect();
}
}
}
@@ -27,6 +27,11 @@ public class ShangTest {
assert ret; assert ret;
sign = api.SYD_DetachedSign(testData, dn);
ret = api.SYD_DetachedVerify( testData, sign );
assert ret;
} }
public void end(){ public void end(){
@@ -1,75 +0,0 @@
package com.sunyard.sydapi.loadrunner.raw;
/*
* LoadRunner Java script. (Build: _build_number_)
*
* Script Description:
*
*/
import lrapi.lr;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import com.sunyard.proto.Util;
import com.sunyard.SydApi;
public class Actions
{
private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346";
private static String pk ;
private static String sk ;
private SydApi api;
public int init() throws Throwable {
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.123");
api = builder.build();
this.pk = api.SM2GetPublicKeyC("123", 0 );
this.sk = api.SM2GetPrivateKeyC("123");
return 0;
}//end of init
public int action() throws Throwable {
lr.start_transaction("auto");//设置事务开始点
try {
System.out.println("begin SYD_Sign_P1");
byte[] sign = this.api.SM2SignC( 0 , sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
System.out.println("sign=" + Util.bytes2HexString( sign ));
System.out.println("begin SYD_Verify_P1");
boolean pass = api.SM2Verify(1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
System.out.println("验签结果 " + pass);
System.out.println("end SYD_Verify_P1");
} finally {
lr.end_transaction("auto", lr.AUTO);//设置事务结束点
}
return 0;
}//end of action
public int end() throws Throwable {
return 0;
}//end of end
public static void main(String[] args) throws Throwable {
Actions actions = new Actions();
actions.init();
actions.action();
actions.end();
}
}
@@ -1,76 +0,0 @@
package com.sunyard.sydapi.loadrunner.raw_uid;
/*
* LoadRunner Java script. (Build: _build_number_)
*
* Script Description:
*
*/
import lrapi.lr;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import com.sunyard.proto.Util;
import com.sunyard.SydApi;
public class Actions
{
private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346";
private static final String uid = "8765432187654321";
private static String pk ;
private static String sk ;
private SydApi api;
public int init() throws Throwable {
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.1.123");
api = builder.build();
this.pk = api.SM2GetPublicKeyC("123", 0 );
this.sk = api.SM2GetPrivateKeyC("123");
return 0;
}//end of init
public int action() throws Throwable {
lr.start_transaction("auto");//设置事务开始点
try {
System.out.println("begin SYD_Sign_P1");
byte[] sign = this.api.SM2SignC( 0, uid , sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
System.out.println("sign=" + Util.bytes2HexString( sign ));
System.out.println("begin SYD_Verify_P1");
boolean pass = api.SM2Verify( uid, 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
System.out.println("验签结果 " + pass);
System.out.println("end SYD_Verify_P1");
} finally {
lr.end_transaction("auto", lr.AUTO);//设置事务结束点
}
return 0;
}//end of action
public int end() throws Throwable {
return 0;
}//end of end
public static void main(String[] args) throws Throwable {
Actions actions = new Actions();
actions.init();
actions.action();
actions.end();
}
}
@@ -0,0 +1,203 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException;
import static com.sunyard.sydapi.util.PrintUtil.printByteArray;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
/**
* 农行北分海淀支行-军队资金集中收付系统
*/
public class ABCNorthBranch {
SydApi4j api;
// SM2密钥索引
String SM2PrivateKeyTag = "111111111111115100000000001";
// SM2公钥
String SM2PublicKey = null;
// SM2私钥
String SM2PrivateKey = null;
// SM4密钥索引
String SM4PrivateKeyTag = "000000000000000100011111111";
// SM4密钥
String SM4Key = null;
@Before
public void before() {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 5000);
SM2PublicKey = api.SM2GetPublicKeyC(SM2PrivateKeyTag);
SM2PrivateKey = api.SM2GetPrivateKeyC(SM2PrivateKeyTag);
SM4Key = new String((byte[]) api.readKey(SM4PrivateKeyTag).get("key"));
System.out.println("=========================================密钥获取完成=========================================");
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
// A4
@Test
public void testComposeKey() {
String[] strs = {"583034303438393445374238444531323942344646344546393838394535364132", "583934443335443836454631463332313344353543343738323246383744333835"};
RetWrap rw = api.composeKey("000", strs);
printRetWrap(rw);
}
// 测试通过
// 74
@Test
public void testSM2SignC2() {
String thisOrgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2SignC(1, SM2PrivateKeyTag, Util.hexString2Bytes(SM2PublicKey), thisOrgData.getBytes());
System.out.println(s);
}
// 测试通过
// 74
@Test
public void testSM2SignC3() {
String thisOrgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2SignC(0, SM2PrivateKey, Util.hexString2Bytes(SM2PublicKey), thisOrgData.getBytes());
System.out.println(s);
}
// 75
@Test
public void testSM2SignAndVerify() {
String orgData = "11111111111111";
// 这里,不管是签名还是验签,都需要在外部做一次hash。
byte[] hash = api.SM3Hash(SM2PublicKey, orgData.getBytes());
/**
* 用私钥签名(外部私钥)
* @param nOrgDataType 签名数据类型,0 : hash 1 : 原数据
* @param privateKey LMK34-35 下加密的私钥
* @param orgData “签名数据类型”为 0 时:HASH 值。“签名数据类型”为 1 时:要签名的信息
* @return 签名的 base64 编码
*/
String s = api.SM2Sign(SydApi.DATA_HASH, Util.hexString2Bytes(SM2PrivateKey), hash);
// 这里的签名结果已经符合条件了,不需要做转换
System.out.println("签名结果: " + s);
System.out.println("decBase64:" + Util.bytes2HexString(Util.decodeBase64(s)));
/**
* 用指定的公钥对指定的原始数据进行数字签名验证(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 验签是否通过
*/
boolean b = api.SM2Verify(SydApi.DATA_HASH, Util.hexString2Bytes(SM2PublicKey), hash, s);
System.out.println("验签结果: " + b);
}
// 测试通过
// 75
@Test
public void testSM2Verify3() {
String thisOrgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2SignC(1, SM2PrivateKeyTag, Util.hexString2Bytes(SM2PublicKey), thisOrgData.getBytes());
System.out.println(s);
boolean b = api.SM2Verify(Util.hexString2Bytes(SM2PublicKey), thisOrgData.getBytes(), s);
System.out.println(b);
}
// 测试通过
// E0
@Test
public void testSM4EncryptDataCBC() {
String msg = "1111111111111111111111";
byte[] bytes = api.SM4EncryptDataCBC(0, SM4Key, 0, 0, msg.getBytes());
printByteArray(bytes);
}
// 测试通过
// E0
@Test
public void testSM4DecryptDataCBC() {
String msg = "11111111111";
byte[] bytes = api.SM4EncryptDataCBC(0, SM4Key, 0, 0, msg.getBytes());
byte[] bytes1 = api.SM4DecryptDataCBC(0, SM4Key, 0, 0, bytes);
printByteArray(bytes1, false);
}
// 测试通过
// E0
@Test
public void testSM4EncryptFileDataCBC() {
String inFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in1.txt";
String outFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in2.txt";
boolean b = api.SM4EncryptFileDataCBC(0, SM4Key, 0, 0, inFilePath, outFilePath);
System.out.println(b);
}
// 测试通过
// E0
@Test
public void testSM4DecryptFileDataCBC() throws UnsupportedEncodingException {
String outFilePath = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\in2.txt";
String outFilePath2 = "C:\\Users\\edgar\\Desktop\\fsdownload\\test\\out1.txt";
boolean b = api.SM4DecryptFileDataCBC(0, SM4Key, 0, 0, outFilePath, outFilePath2);
System.out.println(b);
}
// LF
@Test
public void testReadKey() {
RetWrap retWrap = api.readKey(SM4PrivateKeyTag);
printRetWrap(retWrap);
}
// QQ
@Test
public void testSM2GetPublicKeyC3() {
String s = api.SM2GetPublicKeyC(SM2PrivateKeyTag);
System.out.println(s);
}
// QP
@Test
public void testSM2GetPrivateKeyC() {
String s = api.SM2GetPrivateKeyC(SM2PrivateKeyTag);
System.out.println(s);
}
}
@@ -1,90 +0,0 @@
package com.sunyard.sydapi.test;
import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;
import com.github.houbb.junitperf.core.rule.JunitPerfRule;
import com.sunyard.RetWrap;
import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Rule;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
public class CertTest {
public static void main(String[] args) {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129", 8889, null, 1000);
try{
List<String>dns = api.getAllCert();
System.out.println(Arrays.toString( dns.toArray() ) );
// String sql=" certtype in (0,2) "; //签名解密
// String sql2=" certtype in (1,3) "; //验签加密
//
// ArrayList<String> m_certs =new ArrayList<String>();
// //查出证书总数,一次次的拿出来
// RetWrap allCert = api.getAllCert(0);
// printRetWrap(allCert);
// Integer allnum = (Integer) allCert.get("certAllNum");//总数
// List<String> certs = (List<String>)allCert.get("certDNs");//部分证书列表
// System.out.println(certs.toString());
// m_certs.addAll(certs);
// int loop = allnum%16;//循环次数
// for (int i = 1; i < loop; i++) {
// RetWrap partCert= api.getAllCert(16*i);
// List<String> partcerts = (List<String>)partCert.get("certDNs");
// m_certs.addAll(partcerts);
// }
// System.out.println("证书:"+m_certs);
// System.out.println("aa"+m_certs.get(20));
}catch (Exception e){
e.printStackTrace();
}finally {
api.disconnect();
}
}
// 测试参数
// private static final int threads = 1;
// private static final long duration = 120000;
// private static final long warmUp = 30000;
//
//
// @Rule
// public JunitPerfRule junitPerfRule = new JunitPerfRule();
// SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.1.129",8889,null,3000);
//
//
// @BeforeClass
// public static void init() throws UnsupportedEncodingException {
// System.out.println("begin");
//
// }
//
//
// @AfterClass
// public static void after() {
// System.out.println("all over");
// }
//
// @Test
// @JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
// public void getAllCert(){
// try {
// api.getAllCert(0);
// } catch (Exception e) {
// e.printStackTrace();
// }
//
// }
}
@@ -1,114 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.proto.Util;
import org.junit.runners.MethodSorters;
import racal.sunyard.main.SydApi4j;
import com.github.houbb.junitperf.core.annotation.JunitPerfConfig;
import com.github.houbb.junitperf.core.rule.JunitPerfRule;
import org.junit.*;
import org.junit.Test;
import java.io.UnsupportedEncodingException;
@FixMethodOrder(MethodSorters.NAME_ASCENDING)
public class P1P7Test {
// 全局配置
private static final String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
// 测试参数
private static final int threads = 1;
private static final long duration = 120000;
private static final long warmUp = 30000;
// 原始数据
private static final byte[] data1k = new byte[ 1024 * 4];
private static final byte[] data1m = new byte[ 1024 * 1024 ];
// 临时数据
private static String pk = null;
private static String dm_1k;
private static String dm_1m = null;
private static byte[] p1sign_1k;
private static byte[] p1sign_1m = null;
private static String p7dsign_1k;
private static String p7dsign_1m = null;
private static String p7asign_1k;
private static String p7asign_1m = null;
@Rule
public JunitPerfRule junitPerfRule = new JunitPerfRule();
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200",8889,null,3000);
@BeforeClass
public static void init() throws UnsupportedEncodingException {
System.out.println("begin");
}
@AfterClass
public static void after() {
System.out.println("all over");
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p1_sign_1k(){
p1sign_1k= api.SYD_NakedSign(data1k, dn);
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p1_verify_1k(){
api.SYD_NakedVerify( data1k, p1sign_1k, dn );
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p7a_sign_1k() throws UnsupportedEncodingException {
p7asign_1k = api.attachedSign(data1k, dn);
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p7a_verify_1k(){
api.attachedVerifyAndGetAll( p7asign_1k );
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p7d_sign_1k(){
p7dsign_1k = api.sm3AndDetachedSign(data1k, pk, dn);
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void p7d_verify_1k(){
api.sm3AndDetachedVerify(data1k, pk, p7dsign_1k );
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void dm_aen_1k() {
dm_1k = String.valueOf(api.generateDEByDn(dn, data1k));
}
@Test
@JunitPerfConfig(threads = threads, warmUp = warmUp, duration = duration)
public void dm_de_1k() {
api.decryptDEByDN(dn, Util.hexString2Bytes(dm_1k));
}
}
@@ -1,73 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.proto.Util;
import com.sunyard.util.ASN1Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
public class RSASignVertify {
private static final String RSADN = "C=cn,O=CFCA TEST CA,OU=CIPSTEST,OU=Units,CN=041@3CIPSCNSHCLR@CN000000129@00000018";
private static final byte[] orgData={1,2,3,4,5,6};
private static final String SM2DN = "C=CN,O=123,OU=23,OU=23,CN=32";
// public p1
// p7attach
// p7detach
public static void main(String[] args) throws IOException {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
//long startTime = System.currentTimeMillis(); //设置系统时间
SydApiBuilder builder = new SydApiBuilder().setIp("172.16.18.59");
SydApi4j api = (SydApi4j) builder.build();
//
// byte[] nakedSign = api.SYD_NakedSign(1,orgData,RSADN);
// System.out.println("nakedSign"+nakedSign);
// byte[] sm2Sign = api.SYD_NakedSign(orgData,SM2DN);
// System.out.println("sm2Sign:"+sm2Sign);
//
// boolean nakedVerify = api.SYD_NakedVerify(1, orgData, nakedSign, RSADN);
// System.out.println(nakedVerify);
// boolean nakedVerify2 = api.SYD_NakedVerify( orgData, sm2Sign, SM2DN);
// System.out.println(nakedVerify2);
// String attachedSign = api.attachedSign(orgData, SM2DN);
// //System.out.println(attachedSign);
// boolean attachedVerify = api.attachedVerify(attachedSign);
// System.out.println(attachedVerify);
//
// String attachedSign2 = api.attachedSign(1,orgData, RSADN);
// String attachedSign3 = api.attachedSign(2,orgData, RSADN);
// String attachedSign4 = api.attachedSign(3,orgData, RSADN);
// System.out.println("签名1:"+attachedSign2);
// System.out.println("签名2:"+attachedSign3);
// System.out.println("签名3:"+attachedSign4);
// boolean attachedVerify2 = api.attachedVerify(attachedSign2);
// RetWrap retWrap = ASN1Util.takeOutOriginDataFromPKCS7Sign(attachedSign2);
// System.out.println(attachedVerify2);
// byte[] orgData = (byte[]) retWrap.get("orgData");
// String cert = (String) retWrap.get("cert");
// System.out.println(Util.bytes2HexString(orgData));
// System.out.println(Util.bytes2HexString(Util.decodeBase64(cert)));
// System.out.println("证书:"+Util.bytes2HexString(Util.encodeBase64(RSADN.getBytes("GBK")).getBytes("GBK")));
String detachedSign = api.detachedSign(1, orgData, SM2DN);
System.out.println(detachedSign);
String detachedSign2 = api.detachedSign(1,0, orgData, RSADN);
System.out.println(detachedSign2);
boolean detachedVerify = api.detachedVerify(1, orgData, detachedSign);
boolean detachedVerify2 = api.detachedVerify(1,0, orgData, detachedSign2);
System.out.println(detachedVerify);
System.out.println(detachedVerify2);
// String RSAsign = api.attachedSign(1, orgData.getBytes("GBK"), RSADN);
}
}
@@ -1,415 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException;
/**
* 上清例子
*/
public class Shanqing {
SydApi4j api;
@Before
public void before() {
// 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 流程演示
*/
@Test
public void testProcess() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[2 * 1024 * 1024];
// 签名
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
// 生成数字信封
RetWrap retWrap = api.generateDEByDn(dn, sign.getBytes());
byte[] cipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
System.out.println("数字信封: " + new String(cipherKey));
// 解密数字信封
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
byte[] oData = (byte[]) retWrap1.get("oData");
System.out.println("原数据: " + retWrap1.get("oData"));
// 验签
RetWrap verify = api.attachedVerifyAndGetAll(oData);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + Util.bytes2HexString((byte[]) (verify.get("oData"))));
}
}
//
// 测试通过
// 73
@Test
public void testSM2ConfirmSessionKeyC() {
String userId = "8012";
byte[] data = "12343242".getBytes();
// 通过用户id获取公钥
String pk = api.SM2GetPublicKeyC(userId, SydApi.FOR_ENCRYPT);
// 生成数字信封
RetWrap retWrap = api.SM2GenSessionKey(pk);
printRetWrap(retWrap);
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
String kcv = (String) retWrap.get(SydApi.RET_KCV);
// 使用生成的对称密钥加密数据
byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data);
// 解密数字信封
RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey);
printRetWrap(retWrap1);
sessionKey = (String) retWrap1.get(SydApi.RET_SESSION_KEY);
kcv = (String) retWrap1.get(SydApi.RET_KCV);
// 使用解密出来的对称密钥解密数据
byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sessionKey, dataEnc);
System.out.println("解密后的数据:" + new String(bytes1));
}
@Test
public void testDetachedSignAndVerify1() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex : " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify2() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
String sign = api.attachedSignSoft(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex: " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify3() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[3 * 1024];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex: " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify8() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[8 * 1024];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex: " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
// 测试通过
// 8018
@Test
public void testAttachedSignAndVerify() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex : " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
}
@Test
public void testAttachedSignAndVerifyGetX509() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
X509 verify = api.attachedVerifyAndGetX509(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey()));
}
@Test
public void testAttachedSignAndVerifyRD() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
byte[] verify = api.attachedVerifyRD(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify));
}
@Test
public void testAttachedSignAndVerifyGetAll() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
@Test
public void testAttachedSignAndVerifyGetAll8k() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[ 8 * 1024 ];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
@Test
public void testAttachedSignAndVerifyGetX509C() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
byte[] sign = api.attachedSignC(orgData, dn);
System.out.println("签名结果: " + sign);
X509 verify = api.attachedVerifyAndGetX509(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey()));
}
@Test
public void testAttachedSignAndVerifyRDC() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
byte[] sign = api.attachedSignC(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
byte[] verify = api.attachedVerifyRD(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify));
}
@Test
public void testAttachedSignAndVerifyGetAllC() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
byte[] sign = api.attachedSignC(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
@Test
public void testDecryptDE54k12() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDnHsm(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDNSoft(dn, new String(CipherKey));
printRetWrap(retWrap1);
byte[] deData = (byte[]) retWrap1.get("oData");
Assert.assertArrayEquals(deData, oData);
}
@Test
public void testDecryptDE54k21() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDNHsm(dn, new String(CipherKey));
printRetWrap(retWrap1);
byte[] deData = (byte[]) retWrap1.get("oData");
Assert.assertArrayEquals(deData, oData);
}
@Test
public void testDecryptDE54k() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE54kr() throws UnsupportedEncodingException {
String dn = "CN=YCCA@黄金交易所@Zhuangj@1,OU=Individual-2,OU=YCCA,O=CFCA OCA1,C=CN";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE520M() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[20 * 1024 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE58k() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[8 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE5() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = "00001111222233".getBytes();
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
// 测试通过
// 76
@Test
public void testSM3Hash() {
String orgData = "FFFFFFFFFFFFFFFF";
byte[] hash = api.SM3Hash(orgData.getBytes());
System.out.println("hash:" + Util.bytes2HexString(hash));
}
// =============================工具方法==============================================
public static void printRetWrap(RetWrap rw) {
printRetWrap(rw, false);
}
/**
* 输出
*
* @param rw
*/
public static void printRetWrap(RetWrap rw, boolean flag) {
for (String s : rw.keySet()) {
Object o = rw.get(s);
if (o instanceof String) {
System.out.println(s + ":" + o);
} else if (o instanceof byte[]) {
if (flag) {
System.out.println(s + ": " + Util.bytes2HexString((byte[]) o));
} else {
System.out.println(s + ": " + new String((byte[]) o));
}
} else {
System.out.println(s + ":" + o);
}
}
}
}
@@ -1,13 +1,14 @@
package com.sunyard.sydapi.test; package com.sunyard.sydapi.test;
import com.sunyard.SydApi; import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util; import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
public class Test74 { public class Test74 {
public static void main(String[] args) { public static void main(String[] args) {
SydApi4j.SYD_Set_Parameter_HA("unkown", "172.16.17.161", 8889, 1000); SydApi4j.SYD_Set_Parameter_HA("unkown", "172.16.17.162", 8889, 1000);
SydApi4j api = (SydApi4j) new SydApi4j(); SydApi4j api = (SydApi4j) new SydApi4j();
@@ -1,32 +0,0 @@
package com.sunyard.sydapi.test;
import racal.sunyard.main.SydApi4j;
public class Test8011 {
private static final String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
// private static final String dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
// private static final String dn = "1004282451";
public static void main(String[] args) {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000);
try {
boolean sign = api.deleteCert(dn);
System.out.println(sign);
} catch (Exception e) {
e.printStackTrace();
} finally {
api.disconnect();
}
}
}
File diff suppressed because it is too large Load Diff
@@ -22,7 +22,7 @@ public class TestBatchData {
List<byte[]> pINdata = new ArrayList<byte[]>(); List<byte[]> pINdata = new ArrayList<byte[]>();
pINdata.add("12345678".getBytes()); pINdata.add("12345678".getBytes());
List<byte[]> datas = api.SYMEncryptDecryptBatchData(0x8, keys, 1, pINdata); // List<byte[]> datas = api.SYMEncryptDecryptBatchData(0x8, keys, 1, pINdata);
// boolean pass = api.SM2Verify( 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign ); // boolean pass = api.SM2Verify( 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
} }
@@ -1,105 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.constant.CertUsage;
import com.sunyard.util.CertUtil;
import org.junit.Assert;
import org.junit.Test;
import java.io.IOException;
import java.io.InputStream;
import java.security.NoSuchProviderException;
import java.security.cert.CertificateException;
public class TestCertUtil {
private static String readCert(String cert){
InputStream is = TestCertUtil.class.getResourceAsStream(cert);
byte[] data = new byte[0];
try {
data = new byte[is.available()];
is.read( data );
} catch (IOException e) {
e.printStackTrace();
}
return new String( data );
}
@Test
public void case1() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.isSM2Cert(readCert("/x509/c1.crt"))
);
}
@Test
public void case2() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.isSM2Cert(readCert("/x509/c2.crt"))
);
}
@Test
public void case3() throws CertificateException, NoSuchProviderException {
CertUtil.isSM2Cert(readCert("/x509/c3.crt"));
}
@Test
public void case4() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.isSM2Cert(readCert("/x509/c4.crt"))
);
}
@Test
public void case5() throws CertificateException, NoSuchProviderException {
Assert.assertFalse(
CertUtil.isSM2Cert(readCert("/x509/c5.crt"))
);
}
@Test
public void case6() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.isSM2Cert(readCert("/x509/c6.crt"))
);
}
@Test
public void certtype1() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.certUsageCheck( readCert("/x509/c1.crt") , CertUsage.digitalSignature , CertUsage.nonRepudiation )
);
}
@Test
public void certtype2() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.certUsageCheck( readCert("/x509/c2.crt") , CertUsage.keyEncipherment )
);
}
@Test
public void certtype4() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.certUsageCheck( readCert("/x509/c4.crt") , CertUsage.keyEncipherment )
);
}
@Test
public void certtype5() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.certUsageCheck( readCert("/x509/c5.crt") )
);
}
@Test
public void certtype6() throws CertificateException, NoSuchProviderException {
Assert.assertTrue(
CertUtil.certUsageCheck( readCert("/x509/c6.crt") , CertUsage.digitalSignature , CertUsage.nonRepudiation)
);
}
}
@@ -1,49 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import org.junit.After;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.util.Arrays;
public class TestE0 {
private SydApi4j api;
private byte[] data = new byte[ 0x501 ];
private byte[] iv = new byte[ 32 ];
@Before
public void before() {
// 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000, 1000, 2);
Arrays.fill( iv, (byte) 0x38 );
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
@Test
public void t1(){
String sessionKeyByLMK = "X12345678123456781234567812345678";
long start = System.currentTimeMillis();
RetWrap retWrap = this.api.SYMEnDeData(true, 1, sessionKeyByLMK, 1, 1, data, iv, 0);
byte[] enData = (byte[]) retWrap.get("msg_all");
retWrap = this.api.SYMEnDeData(false, 1, sessionKeyByLMK, 1, 1, enData, iv, 0);
byte[] oData = (byte[]) retWrap.get("msg_all");
long end = System.currentTimeMillis();
System.out.println( "耗时=" + ( end - start ) );
Assert.assertArrayEquals( oData, data );
}
}
@@ -1,297 +1,297 @@
//package com.sunyard.sydapi.test; package com.sunyard.sydapi.test;
//
//import com.sunyard.RetWrap; import com.sunyard.RetWrap;
//import com.sunyard.SydApi; import com.sunyard.SydApi;
//import com.sunyard.cert.X509; import com.sunyard.cert.X509;
//import com.sunyard.proto.Util; import com.sunyard.proto.Util;
//import org.junit.After; import org.junit.After;
//import org.junit.Before; import org.junit.Before;
//import org.junit.Test; import org.junit.Test;
//import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
//
//import java.io.IOException; import java.io.IOException;
//import java.util.Base64; import java.util.Base64;
//
//import static com.sunyard.sydapi.util.PrintUtil.printRetWrap; import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
//
///** /**
// * 甘肃银行数字货币 * 甘肃银行数字货币
// */ */
//public class TestGSYH { public class TestGSYH {
//
// SydApi4j api; SydApi4j api;
// // 对方加密证书sn // 对方加密证书sn
// String sn = "1004282452"; String sn = "1004282452";
// // 自己签名证书sn // 自己签名证书sn
// String sn1 = "1004282451"; String sn1 = "1004282451";
//
// @Before @Before
// public void before() { public void before() {
// // 通过设置debug的属性开启debug,如果不设置则默认不打开 // 通过设置debug的属性开启debug,如果不设置则默认不打开
// System.setProperty("com.sunyard.sydapi4j.debug", "true"); System.setProperty("com.sunyard.sydapi4j.debug", "true");
// api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000); api = (SydApi4j) new SydApi4j().connect("61.164.40.82", 8889, null, 1000);
//
// } }
//
// @After @After
// public void after() { public void after() {
// try { try {
// this.api.disconnect(); this.api.disconnect();
// } catch (Exception e) { } catch (Exception e) {
// e.printStackTrace(); e.printStackTrace();
// } }
// } }
//
// @Test @Test
// public void test02() { public void test02() {
// Base64.Encoder encoder = Base64.getEncoder(); Base64.Encoder encoder = Base64.getEncoder();
// Base64.Decoder decoder = Base64.getDecoder(); Base64.Decoder decoder = Base64.getDecoder();
//
// // 2. // 2.
// String data = "1111111111111111"; String data = "1111111111111111";
// // 随机生成对称密钥,由指定的公钥加密生成数字信封 // 随机生成对称密钥,由指定的公钥加密生成数字信封
// RetWrap retWrap = api.generateDEbyGS(sn, SydApi.ALG_SM4); RetWrap retWrap = api.generateDEbyGS(sn, SydApi.ALG_SM4);
// String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY); String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
//
// // sm4加密账号等数据 // sm4加密账号等数据
// byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes()); byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes());
// // base64转码 // base64转码
// byte[] dataEncBs64 = encoder.encode(dataEnc); byte[] dataEncBs64 = encoder.encode(dataEnc);
//
// System.out.println("dataEncBs64: " + Util.bytes2HexString(dataEncBs64)); System.out.println("dataEncBs64: " + Util.bytes2HexString(dataEncBs64));
//
// // 将sm2加密后的数据进行base64转码 // 将sm2加密后的数据进行base64转码
// String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY); String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
// byte[] cipherKeyBs64 = encoder.encode(cipherKey.getBytes()); byte[] cipherKeyBs64 = encoder.encode(cipherKey.getBytes());
//
// // 3. // 3.
// // 报文正文 // 报文正文
// String msg = "12313146464564"; String msg = "12313146464564";
// // 对报文正文签名(内部会计算hash) // 对报文正文签名(内部会计算hash)
// String msgSign = api.netGSSign(sn1, msg.getBytes()); String msgSign = api.netGSSign(sn1, msg.getBytes());
// // base64转码 // base64转码
// byte[] msgSignBs64 = encoder.encode(msgSign.getBytes()); byte[] msgSignBs64 = encoder.encode(msgSign.getBytes());
//
//
// // -------------下面为城银清算步骤----------------- // -------------下面为城银清算步骤-----------------
// // 7. // 7.
// // base64解码 // base64解码
// byte[] msgSignB = decoder.decode(msgSignBs64); byte[] msgSignB = decoder.decode(msgSignBs64);
// // 对报文验签 // 对报文验签
// boolean b = api.netGSVerify(sn1, msg.getBytes(), new String(msgSignB)); boolean b = api.netGSVerify(sn1, msg.getBytes(), new String(msgSignB));
// System.out.println("验签结果: " + b); System.out.println("验签结果: " + b);
//
// // 8. // 8.
// byte[] cipherKeyB = decoder.decode(cipherKeyBs64); byte[] cipherKeyB = decoder.decode(cipherKeyBs64);
// // 解密数字信封获取对称密钥 // 解密数字信封获取对称密钥
// RetWrap retWrap1 = api.decryptDE(sn, new String(cipherKeyB)); RetWrap retWrap1 = api.decryptDE(sn, new String(cipherKeyB));
// sessionKey = (String) retWrap1.get(SydApi.RET_SESSION_KEY); sessionKey = (String) retWrap1.get(SydApi.RET_SESSION_KEY);
//
// // 9. // 9.
// // 使用对称密钥解密报文 // 使用对称密钥解密报文
// dataEnc = decoder.decode(dataEncBs64); dataEnc = decoder.decode(dataEncBs64);
// byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sessionKey, dataEnc); byte[] bytes1 = api.SYMDecryptData(SydApi.NALG_SM4, sessionKey, dataEnc);
// System.out.println("data: " + new String(bytes1)); System.out.println("data: " + new String(bytes1));
// } }
//
// // 测试通过 // 测试通过
// // 8017 // 8017
// @Test @Test
// public void testGetX509CertFileBySN() { public void testGetX509CertFileBySN() {
// String sn2 = "3C93000000000025"; String sn2 = "3C93000000000025";
//
// /** /**
// * 通过证书序号 sn 获取的 X509 证书文件。 * 通过证书序号 sn 获取的 X509 证书文件。
// * @param sn sn,证书序号 * @param sn sn,证书序号
// * @param nCertType 证书类型,0:签名证书, 1:加密证书 * @param nCertType 证书类型,0:签名证书, 1:加密证书
// * @return base64 编码的证书 * @return base64 编码的证书
// */ */
// String s = api.GetX509CertFileBySN(sn2, SydApi.FOR_SIGN); String s = api.GetX509CertFileBySN(sn2, SydApi.FOR_SIGN);
// System.out.println(s); System.out.println(s);
//
// /** /**
// * 输入 X509 格式的证书,获取证书信息。 * 输入 X509 格式的证书,获取证书信息。
// * @param pCert base64 编码的证书 * @param pCert base64 编码的证书
// * @return 证书信息类 * @return 证书信息类
// * 证书信息类,包含:颁发者DN、 证书序列号、 证书主题、证书有效期的起始时间、证书有效期的终止时间、DER编码的公钥。 * 证书信息类,包含:颁发者DN、 证书序列号、 证书主题、证书有效期的起始时间、证书有效期的终止时间、DER编码的公钥。
// */ */
// X509 x509 = api.GetX509CertInfo(s); X509 x509 = api.GetX509CertInfo(s);
// System.out.println("证书主题DN: " + x509.getSubject()); System.out.println("证书主题DN: " + x509.getSubject());
// } }
//
//
// @Test @Test
// public void testimportCertAddHT() { public void testimportCertAddHT() {
// String cert1 = "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcNMjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNVBAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNVBAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKREyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arEv0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B/ejZglI="; String cert1 = "MIIB4TCCAYSgAwIBAgIIPJMAAAAAACswDAYIKoEcz1UBg3UFADAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QwHhcNMTcxMTE3MDIzMDUxWhcNMjMwMTI1MDIzMDUxWjBZMQswCQYDVQQGEwJDTjELMAkGA1UECAwCWkoxCzAJBgNVBAcMAkhaMQ4wDAYDVQQKDAVISkpZUzERMA8GA1UECwwIMDAwMDAwMDAxDTALBgNVBAMMBDIyMjIwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAATxqegqlmc/lduzBaKREyeNuPf78RA3wfJuhAv8zymLwQ6doefs1Iul+kMOukhfwY9aEhVdqws34FZMm2vs1+wXo2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFHfjFl72707A6s+YVuGvEuyvFWTMMAwGCCqBHM9VAYN1BQADSQAwRgIhALzg7+QW7RU4phv+4arEv0IOeaA6dtR8VT4Bwin9oHTWAiEA9kLESGiYm8L5Htf7GBXgH+pk7BJ68clml41B/ejZglI=";
//
// String jgh = "00000000"; String jgh = "00000000";
//
// /** /**
// * 上传指定证书到加密设备,并在证书前后加上begin和end * 上传指定证书到加密设备,并在证书前后加上begin和end
// * @param certData 证书的字节数组 * @param certData 证书的字节数组
// * @param organizationId 机构号的字节数组 * @param organizationId 机构号的字节数组
// * @return * @return
// */ */
// RetWrap retWrap = api.importCertAddHT(cert1, jgh.getBytes()); RetWrap retWrap = api.importCertAddHT(cert1, jgh.getBytes());
// System.out.println(retWrap); System.out.println(retWrap);
// } }
//
// // 8012 // 8012
// @Test @Test
// public void testSYD_Get_X509_CertInfo_HA1() { public void testSYD_Get_X509_CertInfo_HA1() {
//
// String orgData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + String orgData = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
// "<Document xmlns=\"urn:cbcc:std:dcep:2020:tech:xsd:ccms.903.001.02\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" + "<Document xmlns=\"urn:cbcc:std:dcep:2020:tech:xsd:ccms.903.001.02\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\">\n" +
// " <CertNtfctn>\n" + " <CertNtfctn>\n" +
// " <GrpHdr>\n" + " <GrpHdr>\n" +
// " <MsgId>20211230001190300000000032001000</MsgId>\n" + " <MsgId>20211230001190300000000032001000</MsgId>\n" +
// " <CreDtTm>2021-12-30T09:27:49</CreDtTm>\n" + " <CreDtTm>2021-12-30T09:27:49</CreDtTm>\n" +
// " <InstgPty>\n" + " <InstgPty>\n" +
// " <InstgDrctPty>G4000131000016</InstgDrctPty>\n" + " <InstgDrctPty>G4000131000016</InstgDrctPty>\n" +
// " </InstgPty>\n" + " </InstgPty>\n" +
// " <InstdPty>\n" + " <InstdPty>\n" +
// " <InstdDrctPty>C1175662000017</InstdDrctPty>\n" + " <InstdDrctPty>C1175662000017</InstdDrctPty>\n" +
// " </InstdPty>\n" + " </InstdPty>\n" +
// " </GrpHdr>\n" + " </GrpHdr>\n" +
// " <CertNtfctnInf>\n" + " <CertNtfctnInf>\n" +
// " <ChgTp>CC00</ChgTp>\n" + " <ChgTp>CC00</ChgTp>\n" +
// " <CertTp>CS01</CertTp>\n" + " <CertTp>CS01</CertTp>\n" +
// " </CertNtfctnInf>\n" + " </CertNtfctnInf>\n" +
// " </CertNtfctn>\n" + " </CertNtfctn>\n" +
// "</Document>"; "</Document>";
//
// String sign = "MIID3QYKKoEcz1UGAQQCAqCCA80wggPJAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICxDCCAsAwggJjoAMCAQICEBAAAAAAAAAAAAAAEEJYBCMwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1" + String sign = "MIID3QYKKoEcz1UGAQQCAqCCA80wggPJAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICxDCCAsAwggJjoAMCAQICEBAAAAAAAAAAAAAAEEJYBCMwDAYIKoEcz1UBg3UFADBcMQswCQYDVQQGEwJDTjEwMC4GA1" +
// "UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjEwMTExMDk1MjI1WhcNMjIwMTExMDk1MjI1WjB2MQswCQYDVQQGEwJjbjEVMBMGA1UECgwMQ0ZDQSBURVNUIENBMQ8wDQYDVQQLDAZDQ0ZDQ0IxF" + "UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIFRFU1QgU00yIE9DQTEwHhcNMjEwMTExMDk1MjI1WhcNMjIwMTExMDk1MjI1WjB2MQswCQYDVQQGEwJjbjEVMBMGA1UECgwMQ0ZDQSBURVNUIENBMQ8wDQYDVQQLDAZDQ0ZDQ0IxF" +
// "DASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQDDCAwNDFAODkwNDI5MDA5OTk5RkRAQ0JDQ0AwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABExU5zuJ3pVl49mS3rTBwUcPuiI/zDR/w117PkpCgJ7m0kGyyorj1h2bxM62PthpNy99KPnk9gEvS696ZE5s8LGjgeowgecw" + "DASBgNVBAsMC0VudGVycHJpc2VzMSkwJwYDVQQDDCAwNDFAODkwNDI5MDA5OTk5RkRAQ0JDQ0AwMDAwMDAwMTBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABExU5zuJ3pVl49mS3rTBwUcPuiI/zDR/w117PkpCgJ7m0kGyyorj1h2bxM62PthpNy99KPnk9gEvS696ZE5s8LGjgeowgecw" +
// "HwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsMTY4NzY" + "HwYDVR0jBBgwFoAUa/4Y2o9COqa4bbMuiIM6NKLBMOEwSAYDVR0gBEEwPzA9BghggRyG7yoBATAxMC8GCCsGAQUFBwIBFiNodHRwOi8vd3d3LmNmY2EuY29tLmNuL3VzL3VzLTE0Lmh0bTA5BgNVHR8EMjAwMC6gLKAqhihodHRwOi8vdWNybC5jZmNhLmNvbS5jbi9TTTIvY3JsMTY4NzY" +
// "uY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUypxjmN7VBcoruhBRWmmFNv9yG1IwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYIKoEcz1UBg3UFAANJADBGAiEA1IQTRQf5aaDJzzVxWLRml1ZSqQd9FPFeKZJnbzGQIQMCIQD/gY5+H1nytcVAx8hGtUPssklmI+9+vTdOF5LaKMR+jzGB3T" + "uY3JsMAsGA1UdDwQEAwID6DAdBgNVHQ4EFgQUypxjmN7VBcoruhBRWmmFNv9yG1IwEwYDVR0lBAwwCgYIKwYBBQUHAwIwDAYIKoEcz1UBg3UFAANJADBGAiEA1IQTRQf5aaDJzzVxWLRml1ZSqQd9FPFeKZJnbzGQIQMCIQD/gY5+H1nytcVAx8hGtUPssklmI+9+vTdOF5LaKMR+jzGB3T" +
// "CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" + "CB2gIBATBwMFwxCzAJBgNVBAYTAkNOMTAwLgYDVQQKDCdDaGluYSBGaW5hbmNpYWwgQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkxGzAZBgNVBAMMEkNGQ0EgVEVTVCBTTTIgT0NBMQIQEAAAAAAAAAAAAAAQQlgEIzAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgXmjY/FIR8" +
// "qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0"; "qudmZGsIQUivZDt3/73dGojVjj5L76OcJICIAHu0G242uYPY2B8zMkGw7kQ1C1xgRipEmlC1GWwMCz0";
//
// /** /**
// * 验签并从签名中获取证书并上载到加密机 * 验签并从签名中获取证书并上载到加密机
// * @param orgData 待签名的原始数据 * @param orgData 待签名的原始数据
// * @param sign 签名数据 * @param sign 签名数据
// * @return 证书信息(包含公钥字段) * @return 证书信息(包含公钥字段)
// */ */
// X509 x509 = api.SYD_Get_X509_CertInfo_HA(orgData.getBytes(), sign); X509 x509 = api.SYD_Get_X509_CertInfo_HA(orgData.getBytes(), sign);
// System.out.println("证书公钥: " + Util.bytes2HexString(x509.getPubKey())); System.out.println("证书公钥: " + Util.bytes2HexString(x509.getPubKey()));
// } }
//
//
// // 测试通过 // 测试通过
// // 78 // 78
// @Test @Test
// public void testSM2DecryptC() { public void testSM2DecryptC() {
// String certId = "1111111111111151"; String certId = "1111111111111151";
// String publicKey = "034200048043AF118B45629857DB693105849B2617FED249D59DFD29BE9A891ADEE7441A2D8C62020953DAEF038184E0244310CF2123C507F26F5380FFECC8D53E79B24E"; String publicKey = "034200048043AF118B45629857DB693105849B2617FED249D59DFD29BE9A891ADEE7441A2D8C62020953DAEF038184E0244310CF2123C507F26F5380FFECC8D53E79B24E";
//
// String orgData = "FFFFFFFFFFFFFFFF"; String orgData = "FFFFFFFFFFFFFFFF";
// String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes()); String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes());
//
// System.out.println("加密后的数据: " + s); System.out.println("加密后的数据: " + s);
// System.out.println("加密后的数据解base64: " + Util.bytes2HexString(Base64.getDecoder().decode(s))); System.out.println("加密后的数据解base64: " + Util.bytes2HexString(Base64.getDecoder().decode(s)));
//
// byte[] bytes = api.SM2DecryptC(certId, s); byte[] bytes = api.SM2DecryptC(certId, s);
//
// System.out.println("decData:" + new String(bytes)); System.out.println("decData:" + new String(bytes));
// } }
//
// // 测试通过 // 测试通过
// // 78 // 78
// @Test @Test
// public void testSM2DecryptOrder2() { public void testSM2DecryptOrder2() {
// String userId = "8015"; String userId = "8015";
// String orgData = "FfffffffffffffFfffffffffffffffff"; String orgData = "FfffffffffffffFfffffffffffffffff";
//
// // 通过用户id获取公钥 // 通过用户id获取公钥
// String publicKey = api.SM2GetPublicKeyC(userId, SydApi.FOR_SIGN); String publicKey = api.SM2GetPublicKeyC(userId, SydApi.FOR_SIGN);
//
// /** /**
// * 用指定的 SM2 公钥对指定的密文数据进行加密。 * 用指定的 SM2 公钥对指定的密文数据进行加密。
// * 输出的sm2密文结构为C1C2C3格式 * 输出的sm2密文结构为C1C2C3格式
// * @param publicKey 公钥钥串,DER 编码,HEX 格式。 * @param publicKey 公钥钥串,DER 编码,HEX 格式。
// * @param pOrgData 加密的数据。 * @param pOrgData 加密的数据。
// * @return 加密的数据 base64 编码。 * @return 加密的数据 base64 编码。
// */ */
// String s = api.SM2EncryptOrder(Util.hexString2Bytes(publicKey), orgData.getBytes()); String s = api.SM2EncryptOrder(Util.hexString2Bytes(publicKey), orgData.getBytes());
//
// System.out.println("加密后的数据: " + s); System.out.println("加密后的数据: " + s);
//
// /** /**
// * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。 * 通过使用者 ID 所对应的私钥对指定的密文数据进行解密。
// * 输入的sm2密文结构为C1C2C3格式 * 输入的sm2密文结构为C1C2C3格式
// * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。 * @param userId 使用者的 ID,最大长度为 16 位数字,右对齐。
// * @param enData 加密的数据,base64 编码。 * @param enData 加密的数据,base64 编码。
// * @param keyType 密钥类型,0:签名证书, 1:加密证书。 * @param keyType 密钥类型,0:签名证书, 1:加密证书。
// * @return 明文数据。 * @return 明文数据。
// */ */
// byte[] bytes = api.SM2DecryptOrder(userId, s, SydApi.FOR_SIGN); byte[] bytes = api.SM2DecryptOrder(userId, s, SydApi.FOR_SIGN);
//
// System.out.println("decData:" + new String(bytes)); System.out.println("decData:" + new String(bytes));
// } }
//
// @Test @Test
// public void testDecryptDE4() { public void testDecryptDE4() {
// String sn = "1004282452"; String sn = "1004282452";
// String orgCode = "00001111222233"; String orgCode = "00001111222233";
//
// /** /**
// * 产生对称密钥,通过公钥加密生成网联格式的数字信封。 * 产生对称密钥,通过公钥加密生成网联格式的数字信封。
// * *
// * @param certSerial 对*方 X509 证书的序列号。 * @param certSerial 对*方 X509 证书的序列号。
// * @param orgCode 机构码 * @param orgCode 机构码
// * @return RetWrap 包含 CipherKey, SessionKey, KCV * @return RetWrap 包含 CipherKey, SessionKey, KCV
// * CipherKey 公钥加密的会话密钥 ,BASE64 编码 * CipherKey 公钥加密的会话密钥 ,BASE64 编码
// * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。 * SessionKey 本地LMK 加密的会话密钥,HEX 格式, 本地 LMK 加密的会话密钥长度,HEX 格式(不包括第 1 个字符),一般为 33 个 Bytes。默认输入值为缓冲区的大小。
// * KCV 会话密钥的检验值,HEX 格式,长度为 32H。 * KCV 会话密钥的检验值,HEX 格式,长度为 32H。
// */ */
// RetWrap retWrap = api.generateDEbyGS(sn, orgCode); RetWrap retWrap = api.generateDEbyGS(sn, orgCode);
// String CipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY); String CipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
// String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY); String sessionKey = (String) retWrap.get(SydApi.RET_SESSION_KEY);
// String kcv = (String) retWrap.get(SydApi.RET_KCV); String kcv = (String) retWrap.get(SydApi.RET_KCV);
// printRetWrap(retWrap); printRetWrap(retWrap);
//
// /** /**
// * 接收用私钥解密数字信封,还原对称密钥。 * 接收用私钥解密数字信封,还原对称密钥。
// * *
// * @param pCertSerial 输入。 对方 X509 证书的序列号。 * @param pCertSerial 输入。 对方 X509 证书的序列号。
// * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码 * @param pCipherKey 输入。 公钥加密的会话密钥,BASE64 编码
// * @return RetWrap 包含 SessionKey KCV * @return RetWrap 包含 SessionKey KCV
// * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文 * SessionKey 输出。 本地LMK 加密的会话密钥,格式为:密钥类型|密钥密文,比如:02|密钥密文
// * KCV 会话密钥的检验值,HEX 格式,长度为 36H。 * KCV 会话密钥的检验值,HEX 格式,长度为 36H。
// * orgCode 如果有机构码的话会返回机构码 * orgCode 如果有机构码的话会返回机构码
// */ */
// RetWrap retWrap1 = api.decryptDE(sn, CipherKey); RetWrap retWrap1 = api.decryptDE(sn, CipherKey);
// printRetWrap(retWrap1); printRetWrap(retWrap1);
// } }
//
//
// // =========================工具方法===================== // =========================工具方法=====================
//
// public static void printRetWrap(RetWrap rw) { public static void printRetWrap(RetWrap rw) {
// printRetWrap(rw, false); printRetWrap(rw, false);
// } }
//
// /** /**
// * 输出 * 输出
// * @param rw * @param rw
// */ */
// public static void printRetWrap(RetWrap rw, boolean flag) { public static void printRetWrap(RetWrap rw, boolean flag) {
// for (String s : rw.keySet()) { for (String s : rw.keySet()) {
//
// Object o = rw.get(s); Object o = rw.get(s);
// if (o instanceof String) { if (o instanceof String) {
// System.out.println(s + ":" + o); System.out.println(s + ":" + o);
// } else if (o instanceof byte[]) { } else if (o instanceof byte[]) {
// if (flag) { if (flag) {
// System.out.println(s + ": " + Util.bytes2HexString((byte[]) o)); System.out.println(s + ": " + Util.bytes2HexString((byte[]) o));
// } else { } else {
// System.out.println(s + ": " + new String((byte[]) o)); System.out.println(s + ": " + new String((byte[]) o));
// } }
// } else { } else {
// System.out.println(s + ":" + o); System.out.println(s + ":" + o);
// } }
// } }
// } }
//} }
+49 -253
View File
@@ -5,13 +5,14 @@ import com.sunyard.SydApi;
import com.sunyard.cert.X509; import com.sunyard.cert.X509;
import com.sunyard.proto.Util; import com.sunyard.proto.Util;
import org.junit.After; import org.junit.After;
import org.junit.Assert;
import org.junit.Before; import org.junit.Before;
import org.junit.Test; import org.junit.Test;
import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException; import java.io.UnsupportedEncodingException;
import java.util.Base64;
import static com.sunyard.sydapi.util.PrintUtil.printRetWrap;
/** /**
* 衡泰例子 * 衡泰例子
@@ -25,6 +26,7 @@ public class TestHT {
// 通过设置debug的属性开启debug,如果不设置则默认不打开 // 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true"); System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000);
// api = (SydApi4j) new SydApi4j().connect("192.168.0.66", 8889, null, 1000);
} }
@After @After
@@ -36,36 +38,6 @@ public class TestHT {
} }
} }
/**
* 流程演示
*/
@Test
public void testProcess() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[2 * 1024 * 1024];
// 签名
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
// 生成数字信封
RetWrap retWrap = api.generateDEByDn(dn, sign.getBytes());
byte[] cipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
System.out.println("数字信封: " + new String(cipherKey));
// 解密数字信封
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
byte[] oData = (byte[]) retWrap1.get("oData");
System.out.println("原数据: " + retWrap1.get("oData"));
// 验签
RetWrap verify = api.attachedVerifyAndGetAll(oData);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + Util.bytes2HexString((byte[]) (verify.get("oData"))));
}
}
// //
// 测试通过 // 测试通过
@@ -73,8 +45,8 @@ public class TestHT {
@Test @Test
public void testSM2ConfirmSessionKeyC() { public void testSM2ConfirmSessionKeyC() {
String userId = "8012"; String userId = "1111111111111151";
byte[] data = "12343242".getBytes(); String data = "12343242";
// 通过用户id获取公钥 // 通过用户id获取公钥
String pk = api.SM2GetPublicKeyC(userId, SydApi.FOR_ENCRYPT); String pk = api.SM2GetPublicKeyC(userId, SydApi.FOR_ENCRYPT);
@@ -87,7 +59,7 @@ public class TestHT {
String kcv = (String) retWrap.get(SydApi.RET_KCV); String kcv = (String) retWrap.get(SydApi.RET_KCV);
// 使用生成的对称密钥加密数据 // 使用生成的对称密钥加密数据
byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data); byte[] dataEnc = api.SYMEncryptData(SydApi.NALG_SM4, sessionKey, data.getBytes());
// 解密数字信封 // 解密数字信封
RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey); RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey);
@@ -100,66 +72,6 @@ public class TestHT {
System.out.println("解密后的数据:" + new String(bytes1)); System.out.println("解密后的数据:" + new String(bytes1));
} }
@Test
public void testDetachedSignAndVerify1() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
String sign = api.detachedSign(1, orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex : " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.detachedVerify(1, orgData.getBytes(), sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify2() throws UnsupportedEncodingException {
// Dn 反转问题
String dn = "CN=YCCA@黄金交易所@Zhuangj@1,OU=Individual-2,OU=YCCA,O=CFCA OCA1,C=CN";
String orgData = "111111213323143243243";
String sign = api.detachedSign(1, orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex : " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.detachedVerify(1, orgData.getBytes(), sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify3() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[3 * 1024];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex: " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
@Test
public void testDetachedSignAndVerify8() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[8 * 1024];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex: " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify);
Assert.assertTrue(verify);
}
// 测试通过 // 测试通过
// 8018 // 8018
@Test @Test
@@ -168,7 +80,6 @@ public class TestHT {
String orgData = "111111213323143243243"; String orgData = "111111213323143243243";
String sign = api.attachedSign(orgData.getBytes(), dn); String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign); System.out.println("签名结果: " + sign);
System.out.println("签名结果 hex : " + Util.bytes2HexString(Util.decodeBase64(sign)));
boolean verify = api.attachedVerify(sign); boolean verify = api.attachedVerify(sign);
System.out.println("验签结果: " + verify); System.out.println("验签结果: " + verify);
@@ -177,11 +88,10 @@ public class TestHT {
@Test @Test
public void testAttachedSignAndVerifyGetX509() { public void testAttachedSignAndVerifyGetX509() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes(); String orgData = "111111213323143243243";
String sign = api.attachedSign(orgData, dn); String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign); System.out.println("签名结果: " + sign);
X509 verify = api.attachedVerifyAndGetX509(sign); X509 verify = api.attachedVerifyAndGetX509(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey())); System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey()));
} }
@@ -193,69 +103,17 @@ public class TestHT {
String sign = api.attachedSign(orgData.getBytes(), dn); String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign); System.out.println("签名结果: " + sign);
byte[] verify = api.attachedVerifyRD(sign); String verify = api.attachedVerifyRD(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify)); System.out.println("验签结果: " + verify);
} }
@Test @Test
public void testAttachedSignAndVerifyGetAll() { public void testAttachedSignAndVerifyGetAll() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
@Test
public void testAttachedSignAndVerifyGetAll8k() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = new byte[ 8 * 1024 ];
String sign = api.attachedSign(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509) verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
@Test
public void testAttachedSignAndVerifyGetX509C() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
byte[] sign = api.attachedSignC(orgData, dn);
System.out.println("签名结果: " + sign);
X509 verify = api.attachedVerifyAndGetX509(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify.getPubKey()));
}
@Test
public void testAttachedSignAndVerifyRDC() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243"; String orgData = "111111213323143243243";
byte[] sign = api.attachedSignC(orgData.getBytes(), dn); String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign); System.out.println("签名结果: " + sign);
byte[] verify = api.attachedVerifyRD(sign);
System.out.println("验签结果: " + Util.bytes2HexString(verify));
}
@Test
public void testAttachedSignAndVerifyGetAllC() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] orgData = "111111213323143243243".getBytes();
byte[] sign = api.attachedSignC(orgData, dn);
System.out.println("签名结果: " + sign);
RetWrap verify = api.attachedVerifyAndGetAll(sign); RetWrap verify = api.attachedVerifyAndGetAll(sign);
if (verify != null) { if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509)verify.get("x509")).getPubKey())); System.out.println("x509公钥: " + Util.bytes2HexString(((X509)verify.get("x509")).getPubKey()));
@@ -263,113 +121,49 @@ public class TestHT {
} }
} }
@Test
public void testDecryptDE54k12() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDnHsm(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDNSoft(dn, new String(CipherKey));
printRetWrap(retWrap1);
byte[] deData = (byte[]) retWrap1.get("oData");
Assert.assertArrayEquals(deData, oData);
}
@Test
public void testDecryptDE54k21() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDNHsm(dn, new String(CipherKey));
printRetWrap(retWrap1);
byte[] deData = (byte[]) retWrap1.get("oData");
Assert.assertArrayEquals(deData, oData);
}
@Test
public void testDecryptDE54k() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE54kr() throws UnsupportedEncodingException {
String dn = "CN=YCCA@黄金交易所@Zhuangj@1,OU=Individual-2,OU=YCCA,O=CFCA OCA1,C=CN";
byte[] oData = new byte[4 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE520M() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[20 * 1024 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test
public void testDecryptDE58k() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = new byte[8 * 1024];
RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey);
printRetWrap(retWrap1);
}
@Test @Test
public void testDecryptDE5() throws UnsupportedEncodingException { public void testDecryptDE5() throws UnsupportedEncodingException {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1"; String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
byte[] oData = "00001111222233".getBytes(); String oData = "00001111222233";
RetWrap retWrap = api.generateDEByDn(dn, oData); RetWrap retWrap = api.generateDEByDn(dn, oData);
byte[] CipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY); String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
byte[] sessionKey = (byte[]) retWrap.get(SydApi.RET_SESSION_KEY); System.out.println("数字信封: " + cipherKey);
printRetWrap(retWrap);
RetWrap retWrap1 = api.decryptDEByDN(dn, CipherKey); RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
printRetWrap(retWrap1); System.out.println("原数据: " + retWrap1.get("oData"));
} }
/**
* 流程演示
*/
@Test
public void testProcess() {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String orgData = "111111213323143243243";
// 签名
String sign = api.attachedSign(orgData.getBytes(), dn);
System.out.println("签名结果: " + sign);
// 生成数字信封
RetWrap retWrap = api.generateDEByDn(dn, sign);
String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
System.out.println("数字信封: " + cipherKey);
// 解密数字信封
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
String oData = (String) retWrap1.get("oData");
System.out.println("原数据: " + retWrap1.get("oData"));
// 验签
RetWrap verify = api.attachedVerifyAndGetAll(oData);
if (verify != null) {
System.out.println("x509公钥: " + Util.bytes2HexString(((X509)verify.get("x509")).getPubKey()));
System.out.println("签名原数据: " + verify.get("oData"));
}
}
// 测试通过 // 测试通过
// 76 // 76
@@ -391,7 +185,6 @@ public class TestHT {
/** /**
* 输出 * 输出
*
* @param rw * @param rw
*/ */
public static void printRetWrap(RetWrap rw, boolean flag) { public static void printRetWrap(RetWrap rw, boolean flag) {
@@ -411,4 +204,7 @@ public class TestHT {
} }
} }
} }
} }
@@ -1,121 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class TestICBC {
public static void main(String[] args) throws UnsupportedEncodingException {
SydApi4j.SYD_Set_Parameter_HA("unkown", "172.16.17.162", 8889 , 1000);
SydApi4j api = (SydApi4j) new SydApi4j();//.connect("wuyong.fullstack.club" , 8889, null,1000);
RetWrap r = api.SYD_SM2GenKeyPair();
System.out.println( r.get("publicKey") );
System.out.println( r.get("privateKey") );
// System.out.println("\n\n----- 获取公钥 () -----");
// String pk = api.SYD_SM2_Get_Id_PublicKey_HA("1234", 0);
// System.out.print("\r\n公钥 : ");
// System.out.println( pk );
//
//
//// pk = api.SYD_SM2_Get_Dn_PublicKey_HA("C=CN,O=Sunyard,OU=8001,CN=8001".getBytes("GBK"), 0);
//// System.out.print("\r\n公钥 : ");
//// System.out.println( pk );
//
//
// // 签名
String data="MainBody><MsgId><Id>101557000040870201809190000000001</Id><CreDtTm>2018-09-19T10:13:39</CreDtTm></MsgId><Qryr><MbrId>101557</MbrId><BrId>000040870</BrId></Qryr><Rspnr><MbrId>201597</MbrId><BrId>000039754</BrId></Rspnr><BizQryInf><QryDt>2018-09-19</QryDt><QryId>00000001</QryId><Cnts>123456,测试</Cnts></BizQryInf></MainBody>";
final String testPubKey = "0342000480C7E165DB8CF019509CE359C4FE06535275F5F63ADDC3955721FA4802BDC8701661554096BBC190916F39073C3763C8BEF6ABDF7A042C9F1D12B6BD6E5E2614";
// System.out.println("\n\n----- SM2 算法签名 (原始数据) -----");
// String sign = api.SYD_SM2_Sign_HA(
// "1234",
// SydApi.DATA_ORIGIN,
// Util.hexString2Bytes(testPubKey),
// data.getBytes()
// );
// System.out.print("\n\n----- SM2 算法签名 结果: ");
// System.out.println( sign );
//
//
//
//
//
// System.out.println("\n\n----- SM2 算法验签 (原始数据) -----");
// boolean SM2VerifyRet = api.SYD_SM2_Verify_HA(
// SydApi.DATA_ORIGIN,
// Util.hexString2Bytes(testPubKey), data.getBytes() , sign);
// if (SM2VerifyRet){
// System.out.println("验签通过");
// }else{
// System.err.println("验签失败");
// throw new RuntimeException("验签失败");
// }
// // 签名验签 2
// System.out.println("\n\n----- 签名验签 2 -----");
// String sign2 = api.SYD_SM2_DetachedSign_HA( data.getBytes() , "C=CN,O=Sunyard,OU=8001,CN=8001");
// System.out.println( sign2 );
// String sign2 = "MIICpQYKKoEcz1UGAQQCAqCCApUwggKRAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIByTCCAcUwggFooAMCAQICCDyTAAAAAAAlMAwGCCqBHM9VAYN1BQAwJjELMAkGA1UEBhMCQ04xFzAVBgNVBAMMDlN1bnlhcmRTTTJSb290MB4XDTE3MDUxNzAyNTI0NFoXDTIyMDcyNTAyNTI0NFowPTELMAkGA1UEBhMCQ04xEDAOBgNVBAoMB1N1bnlhcmQxDTALBgNVBAsMBDgwMDExDTALBgNVBAMMBDgwMDEwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAAQ+2joQe3zDXMAFx/vwu05rQ6B+4U42BgPSLsoqYAstD6AwVdQA0SQDAPVGSLhJ0T9QszD/FDUbVkWxNoaCCmW7o2cwZTAOBgNVHQ8BAf8EBAMCAMAwEwYDVR0lBAwwCgYIKwYBBQUHAwEwHwYDVR0jBBgwFoAU93/arv8hxtk6eq2g+6z+AqVO1cEwHQYDVR0OBBYEFAMWZaY2AwaQTNiFLpsa0dyCzBZ6MAwGCCqBHM9VAYN1BQADSQAwRgIhAIl2ZHGfln5hedcousARzZ2yeUjUbxSFMmhMmr5t6Q6nAiEAvqYX/KpIcvnPyB/Yiil+oq6DFdVM6P3vDxBhU/8taXExgaAwgZ0CAQEwMjAmMQswCQYDVQQGEwJDTjEXMBUGA1UEAwwOU3VueWFyZFNNMlJvb3QCCDyTAAAAAAAlMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAERzBFAiATwLIYiylt7xHmBkH6EclrchClxzLlKWC5guxxzkr58gIhANSw+owu8cyypdJtHGrGqjSiB1BVzGva+irUHelx/GbC";
// sign2 = "MIID7gYKKoEcz1UGAQQCAqCCA94wggPaAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIC2jCCAtYwggJ6oAMCAQICBUACgAF0MAwGCCqBHM9VAYN1BQAwYTELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEgMB4GA1UEAwwXQ0ZDQSBBQ1MgVEVTVCBTTTIgT0NBMzEwHhcNMTcxMTE2MDY1NDQ1WhcNMjIxMTE2MDY1NDQ1WjCBgzELMAkGA1UEBhMCQ04xHDAaBgNVBAoME0NGQ0EgVEVTVCBTTTIgT0NBMzExDjAMBgNVBAsMBVNIQ1BFMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMSswKQYDVQQDDCIwNTFA5LiK5rW356Wo5o2u5Lqk5piT5omAQEFBQUFBQUA4MFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEYPA9UQRL/ZaThEN0nc3SwkOHw4hPDXG9hZeKiBnNdhgPy1EtX4My2bpNFpYMmQ0nvkJUM4qpJrF7MSqEws6rLaOB+TCB9jA/BggrBgEFBQcBAQQzMDEwLwYIKwYBBQUHMAGGI2h0dHA6Ly9vY3NwdGVzdC5jZmNhLmNvbS5jbjo4MC9vY3NwMB8GA1UdIwQYMBaAFATHvPlZAWk+jDQ2IGIYPN68tbsMMAwGA1UdEwEB/wQCMAAwNgYDVR0fBC8wLTAroCmgJ4YlaHR0cDovLzIxMC43NC40Mi4zL09DQTMxL1NNMi9jcmwxLmNybDAOBgNVHQ8BAf8EBAMCBsAwHQYDVR0OBBYEFKJnS7XYRDWG9eqXtSzUZXK+De2/MB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCIGaSRoaUSpoH4lW3at1ABluiNwFDH21jHesHmy0F5gjqAiEA0sUykW9E36F3qQ91YDvasQg8EnOMp1idhgt6pq/NUAYxgdgwgdUCAQEwajBhMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MSAwHgYDVQQDDBdDRkNBIEFDUyBURVNUIFNNMiBPQ0EzMQIFQAKAAXQwDAYIKoEcz1UBgxEFADANBgkqgRzPVQGCLQEFAARHMEUCIQDH3ePzq4nYJ8pAodJyqPKqCQuQwmOpyj/rWcDILzFj2gIgUW5c9W6jD7u91opMcDwaw4aNEvEtGX6ks5XDIMIkUjI=";
//
//
//
// boolean pass = api.SYD_SM2_DetachedVerify_HA( "<MainBody><MsgId><Id>000000000000000201809181000008627</Id><CreDtTm>2018-09-17T19:06:39</CreDtTm></MsgId><CertNtfctnInf><ChngTp>CC00</ChngTp></CertNtfctnInf></MainBody>".getBytes(), sign2 );
// System.out.println( pass );
//
// // 获取公钥
// X509 x = api.SYD_Get_X509_CertInfo_HA( "<MainBody><MsgId><Id>000000000000000201809181000008627</Id><CreDtTm>2018-09-17T19:06:39</CreDtTm></MsgId><CertNtfctnInf><ChngTp>CC00</ChngTp></CertNtfctnInf></MainBody>".getBytes(), sign2 );
// System.out.println( Util.bytes2HexString( x.getPubKey() ) );
byte[]ttt = new byte[40960];
Arrays.fill(ttt, (byte) 0x88);
String sign2 = api.SYD_SM2_Sign_HA(
"1234",
SydApi.DATA_HASH,
Util.hexString2Bytes("0342000480C7E165DB8CF019509CE359C4FE06535275F5F63ADDC3955721FA4802BDC8701661554096BBC190916F39073C3763C8BEF6ABDF7A042C9F1D12B6BD6E5E2614"),
ttt
);
System.out.print("\n\n----- SM2 算法签名 结果: ");
System.out.println( sign2 );
System.out.println( api.SYD_SM2_Verify_HA(
SydApi.DATA_HASH,
Util.hexString2Bytes("0342000480C7E165DB8CF019509CE359C4FE06535275F5F63ADDC3955721FA4802BDC8701661554096BBC190916F39073C3763C8BEF6ABDF7A042C9F1D12B6BD6E5E2614"),
ttt ,
sign2
) );
String sign3 = api.SYD_SM2_Sign_HA(
"1234",
SydApi.DATA_ORIGIN,
Util.hexString2Bytes("0342000480C7E165DB8CF019509CE359C4FE06535275F5F63ADDC3955721FA4802BDC8701661554096BBC190916F39073C3763C8BEF6ABDF7A042C9F1D12B6BD6E5E2614"),
"<MainBody><MsgId><Id>101557000040870201809190000000001</Id><CreDtTm>2018-09-19T10:13:39</CreDtTm></MsgId><Qryr><MbrId>101557</MbrId><BrId>000040870</BrId></Qryr><Rspnr><MbrId>201597</MbrId><BrId>000039754</BrId></Rspnr><BizQryInf><QryDt>2018-09-19</QryDt><QryId>00000001</QryId><Cnts>123456,测试</Cnts></BizQryInf></MainBody>".getBytes()
);
System.out.print("\n\n----- SM2 算法签名 结果: ");
System.out.println( sign3 );
System.out.println( api.SYD_SM2_Verify_HA(
SydApi.DATA_ORIGIN,
Util.hexString2Bytes("0342000480C7E165DB8CF019509CE359C4FE06535275F5F63ADDC3955721FA4802BDC8701661554096BBC190916F39073C3763C8BEF6ABDF7A042C9F1D12B6BD6E5E2614"),
"<MainBody><MsgId><Id>101557000040870201809190000000001</Id><CreDtTm>2018-09-19T10:13:39</CreDtTm></MsgId><Qryr><MbrId>101557</MbrId><BrId>000040870</BrId></Qryr><Rspnr><MbrId>201597</MbrId><BrId>000039754</BrId></Rspnr><BizQryInf><QryDt>2018-09-19</QryDt><QryId>00000001</QryId><Cnts>123456,测试</Cnts></BizQryInf></MainBody>".getBytes() ,
sign3
) );
}
}
@@ -537,7 +537,7 @@ public class TestLast {
RetWrap retWrap1 = api.conutHash(1,0, key2.getBytes(), key1.getBytes()); RetWrap retWrap1 = api.conutHash(1,0, key2.getBytes(), key1.getBytes());
byte[] bytes = api.RSASignC("0000000000000005", 1, 0,(byte[]) retWrap1.get("hash")); byte[] bytes = api.RSASignC("0000000000000005", 1, 0,(byte[]) retWrap1.get("hash"));
System.out.println(bytes); System.out.println(bytes);
} }*/
/* //15.6 RSA验证签名(+) /* //15.6 RSA验证签名(+)
@@ -560,7 +560,7 @@ public class TestLast {
//15.7计算HASH散列值(MD5\SHA1\SHA256)(+) -> pass //15.7计算HASH散列值(MD5\SHA1\SHA256)(+) -> pass
@Test @Test
public void RSASignC() { public void RSASignC() {
RetWrap retWrap1 = api.countHash(1, 0, key2.getBytes(), key1.getBytes()); RetWrap retWrap1 = api.conutHash(1, 0, key2.getBytes(), key1.getBytes());
System.out.println(retWrap1); System.out.println(retWrap1);
} }
@@ -14,7 +14,7 @@ public class TestPKCS1 {
public static void main(String[] args) { public static void main(String[] args) {
System.setProperty("com.sunyard.sydapi4j.debug","true");
// 连接加密机 // 连接加密机
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000); SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
@@ -22,10 +22,10 @@ public class TestPKCS1 {
try { try {
// 原始数据模式 // 原始数据模式
case1( api ); // case1( api );
// 外部 hash // 外部 hash
// case2( api ); case2( api );
} catch (Exception e) { } catch (Exception e) {
@@ -1,4 +1,4 @@
package com.sunyard.sydapi.test; package com.sunyard.sydapi.sample;
import com.sunyard.SydApi; import com.sunyard.SydApi;
@@ -15,7 +15,7 @@ public class TestPKCS7 {
// 连接加密机 // 连接加密机
// SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000); // SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.17.162", 8889, null, 1000);
SydApi4j.SYD_Set_Parameter_HA("unkown", "172.16.18.59", 8889, 1000); SydApi4j.SYD_Set_Parameter_HA("unkown", "192.168.0.100", 8889, 1000);
SydApi4j api = (SydApi4j) new SydApi4j(); SydApi4j api = (SydApi4j) new SydApi4j();
try { try {
@@ -0,0 +1,162 @@
package com.sunyard.sydapi.test;
import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.inf.customize.SydSDNXApiImpl;
import racal.sunyard.main.SydApi4j;
public class TestSDNXApi {
private static final String testCertNo = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
//private static final String testCertNo = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
//private static final String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001";
//private static final String testData = "<MainBody><MsgId><Id>101557000040870201809190000000001</Id><CreDtTm>2018-09-19T10:13:39</CreDtTm></MsgId><Qryr><MbrId>101557</MbrId><BrId>000040870</BrId></Qryr><Rspnr><MbrId>201597</MbrId><BrId>000039754</BrId></Rspnr><BizQryInf><QryDt>2018-09-19</QryDt><QryId>00000001</QryId><Cnts>123456,测试</Cnts></BizQryInf></MainBody>";
private static final String testData = "<MainBody><MsgId><Id>000000000000000201902231000012910</Id><CreDtTm>2019-02-23T09:29:19</CreDtTm></MsgId><CertNtfctnInf><ChngTp>CC00</ChngTp></CertNtfctnInf></MainBody>";
private static final String testUser = "201597";
//private static final String testUser = "8001";
//private static final String testUser = "402030000011";
public static void main(String[] args) {
SydApi api = null;
System.out.println("\n\n----- connect -----");
// 建议从配置文件读取配置
// 单服务器测试使用
// PoolManager.INSTANCE.createPool("default", "{\n" +
// " \"mode\" : \"solo\", // (必填)\n" +
// " \"oipc\" : \"com.sunyard.pool4sydapi.SydApiSDNXInPool\", " +
// " \"ip\" : \"172.16.18.71\", // (必填)\n" +
// " \"port\": 8889, // (必填)【数字】\n" +
// " \"pwd\": \"\", // 没有就不填写此项\n" +
// " \"timeout\": 1000 //【数字】不限超时时间就不填写此项\n" +
// "}");
// // 推荐配置
// PoolManager.INSTANCE.createPool("default", "{\n" +
// " \"mode\" : \"round-robin\", // (必填)\n" +
// " \"oipc\" : \"com.sunyard.pool4sydapi.SydApiSDNXInPool\", // (必填)\n" +
// " \"ips\" : [ // (必填)\n" +
// " \"172.16.18.69\",\n" +
// " \"172.16.18.70\"\n" +
// " ],\n" +
// " \"port\": 8889, //(必填)【数字】\n" +
// " \"pwd\": \"\", //【数字】没有就不填写此项\n" +
// " \"timeout\": 1000 , //【数字】【数字】链接和响应超时时限,不限超时时间就不填写此项\n" +
// " \"connectTimeout\" : 1000, //【数字】【数字】链接超时时限,如果没有传递,但是存在 timeout 就等于 timeout 的值\n" +
// " \"waitRecvTimeout\" : 1000, //【数字】【数字】响应超时时限,如果没有传递,但是存在 timeout 就等于 timeout 的值\n" +
// " \"maxContinuousErrorTime\" : 3, //【数字】 单台加密机连续出错次数\n" +
// " \"recoveryTime\" : 300000, //【数字】 恢复时间,单位毫秒,默认 5 分钟,最大 2^63\n" +
// " \"keepAlive\" : 1, //【数字】 保持链接个数,默认是链接池个数的一半\n" +
// " \"maxAliveTime\" : 300000000, //【数字】 最大生存时间\n" +
// " \"maxIdleTime\" : 300000 , //【数字】 最大空闲时间,默认 5 分钟,最大 2^63\n" +
// " \"checkMode\" : \"before/after/deamon\", // 链接检测模式,使用前/使用后/后台轮询\n" +
// " \"checkGap\" : 300000 // 后台轮询检测间隔\n" +
// "}");
// 自定义配置
// PoolManager.INSTANCE.createPool("default", "{\n" +
// " \"mode\" : \"weighted-round-robin\", // (必填)\n" +
// " \"oipc\" : \"com.sunyard.pool4sydapi.SydApiSDNXInPool\", // (必填)\n" +
// " \"ips\" : { // (必填)\n" +
// " \"172.16.18.69\" : 1,\n" +
// " \"172.16.18.70\" : 3\n" +
// " },\n" +
// " \"port\": 8889, //(必填)【数字】\n" +
// " \"pwd\": \"\", //【数字】没有就不填写此项\n" +
// " \"timeout\": 1000 , //【数字】【数字】链接和响应超时时限,不限超时时间就不填写此项\n" +
// " \"connectTimeout\" : 1000, //【数字】【数字】链接超时时限,如果没有传递,但是存在 timeout 就等于 timeout 的值\n" +
// " \"waitRecvTimeout\" : 1000, //【数字】【数字】响应超时时限,如果没有传递,但是存在 timeout 就等于 timeout 的值\n" +
// " \"maxContinuousErrorTime\" : 3, //【数字】 单台加密机连续出错次数\n" +
// " \"recoveryTime\" : 300000, //【数字】 恢复时间,单位毫秒,默认 5 分钟,最大 2^63\n" +
// " \"keepAlive\" : 1, //【数字】 保持链接个数,默认是链接池个数的一半\n" +
// " \"maxAliveTime\" : 300000000, //【数字】 最大生存时间\n" +
// " \"maxIdleTime\" : 300000 , //【数字】 最大空闲时间,默认 5 分钟,最大 2^63\n" +
// " \"checkMode\" : \"before/after/deamon\", // 链接检测模式,使用前/使用后/后台轮询\n" +
// " \"checkGap\" : 300000 // 后台轮询检测间隔\n" +
// "}");
try {
//热备模式连接
SydApi4j.SYD_Set_Parameter_HA("unkown", "122.224.86.107", 8889, 1000);
api = new SydApi4j();
// 链接池和负载均衡模式
//api = (SydSDNXApiImpl) PoolManager.INSTANCE.getPool().get().getOrigin();
System.out.println("连接加密机成功");
} catch (Exception e) {
e.printStackTrace();
}
try {
//用证书DN签名
//case1(api);
//根据机构号验签,上传并返回证书内容,并更新机构号
case2(api);
//裸签名
//case3(api);
//验签
//case4(api);
} finally {
System.out.println("\n\n----- disconnect -----");
api.disconnect();
}
System.out.println("执行结束\n\n");
}
public static void case1(SydSDNXApiImpl api) {
System.out.println("\n\n----- 签名 基础接口原始数据模式 -----");
String sign = api.detachedSign(SydApi4j.DATA_ORIGIN, testData.getBytes(), testCertNo);
System.out.println("\t签名结果: " + sign);
}
//需要上传验签结果,测试的时候签名和验签不能同时进行,签名以后要删除数据库数据才可以验签(仅限测试可以这样操作)
public static void case2(SydApi api) {
System.out.println("\n\n----- 验签 ,上传并返回证书内容,并更新机构号 -----");
String sign = "MIIEYQYKKoEcz1UGAQQCAqCCBFEwggRNAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIIDUjCCA04wggLyoAMCAQICBUCEF1MkMAwGCCqBHM9VAYN1BQAwXDELMAkGA1UEBhMCQ04xMDAuBgNVBAoMJ0NoaW5hIEZpbmFuY2lhbCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTEbMBkGA1UEAwwSQ0ZDQSBBQ1MgU00yIE9DQTMxMB4XDTE4MDExNzAxMTExMFoXDTIzMDExNzAxMTExMFowgYIxCzAJBgNVBAYTAkNOMRswGQYDVQQKDBJDRkNBIEFDUyBTTTIgT0NBMzExDjAMBgNVBAsMBVNIQ1BFMRkwFwYDVQQLDBBPcmdhbml6YXRpb25hbC0xMSswKQYDVQQDDCIwNTFA5LiK5rW356Wo5o2u5Lqk5piT5omAQEFBQUFBQUAxMFkwEwYHKoZIzj0CAQYIKoEcz1UBgi0DQgAEz79HajSQLou2kkL6n26pCKkcKcbHTWR6MbArRQruWY+WDiyPhRaYLU4W6d8wBTDTOS6T5dCtSNZBxeb5qoeeNaOCAXYwggFyMGwGCCsGAQUFBwEBBGAwXjAoBggrBgEFBQcwAYYcaHR0cDovL29jc3AuY2ZjYS5jb20uY24vb2NzcDAyBggrBgEFBQcwAoYmaHR0cDovL2NybC5jZmNhLmNvbS5jbi9vY2EzMS9vY2EzMS5jZXIwHwYDVR0jBBgwFoAUCNjRJsRIfZzsrJjp8X9iuYDOqUUwDAYDVR0TAQH/BAIwADBIBgNVHSAEQTA/MD0GCGCBHIbvKgEEMDEwLwYIKwYBBQUHAgEWI2h0dHA6Ly93d3cuY2ZjYS5jb20uY24vdXMvdXMtMTQuaHRtMDsGA1UdHwQ0MDIwMKAuoCyGKmh0dHA6Ly9jcmwuY2ZjYS5jb20uY24vb2NhMzEvU00yL2NybDcyLmNybDAOBgNVHQ8BAf8EBAMCBsAwHQYDVR0OBBYEFIzDvi38AZLlWA/Wqfk93ZPe7qNgMB0GA1UdJQQWMBQGCCsGAQUFBwMCBggrBgEFBQcDBDAMBggqgRzPVQGDdQUAA0gAMEUCICDVyelEL86xbj0mAeMl3knQD0n2QKERtni/e82bQz/nAiEAjq5SKIaVJu9T/lkds3QQfgLpBX65Rwj2Scgc7cC2dVcxgdMwgdACAQEwZTBcMQswCQYDVQQGEwJDTjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9yaXR5MRswGQYDVQQDDBJDRkNBIEFDUyBTTTIgT0NBMzECBUCEF1MkMAwGCCqBHM9VAYMRBQAwDQYJKoEcz1UBgi0BBQAERzBFAiEA03ogUebmqNyLjD5/OXr4gSdVQfqp3yqrVVPgRmGPy1QCIBkHrzpSxw/ZPloL+t1GHlEp2rW7qVgy966/lQqE7UVH";
X509 x509 = api.SYD_Get_X509_CertInfo_HA(testData.getBytes(), sign);
System.out.println("验签结果" + x509);
}
public static void case3(SydSDNXApiImpl api) {
System.out.println("\n\n----- 裸签名 -----");
String sign = api.nakedSign(testData.getBytes(), testCertNo);
System.out.println("签名结果 " + sign);
}
public static void case4(SydSDNXApiImpl api) {
System.out.println("\n\n----- 裸签名 -----");
String sign = api.nakedSign(testData.getBytes(), testCertNo);
System.out.println("签名结果 " + sign);
//String sign = "dFOUuU+JVNEZO8494MV+xtPuMVhEjnXlilHlymK9Cz/jQ3m+lRKTbv4tfyo5Eb7MM7lqQi6cdwKZ/CLnkOa+Vsye4DDYYSweqsraLwdtrVcc1sw2KDHeJUao2SXIhdhgxSw+puiOCDq/4FsJADdnYprIp+GSLfjj7tuhbBBb0JCV6rnTutIozq2QDPQKEspzMxQ2TtbVQezfL3uMA5GuYNdJYz4eAasQtxTQS5dhe3/CaWbjBeL2kKhsvuMbP6wsx2HeuXvaf99OEBkyXq2fFPJtuU7WB4SIYKN1wI0BK/IMa0ULj1Q1SBakd5+iO8ckrokJJ6E2JH3Nd/mT+5DdRg==";
System.out.println("\n\n----- 验签 -----");
boolean pass = api.SYD_NakedVerify(testData.getBytes(), sign, testUser);
System.out.println("验签结果 " + pass);
}
}
+104 -104
View File
@@ -1,104 +1,104 @@
//package com.sunyard.sydapi.test; package com.sunyard.sydapi.test;
//
//
//import com.sunyard.SydApi; import com.sunyard.SydApi;
//import com.sunyard.proto.Util; import com.sunyard.proto.Util;
//import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
//import racal.sunyard.main.SydApiBuilder; import racal.sunyard.main.SydApiBuilder;
//
//import static com.sunyard.SydApi.*; import static com.sunyard.SydApi.*;
//
//
//public class TestSV { public class TestSV {
//
// private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346"; private static final String inHexData = "67c6697351ff4aec29cdbaabf2fbe346";
// private static final String dn = "C=CN,ST=浙江,L=杭州,O=信雅达测试123,OU=安全应用1,OU=安全应用2,CN=@信雅达安全测试"; private static final String dn = "C=CN,ST=浙江,L=杭州,O=信雅达测试123,OU=安全应用1,OU=安全应用2,CN=@信雅达安全测试";
//
//
// public static void main(String[] args) { public static void main(String[] args) {
// System.setProperty("com.sunyard.sydapi4j.debug", "true"); System.setProperty("com.sunyard.sydapi4j.debug", "true");
// // 连接加密机 // 连接加密机
// SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000); SydApi4j api = (SydApi4j) new SydApi4j().connect("172.16.18.59", 8889, null, 1000);
//
// SydApiBuilder builder = new SydApiBuilder().setIp("192.168.5.88"); SydApiBuilder builder = new SydApiBuilder().setIp("192.168.5.88");
// builder.build(); builder.build();
//
// try { try {
//
// // case1(api); // case1(api);
// case4(api); case4(api);
// case5(api); case5(api);
//
// } catch (Exception e) { } catch (Exception e) {
// e.printStackTrace(); e.printStackTrace();
// } finally { } finally {
// api.disconnect(); api.disconnect();
// } }
// } }
//
// public static void case1(SydApi api) { public static void case1(SydApi api) {
// String sign = api.attachedSign( Util.hexString2Bytes( inHexData ), dn ); String sign = api.attachedSign( Util.hexString2Bytes( inHexData ), dn );
// System.out.println("签名结果 " + sign ); System.out.println("签名结果 " + sign );
//
//
// boolean pass = api.attachedVerify(sign); boolean pass = api.attachedVerify(sign);
// System.out.println("验签结果 " + pass); System.out.println("验签结果 " + pass);
// } }
//
//
// public static void case2(SydApi api) { public static void case2(SydApi api) {
// System.out.println("begin SYD_Sign_Detach"); System.out.println("begin SYD_Sign_Detach");
// String sign = api.detachedSign( DATA_ORIGIN, Util.hexString2Bytes( inHexData ), dn ); String sign = api.detachedSign( DATA_ORIGIN, Util.hexString2Bytes( inHexData ), dn );
// System.out.println("签名结果 " + sign ); System.out.println("签名结果 " + sign );
// System.out.println("begin SYD_Sign_Detach"); System.out.println("begin SYD_Sign_Detach");
//
// System.out.println("begin SYD_Verify_Detach"); System.out.println("begin SYD_Verify_Detach");
// boolean pass = api.detachedVerify(DATA_ORIGIN, Util.hexString2Bytes( inHexData ), sign); boolean pass = api.detachedVerify(DATA_ORIGIN, Util.hexString2Bytes( inHexData ), sign);
// System.out.println("验签结果 " + pass); System.out.println("验签结果 " + pass);
// System.out.println("end SYD_Verify_Detach"); System.out.println("end SYD_Verify_Detach");
// } }
//
//
// public static void case3(SydApi api) { public static void case3(SydApi api) {
// System.out.println("begin SYD_NakedSign"); System.out.println("begin SYD_NakedSign");
// byte[] sign = api.SYD_NakedSign( Util.hexString2Bytes(inHexData) , dn); byte[] sign = api.SYD_NakedSign( Util.hexString2Bytes(inHexData) , dn);
// System.out.println("签名结果 " + Util.bytes2HexString(sign) ); System.out.println("签名结果 " + Util.bytes2HexString(sign) );
// System.out.println("end SYD_NakedSign"); System.out.println("end SYD_NakedSign");
//
// System.out.println("begin SYD_NakedVerify"); System.out.println("begin SYD_NakedVerify");
// boolean pass = api.SYD_NakedVerify( Util.hexString2Bytes(inHexData), sign, dn); boolean pass = api.SYD_NakedVerify( Util.hexString2Bytes(inHexData), sign, dn);
// System.out.println("验签结果 " + pass); System.out.println("验签结果 " + pass);
// System.out.println("end SYD_NakedVerify"); System.out.println("end SYD_NakedVerify");
// } }
//
//
// public static void case4(SydApi api) { public static void case4(SydApi api) {
// // 不传 ID // 不传 ID
// String pk = api.SM2GetPublicKeyC("65667", 0 ); String pk = api.SM2GetPublicKeyC("65667", 0 );
// String sk = api.SM2GetPrivateKeyC("000000000006566700000000001"); String sk = api.SM2GetPrivateKeyC("000000000006566700000000001");
//
// String sign = api.SM2SignC( 0, sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) ); String sign = api.SM2SignC( 0, sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
// System.out.println("签名结果 " + sign ); System.out.println("签名结果 " + sign );
//
// boolean pass = api.SM2Verify(Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign ); boolean pass = api.SM2Verify(Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
// System.out.println("验签结果 " + pass); System.out.println("验签结果 " + pass);
// } }
//
//
// public static void case5(SydApi api) { public static void case5(SydApi api) {
// // 传 ID // 传 ID
// String uid = "8765432187654321"; String uid = "8765432187654321";
// String pk = api.SM2GetPublicKeyC("65667", 0 ); String pk = api.SM2GetPublicKeyC("65667", 0 );
// String sk = api.SM2GetPrivateKeyC("000000000006566700000000001"); String sk = api.SM2GetPrivateKeyC("000000000006566700000000001");
//
// System.out.println("begin SYD_Sign_P1"); System.out.println("begin SYD_Sign_P1");
// String sign = api.SM2SignC( 0, uid, sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) ); String sign = api.SM2SignC( 0, uid, sk, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData) );
// System.out.println("签名结果 " + Util.bytes2HexString( Util.decodeBase64( sign ) ) ); System.out.println("签名结果 " + Util.bytes2HexString( Util.decodeBase64( sign ) ) );
// System.out.println("end SYD_Verify_P1"); System.out.println("end SYD_Verify_P1");
//
// System.out.println("begin SYD_Sign_P1"); System.out.println("begin SYD_Sign_P1");
// boolean pass = api.SM2Verify(uid, 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign ); boolean pass = api.SM2Verify(uid, 1, Util.hexString2Bytes(pk), Util.hexString2Bytes(inHexData), sign );
// System.out.println("验签结果 " + pass); System.out.println("验签结果 " + pass);
// System.out.println("end SYD_Verify_P1"); System.out.println("end SYD_Verify_P1");
// } }
//} }
@@ -1,94 +0,0 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class TestShangqingXingye {
private static final byte[] orgDataBig = new byte[ 5 * 1024];
private static final byte[] orgData2k = new byte[ 2 * 1024];
private static final String pcDnEN = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
public static void main(String[] args) {
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
long startTime = System.currentTimeMillis(); //获取开始时间
SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100");
SydApi4j api = (SydApi4j) builder.build();
try {
/**
* 产生对称密钥,通过公钥加密生成数字信封,。
* @param pcDnEN: 清算所的公钥证书
* @param pcData: 明文数据。
* @return RetWrap: 数字信封
*/
RetWrap signData = api.generateDEByDn(pcDnEN, orgDataBig);
byte[] cpkey2 = (byte[]) signData.get("CipherKey");
System.out.println("加密信封:" + new String(cpkey2));
/**
* 接收用私钥解密数字信封,还原原文。。
* @param pcDnEN: 清算所的公钥证书
* @param cpkey: 数字信封。
* @return preData: 原数据
*/
RetWrap oDataWrap = api.decryptDEByDN(pcDnEN, cpkey2);
byte[] preData = (byte[]) oDataWrap.get("oData");
System.out.println("解密信封:" + Util.bytes2HexString(preData));
/**
* 通过指定的私钥对指定的原始数据编制带公钥证书的数字签名(遵循PKCS#7),
* @param orgData: 待签名的原始数据
* @param pcDnEN: 签名者证书 DN
* @return signsData: 签名数据
*/
String signsData = api.SYD_SM2_DetachedSign_HA(orgData2k, pcDnEN);
System.out.println("签名数据:" + signsData);
/**
* 利用清算所的公钥证书对签名数据进行验签。
* @param dataType: 数据模式, 0:输入的数据为 HASH 后的数据, 1:输入的数据为原始数据库(本次传入1)
* @param orgData: 待签名的原始数据
* @param sign: 签名数据。
*/
boolean result = api.detachedVerify(1, orgData2k, signsData);
System.out.println("验签结果:" + result);
/**
* 产生对称密钥,通过清算所公钥证书加密生成数字信封。
* 利用会员的私钥证书对数据进行签名
* 上清所 SYD_SignDzigitalEnvelope (String pcDnEN, String pcDnSign, byte[] pcData);
* @param pcDnEN: 清算所的公钥证书
* @param pcDnSign:会员的私钥证书
* @param pcData: 明文数据。
* @return pcSignData: 签名数字信封
*/
String pcSignData = api.SYD_SignDigitalEnvelope(pcDnEN, pcDnEN, orgData2k);
System.out.println("签名数字信封:" + pcSignData);
/**
* 利用清算所公钥证书对签名数据进行验签。接收用会员的私钥证书解密数字信封,还原原文。
* 上清所 byte[] SYD_VerifyDigitalEnveloe(String pcDnDe, String pcDnVerify, String pcSignData );
* @param pcDnDe: 会员的私钥证书
* @param pcDnVerify: 清算所公钥证书
* @param pcSignData: 签名数字信封数据。
* @return pcData:原数据
*/
byte[] oData = api.SYD_VerifyDigitalEnveloe(pcDnEN, pcDnEN, pcSignData);
System.out.println("原数据:" + Util.bytes2HexString(oData));
} catch (Exception e) {
e.printStackTrace();
} finally {
long endTime = System.currentTimeMillis(); //获取结束时间
System.out.println("程序运行时间:" + (endTime - startTime) + "ms"); //输出程序运行时间
}
}
}
@@ -1,113 +1,113 @@
//package com.sunyard.sydapi.test; package com.sunyard.sydapi.test;
//
//import com.sunyard.trans.PacketSN; import com.sunyard.trans.PacketSN;
//import org.junit.Test; import org.junit.Test;
//import racal.sunyard.main.SydApi4j; import racal.sunyard.main.SydApi4j;
//
//import java.lang.reflect.Method; import java.lang.reflect.Method;
//import java.lang.reflect.ParameterizedType; import java.lang.reflect.ParameterizedType;
//import java.lang.reflect.Type; import java.lang.reflect.Type;
//import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
//import java.util.Arrays; import java.util.Arrays;
//import java.util.Calendar; import java.util.Calendar;
//import java.util.Date; import java.util.Date;
//import java.util.HashMap; import java.util.HashMap;
//
//public class TestUtil { public class TestUtil {
// public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
// /* PacketSN sn = PacketSN.gen(); /* PacketSN sn = PacketSN.gen();
HashMap<String, Object> packet = new HashMap<String, Object>();
packet.put("header", sn.getSn().array());
HashMap<String, Object> data = new HashMap<String, Object>();
data.put("alg$option", 0);
data.put("certificateModel$option", 0);
data.put("certificateSn", "113123");
data.put("keyType", "X");
packet.put("data", data);
SectionWrap s=new SectionWrap();
HashMap<String, Section> sc = new HashMap<String, Section>();
SectionValue s2=new SectionValue();
s2.setValue("L".getBytes());
sc.put("data",s2);
s.setSections(sc);*/
// HashMap<String, Object> packet = new HashMap<String, Object>(); // HashMap<String, Object> packet = new HashMap<String, Object>();
// packet.put("header", sn.getSn().array());
// HashMap<String, Object> data = new HashMap<String, Object>(); // HashMap<String, Object> data = new HashMap<String, Object>();
// data.put("alg$option", 0);
// data.put("certificateModel$option", 0);
// data.put("certificateSn", "113123");
// data.put("keyType", "X");
// packet.put("data", data); // packet.put("data", data);
// SectionWrap s=new SectionWrap(); // PacketSN sn = PacketSN.gen();
// HashMap<String, Section> sc = new HashMap<String, Section>(); // packet.put("header", sn.getSn().array());
// SectionValue s2=new SectionValue(); // data.put("algorithmId$option", 0x1);
// s2.setValue("L".getBytes()); // data.put("keyLength", 256);
// sc.put("data",s2);
// s.setSections(sc);*/
//// HashMap<String, Object> packet = new HashMap<String, Object>();
//// HashMap<String, Object> data = new HashMap<String, Object>();
//// packet.put("data", data);
//// PacketSN sn = PacketSN.gen();
//// packet.put("header", sn.getSn().array());
//// data.put("algorithmId$option", 0x1);
//// data.put("keyLength", 256);
////
//// try {
//// byte[] a=(byte[]) Util.eval("ResE2","getKeyLen",packet,null,null);
//// System.out.println(a[0]);
//// } catch (Exception e) {
//// e.printStackTrace();
//// }
//
//
// //
// try {
// byte[] a=(byte[]) Util.eval("ResE2","getKeyLen",packet,null,null);
// System.out.println(a[0]);
// } catch (Exception e) {
// e.printStackTrace();
// } // }
//
// /**
// * 获取所有方法
// */ }
// @Test
// public void getMethod() { /**
// Class<SydApi4j> jClass = SydApi4j.class; * 获取所有方法
// */
// Method[] dm = jClass.getDeclaredMethods(); @Test
// public void getMethod() {
// System.out.println(dm.length); Class<SydApi4j> jClass = SydApi4j.class;
//
// for (int i = 0; i < dm.length; i++) { Method[] dm = jClass.getDeclaredMethods();
// Type[] types = dm[i].getGenericParameterTypes();
// System.out.print(dm[i].getName() + "("); System.out.println(dm.length);
// for (int j = 0; j < types.length; j++) {
// Type type = types[j]; for (int i = 0; i < dm.length; i++) {
// Type[] types = dm[i].getGenericParameterTypes();
// System.out.print(getRealTypeName(type)); System.out.print(dm[i].getName() + "(");
// if (j != types.length - 1) { for (int j = 0; j < types.length; j++) {
// System.out.print(", "); Type type = types[j];
// }
// } System.out.print(getRealTypeName(type));
// System.out.println(")"); if (j != types.length - 1) {
// } System.out.print(", ");
// } }
// }
// public String getRealTypeName(Type type) { System.out.println(")");
// }
// String resultName = ""; }
// if (type instanceof ParameterizedType) {
// public String getRealTypeName(Type type) {
// resultName = getRealName(type.getTypeName()) + "<";
// String resultName = "";
// Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments(); if (type instanceof ParameterizedType) {
//
// for (int z = 0; z < actualTypes.length; z++) { resultName = getRealName(type.getTypeName()) + "<";
// resultName += getRealName(actualTypes[z].getTypeName());
// if (z != actualTypes.length - 1) { Type[] actualTypes = ((ParameterizedType) type).getActualTypeArguments();
// resultName += ", ";
// } for (int z = 0; z < actualTypes.length; z++) {
// } resultName += getRealName(actualTypes[z].getTypeName());
// resultName += ">"; if (z != actualTypes.length - 1) {
// } else { resultName += ", ";
// resultName = getRealName(type.getTypeName()); }
// } }
// resultName += ">";
// return resultName.replace("$", "."); } else {
// } resultName = getRealName(type.getTypeName());
// }
// public String getRealName(String typeName) {
// if (typeName.contains(".") && typeName.contains("<")) { return resultName.replace("$", ".");
// typeName = typeName.substring(0, typeName.indexOf("<")); }
// return typeName.substring(typeName.lastIndexOf(".") + 1);
// } public String getRealName(String typeName) {
// if (typeName.contains(".") && typeName.contains("<")) {
// if (typeName.contains(".")) { typeName = typeName.substring(0, typeName.indexOf("<"));
// return typeName.substring(typeName.lastIndexOf(".") + 1); return typeName.substring(typeName.lastIndexOf(".") + 1);
// } }
//
// return typeName; if (typeName.contains(".")) {
// } return typeName.substring(typeName.lastIndexOf(".") + 1);
//} }
return typeName;
}
}
@@ -0,0 +1,457 @@
package com.sunyard.sydapi.test;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.cert.X509;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 新疆联通政务云
*/
public class TestXJ {
SydApi4j api;
@Before
public void before() {
// 通过设置debug的属性开启debug,如果不设置则默认不打开
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = (SydApi4j) new SydApi4j().connect("192.168.0.100", 8889, null, 1000);
}
@After
public void after() {
try {
this.api.disconnect();
} catch (Exception e) {
e.printStackTrace();
}
}
// 测试通过
// 8003
@Test
public void testSYD_NakedSign() {
String dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
byte[] bytes = api.SYD_NakedSign("111".getBytes(), dn);
System.out.println(Util.bytes2HexString(bytes));
}
// 测试通过
// 8004
@Test
public void testSYD_NakedVerify() {
String dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
String orgData = "111";
byte[] bytes = api.SYD_NakedSign(orgData.getBytes(), dn);
String sign = Util.bytes2HexString(bytes);
System.out.println(sign);
boolean b = api.SYD_NakedVerify(orgData.getBytes(), bytes, dn);
System.out.println(b);
}
// 测试通过
// 6C
@Test
public void testNetSign() {
String sn = "1004282451";
String s = api.netSign(sn, "111".getBytes());
System.out.println(s);
}
// 测试通过
// 6D
@Test
public void testNetVerify() {
String sn = "1004282451";
String data = "111";
String s = api.netSign(sn, data.getBytes());
boolean b = api.netVerify(sn, data.getBytes(), s);
System.out.println(b);
}
// 测试通过
// 80
@Test
public void testSM2SignCustomized() {
String sn = "1004282452";
String s = api.SM2SignCustomized(sn, "111".getBytes());
System.out.println(s);
}
// 测试通过
// 81
@Test
public void testSM2VerifyCustomized() {
String sn = "1004282451";
String data = "111";
String s = api.SM2SignCustomized(sn, data.getBytes());
boolean b = api.SM2VerifyCustomized(sn, data.getBytes(), s);
System.out.println(b);
}
// 测试通过
// 74
@Test
public void testSM2SignC() {
String userId = "1111111111111113";
String certNo = "1234567812345678";
String thisPublicKey = "03420004549B6A1A09A5D0D9432C6829D443F85ED8785340FC1AB14118BB7637830C808F7A888DF0C4F988EA6FF2EE6C76ECD00C4B7CEC92CC8EA365F8EA291041CAB231";
String thisOrgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2SignC(userId, certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes());
System.out.println(s);
}
// 测试通过
// 75
@Test
public void testSM2Verify() {
String userId = "1111111111111113";
String certNo = "1234567812345678";
String thisPublicKey = "03420004549B6A1A09A5D0D9432C6829D443F85ED8785340FC1AB14118BB7637830C808F7A888DF0C4F988EA6FF2EE6C76ECD00C4B7CEC92CC8EA365F8EA291041CAB231";
String thisOrgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2SignC(userId, certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes());
System.out.println(s);
boolean b = api.SM2Verify(certNo, 1, Util.hexString2Bytes(thisPublicKey), thisOrgData.getBytes(), s);
System.out.println(b);
}
// 测试通过
// 8005
@Test
public void testSYD_DetachedSign() {
String orgData = "3214312341243214";
String DN = "C=CN,O=Sunyard,OU=8001,CN=8001";
String s = api.SYD_DetachedSign(orgData.getBytes(), DN);
System.out.println(s);
}
// 测试通过
// 8006
@Test
public void testSYD_DetachedVerify() {
String orgData = "3214312341243214";
String DN = "C=CN,O=Sunyard,OU=8001,CN=8001";
String sign = api.SYD_DetachedSign(orgData.getBytes(), DN);
System.out.println("签名结果" + sign);
boolean b = api.SYD_DetachedVerify(orgData.getBytes(), sign);
System.out.println("验签结果:" + b);
}
// 测试通过
// 8005
@Test
public void testSm3AndDetachedSign() {
String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5";
String orgData = "FFFFFFFFFFFFFFFF";
String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001";
String sign = api.sm3AndDetachedSign(orgData.getBytes(), publicKey, testCertNo);
System.out.println("签名结果: " + sign);
boolean b = api.sm3AndDetachedVerify(orgData.getBytes(), publicKey, sign);
System.out.println("验签结果:" + b);
}
// 测试通过
// 8005
@Test
public void testDetachedSign() {
String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5";
String orgData = "FFFFFFFFFFFFFFFF";
String testCertNo = "C=CN,O=Sunyard,OU=8001,CN=8001";
byte[] hash = api.SM3Hash(publicKey, orgData.getBytes());
String sign = api.detachedSign(
SydApi.DATA_HASH,
hash,
testCertNo
);
System.out.println("\t签名结果: " + sign);
boolean verify = api.detachedVerify(
SydApi.DATA_HASH,
hash,
sign
);
System.out.println("\t验签结果: " + verify);
}
// 测试通过
// 72
@Test
public void testSM2GenSessionKey() {
String pk="034200041CD47354867E12B9D138F098413C47D42EDEB2AD402EAB431C0C7AC2FE2D6DE9C67273C643C709F2A749188941B7FA7F9FF14F8E7D19316936DB4D4954FF3819";
RetWrap retWrap = api.SM2GenSessionKey(pk);
printRetWrap(retWrap);
}
// 测试通过
// 73
@Test
public void testSM2ConfirmSessionKeyC() {
String userId = "1111111111111147";
String pk="0342000422C4FC907E0BEC600C2070D675EFB65EAE3A628260FF5461DD5F8133CF7CF98530EF392D016B6487BA6148E9AC27BDD4E8D7404A310CB09335F50AEF00ADB068";
RetWrap retWrap = api.SM2GenSessionKey(pk);
printRetWrap(retWrap);
String cipherKey = (String) retWrap.get("CipherKey");
RetWrap retWrap1 = api.SM2ConfirmSessionKeyC(userId, cipherKey);
printRetWrap(retWrap1);
}
// 测试通过
// E0
@Test
public void testSYMEncryptData() {
String sessionKey = "XF356BCBA3204F6E6F356BCBA3204F6E6";
String pInData = "1111111111111111";
byte[] bytes = api.SYMEncryptData(3,sessionKey, pInData.getBytes());
byte[] bytes1 = api.SYMDecryptData(3, sessionKey, bytes);
System.out.println(new String(bytes1));
}
// 测试通过
// E0
@Test
public void testEncDecData() {
String msg = "1111111111111111111111";
String key = "X3C9003C47A13379011733681ABB4A4D0";
byte[] bytes = api.SYMEncryptDataCBC(1, key, msg.getBytes());
System.out.println("输出为: " + Util.bytes2HexString(bytes));
byte[] bytes1 = api.SYMDecryptDataCBC(1, key, bytes);
System.out.println("明文:" + new String(bytes1));
}
// 测试通过
// 6B
@Test
public void testDecryptDE() {
String sn = "1004282452";
RetWrap retWrap = api.generateDE(sn, (byte) 0x30);
String sessionKey = (String) retWrap.get("SessionKey");
String CipherKey = (String) retWrap.get("CipherKey");
String KCV = (String) retWrap.get("KCV");
RetWrap retWrap1 = api.decryptDE(sn, CipherKey);
printRetWrap(retWrap1);
}
// 测试通过
// 7E
@Test
public void testSYD_SM2_Get_Dn_PublicKey_HA() {
String dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
String s = api.SYD_SM2_Get_Dn_PublicKey_HA(dn.getBytes(), 0);
System.out.println(s);
}
// 测试通过
// 6E
@Test
public void testGetX509SN() {
String dn = "C=CN,ST=ZJ,L=HZ,O=SUNYARD,OU=123456,CN=111";
String s = api.getX509SN(0, dn.getBytes());
System.out.println(s);
}
// 测试通过
// 7E
@Test
public void testGetDNPublicKey() {
String dn = "C=CN,O=Sunyard,OU=8001,CN=8001";
String s = api.GetDNPublicKey(0, dn.getBytes());
System.out.println(s);
}
// 测试通过
// QQ
@Test
public void testSM2GetPublicKeyC() {
String userId = "1111111111111117";
String s = api.SM2GetPublicKeyC(userId, 0);
System.out.println(s);
}
// 测试通过
// 8016
@Test
public void testGetX509CertInfo() {
String pCert = "-----BEGIN CERTIFICATE-----\u0007MIIC1jCCAnqgAwIBAgIFQAKAAXQwDAYIKoEcz1UBg3UFADBhMQswCQYDVQQGEwJD\u0007TjEwMC4GA1UECgwnQ2hpbmEgRmluYW5jaWFsIENlcnRpZmljYXRpb24gQXV0aG9y\u0007aXR5MSAwHgYDVQQDDBdDRkNBIEFDUyBURVNUIFNNMiBPQ0EzMTAeFw0xNzExMTYw\u0007NjU0NDVaFw0yMjExMTYwNjU0NDVaMIGDMQswCQYDVQQGEwJDTjEcMBoGA1UECgwT\u0007Q0ZDQSBURVNUIFNNMiBPQ0EzMTEOMAwGA1UECwwFU0hDUEUxGTAXBgNVBAsMEE9y\u0007Z2FuaXphdGlvbmFsLTExKzApBgNVBAMMIjA1MUDkuIrmtbfnpajmja7kuqTmmJPm\u0007iYBAQUFBQUFBQDgwWTATBgcqhkjOPQIBBggqgRzPVQGCLQNCAARg8D1RBEv9lpOE\u0007Q3SdzdLCQ4fDiE8Ncb2Fl4qIGc12GA/LUS1fgzLZuk0WlgyZDSe+QlQziqkmsXsx\u0007KoTCzqsto4H5MIH2MD8GCCsGAQUFBwEBBDMwMTAvBggrBgEFBQcwAYYjaHR0cDov\u0007L29jc3B0ZXN0LmNmY2EuY29tLmNuOjgwL29jc3AwHwYDVR0jBBgwFoAUBMe8+VkB\u0007aT6MNDYgYhg83ry1uwwwDAYDVR0TAQH/BAIwADA2BgNVHR8ELzAtMCugKaAnhiVo\u0007dHRwOi8vMjEwLjc0LjQyLjMvT0NBMzEvU00yL2NybDEuY3JsMA4GA1UdDwEB/wQE\u0007AwIGwDAdBgNVHQ4EFgQUomdLtdhENYb16pe1LNRlcr4N7b8wHQYDVR0lBBYwFAYI\u0007KwYBBQUHAwIGCCsGAQUFBwMEMAwGCCqBHM9VAYN1BQADSAAwRQIgZpJGhpRKmgfi\u0007Vbdq3UAGW6I3AUMfbWMd6webLQXmCOoCIQDSxTKRb0TfoXepD3VgO9qxCDwSc4yn\u0007WJ2GC3qmr81QBg==\u0007-----END CERTIFICATE-----\u0007";
X509 x509 = api.GetX509CertInfo(pCert);
String path = "E:\\work\\sunyard\\证书\\sm2.q\\sm2.q.enc.crt.pem";
X509 x509_1 = api.GetX509CertInfo(getCertStr(path));
}
// 测试通过
// 8017
@Test
public void testGetX509CertFileC() {
String userId = "8001";
String s = api.GetX509CertFileC(userId, 0);
System.out.println(s);
}
// 测试通过
// E2
@Test
public void testSM2GenKeyPair() {
RetWrap retWrap = api.SM2GenKeyPair();
printRetWrap(retWrap, true);
}
// 测试通过
// QN
@Test
public void testSYD_SM2GenKeyPair() {
RetWrap retWrap = api.SYD_SM2GenKeyPair();
printRetWrap(retWrap);
}
// 测试通过
// 77
@Test
public void testSM2Encrypt() {
String publicKey = "03420004C51A40A094B6A14500B2980603D68CA263FF1BA238AFB17BB8B791C5F444465A749B68B4584C83E7BEF66DE2446177E14DBE0F32691F54B1636CC73334A1A94D";
String orgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes());
System.out.println("encData: " + s);
}
// 测试通过
// 78
@Test
public void testSM2DecryptC() {
String certId = "1111111111111122";
String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5";
String orgData = "FFFFFFFFFFFFFFFF";
String s = api.SM2Encrypt(Util.hexString2Bytes(publicKey), orgData.getBytes());
byte[] bytes = api.SM2DecryptC(certId, s);
System.out.println("decData:" + new String(bytes));
}
// 测试通过
// 76
// 带公钥
@Test
public void testSM3Hash() {
String publicKey = "0342000469DE3847DD6A66DA96DB8F2DCFA32E10E680FF2EF4A592079E7C3A44320BB15084E7CA9782A39B6E28F07C04FE00D68958A2605921E71712D56C1E4435A39FA5";
String orgData = "FFFFFFFFFFFFFFFF";
byte[] hash = api.SM3Hash(publicKey, orgData.getBytes());
System.out.println("hash:" + Util.bytes2HexString(hash));
}
// 测试通过
// 76
// 不带公钥
@Test
public void testSM3Hash2() {
String orgData = "FFFFFFFFFFFFFFFF";
byte[] hash = api.SM3Hash(orgData.getBytes());
System.out.println("hash:" + Util.bytes2HexString(hash));
}
// 工具方法
// ==========================================
public static void printRetWrap(RetWrap rw) {
printRetWrap(rw, false);
}
/**
* 输出
* @param rw
*/
public static void printRetWrap(RetWrap rw, boolean flag) {
for (String s : rw.keySet()) {
Object o = rw.get(s);
if (o instanceof String) {
System.out.println(s + ":" + o);
} else if (o instanceof byte[]) {
if (flag) {
System.out.println(s + ": " + Util.bytes2HexString((byte[]) o));
} else {
System.out.println(s + ": " + new String(Util.hexString2Bytes(Util.bytes2HexString((byte[]) o))));
}
} else {
System.out.println(s + ":" + o);
}
}
}
// 获取证书
public String getCertStr(String path) {
BufferedInputStream bis = null;
try {
bis = new BufferedInputStream(new FileInputStream(path));
StringBuilder str = new StringBuilder();
int len = 0;
while ((len = bis.read()) != -1) {
str.append((char) len);
}
return str.toString();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}
}
@@ -1,83 +0,0 @@
package com.sunyard.sydapi.util;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.cms.SydCmsUtil;
import org.bouncycastle.asn1.ASN1Sequence;
import org.bouncycastle.asn1.ASN1Set;
import org.bouncycastle.asn1.ASN1TaggedObject;
import org.bouncycastle.asn1.DEROctetString;
import org.bouncycastle.asn1.cms.ContentInfo;
import org.bouncycastle.cms.SydCmsUtil;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.pqc.math.linearalgebra.ByteUtils;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
public class SydCmsUtilTest {
@Test
public void test(){
SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
try {
String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
String oData = "00001111222233";
RetWrap retWrap = api.generateDEByDnSoft(dn, oData.getBytes() );
byte[] cipherKey = (byte[]) retWrap.get(SydApi.RET_CIPHER_KEY);
System.out.println("数字信封: " + cipherKey);
RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
System.out.println("原数据: " + retWrap1.get("oData"));
}catch ( Exception e ) {
e.printStackTrace();
} finally {
if ( null != api ) {
api.disconnect();
}
}
}
public static void main(String[] args) {
// System.setProperty("com.sunyard.sydapi4j.debug", "true");
//
//
// String tmpl = "3082014D06092A864886F70D010703A082013E3082013A0201003181F73081F40201003065305C310B300906035504061302434E3130302E060355040A0C274368696E612046696E616E6369616C2043657274696669636174696F6E20417574686F72697479311B301906035504030C1243464341205445535420534D32204F43413102051004282452300B06092A811CCF5501822D03047B307902203C3AF535307DA548DA02C0AD171D2BC24D22472B42E5E175FCAF2C5CD30B5443022100ED53E7594F35FFACEB57F05898123F78E5B2D045CC47D894CD2E7BD34D66DA1D042014BD71F8CDA9729093A7CC391E2009C5D5F007586C2EBFB55BC175A6E8BDA33E04104AB82510BFDDD4FEE79C3F107D6F7F94303B060A2A811CCF550601040201301B06072A811CCF55016804100000000000000000000000000000000080109FD3D4338DB19E672CC162AF5B9B03E9";
//
// System.out.println( SydCmsUtil.class.getClassLoader() );
//
// ContentInfo info = SydCmsUtil.getContentInfo(Util.hexString2Bytes( tmpl ) );
//
// System.out.println( info );
//
// info = SydApi4j.genCMSEnvelopedData(new byte[0], new byte[0]);
//
// SydApi4j api = (SydApi4j) new SydApi4j().connect("192.168.0.200", 8889, null, 1000);
//
// try {
// String dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
// String oData = "00001111222233";
//
// RetWrap retWrap = api.generateDEByDnSoft(dn, oData);
// String cipherKey = (String) retWrap.get(SydApi.RET_CIPHER_KEY);
// System.out.println("数字信封: " + cipherKey);
//
// RetWrap retWrap1 = api.decryptDEByDN(dn, cipherKey);
// System.out.println("原数据: " + retWrap1.get("oData"));
// }catch ( Exception e ) {
// e.printStackTrace();
// } finally {
// if ( null != api ) {
// api.disconnect();
// }
// }
}
}
-14
View File
@@ -1,14 +0,0 @@
package lrapi;
public class lr {
public static String AUTO = "AUTO";
public static void start_transaction(String t) {
System.out.println("start_transaction" + t);
}
public static void end_transaction(String t, String type) {
System.out.println("end_transaction" + t);
}
}
-50
View File
@@ -1,50 +0,0 @@
package sample;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApiPoolBuilder;
/**
* 集群模式 - 长连接
*/
public class HSMPoolLongLink {
public static void main(String[] args) {
// 调试模式
System.setProperty("com.sunyard.sydapi4j.debug", "true");
// 建立链接
final String[] pcipList = {"172.16.18.59", "192.168.0.200"};
final int[] iportList = {8889, 8889};
for (int i = 0; i < 10; i++) {
int tmp = i;
new Thread(new Runnable() {
@Override
public void run() {
SydApiPoolBuilder builder = new SydApiPoolBuilder(pcipList, iportList, 10, 1000);
SydApi api = builder.build();
try {
for (int j = 0; j < 20; j++) {
byte[] data = api.SM3Hash("test".getBytes());
System.out.println("hex=" + Util.bytes2HexString(data));
// boolean sign = api.deleteCert("C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1");
// System.out.println(sign);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != api) {
api.disconnect();
}
}
}
}, i + "t").start();
}
System.out.println(1);
}
}
@@ -1,52 +0,0 @@
package sample;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApiClusterBuilder;
/**
* 集群模式 - 短连接
*/
public class HSMPoolShortLink {
public static void main(String[] args) {
// 调试模式
System.setProperty("com.sunyard.sydapi4j.debug", "true");
// 建立链接
final String[] pcipList = {"172.16.18.59", "192.168.0.200"};
final int[] iportList = {8889, 8889};
for (int i = 0; i < 10; i++) {
int tmp = i;
new Thread(new Runnable() {
@Override
public void run() {
SydApi api = SydApiClusterBuilder.SYD_Short_Connect_Ex(
pcipList,
iportList,
10,
1000);
try {
for (int j = 0; j < 20; j++) {
byte[] data = api.SM3Hash("test".getBytes());
System.out.println("hex=" + Util.bytes2HexString(data));
// boolean sign = api.deleteCert("C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1");
// System.out.println(sign);
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (null != api) {
api.disconnect();
}
}
}
}).start();
}
}
}
-52
View File
@@ -1,52 +0,0 @@
package sample;
import com.sunyard.SydApi;
import com.sunyard.proto.Util;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import racal.sunyard.main.SydApi4j;
public class HashTest {
private static final String ip = "172.16.17.161";
private SydApi api;
@Before
public void before() {
System.setProperty("com.sunyard.sydapi4j.debug", "true");
api = new SydApi4j().connect(ip, 8889, null, 5000);
}
@After
public void after() {
if (null != api) {
api.disconnect();
}
}
@Test
public void md5(){
api.itHash( 2, new byte[ 5 * 1024 * 1024 ]);
}
@Test
public void sha1(){
api.itHash( 0, new byte[ 5 * 1024 * 1024 ]);
}
@Test
public void sha256(){
api.itHash( 1, new byte[ 5 * 1024 * 1024 ]);
}
@Test
public void hex(){
String s = "MEQCICECex9ZSh6PktFDu3rkszxJ++miqXBs5uCJS2VL8lhUAiBgZSLbJAMgrpTpmRL2L/5XsWBHSoFbKI6ToSzDnbPCaQ==";
System.out.println(Util.bytes2HexString(Util.decodeBase64(s)));
System.out.println(new String(Util.decodeBase64(s)));
}
}
-39
View File
@@ -1,39 +0,0 @@
package sample;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
public class Sample4GH {
private static final String SM2dn = "C=CN,O=CFCA OCA1,OU=YCCA,OU=Individual-2,CN=YCCA@黄金交易所@Zhuangj@1";
private static final String SM2dn2 = "C=CN,O=SM2,OU=test,CN=1";
private static final String RSAdn = "C=cn,O=CFCA TEST CA,OU=NCS2,OU=Enterprises,CN=041@Z402451000010@ShanDong@00000001";
private static final byte[] orgData = new byte[ 1024];
public static void main(String[] args) {
//设置连接
SydApiBuilder builder = new SydApiBuilder().setIp("172.16.17.161");
SydApi4j api = (SydApi4j) builder.build();
byte[] nakedSign = api.SYD_NakedSign(SM2dn, orgData, (byte[]) null);
System.out.println("裸签"+nakedSign);
boolean nakedVerify = api.SYD_NakedVerify(SM2dn, nakedSign, orgData, (byte[]) null);
System.out.println("裸签验签"+nakedVerify);
String detachedSign = api.detachedSign(1, orgData, SM2dn);
System.out.println("det签名"+detachedSign);
boolean detachedVerify = api.detachedVerify(1, orgData, detachedSign);
System.out.println("det验签"+detachedVerify);
String attachedSign = api.attachedSignHsm(orgData, SM2dn);
System.out.println("att签名"+attachedSign);
boolean attachedVerify = api.attachedVerify(attachedSign.getBytes());
System.out.println("att验签"+attachedVerify);
}
}
-88
View File
@@ -1,88 +0,0 @@
package sample;
import com.sunyard.RetWrap;
import com.sunyard.SydApi;
import com.sunyard.SydApiException;
import com.sunyard.proto.Util;
import racal.sunyard.main.SydApi4j;
import racal.sunyard.main.SydApiBuilder;
import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Sample4HY {
private static final String SM2dn = "C=cn,O=CFCA TEST OCA1,OU=Local RA,OU=Organizational-1,CN=041@Z8000000001938231GX0@8000000001938231GX0@00000001";
private static final String SM2dn2 = "C=CN,O=Sunyard,OU=8001,CN=8001" ;
private static final byte[] orgData = new byte[ 10*1024];
public static void main(String[] args) {
//调试模式(控制台会打印发送报文)
//System.setProperty("com.sunyard.sydapi4j.debug", "true");
//证书是否反序校验
//System.setProperty("com.sunyard.dnsort", "false");
//主备模式连接
SydApi4j.SYD_Set_Parameter_HA("172.16.17.47", "172.16.17.16", 8889, 1000);
SydApi4j api = (SydApi4j) new SydApi4j();
//设置连接
// SydApiBuilder builder = new SydApiBuilder().setIp("192.168.0.100");
// SydApi4j api = (SydApi4j) builder.build();
try {
// SM2裸签
byte[] nakedSign1 = api.SYD_NakedSign(orgData, SM2dn2);
System.out.println("SM2数据裸签:"+ Util.bytes2HexString(nakedSign1));
String sign= "30450221008E2342E7C1CECACC46BF7CB6777382FE6A1B19D89DF80428B87630EEC8D4D4CD02200CF82B240708765432ED74495DD73A0BF1E6DCDE6AE56C6CB4BEFA1A875E777E";
boolean nakedVerify1 = api.SYD_NakedVerify(orgData, Util.hexString2Bytes(sign), SM2dn2);
System.out.println("SM2数据验签:"+nakedVerify1 );
String s = api.detachedSign(1, orgData, SM2dn2);
System.out.println("原始数据小于4k签名:"+s);
//原始数据大于4k
byte[] hash = api.SM3Hash(orgData);//计算hash
String s2 = api.detachedSign(0, hash, SM2dn2);
System.out.println("原始数据大于4k签名:"+s2);
String aa = "MIIDLwYKKoEcz1UGAQQCAqCCAx8wggMbAgEBMQ4wDAYIKoEcz1UBgxEFADAMBgoqgRzPVQYBBAIBoIICMTCCAi0wggHSoAMCAQICBgGKaA2T3TAMBggqgRzPVQGDdQUAMEsxCzAJBgNVBAYTAkNOMQ4wDAYDVQQKEwVHTVNTTDEQMA4GA1UECxMHUEtJL1NNMjEaMBgGA1UEAxMRTWlkZGxlQ0EgZm9yIFRlc3QwIhgPMjAyMzA5MDUxNjAwMDBaGA8yMDI0MDkwNTE2MDAwMFowXTELMAkGA1UEBgwCQ04xCzAJBgNVBAgMAnpqMQswCQYDVQQHDAJoejEQMA4GA1UECgwHc3VueWFyZDEQMA4GA1UECwwHU00yVGVzdDEQMA4GA1UEAwwHU00yVGVzdDBZMBMGByqGSM49AgEGCCqBHM9VAYItA0IABJLNr8XSXI2UFvhoW5vBZMJUAyjzBaPR+0klKxVxwwKodFdH3iNrRjNf7Zj6ye8rP8TqKzHu9+zc1Wm3/DBPeiGjgYkwgYYwGwYDVR0jBBQwEoAQ+X9VtCeUM2KmVspvzF0a/zAZBgNVHQ4EEgQQK7bhyJnGBrfCV6cWZnJQJDAxBggrBgEFBQcBAQQlMCMwIQYIKwYBBQUHMAGGFWh0dHBzOi8vb2NzcC5nbXNzbC5jbjAJBgNVHRMEAjAAMA4GA1UdDwEB/wQEAwIAwDAMBggqgRzPVQGDdQUAA0cAMEQCIAHfg+kXDY0hwKtcFh4QBrI+C+96RPc5HuT8ls9Ribd2AiB4jFCV7CSa3aBscynS5LHEM1UNX9BxwMs9gtHUkDjLlDGBwjCBvwIBATBVMEsxCzAJBgNVBAYTAkNOMQ4wDAYDVQQKEwVHTVNTTDEQMA4GA1UECxMHUEtJL1NNMjEaMBgGA1UEAxMRTWlkZGxlQ0EgZm9yIFRlc3QCBgGKaA2T3TAMBggqgRzPVQGDEQUAMA0GCSqBHM9VAYItAQUABEYwRAIgEeWxsmL+TZFsDJkNAtOt572P+V53WZoPN9ppDcleOSECIHSuoF0zEUV8EPHS3omE9mvUuVMoO4E6vIWuwGTGurN4";
System.out.println(Util.bytes2HexString(Util.decodeBase64(aa)));
// //数字信封
// RetWrap genSM2 = api.generateDEByDn( SM2dn2, orgData);
// byte[] cipherKey = (byte[]) genSM2.get(SydApi.RET_CIPHER_KEY);
// System.out.println("SM2数字信封: " + new String(cipherKey));
// RetWrap denSM2 = api.decryptDEByDN( SM2dn2, cipherKey);
// byte[] oData = (byte[]) denSM2.get("oData");
// System.out.println("SM2信封解密:"+Util.bytes2HexString(oData));
//
//
// String aa ="MEUCIQD3ZW+ReFjSbkPx2SEm3R8SwC4ke8ZllgGJBXEp8aSJsAIgUUEVqWQtbDPitbJQec5+71gCU3e3OBNwdL0EYoKId4k=";
// String oData2 ="test123";
// boolean nakedVerify2 = api.SYD_NakedVerify(oData2.getBytes(), Util.decodeBase64(aa), SM2dn);
// System.out.println("SM2数据验签:"+nakedVerify2 );
// String certByDn = api.getCertByDn(SM2dn2, 0);
// System.out.println(certByDn);
//
// Pattern pattern = Pattern.compile("-----BEGIN CERTIFICATE-----|-----END CERTIFICATE-----");
// Matcher matcher = pattern.matcher(certByDn);
// String dealCert = matcher.replaceAll("").trim();
// System.out.println(dealCert);
}catch (SydApiException e){
e.printStackTrace();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}

Some files were not shown because too many files have changed in this diff Show More