home *** CD-ROM | disk | FTP | other *** search
- package sun.security.pkcs;
-
- import java.io.ByteArrayOutputStream;
- import java.io.DataInputStream;
- import java.io.FilterInputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.security.NoSuchAlgorithmException;
- import java.security.SignatureException;
- import java.util.Vector;
- import sun.security.util.BigInt;
- import sun.security.util.DerInputStream;
- import sun.security.util.DerOutputStream;
- import sun.security.util.DerValue;
- import sun.security.util.ObjectIdentifier;
- import sun.security.x509.AlgorithmId;
- import sun.security.x509.X500Name;
- import sun.security.x509.X509Cert;
-
- public class PKCS7 {
- private boolean debug = false;
- private ObjectIdentifier contentType;
- private BigInt version;
- private AlgorithmId[] digestAlgorithmIds;
- private ContentInfo contentInfo;
- private X509Cert[] certificates;
- private SignerInfo[] signerInfos;
-
- public PKCS7(InputStream var1) throws ParsingException, IOException {
- DataInputStream var2 = new DataInputStream(var1);
- byte[] var3 = new byte[((FilterInputStream)var2).available()];
- var2.readFully(var3);
- this.parse(new DerInputStream(var3));
- }
-
- public PKCS7(DerInputStream var1) throws ParsingException {
- this.parse(var1);
- }
-
- public PKCS7(byte[] var1) throws ParsingException {
- DerInputStream var2 = new DerInputStream(var1);
- this.parse(var2);
- }
-
- private void parse(DerInputStream var1) throws ParsingException {
- try {
- ContentInfo var2 = new ContentInfo(var1);
- this.contentType = var2.contentType;
- if (this.contentType.equals(ContentInfo.SIGNED_DATA_OID)) {
- this.parseSignedData(var2.getContent());
- } else {
- throw new ParsingException("content type " + this.contentType + "not supported.");
- }
- } catch (IOException var3) {
- this.debug(var3);
- throw new ParsingException("IOException.");
- }
- }
-
- public PKCS7(AlgorithmId[] var1, ContentInfo var2, X509Cert[] var3, SignerInfo[] var4) {
- this.version = new BigInt(1);
- this.digestAlgorithmIds = var1;
- this.contentInfo = var2;
- this.certificates = var3;
- this.signerInfos = var4;
- }
-
- private void parseSignedData(DerValue var1) throws ParsingException, IOException {
- DerInputStream var2 = var1.toDerInputStream();
- this.version = var2.getInteger();
- DerValue[] var3 = var2.getSet(1);
- int var4 = var3.length;
- this.digestAlgorithmIds = new AlgorithmId[var4];
-
- try {
- for(int var5 = 0; var5 < var4; ++var5) {
- DerValue var6 = var3[var5];
- this.digestAlgorithmIds[var5] = AlgorithmId.parse(var6);
- }
- } catch (IOException var10) {
- this.debug(var10);
- throw new ParsingException("error parsing digest AlgorithmId IDs");
- }
-
- this.contentInfo = new ContentInfo(var2);
- DerValue[] var13 = var2.getSet(2);
- var4 = var13.length;
- this.certificates = new X509Cert[var4];
-
- for(int var14 = 0; var14 < var4; ++var14) {
- X509Cert var7 = new X509Cert(var13[var14]);
- this.certificates[var14] = var7;
- }
-
- var2.getSet(0);
- DerValue[] var15 = var2.getSet(1);
- var4 = var15.length;
- this.signerInfos = new SignerInfo[var4];
-
- for(int var8 = 0; var8 < var4; ++var8) {
- DerInputStream var9 = var15[var8].toDerInputStream();
- this.signerInfos[var8] = new SignerInfo(var9);
- }
-
- }
-
- public void encodeSignedData(OutputStream var1) throws IOException {
- DerOutputStream var2 = new DerOutputStream();
- this.encodeSignedData(var2);
- var1.write(((ByteArrayOutputStream)var2).toByteArray());
- }
-
- public void encodeSignedData(DerOutputStream var1) throws IOException {
- DerOutputStream var2 = new DerOutputStream();
- var2.putInteger(this.version);
- DerOutputStream var3 = new DerOutputStream();
-
- for(int var4 = 0; var4 < this.digestAlgorithmIds.length; ++var4) {
- this.digestAlgorithmIds[var4].encode(var3);
- }
-
- var2.write((byte)49, var3);
- this.contentInfo.encode(var2);
- DerOutputStream var5 = new DerOutputStream();
-
- for(int var6 = 0; var6 < this.certificates.length; ++var6) {
- this.certificates[var6].encode(var5);
- }
-
- var2.write((byte)49, var5);
- DerOutputStream var7 = new DerOutputStream();
- var2.write((byte)49, var7);
- DerOutputStream var8 = new DerOutputStream();
-
- for(int var9 = 0; var9 < this.signerInfos.length; ++var9) {
- this.signerInfos[var9].encode(var8);
- }
-
- var2.write((byte)49, var8);
- DerValue var10 = new DerValue((byte)48, ((ByteArrayOutputStream)var2).toByteArray());
- ContentInfo var11 = new ContentInfo(ContentInfo.SIGNED_DATA_OID, var10);
- var11.encode(var1);
- }
-
- public SignerInfo verify(SignerInfo var1, byte[] var2) throws NoSuchAlgorithmException, SignatureException {
- return var1.verify(this, var2);
- }
-
- public SignerInfo[] verify(byte[] var1) throws NoSuchAlgorithmException, SignatureException {
- Vector var2 = new Vector();
-
- for(int var3 = 0; var3 < this.signerInfos.length; ++var3) {
- SignerInfo var4 = this.verify(this.signerInfos[var3], var1);
- if (var4 != null) {
- var2.addElement(var4);
- }
- }
-
- if (var2.size() != 0) {
- SignerInfo[] var5 = new SignerInfo[var2.size()];
- var2.copyInto(var5);
- return var5;
- } else {
- return null;
- }
- }
-
- public SignerInfo[] verify() throws NoSuchAlgorithmException, SignatureException {
- return this.verify((byte[])null);
- }
-
- public BigInt getVersion() {
- return this.version;
- }
-
- public AlgorithmId[] getDigestAlgorithmIds() {
- return this.digestAlgorithmIds;
- }
-
- public ContentInfo getContentInfo() {
- return this.contentInfo;
- }
-
- public X509Cert[] getCertificates() {
- return this.certificates;
- }
-
- public SignerInfo[] getSignerInfos() {
- return this.signerInfos;
- }
-
- public X509Cert getCertificate(BigInt var1, X500Name var2) {
- for(int var3 = 0; var3 < this.certificates.length; ++var3) {
- X509Cert var4 = this.certificates[var3];
- X500Name var5 = var4.getSubjectName();
- BigInt var6 = var4.getSerialNumber();
- if (var1.equals(var6) && var2.equals(var5)) {
- return var4;
- }
- }
-
- return null;
- }
-
- public String toString() {
- String var1 = "";
- var1 = var1 + "PKCS7 :: version: " + this.version + "\n";
- var1 = var1 + "PKCS7 :: digest AlgorithmIds: \n";
-
- for(int var2 = 0; var2 < this.digestAlgorithmIds.length; ++var2) {
- var1 = var1 + "\t" + this.digestAlgorithmIds[var2] + "\n";
- }
-
- var1 = var1 + this.contentInfo + "\n";
- var1 = var1 + "PKCS7 :: certificates: \n";
-
- for(int var3 = 0; var3 < this.certificates.length; ++var3) {
- var1 = var1 + "\t" + var3 + ". " + this.certificates[var3] + "\n";
- }
-
- var1 = var1 + "PKCS7 :: signer infos: \n";
-
- for(int var4 = 0; var4 < this.signerInfos.length; ++var4) {
- var1 = var1 + "\t" + var4 + ". " + this.signerInfos[var4] + "\n";
- }
-
- return var1;
- }
-
- private void debug(Throwable var1) {
- if (this.debug) {
- var1.printStackTrace();
- }
-
- }
- }
-