本文默认所需的国密SM2证书已生成完成。基于BouncyCastle JAR包+itextpdf,利用itext提供的2个签名接口:ExternalDigest 及 ExternalSignature,修改BC部份代码实现国密SM2签名处理。具体处理如下:
1、pom.xml 引入 itextpdf 5.5.6 + bouncycastle jdk15on-1.60或以上版本
2、BouncyCastleDigest.java 增加
if(("1.2.156.10197.1.401").equals(oid)){
return new org.bouncycastle.jcajce.provider.digest.SM3.Digest();
}
3. DigestAlgorithms.java 增加
DIGEST_NAMES.put("1.2.156.10197.1.401",“SM3”);
ALLOWED_DIGESTS.put("SM3","1.2.156.10197.1.401");
4. EncryptionAlgorithms.java 增加
ALGORITHM_NAMES.put("1.2.156.10197.1.501","SM2");
5. PrivateKeySignature.java 中 sign(byte[] b) 方法增加
if("SM3".equalsIgnoreCase(this.hashAlgorithm)){
signMode = "SM3withSM2";
}
6. PdfPKCS7.java 中 setExternalDigest(...) 方法中 将 ECDSA 条件下的赋值改为
this.digestEncryptionAlgorithmOid = "1.2.156.10197.1.501";