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 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 = (ASN1Sequence) seq2.getObjectAt( 2 ).toASN1Primitive(); ASN1TaggedObject tag2 = (ASN1TaggedObject) seq3.getObjectAt( 1 ); DEROctetString o = (DEROctetString) tag2.getObject(); ret.put( "orgData", o.getOctets() ); 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()); } }