home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.jar;
-
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.File;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.OutputStream;
- import java.io.PrintStream;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Vector;
- import sun.misc.BASE64Encoder;
- import sun.misc.CharacterEncoder;
- import sun.net.www.MessageHeader;
- import sun.security.pkcs.PKCS7;
- import sun.security.pkcs.SignerInfo;
-
- public class SignatureFile {
- static final boolean debug = false;
- private Vector entries;
- static final String[] hashes = new String[]{"SHA", "MD5"};
- private Manifest manifest;
- private String rawName;
- private PKCS7 signatureBlock;
- private Hashtable digests;
-
- static final void debug(String var0) {
- }
-
- private SignatureFile(String var1) throws JarException {
- this.entries = new Vector();
- this.digests = new Hashtable();
- this.entries = new Vector();
- if (var1 != null) {
- if (var1.length() > 8 || var1.indexOf(46) != -1) {
- throw new JarException("invalid file name");
- }
-
- this.rawName = var1.toUpperCase();
- }
-
- }
-
- private SignatureFile(String var1, boolean var2) throws JarException {
- this(var1);
- if (var2) {
- MessageHeader var3 = new MessageHeader();
- var3.set("Signature-Version", "1.0");
- this.entries.addElement(var3);
- }
-
- }
-
- public SignatureFile(Manifest var1, String var2) throws JarException {
- this(var2, true);
- this.manifest = var1;
- Enumeration var3 = var1.entries();
-
- while(var3.hasMoreElements()) {
- MessageHeader var4 = (MessageHeader)var3.nextElement();
- String var5 = var4.findValue("Name");
- if (var5 != null) {
- this.add(var5);
- }
- }
-
- }
-
- public SignatureFile(Manifest var1, String[] var2, String var3) throws JarException {
- this(var3, true);
- this.manifest = var1;
- this.add(var2);
- }
-
- public SignatureFile(InputStream var1, String var2) throws IOException {
- this(var2);
-
- while(var1.available() > 0) {
- MessageHeader var3 = new MessageHeader(var1);
- this.entries.addElement(var3);
- }
-
- }
-
- public SignatureFile(InputStream var1) throws IOException {
- this((InputStream)var1, (String)null);
- }
-
- public SignatureFile(byte[] var1) throws IOException {
- this((InputStream)(new ByteArrayInputStream(var1)));
- }
-
- public String getName() {
- return "META-INF" + File.separator + this.rawName + ".SF";
- }
-
- public String getBlockName() {
- String var1 = "DSA";
- if (this.signatureBlock != null) {
- SignerInfo var2 = this.signatureBlock.getSignerInfos()[0];
- var1 = var2.getDigestEncryptionAlgorithmId().getName();
- var1 = var1.substring(var1.length() - 3);
- }
-
- return "META-INF" + File.separator + this.rawName + "." + var1;
- }
-
- public PKCS7 getBlock() {
- return this.signatureBlock;
- }
-
- public void setBlock(PKCS7 var1) {
- this.signatureBlock = var1;
- }
-
- public void add(String[] var1) throws JarException {
- for(int var2 = 0; var2 < var1.length; ++var2) {
- this.add(var1[var2]);
- }
-
- }
-
- public void add(String var1) throws JarException {
- MessageHeader var2 = this.manifest.getEntry(var1);
- if (var2 == null) {
- throw new JarException("entry " + var1 + " not in manifest");
- } else {
- MessageHeader var3;
- try {
- var3 = this.computeEntry(var2);
- } catch (IOException var5) {
- throw new JarException(((Throwable)var5).getMessage());
- }
-
- this.entries.addElement(var3);
- }
- }
-
- public MessageHeader getEntry(String var1) {
- Enumeration var2 = this.entries();
-
- while(var2.hasMoreElements()) {
- MessageHeader var3 = (MessageHeader)var2.nextElement();
- if (var1.equals(var3.findValue("Name"))) {
- return var3;
- }
- }
-
- return null;
- }
-
- public MessageHeader entryAt(int var1) {
- return (MessageHeader)this.entries.elementAt(var1);
- }
-
- public Enumeration entries() {
- return this.entries.elements();
- }
-
- private MessageHeader computeEntry(MessageHeader var1) throws IOException {
- MessageHeader var2 = new MessageHeader();
- String var3 = var1.findValue("Name");
- if (var3 == null) {
- return null;
- } else {
- var2.set("Name", var3);
- BASE64Encoder var4 = new BASE64Encoder();
-
- try {
- String var5 = "";
-
- for(int var6 = 0; var6 < hashes.length; ++var6) {
- var5 = var5 + hashes[var6] + " ";
- }
-
- var2.set("Digest-Algorithms", var5);
-
- for(int var7 = 0; var7 < hashes.length; ++var7) {
- MessageDigest var8 = this.getDigest(hashes[var7]);
- ByteArrayOutputStream var9 = new ByteArrayOutputStream();
- PrintStream var10 = new PrintStream(var9);
- var1.print(var10);
- byte[] var11 = var9.toByteArray();
- byte[] var12 = var8.digest(var11);
- var2.set(hashes[var7] + "-Digest", ((CharacterEncoder)var4).encode(var12));
- }
-
- return var2;
- } catch (NoSuchAlgorithmException var13) {
- throw new JarException(((Throwable)var13).getMessage());
- }
- }
- }
-
- private MessageDigest getDigest(String var1) throws NoSuchAlgorithmException {
- MessageDigest var2 = (MessageDigest)this.digests.get(var1);
- if (var2 == null) {
- var2 = MessageDigest.getInstance(var1);
- this.digests.put(var1, var2);
- }
-
- var2.reset();
- return var2;
- }
-
- public void stream(OutputStream var1) throws IOException {
- MessageHeader var2 = (MessageHeader)this.entries.elementAt(0);
- if (var2.findValue("Signature-Version") == null) {
- throw new JarException("Signature file requires Signature-Version: 1.0 in 1st header");
- } else {
- PrintStream var3 = new PrintStream(var1);
- var2.print(var3);
-
- for(int var4 = 1; var4 < this.entries.size(); ++var4) {
- MessageHeader var5 = (MessageHeader)this.entries.elementAt(var4);
- var5.print(var3);
- }
-
- }
- }
- }
-