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 / SignatureFile.class (.txt) < prev   
Encoding:
Java Class File  |  1997-07-08  |  5.6 KB  |  225 lines

  1. package sun.tools.jar;
  2.  
  3. import java.io.ByteArrayInputStream;
  4. import java.io.ByteArrayOutputStream;
  5. import java.io.File;
  6. import java.io.IOException;
  7. import java.io.InputStream;
  8. import java.io.OutputStream;
  9. import java.io.PrintStream;
  10. import java.security.MessageDigest;
  11. import java.security.NoSuchAlgorithmException;
  12. import java.util.Enumeration;
  13. import java.util.Hashtable;
  14. import java.util.Vector;
  15. import sun.misc.BASE64Encoder;
  16. import sun.misc.CharacterEncoder;
  17. import sun.net.www.MessageHeader;
  18. import sun.security.pkcs.PKCS7;
  19. import sun.security.pkcs.SignerInfo;
  20.  
  21. public class SignatureFile {
  22.    static final boolean debug = false;
  23.    private Vector entries;
  24.    static final String[] hashes = new String[]{"SHA", "MD5"};
  25.    private Manifest manifest;
  26.    private String rawName;
  27.    private PKCS7 signatureBlock;
  28.    private Hashtable digests;
  29.  
  30.    static final void debug(String var0) {
  31.    }
  32.  
  33.    private SignatureFile(String var1) throws JarException {
  34.       this.entries = new Vector();
  35.       this.digests = new Hashtable();
  36.       this.entries = new Vector();
  37.       if (var1 != null) {
  38.          if (var1.length() > 8 || var1.indexOf(46) != -1) {
  39.             throw new JarException("invalid file name");
  40.          }
  41.  
  42.          this.rawName = var1.toUpperCase();
  43.       }
  44.  
  45.    }
  46.  
  47.    private SignatureFile(String var1, boolean var2) throws JarException {
  48.       this(var1);
  49.       if (var2) {
  50.          MessageHeader var3 = new MessageHeader();
  51.          var3.set("Signature-Version", "1.0");
  52.          this.entries.addElement(var3);
  53.       }
  54.  
  55.    }
  56.  
  57.    public SignatureFile(Manifest var1, String var2) throws JarException {
  58.       this(var2, true);
  59.       this.manifest = var1;
  60.       Enumeration var3 = var1.entries();
  61.  
  62.       while(var3.hasMoreElements()) {
  63.          MessageHeader var4 = (MessageHeader)var3.nextElement();
  64.          String var5 = var4.findValue("Name");
  65.          if (var5 != null) {
  66.             this.add(var5);
  67.          }
  68.       }
  69.  
  70.    }
  71.  
  72.    public SignatureFile(Manifest var1, String[] var2, String var3) throws JarException {
  73.       this(var3, true);
  74.       this.manifest = var1;
  75.       this.add(var2);
  76.    }
  77.  
  78.    public SignatureFile(InputStream var1, String var2) throws IOException {
  79.       this(var2);
  80.  
  81.       while(var1.available() > 0) {
  82.          MessageHeader var3 = new MessageHeader(var1);
  83.          this.entries.addElement(var3);
  84.       }
  85.  
  86.    }
  87.  
  88.    public SignatureFile(InputStream var1) throws IOException {
  89.       this((InputStream)var1, (String)null);
  90.    }
  91.  
  92.    public SignatureFile(byte[] var1) throws IOException {
  93.       this((InputStream)(new ByteArrayInputStream(var1)));
  94.    }
  95.  
  96.    public String getName() {
  97.       return "META-INF" + File.separator + this.rawName + ".SF";
  98.    }
  99.  
  100.    public String getBlockName() {
  101.       String var1 = "DSA";
  102.       if (this.signatureBlock != null) {
  103.          SignerInfo var2 = this.signatureBlock.getSignerInfos()[0];
  104.          var1 = var2.getDigestEncryptionAlgorithmId().getName();
  105.          var1 = var1.substring(var1.length() - 3);
  106.       }
  107.  
  108.       return "META-INF" + File.separator + this.rawName + "." + var1;
  109.    }
  110.  
  111.    public PKCS7 getBlock() {
  112.       return this.signatureBlock;
  113.    }
  114.  
  115.    public void setBlock(PKCS7 var1) {
  116.       this.signatureBlock = var1;
  117.    }
  118.  
  119.    public void add(String[] var1) throws JarException {
  120.       for(int var2 = 0; var2 < var1.length; ++var2) {
  121.          this.add(var1[var2]);
  122.       }
  123.  
  124.    }
  125.  
  126.    public void add(String var1) throws JarException {
  127.       MessageHeader var2 = this.manifest.getEntry(var1);
  128.       if (var2 == null) {
  129.          throw new JarException("entry " + var1 + " not in manifest");
  130.       } else {
  131.          MessageHeader var3;
  132.          try {
  133.             var3 = this.computeEntry(var2);
  134.          } catch (IOException var5) {
  135.             throw new JarException(((Throwable)var5).getMessage());
  136.          }
  137.  
  138.          this.entries.addElement(var3);
  139.       }
  140.    }
  141.  
  142.    public MessageHeader getEntry(String var1) {
  143.       Enumeration var2 = this.entries();
  144.  
  145.       while(var2.hasMoreElements()) {
  146.          MessageHeader var3 = (MessageHeader)var2.nextElement();
  147.          if (var1.equals(var3.findValue("Name"))) {
  148.             return var3;
  149.          }
  150.       }
  151.  
  152.       return null;
  153.    }
  154.  
  155.    public MessageHeader entryAt(int var1) {
  156.       return (MessageHeader)this.entries.elementAt(var1);
  157.    }
  158.  
  159.    public Enumeration entries() {
  160.       return this.entries.elements();
  161.    }
  162.  
  163.    private MessageHeader computeEntry(MessageHeader var1) throws IOException {
  164.       MessageHeader var2 = new MessageHeader();
  165.       String var3 = var1.findValue("Name");
  166.       if (var3 == null) {
  167.          return null;
  168.       } else {
  169.          var2.set("Name", var3);
  170.          BASE64Encoder var4 = new BASE64Encoder();
  171.  
  172.          try {
  173.             String var5 = "";
  174.  
  175.             for(int var6 = 0; var6 < hashes.length; ++var6) {
  176.                var5 = var5 + hashes[var6] + " ";
  177.             }
  178.  
  179.             var2.set("Digest-Algorithms", var5);
  180.  
  181.             for(int var7 = 0; var7 < hashes.length; ++var7) {
  182.                MessageDigest var8 = this.getDigest(hashes[var7]);
  183.                ByteArrayOutputStream var9 = new ByteArrayOutputStream();
  184.                PrintStream var10 = new PrintStream(var9);
  185.                var1.print(var10);
  186.                byte[] var11 = var9.toByteArray();
  187.                byte[] var12 = var8.digest(var11);
  188.                var2.set(hashes[var7] + "-Digest", ((CharacterEncoder)var4).encode(var12));
  189.             }
  190.  
  191.             return var2;
  192.          } catch (NoSuchAlgorithmException var13) {
  193.             throw new JarException(((Throwable)var13).getMessage());
  194.          }
  195.       }
  196.    }
  197.  
  198.    private MessageDigest getDigest(String var1) throws NoSuchAlgorithmException {
  199.       MessageDigest var2 = (MessageDigest)this.digests.get(var1);
  200.       if (var2 == null) {
  201.          var2 = MessageDigest.getInstance(var1);
  202.          this.digests.put(var1, var2);
  203.       }
  204.  
  205.       var2.reset();
  206.       return var2;
  207.    }
  208.  
  209.    public void stream(OutputStream var1) throws IOException {
  210.       MessageHeader var2 = (MessageHeader)this.entries.elementAt(0);
  211.       if (var2.findValue("Signature-Version") == null) {
  212.          throw new JarException("Signature file requires Signature-Version: 1.0 in 1st header");
  213.       } else {
  214.          PrintStream var3 = new PrintStream(var1);
  215.          var2.print(var3);
  216.  
  217.          for(int var4 = 1; var4 < this.entries.size(); ++var4) {
  218.             MessageHeader var5 = (MessageHeader)this.entries.elementAt(var4);
  219.             var5.print(var3);
  220.          }
  221.  
  222.       }
  223.    }
  224. }
  225.