@@ -398,57 +398,71 @@ public class SydApi4j implements SydApi {
}
}
@Override
public byte [ ] SYD_NakedSign ( byte [ ] orgData , String sCertDN ) {
if ( orgData = = null ) {
throw new IllegalArgumentException ( " 输入数据为 null " ) ;
} else {
return orgData . length < 4096 ? this . SYD_NakedSign ( sCertDN , orgData , ( byte [ ] ) null ) : this . SYD_NakedSign_OuterHash ( orgData , sCertDN ) ;
}
}
public byte [ ] SYD_NakedSign ( String sCertDN , byte [ ] orgData , byte [ ] hash ) {
Proto8003 proto = new Proto8003 ( ) ;
byte [ ] dn = new byte [ 256 ] ;
byte [ ] s = null ;
try {
sCertDN = DnUtil . verifyDn ( sCertDN ) ;
s = sCertDN . getBytes ( " GBK " ) ;
} catch ( UnsupportedEncodingException e ) {
e . printStackTrace ( ) ;
} catch ( UnsupportedEncodingException var16 ) {
var16 . 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 > ( ) ;
HashMap < String , Object > packet = new HashMap ( ) ;
HashMap < String , Object > data = new HashMap ( ) ;
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 ( " signData " , orgData ) ;
/ / 渲染发送
data . put ( " hash " , hash ) ;
ByteBuffer bb = proto . rend ( packet ) ;
synchronized ( this ) {
/ / 响应解析
bb = syncRead ( syncSend ( bb ) ) ;
synchronized ( this ) {
bb = this . syncRead ( this . syncSend ( bb ) ) ;
}
Packet p = proto . parse ( bb ) ;
Map < String , Object > ret = p . toMap ( ) ;
if (
! Arrays . equals ( sn . getSn ( ) . array ( ) , ( ( PacketSection ) ret . get ( " header " ) ) . getBytes ( ) )
) {
if ( ! Arrays . equals ( sn . getSn ( ) . array ( ) , ( ( PacketSection ) ret . get ( " header " ) ) . getBytes ( ) ) ) {
throw new SydApiException ( " 包序号不匹配 " , - 4 ) ;
} else {
ret = ( Map ) ret . get ( " data " ) ;
PacketSection error = ( PacketSection ) ret . get ( " error " ) ;
byte [ ] be = error . getBytes ( ) ;
if ( ( be [ 0 ] ^ be [ 1 ] ) ! = 0 ) {
throw new SydApiException ( error . getInfo ( ) , error . autoInt ( ) ) ;
} else {
return ( ( PacketSection ) ret . get ( " signature " ) ) . getBytes ( ) ;
}
}
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 ( ( PacketSection ) ret . get ( " signature " ) ) . getBytes ( ) ;
}
public byte [ ] SYD_NakedSign_OuterHash ( byte [ ] orgData , String sCertDN ) {
sCertDN = DnUtil . verifyDn ( sCertDN ) ;
String pk = null ;
try {
pk = this . SYD_SM2_Get_Dn_PublicKey_HA ( sCertDN . getBytes ( " GBK " ) , 0 ) ;
} catch ( UnsupportedEncodingException var5 ) {
var5 . printStackTrace ( ) ;
throw new SydApiException ( " DN 编码错误 " , 52225 , var5 ) ;
}
byte [ ] hash = this . SM3Hash ( pk , orgData ) ;
return this . SYD_NakedSign ( sCertDN , ( byte [ ] ) null , hash ) ;
}
@Override
public byte [ ] SYD_NakedSign ( int rFlag , byte [ ] orgData , String sCertDN ) {
@@ -509,62 +523,75 @@ public class SydApi4j implements SydApi {
return ( ( PacketSection ) ret . get ( " signature " ) ) . getBytes ( ) ;
}
@Override
public boolean SYD_NakedVerify ( byte [ ] orgData , byte [ ] sign , String sCertDN ) {
Proto8004 proto = new Proto8004 ( ) ;
return orgData . length < 4096 ? this . SYD_NakedVerify ( sCertDN , sign , orgData , ( byte [ ] ) null ) : this . SYD_NakedVerify_OuterHash ( orgData , sign , sCertDN ) ;
}
public boolean SYD_NakedVerify ( String sCertDN , byte [ ] sign , byte [ ] orgData , byte [ ] hash ) {
Proto8004 proto = new Proto8004 ( ) ;
sign = ASN1Util . alignSignDer ( sign ) ;
byte [ ] dn = new byte [ 256 ] ;
byte [ ] s = null ;
try {
sCertDN = DnUtil . verifyDn ( sCertDN ) ;
s = sCertDN . getBytes ( " GBK " ) ;
} catch ( UnsupportedEncodingException e ) {
e . printStackTrace ( ) ;
} catch ( UnsupportedEncodingException var18 ) {
var18 . 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 > ( ) ;
HashMap < String , Object > packet = new HashMap ( ) ;
HashMap < String , Object > data = new HashMap ( ) ;
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 ( " odata " , orgData ) ;
data . put ( " hash " , hash ) ;
data . put ( " signature " , sign ) ;
data . put ( " returnSign$option " , 0 ) ;
/ / 渲染发送
ByteBuffer bb = proto . rend ( packet ) ;
synchronized ( this ) {
byte [ ] b = syncSend ( bb ) ;
/ / 响应解析
bb = syncRead ( b ) ;
synchronized ( this ) {
byte [ ] b = this . syncSend ( bb ) ;
bb = this . syncRead ( b ) ;
}
Packet p = proto . parse ( bb , packet ) ;
Map < String , Object > ret = p . toMap ( ) ;
if (
! Arrays . equals ( sn . getSn ( ) . array ( ) , ( ( PacketSection ) ret . get ( " header " ) ) . getBytes ( ) )
) {
if ( ! Arrays . equals ( sn . getSn ( ) . array ( ) , ( ( PacketSection ) ret . get ( " header " ) ) . getBytes ( ) ) ) {
throw new SydApiException ( " 包序号不匹配 " , - 4 ) ;
} else {
ret = ( Map ) ret . get ( " data " ) ;
PacketSection error = ( PacketSection ) ret . get ( " error " ) ;
byte [ ] be = error . getBytes ( ) ;
if ( ( be [ 0 ] ^ be [ 1 ] ) ! = 0 ) {
SydApiException e = new SydApiException ( error . getInfo ( ) , error . autoInt ( ) ) ;
println ( " 验签失败= " + e . toString ( ) ) ;
return false ;
} else {
return true ;
}
}
ret = ( Map < String , Object > ) ret . get ( " data " ) ;
PacketSection error = ( PacketSection ) ret . get ( " error " ) ;
byte [ ] be = error . getBytes ( ) ;
if ( ( 0 ! = ( be [ 0 ] ^ be [ 1 ] ) ) ) {
SydApiException e = new SydApiException ( error . getInfo ( ) , error . autoInt ( ) ) ;
println ( " 验签失败= " + e . toString ( ) ) ;
return false ;
}
return true ;
}
public boolean SYD_NakedVerify_OuterHash ( byte [ ] orgData , byte [ ] sign , String sCertDN ) {
sCertDN = DnUtil . verifyDn ( sCertDN ) ;
String pk = null ;
try {
pk = this . SYD_SM2_Get_Dn_PublicKey_HA ( sCertDN . getBytes ( " GBK " ) , 0 ) ;
} catch ( UnsupportedEncodingException var6 ) {
var6 . printStackTrace ( ) ;
throw new SydApiException ( " DN 编码错误 " , 52225 , var6 ) ;
}
byte [ ] hash = this . SM3Hash ( pk , orgData ) ;
return this . SYD_NakedVerify ( sCertDN , sign , orgData , hash ) ;
}
@Override
public boolean SYD_NakedVerify ( int rFlag , byte [ ] orgData , byte [ ] sign , String sCertDN ) {
Proto8004 proto = new Proto8004 ( ) ;
@@ -884,8 +911,9 @@ public class SydApi4j implements SydApi {
if ( orgData . length < 4096 ) {
deVerify = detachedVerify ( rFlag , dataType , orgData , sign ) ;
} else {
RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
deVerify = this . detachedVerify ( 2 , 0 , ( byte [ ] ) hashData . get ( " hash " ) , sign ) ;
/ / RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
byte [ ] hashData = RSAHash ( 0 , orgData ) ;
deVerify = this . detachedVerify ( 2 , 0 , hashData , sign ) ;
}
return deVerify ;
}
@@ -1082,8 +1110,8 @@ public class SydApi4j implements SydApi {
if ( orgData . length < 4096 ) {
sign = detachedSign ( rFlag , dataType , orgData , sCertDN ) ;
} else {
RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
byte [ ] hash = ( byte [ ] ) hashData . get ( " hash " ) ;
/ / RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
byte [ ] hash = RSAHash ( 0 , orgData ) ;
sign = detachedSign ( 2 , 0 , hash , sCertDN ) ;
}
return sign ;
@@ -9137,6 +9165,43 @@ public class SydApi4j implements SydApi {
return rw ;
}
/ *
根据原始数据计算出RSAhash结果 ( 数据长度不限 )
@param hashType HASH类型 。 0 : SHA1 , 1 : SHA256 , 2 : MD5
@param orgData 原始数据
* /
public byte [ ] RSAHash ( int hashType , byte [ ] orgData ) {
byte [ ] hashData = new byte [ 0 ] ;
final int packLen = 4064 ;
/ / 如果长度小于等于 4064 , 发送唯一包
if ( orgData . length < = 4064 ) {
RetWrap retWrap = countHash ( hashType , 0 , orgData , null ) ;
hashData = ( byte [ ] ) retWrap . get ( " hash " ) ;
}
/ / 分包
if ( orgData . length > 4064 ) {
int loop = orgData . length / packLen ;
if ( orgData . length % packLen > 0 ) {
loop + + ;
}
byte [ ] proData = Arrays . copyOfRange ( orgData , 0 , packLen ) ;
RetWrap retWrap = countHash ( hashType , 1 , proData , null ) ;
/ / 第一块hash数据作为中间块过度消息数据
byte [ ] durHashData = ( byte [ ] ) retWrap . get ( " filterData " ) ;
byte [ ] durData ;
for ( int i = 1 ; i < loop - 1 ; i + + ) {
durData = Arrays . copyOfRange ( orgData , i * packLen , ( i + 1 ) * packLen ) ;
RetWrap durretWrap = countHash ( hashType , 2 , durData , durHashData ) ;
durHashData = ( byte [ ] ) durretWrap . get ( " filterData " ) ;
}
byte [ ] finData = Arrays . copyOfRange ( orgData , ( loop - 1 ) * packLen , orgData . length ) ;
RetWrap finretWrap = countHash ( hashType , 3 , finData , durHashData ) ;
hashData = ( byte [ ] ) finretWrap . get ( " hash " ) ;
}
return hashData ;
}
/ * *
* 15 . 7计算HASH散列值 ( MD5 \ SHA1 \ SHA256 ) ( + ) - > pass
*
@@ -11596,8 +11661,9 @@ public class SydApi4j implements SydApi {
if ( orgData . length < 4096 ) {
verifyRSA = this . detachedVerify ( rFlag , 1 , orgData , sign2 ) ;
} else {
RetWrap hashData = this . countHash ( 0 , 0 , orgData , null ) ;
verifyRSA = this . detachedVerify ( 2 , 0 , ( byte [ ] ) hashData . get ( " hash " ) , sign2 ) ;
/ / RetWrap hashData = this . countHash ( 0 , 0 , orgData , null ) ;
byte [ ] hashData = RSAHash ( 0 , orgData ) ;
verifyRSA = this . detachedVerify ( 2 , 0 , hashData , sign2 ) ;
}
return verifyRSA ;
}
@@ -11642,8 +11708,9 @@ public class SydApi4j implements SydApi {
public String attachedSignRSASoft ( int rFlag , byte [ ] orgData , String sCertDN ) throws UnsupportedEncodingException {
sCertDN = verifyDn ( sCertDN ) ;
try {
RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
byte [ ] hash = ( byte [ ] ) hashData . get ( " hash " ) ;
/ / RetWrap hashData = countHash ( 0 , 0 , orgData , null ) ;
/ / byte [ ] hash = ( byte [ ] ) hashData . get ( " hash " ) ;
byte [ ] hash = RSAHash ( 0 , orgData ) ;
String sign = this . detachedSign ( 2 , 0 , hash , sCertDN ) ;
return ASN1Util . addOriginDataToPKCS7Sign ( orgData , sign ) ;
} catch ( IOException e ) {