home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / jar / JarVerifierStream.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  8.0 KB  |  344 lines

  1. package sun.tools.jar;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.PrintStream;
  7. import java.math.BigInteger;
  8. import java.security.Identity;
  9. import java.security.IdentityScope;
  10. import java.security.KeyManagementException;
  11. import java.security.MessageDigest;
  12. import java.security.NoSuchAlgorithmException;
  13. import java.security.PublicKey;
  14. import java.security.SignatureException;
  15. import java.util.Enumeration;
  16. import java.util.Hashtable;
  17. import java.util.Vector;
  18. import java.util.zip.ZipEntry;
  19. import java.util.zip.ZipException;
  20. import java.util.zip.ZipInputStream;
  21. import sun.misc.BASE64Decoder;
  22. import sun.misc.CharacterDecoder;
  23. import sun.net.www.MessageHeader;
  24. import sun.security.pkcs.PKCS7;
  25. import sun.security.pkcs.SignerInfo;
  26. import sun.security.provider.IdentityDatabase;
  27. import sun.security.provider.SystemIdentity;
  28. import sun.security.x509.X509Cert;
  29.  
  30. public class JarVerifierStream extends ZipInputStream {
  31.    static boolean debug;
  32.    private ZipEntry currentEntry;
  33.    private Vector scopes = new Vector();
  34.    private Hashtable nameToHash = new Hashtable();
  35.    private MessageDigest md5;
  36.    private MessageDigest sha;
  37.    private Hashtable signatures = new Hashtable();
  38.    private Hashtable verifiedSignatures = new Hashtable();
  39.    private boolean parsingBlock = false;
  40.    private boolean computingHashes = false;
  41.    private ByteArrayOutputStream blockOut;
  42.    private boolean parsingManifest = false;
  43.    private Manifest manifest;
  44.    private ByteArrayOutputStream manifestOut;
  45.  
  46.    public JarVerifierStream(InputStream var1) throws IOException {
  47.       super(var1);
  48.       IdentityScope var2 = IdentityScope.getSystemScope();
  49.       if (var2 != null) {
  50.          this.addScope(var2);
  51.       }
  52.  
  53.       try {
  54.          this.sha = MessageDigest.getInstance("SHA");
  55.       } catch (NoSuchAlgorithmException var4) {
  56.          debug("didn't find an implementation for SHA");
  57.       }
  58.  
  59.       try {
  60.          this.md5 = MessageDigest.getInstance("MD5");
  61.       } catch (NoSuchAlgorithmException var3) {
  62.          debug("didn't find an implementation for MD5");
  63.       }
  64.    }
  65.  
  66.    public synchronized ZipEntry getNextEntry() throws IOException {
  67.       if (this.currentEntry != null) {
  68.          this.computeHashes(this.currentEntry.getName());
  69.       }
  70.  
  71.       this.computingHashes = false;
  72.       if (this.currentEntry != null) {
  73.          this.closeEntry();
  74.       }
  75.  
  76.       this.currentEntry = super.getNextEntry();
  77.       if (this.currentEntry == null) {
  78.          this.computeSignatures();
  79.          return null;
  80.       } else {
  81.          String var1 = this.currentEntry.getName().toUpperCase();
  82.          if (Manifest.isManifestName(var1) && this.manifest == null) {
  83.             this.parsingManifest = true;
  84.             this.manifestOut = new ByteArrayOutputStream();
  85.          }
  86.  
  87.          if (var1.endsWith("DSA") || var1.endsWith("RSA")) {
  88.             this.parsingBlock = true;
  89.             this.blockOut = new ByteArrayOutputStream();
  90.          }
  91.  
  92.          return this.currentEntry;
  93.       }
  94.    }
  95.  
  96.    private void processData() throws ZipException, IOException {
  97.       if (this.parsingManifest) {
  98.          this.manifest = new Manifest(this.manifestOut.toByteArray());
  99.          this.parsingManifest = false;
  100.       }
  101.  
  102.       if (this.parsingBlock) {
  103.          PKCS7 var1 = new PKCS7(this.blockOut.toByteArray());
  104.          this.addBlock(var1);
  105.          this.parsingBlock = false;
  106.       }
  107.  
  108.    }
  109.  
  110.    public synchronized void closeEntry() throws ZipException, IOException {
  111.       super.closeEntry();
  112.       this.processData();
  113.    }
  114.  
  115.    public int read() throws IOException {
  116.       int var1 = super.read();
  117.       if (var1 != -1) {
  118.          if (this.parsingBlock) {
  119.             this.blockOut.write(var1);
  120.          }
  121.  
  122.          if (this.parsingManifest) {
  123.             this.manifestOut.write(var1);
  124.          }
  125.  
  126.          if (this.computingHashes) {
  127.             this.sha.update((byte)var1);
  128.          }
  129.       }
  130.  
  131.       return var1;
  132.    }
  133.  
  134.    public int read(byte[] var1, int var2, int var3) throws IOException {
  135.       int var4 = super.read(var1, var2, var3);
  136.       if (var4 != -1) {
  137.          if (this.parsingBlock) {
  138.             this.blockOut.write(var1, var2, var4);
  139.          }
  140.  
  141.          if (this.parsingManifest) {
  142.             this.manifestOut.write(var1, var2, var4);
  143.          }
  144.  
  145.          if (this.computingHashes) {
  146.             this.sha.update(var1);
  147.          }
  148.       }
  149.  
  150.       return var4;
  151.    }
  152.  
  153.    private void addBlock(PKCS7 var1) throws IOException {
  154.       byte[] var2 = var1.getContentInfo().getData();
  155.       SignatureFile var3 = new SignatureFile(var2);
  156.       this.signatures.put(var3, var1);
  157.    }
  158.  
  159.    private void computeHashes(String var1) {
  160.       byte[] var2 = this.sha.digest();
  161.       byte[] var3 = this.md5.digest();
  162.       BigInteger var4 = new BigInteger(1, var2);
  163.       BigInteger var5 = new BigInteger(1, var3);
  164.       BigInteger[] var6 = new BigInteger[]{var4, var5};
  165.       this.nameToHash.put(var1, var6);
  166.       this.md5.reset();
  167.       this.sha.reset();
  168.    }
  169.  
  170.    private void computeSignatures() {
  171.       debug("computeSignatures::: invoke");
  172.       Enumeration var1 = this.signatures.keys();
  173.  
  174.       while(var1.hasMoreElements()) {
  175.          SignatureFile var2 = (SignatureFile)var1.nextElement();
  176.          PKCS7 var3 = (PKCS7)this.signatures.get(var2);
  177.          this.processSignature(var2, var3);
  178.       }
  179.  
  180.    }
  181.  
  182.    private void processSignature(SignatureFile var1, PKCS7 var2) {
  183.       MessageDigest var3;
  184.       BASE64Decoder var4;
  185.       SignerInfo[] var5;
  186.       try {
  187.          var5 = var2.verify();
  188.          if (var5 == null) {
  189.             return;
  190.          }
  191.  
  192.          var4 = new BASE64Decoder();
  193.          var3 = MessageDigest.getInstance("SHA");
  194.       } catch (SignatureException var16) {
  195.          debug("signature exception", var16);
  196.          return;
  197.       } catch (NoSuchAlgorithmException var17) {
  198.          debug("algorithm not available", var17);
  199.          return;
  200.       }
  201.  
  202.       Enumeration var6 = var1.entries();
  203.  
  204.       while(var6.hasMoreElements()) {
  205.          MessageHeader var8 = (MessageHeader)var6.nextElement();
  206.          String var7;
  207.          if ((var7 = var8.findValue("Name")) != null) {
  208.             MessageHeader var9 = this.manifest.getEntry(var7);
  209.             if (var9 != null) {
  210.                String var10 = var8.findValue("SHA-Digest");
  211.  
  212.                byte[] var11;
  213.                try {
  214.                   var11 = ((CharacterDecoder)var4).decodeBuffer(var10);
  215.                } catch (IOException var15) {
  216.                   continue;
  217.                }
  218.  
  219.                ByteArrayOutputStream var12 = new ByteArrayOutputStream();
  220.                PrintStream var13 = new PrintStream(var12);
  221.                var9.print(var13);
  222.                byte[] var14 = var3.digest(var12.toByteArray());
  223.                if (MessageDigest.isEqual(var14, var11)) {
  224.                   this.addIdentities(var7, var5, var2);
  225.                }
  226.             }
  227.          }
  228.       }
  229.  
  230.    }
  231.  
  232.    private void addIdentities(String var1, SignerInfo[] var2, PKCS7 var3) {
  233.       Vector var4 = (Vector)this.verifiedSignatures.get(var1);
  234.       if (var4 == null) {
  235.          var4 = new Vector();
  236.       }
  237.  
  238.       Vector var5 = this.findIdentities(var2, var3);
  239.       Enumeration var6 = var5.elements();
  240.  
  241.       while(var6.hasMoreElements()) {
  242.          var4.addElement(var6.nextElement());
  243.       }
  244.  
  245.       this.verifiedSignatures.put(var1, var4);
  246.    }
  247.  
  248.    public void addScope(IdentityScope var1) {
  249.       this.scopes.addElement(var1);
  250.    }
  251.  
  252.    public void removeScope(IdentityScope var1) {
  253.       this.scopes.removeElement(var1);
  254.    }
  255.  
  256.    private Vector findIdentities(SignerInfo[] var1, PKCS7 var2) {
  257.       Vector var3 = new Vector();
  258.       Enumeration var4 = this.scopes.elements();
  259.  
  260.       while(var4.hasMoreElements()) {
  261.          IdentityScope var5 = (IdentityScope)var4.nextElement();
  262.          Identity[] var6 = this.findIdentities0(var1, var2, var5);
  263.          if (var6 != null) {
  264.             for(int var7 = 0; var7 < var6.length; ++var7) {
  265.                var3.addElement(var6[var7]);
  266.             }
  267.          }
  268.       }
  269.  
  270.       return var3;
  271.    }
  272.  
  273.    private Identity[] findIdentities0(SignerInfo[] var1, PKCS7 var2, IdentityScope var3) {
  274.       Vector var4 = new Vector();
  275.       if (var3 instanceof IdentityDatabase) {
  276.          IdentityDatabase var5 = (IdentityDatabase)var3;
  277.  
  278.          for(int var6 = 0; var6 < var1.length; ++var6) {
  279.             SignerInfo var7 = var1[var6];
  280.             X509Cert var8 = var7.getCertificate(var2);
  281.             PublicKey var9 = var8.getPublicKey();
  282.             Identity var10 = var5.getIdentity(var9);
  283.             debug("Identity:::" + var10);
  284.             if (var10 != null) {
  285.                var4.addElement(var10);
  286.             } else {
  287.                try {
  288.                   String var11 = var8.getPrincipal().getName();
  289.                   var10 = new SystemIdentity(var11, var3);
  290.                   var10.setPublicKey(var9);
  291.                   var10.addCertificate(var8);
  292.                   var4.addElement(var10);
  293.                   var10.toString(true);
  294.                } catch (KeyManagementException var12) {
  295.                }
  296.             }
  297.          }
  298.  
  299.          if (var4.size() != 0) {
  300.             Identity[] var13 = new Identity[var4.size()];
  301.             var4.copyInto(var13);
  302.             return var13;
  303.          }
  304.       }
  305.  
  306.       return null;
  307.    }
  308.  
  309.    public Hashtable getVerifiedSignatures() {
  310.       return this.verifiedSignatures;
  311.    }
  312.  
  313.    public Enumeration getBlocks() {
  314.       return this.signatures.elements();
  315.    }
  316.  
  317.    public Hashtable getNameToHash() {
  318.       return this.nameToHash;
  319.    }
  320.  
  321.    public Manifest getManifest() {
  322.       return this.manifest;
  323.    }
  324.  
  325.    static void debug(String var0) {
  326.       if (debug) {
  327.          System.err.println("sun.tools.jar.JarVerifierStream:::" + var0);
  328.       }
  329.  
  330.    }
  331.  
  332.    static void debug(String var0, Throwable var1) {
  333.       if (debug) {
  334.          var1.printStackTrace();
  335.          debug(var0);
  336.       }
  337.  
  338.    }
  339.  
  340.    public Hashtable getHashTable() {
  341.       return this.nameToHash;
  342.    }
  343. }
  344.