@@ -80,7 +80,7 @@ public class SydApi4j implements SydApi {
return 0 ;
}
/ / 测试通过
@Override
public RetWrap SYD_SM2GenKeyPair ( ) {
ProtoQN proto = new ProtoQN ( ) ;
@@ -379,7 +379,7 @@ public class SydApi4j implements SydApi {
packet . put ( " header " , sn . getSn ( ) . array ( ) ) ;
data . put ( " signatureDataType$option " , 1 ) ;
data . put ( " DN " , dn ) ;
data . put ( " data " , orgData ) ;
data . put ( " signData " , orgData ) ;
/ / 渲染发送
ByteBuffer bb = proto . rend ( packet ) ;
@@ -592,6 +592,7 @@ public class SydApi4j implements SydApi {
return detachedVerify ( DATA_HASH , hash , sign ) ;
}
/ / 测试通过
@Override
public String detachedSign ( int dataType , byte [ ] orgData , String sCertDN ) {
Proto8005 proto = new Proto8005 ( ) ; / / pset . getProtocolReqRender ( " 75 " ) ;
@@ -649,6 +650,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public boolean detachedVerify ( int dataType , byte [ ] orgData , String sign ) {
Proto8006 proto = new Proto8006 ( ) ; / / pset . getProtocolReqRender ( " 75 " ) ;
@@ -805,7 +807,7 @@ public class SydApi4j implements SydApi {
return detachedSign ( DATA_ORIGIN , orgData , sCertDN ) ;
}
/ / 测试通过
@Override
public boolean SYD_SM2_DetachedVerify_HA (
byte [ ] orgData ,
@@ -814,7 +816,7 @@ public class SydApi4j implements SydApi {
return detachedVerify ( DATA_ORIGIN , orgData , sign ) ;
}
/ / 测试通过
@Override
public boolean SYD_DetachedVerify ( byte [ ] orgData , String sign ) {
return SYD_SM2_DetachedVerify_HA ( orgData , sign ) ;
@@ -885,6 +887,7 @@ public class SydApi4j implements SydApi {
return GetX509CertInfo ( new String ( pCertInfo ) ) ;
}
/ / 测试通过
@Override
public RetWrap getAllCert ( int dataFlag ) throws UnsupportedEncodingException {
Proto8008 proto = new Proto8008 ( ) ;
@@ -950,6 +953,7 @@ public class SydApi4j implements SydApi {
return r ;
}
/ / 测试通过
@Override
public RetWrap importCert ( byte [ ] certData , byte [ ] organizationId ) {
@@ -1814,6 +1818,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public RetWrap SYMEnDeData ( Boolean isEn , int nAlg , String seesionKey , int roundmod , int fullMode , byte [ ] pInData , byte [ ] iv , int block ) {
@@ -2043,8 +2048,7 @@ public class SydApi4j implements SydApi {
}
@Override
public RetWrap generateDEByDn ( byte [ ] dn , byte nAlg ) {
Integer alg = new Integer ( nAlg ) ;
public RetWrap generateDEByDn ( byte [ ] dn , int alg ) {
Proto6A proto = new Proto6A ( ) ;
/ / 填充数据
PacketSN sn = PacketSN . gen ( ) ;
@@ -2485,6 +2489,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public boolean RSAVerify ( int HashMark , int nOrgDataType , byte [ ] publicKey , byte [ ] orgData , byte [ ] base64Sign ) {
@@ -2499,6 +2504,7 @@ public class SydApi4j implements SydApi {
data . put ( " hashMark$option " , HashMark ) ;
data . put ( " signature " , sign ) ;
data . put ( " hashData " , orgData ) ;
data . put ( " infoData " , orgData ) ;
data . put ( " publicKey " , publicKey ) ;
ByteBuffer bb = proto . rend ( packet ) ;
@@ -2524,6 +2530,7 @@ public class SydApi4j implements SydApi {
}
}
/ / 测试通过
@Override
public byte [ ] RSASignC ( String privateKeyIndex , int HashMark , int nOrgDataType , byte [ ] orgData ) {
Proto7B proto = new Proto7B ( ) ;
@@ -2668,6 +2675,7 @@ public class SydApi4j implements SydApi {
}
}
/ / 测试通过
@Override
public String RSAGetPublicKeyC ( String userId , int nKeyTypes ) {
@@ -2865,6 +2873,7 @@ public class SydApi4j implements SydApi {
return cinfo ;
}
/ / 测试通过
@Override
public String GetX509CertFileC ( String userId , int nCertType ) {
@@ -2913,6 +2922,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public String SM2SignC ( String pUserID , String certNo , int nOrgDataType , byte [ ] publicKey , byte [ ] orgData ) {
@@ -3162,6 +3172,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public boolean SM2Verify ( String certNo , int nOrgDataType , byte [ ] publicKey , byte [ ] orgData , String base64Sign ) {
@@ -3348,6 +3359,7 @@ public class SydApi4j implements SydApi {
}
/ / 测试通过
@Override
public byte [ ] decryptBySkC ( int alg , String userId , byte [ ] data ) {
byte [ ] algBin = 0 = = alg ? DTO78 . Req . Data . AlgorithmKeyOptions . OPVRSA . getBin ( ) : DTO78 . Req . Data . AlgorithmKeyOptions . OPVSM2 . getBin ( ) ;
@@ -4099,6 +4111,7 @@ public class SydApi4j implements SydApi {
return repackEncrypt ( packet ) ;
}
/ / 测试通过
@Override
public String GetDNPublicKey ( int dnType , byte [ ] dn ) {
@@ -4679,6 +4692,7 @@ public class SydApi4j implements SydApi {
* @param macLen MAC数据长度 , 1 = 4Byte 2 = 8Byte 3 = 16Byte ( 仅在SM4 / AES 下有效 )
* @return mac 值 hex 格式
* /
/ / 测试通过
@Override
public String MACCalc ( int alg , int keyType , String AK , int fullMode , byte [ ] infoData , int macLen ) {
ProtoMA proto = new ProtoMA ( ) ;
@@ -4696,7 +4710,7 @@ public class SydApi4j implements SydApi {
data . put ( " fullMode$option " , fullMode ) ;
data . put ( " MACLen$option " , macLen - 1 ) ;
data . put ( " key " , AK . getBytes ( ) ) ;
data . put ( " MACData " , Util . bytes2HexString ( infoData ) ) ;
data . put ( " MACData " , infoData ) ;
/ / 渲染发送
ByteBuffer bb = proto . rend ( packet ) ;
@@ -4765,8 +4779,8 @@ public class SydApi4j implements SydApi {
data . put ( " fullMode$option " , fullMode ) ;
data . put ( " MACLen$option " , macLen - 1 ) ;
data . put ( " key " , AK ) ;
data . put ( " MAC " , mac . getBytes ( ) ) ;
data . put ( " MACData " , Util . bytes2HexString ( infoData ) ) ;
data . put ( " MAC " , mac ) ;
data . put ( " MACData " , infoData ) ;
/ / 渲染发送
ByteBuffer bb = proto . rend ( packet ) ;
@@ -4931,7 +4945,7 @@ public class SydApi4j implements SydApi {
return GenerateMIYA ( AreaCode , Version , Alg , Data , MIYA_FULL_WEAK , MIYA_MAC_LEN_4 ) ;
}
/ / 测试通过
@Override
public String GenerateMIYA ( String AreaCode , int Version , int Alg , byte [ ] Data , byte fullFlag , byte macLenFlag ) {
if ( Version < 0 | | Version > 999 ) {
@@ -5009,6 +5023,7 @@ public class SydApi4j implements SydApi {
return VerifyMIYA ( AreaCode , Version , Alg , mac , Data , MIYA_FULL_WEAK , MIYA_MAC_LEN_4 ) ;
}
/ / 测试通过
@Override
public boolean VerifyMIYA ( String AreaCode , int Version , int Alg , String mac , byte [ ] Data , byte fullFlag , byte macLenFlag ) {
@@ -5196,6 +5211,7 @@ public class SydApi4j implements SydApi {
*
* @param format 打印格式
* /
/ / 测试通过
public void setPrintFormat ( String format ) {
ProtoPA proto = new ProtoPA ( ) ;
@@ -5751,10 +5767,10 @@ public class SydApi4j implements SydApi {
data . put ( " alg$option " , alg ) ;
data . put ( " fillKey$option " , 1 ) ;
data . put ( " publicKey " , publicKey ) ;
/ * data . put ( " AlgorithmKey1 " , " P " ) ;
data . put ( " AlgorithmKey1 " , " P " ) ;
data . put ( " EncryAlgorithm1$option " , 1 ) ;
data . put ( " AlgorithmKey2 " , " Q " ) ;
data . put ( " EncryAlgorithm2$option " , 0 ) ; * /
data . put ( " EncryAlgorithm2$option " , 0 ) ;
packet . put ( " data " , data ) ;
/ / 渲染发送 耗时长
@@ -6110,6 +6126,7 @@ public class SydApi4j implements SydApi {
* @param infoData 密文PIN
* @return 密文PIN
* /
/ / 测试通过
public byte [ ] switchEncry4PIN ( String srcKey , String aimKey , byte [ ] infoData ) {
/ / 获取协议
Proto67 proto = new Proto67 ( ) ;
@@ -8703,6 +8720,108 @@ public class SydApi4j implements SydApi {
}
}
private byte [ ] _SYMEncryt ( int storageType , String key , int algFlag , byte [ ] iv , int divNum , List < byte [ ] > divData , int [ ] divAlgFlag , List < byte [ ] > divIv , byte [ ] inputData ) {
/ / 填充数据
PacketSN sn = PacketSN . gen ( ) ;
ByteBuffer bb = ByteBuffer . allocate ( 10240 ) ;
byte [ ] ret = new byte [ 2 ] ;
bb . put ( ret ) ;
bb . put ( sn . getSn ( ) . array ( ) ) ;
bb . put ( " S0 " . getBytes ( ) ) ;
/ / 存储类型
bb . put ( String . valueOf ( storageType ) . getBytes ( ) ) ;
if ( 1 = = storageType ) {
byte [ ] keyBytes = Util . hexString2Bytes ( key ) ;
/ / 外部密钥长度
bb . put ( String . format ( " %04d " , keyBytes . length ) . getBytes ( ) ) ;
/ / 外部密钥
bb . put ( keyBytes ) ;
}
if ( 0 = = storageType ) {
String gId = " 00000000 " + key ;
gId = gId . substring ( gId . length ( ) - 8 , gId . length ( ) ) ;
/ / 密钥索引
bb . put ( ( " 0000000000000000000 " + gId ) . getBytes ( ) ) ;
}
/ / 算法类型支持算法 : 3DES 、 AES 、 SM1 、 SM4
bb . put ( String . format ( " %02d " , MyUtil . transAlg ( algFlag ) ) . getBytes ( ) ) ;
bb . put ( iv ) ;
/ / 密钥分散级数
bb . put ( String . valueOf ( divNum ) . getBytes ( ) ) ;
/ / 分散因子
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divData . get ( i ) ) ;
}
/ / 分散算法标识
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( String . format ( " %02d " , MyUtil . transAlg ( divAlgFlag [ i ] ) ) . getBytes ( ) ) ;
}
/ / 分散算法的初始向量
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divIv . get ( i ) ) ;
}
/ / 输入数据长度
bb . put ( String . format ( " %04d " , inputData . length ) . getBytes ( ) ) ;
/ / 输入数据
bb . put ( inputData ) ;
int len = bb . position ( ) - 2 ;
bb . put ( 0 , ( byte ) ( 0xFF & ( len / 256 ) ) ) ;
bb . put ( 1 , ( byte ) ( 0xFF & ( len % 256 ) ) ) ;
synchronized ( this ) {
/ / 响应解析
bb = syncRead ( syncSend ( bb ) ) ;
}
bb . flip ( ) ;
/ / 解析头部
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
/ / 解析header
byte [ ] header = new byte [ 8 ] ;
bb . get ( header , 0 , 8 ) ;
/ / 解析协议
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
if ( ! Arrays . equals ( sn . getSn ( ) . array ( ) , header ) ) {
throw new SydApiException ( " 包序号不匹配 " , - 4 ) ;
}
/ / 检测错误
byte [ ] error = new byte [ 2 ] ;
bb . get ( error , 0 , 2 ) ;
int e = Util . a2i ( error , 16 ) ;
if ( 0 ! = e ) {
throw new SydApiException ( RetWrap . transMsg ( e ) , e ) ;
}
/ / 数据长度
byte [ ] infoLen = new byte [ 4 ] ;
bb . get ( infoLen , 0 , 4 ) ;
/ / 数据
byte [ ] info = new byte [ Util . a2i ( infoLen , 10 ) ] ;
bb . get ( info ) ;
return info ;
}
/ * *
* @param storageType 存储类型 0 - 使用内部密钥 , 1 - 使用外部密钥
* @param key 使用内部密钥时 , 该值传后八位密钥索引 ; 使用外部密钥时 , 该值为外部密钥 ( hex格式 )
@@ -8897,6 +9016,107 @@ public class SydApi4j implements SydApi {
}
}
private byte [ ] _genMAC ( int storageType , String key , int algFlag , byte [ ] iv , int divNum , List < byte [ ] > divData , int [ ] divAlgFlag , List < byte [ ] > divIv , byte [ ] inputData , int macDataLen ) {
/ / 填充数据
PacketSN sn = PacketSN . gen ( ) ;
ByteBuffer bb = ByteBuffer . allocate ( 10240 ) ;
byte [ ] ret = new byte [ 2 ] ;
bb . put ( ret ) ;
bb . put ( sn . getSn ( ) . array ( ) ) ;
bb . put ( " S2 " . getBytes ( ) ) ;
/ / 存储类型
bb . put ( String . valueOf ( storageType ) . getBytes ( ) ) ;
if ( 1 = = storageType ) {
byte [ ] keyBytes = Util . hexString2Bytes ( key ) ;
/ / 外部密钥长度
bb . put ( String . format ( " %04d " , keyBytes . length ) . getBytes ( ) ) ;
/ / 外部密钥
bb . put ( keyBytes ) ;
}
if ( 0 = = storageType ) {
String gId = " 00000000 " + key ;
gId = gId . substring ( gId . length ( ) - 8 , gId . length ( ) ) ;
/ / 密钥索引
bb . put ( ( " 0000000000000000000 " + gId ) . getBytes ( ) ) ;
}
/ / 算法类型支持算法 : 3DES 、 AES 、 SM1 、 SM4
bb . put ( String . format ( " %02d " , MyUtil . transAlg ( algFlag ) ) . getBytes ( ) ) ;
bb . put ( iv ) ;
/ / 密钥分散级数
bb . put ( String . valueOf ( divNum ) . getBytes ( ) ) ;
/ / 分散因子
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divData . get ( i ) ) ;
}
/ / 分散算法标识
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( String . format ( " %02d " , MyUtil . transAlg ( divAlgFlag [ i ] ) ) . getBytes ( ) ) ;
}
/ / 分散算法的初始向量
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divIv . get ( i ) ) ;
}
/ / 输入数据长度
bb . put ( String . format ( " %04d " , inputData . length ) . getBytes ( ) ) ;
/ / 输入数据
bb . put ( inputData ) ;
/ / 需要的MAC长度
bb . put ( String . format ( " %02d " , macDataLen ) . getBytes ( ) ) ;
int len = bb . position ( ) - 2 ;
bb . put ( 0 , ( byte ) ( 0xFF & ( len / 256 ) ) ) ;
bb . put ( 1 , ( byte ) ( 0xFF & ( len % 256 ) ) ) ;
synchronized ( this ) {
/ / 响应解析
bb = syncRead ( syncSend ( bb ) ) ;
}
bb . flip ( ) ;
/ / 解析头部
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
/ / 解析header
byte [ ] header = new byte [ 8 ] ;
bb . get ( header , 0 , 8 ) ;
/ / 解析协议
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
if ( ! Arrays . equals ( sn . getSn ( ) . array ( ) , header ) ) {
throw new SydApiException ( " 包序号不匹配 " , - 4 ) ;
}
/ / 检测错误
byte [ ] error = new byte [ 2 ] ;
bb . get ( error , 0 , 2 ) ;
int e = Util . a2i ( error , 16 ) ;
if ( 0 ! = e ) {
throw new SydApiException ( RetWrap . transMsg ( e ) , e ) ;
}
/ / 数据
byte [ ] info = new byte [ macDataLen ] ;
bb . get ( info ) ;
return info ;
}
/ * *
* @param keyIndex 密钥索引
* @param iv 仅当算法为3DES - CBC模式下有此域
@@ -8984,6 +9204,95 @@ public class SydApi4j implements SydApi {
}
}
private byte [ ] _genMacAndNextIv ( String keyIndex , byte [ ] iv , int divNum , List < byte [ ] > divData , int [ ] divAlgFlag , List < byte [ ] > divIv , byte [ ] inputData ) {
/ / 填充数据
PacketSN sn = PacketSN . gen ( ) ;
ByteBuffer bb = ByteBuffer . allocate ( 10240 ) ;
byte [ ] ret = new byte [ 2 ] ;
bb . put ( ret ) ;
bb . put ( sn . getSn ( ) . array ( ) ) ;
bb . put ( " S3 " . getBytes ( ) ) ;
String gId = " 00000000 " + keyIndex ;
gId = gId . substring ( gId . length ( ) - 8 ) ;
/ / 密钥索引
bb . put ( ( " 0000000000000000000 " + gId ) . getBytes ( ) ) ;
/ / 算法类型支持算法 : 仅支持3DES - CBC
bb . put ( String . format ( " %02d " , 8 ) . getBytes ( ) ) ;
bb . put ( iv ) ;
/ / 密钥分散级数
bb . put ( String . valueOf ( divNum ) . getBytes ( ) ) ;
/ / 分散因子
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divData . get ( i ) ) ;
}
/ / 分散算法标识
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( String . format ( " %02d " , MyUtil . transAlg ( divAlgFlag [ i ] ) ) . getBytes ( ) ) ;
}
/ / 分散算法的初始向量
for ( int i = 0 ; i < divNum ; i + + ) {
bb . put ( divIv . get ( i ) ) ;
}
/ / 输入数据长度
bb . put ( String . format ( " %04d " , inputData . length ) . getBytes ( ) ) ;
/ / 输入数据
bb . put ( inputData ) ;
int len = bb . position ( ) - 2 ;
bb . put ( 0 , ( byte ) ( 0xFF & ( len / 256 ) ) ) ;
bb . put ( 1 , ( byte ) ( 0xFF & ( len % 256 ) ) ) ;
synchronized ( this ) {
/ / 响应解析
bb = syncRead ( syncSend ( bb ) ) ;
}
bb . flip ( ) ;
/ / 解析头部
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
/ / 解析header
byte [ ] header = new byte [ 8 ] ;
bb . get ( header , 0 , 8 ) ;
/ / 解析协议
bb . get ( new byte [ 2 ] , 0 , 2 ) ;
if ( ! Arrays . equals ( sn . getSn ( ) . array ( ) , header ) ) {
throw new SydApiException ( " 包序号不匹配 " , - 4 ) ;
}
/ / 检测错误
byte [ ] error = new byte [ 2 ] ;
bb . get ( error , 0 , 2 ) ;
int e = Util . a2i ( error , 16 ) ;
if ( 0 ! = e ) {
throw new SydApiException ( RetWrap . transMsg ( e ) , e ) ;
}
/ / 数据
byte [ ] info = new byte [ 16 ] ;
bb . get ( info ) ;
return info ;
}
/ * *
* @param storageType 存储类型 , 0 - 存储在内部 1 - 存储在外部
* @param algFlag 算法类型 : 仅支持RSA 、 SM2