home *** CD-ROM | disk | FTP | other *** search
- package sun.security.provider;
-
- import java.io.BufferedOutputStream;
- import java.io.ByteArrayInputStream;
- import java.io.ByteArrayOutputStream;
- import java.io.DataInputStream;
- import java.io.File;
- import java.io.FileInputStream;
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.FilterInputStream;
- import java.io.FilterOutputStream;
- import java.io.IOException;
- import java.io.InputStream;
- import java.io.PrintStream;
- import java.math.BigInteger;
- import java.security.Certificate;
- import java.security.Identity;
- import java.security.IdentityScope;
- import java.security.InvalidKeyException;
- import java.security.InvalidParameterException;
- import java.security.Key;
- import java.security.KeyException;
- import java.security.KeyManagementException;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.NoSuchAlgorithmException;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.SecureRandom;
- import java.security.Signature;
- import java.security.SignatureException;
- import java.security.Signer;
- import java.util.Date;
- import java.util.Enumeration;
- import java.util.Hashtable;
- import java.util.Properties;
- import java.util.zip.ZipEntry;
- import java.util.zip.ZipInputStream;
- import java.util.zip.ZipOutputStream;
- import sun.security.pkcs.ContentInfo;
- import sun.security.pkcs.PKCS7;
- import sun.security.pkcs.PKCS8Key;
- import sun.security.pkcs.SignerInfo;
- import sun.security.util.BigInt;
- import sun.security.util.DerValue;
- import sun.security.x509.AlgorithmId;
- import sun.security.x509.CertException;
- import sun.security.x509.X500Name;
- import sun.security.x509.X500Signer;
- import sun.security.x509.X509Cert;
- import sun.security.x509.X509Key;
- import sun.tools.jar.Manifest;
- import sun.tools.jar.SignatureFile;
-
- public class Main {
- private boolean debug = false;
- private boolean quitOnError = false;
- String program;
- String usage;
- PrintStream out;
- PrintStream err;
- // $FF: renamed from: in java.io.InputStream
- InputStream field_0;
- protected IdentityScope scope;
-
- public Main(PrintStream var1, PrintStream var2, InputStream var3, String var4, boolean var5) {
- this.out = var1;
- this.err = var2;
- this.program = var4;
- this.quitOnError = var5;
- }
-
- protected void setScope(IdentityScope var1) {
- this.scope = var1;
- }
-
- void listCmd(String[] var1) {
- String var2 = var1[0];
- boolean var3 = false;
- if (var2.equals("li")) {
- if (var1.length != 2) {
- this.listUsage();
- } else {
- Identity var4 = this.scope.getIdentity(var1[1]);
- if (var4 == null) {
- this.error("No such identity: " + var1[1] + " in scope " + this.scope);
- } else {
- this.list(var4);
- }
- }
- } else if (!var2.equals("l") && !(var3 = var2.equals("ld"))) {
- this.listUsage();
- } else {
- if (var1.length != 1) {
- this.listUsage();
- }
-
- this.list(var3);
- }
- }
-
- void listUsage() {
- String var1 = "";
- var1 = var1 + "legal options for list:\n";
- var1 = var1 + "\tno argument \tlist all identities in succint form.\n";
- var1 = var1 + "\ti <identity>\tlist an identity in detail.\n";
- var1 = var1 + "\td\t\tdetail: list all identities in detail.";
- this.out.println(var1);
- this.error("illegal arguments to list");
- }
-
- public boolean list(boolean var1) {
- this.out.println();
- this.out.println("Scope: " + this.scope);
- Enumeration var2 = this.scope.identities();
-
- while(var2.hasMoreElements()) {
- Identity var3 = (Identity)var2.nextElement();
- this.out.println();
- this.out.println(var3.toString(var1));
- }
-
- return true;
- }
-
- public void list(Identity var1) {
- this.out.println("Identity: " + var1.getName());
- this.out.println(var1.toString(true));
- }
-
- void createCmd(String[] var1) {
- boolean var2 = false;
- String var3 = var1[0];
- boolean var4 = false;
- int var5 = var1.length;
- boolean var6 = var3.equalsIgnoreCase("c");
- boolean var7 = var3.equalsIgnoreCase("cs");
- boolean var8 = var5 == 2 || var5 == 3;
- if (var5 == 3) {
- var4 = new Boolean(var1[2]);
- }
-
- if (var8 && var6) {
- var2 = this.createIdentity(var1[1], var4);
- } else if (var8 && var7) {
- var2 = this.createSigner(var1[1], var4);
- } else {
- String var9 = "";
- var9 = var9 + "legal options for create:\n";
- var9 = var9 + "\tno arguments\t<name> {trusted}\tcreate a new identity.\n";
- var9 = var9 + "\ts\t\t<name> {trusted}\tcreate a new signer.\n";
- this.out.println(var9);
- this.error("illegal arguments to create");
- }
-
- if (var2) {
- String var13 = "Created identity " + this.scope.getIdentity(var1[1]);
- this.save(this.scope, var13);
- }
-
- }
-
- public boolean createIdentity(String var1, boolean var2) {
- try {
- SystemIdentity var3 = new SystemIdentity(var1, this.scope);
- this.scope.addIdentity(var3);
- var3.setTrusted(var2);
- return true;
- } catch (KeyManagementException var4) {
- return this.error("An error occured trying to add " + var1 + " to " + this.scope, var4);
- } catch (InvalidParameterException var5) {
- return this.error("Invalid parameter trying to add " + var1 + " to " + this.scope, var5);
- }
- }
-
- public boolean createSigner(String var1, boolean var2) {
- try {
- if (this.scope.getIdentity(var1) != null) {
- return this.error("Name conflict. Please remove the identity named " + var1 + " before adding a new identity with that name.");
- } else {
- SystemSigner var3 = new SystemSigner(var1, this.scope);
- this.scope.addIdentity(var3);
- var3.setTrusted(var2);
- return true;
- }
- } catch (KeyManagementException var4) {
- return this.error("An error occured trying to add " + var1 + " to " + this.scope, var4);
- }
- }
-
- protected void removeCmd(String[] var1) {
- String var2 = "";
- boolean var3 = false;
- if (var1.length == 2) {
- var2 = var1[1];
- if (this.scope.getIdentity(var2) == null) {
- var3 = this.error("No one named " + var2 + " in the system.");
- } else {
- var3 = this.remove(var2);
- }
- } else {
- String var4 = "";
- var4 = var4 + "legal options for remove:\n";
- var4 = var4 + "\tno arguments\t<name>\tthe name of the identity to remove\n";
- this.out.println(var4);
- var3 = this.error("illegal arguments to remove");
- }
-
- if (var3) {
- this.save(this.scope, "Removed " + var2 + ".");
- }
-
- }
-
- public boolean remove(String var1) {
- try {
- Identity var2 = this.scope.getIdentity(var1);
- if (var2 == null) {
- return this.error(var1 + " not found in database.");
- } else {
- this.scope.removeIdentity(var2);
- return true;
- }
- } catch (KeyManagementException var3) {
- return this.internalError("remove " + var1);
- }
- }
-
- protected void exportCmd(String[] var1) {
- boolean var2 = false;
- String var3 = "";
- String var4 = var1[0];
- int var5 = var1.length;
- if (var5 >= 3 && var5 <= 4) {
- String var6 = var1[1];
- if (var4.equals("ek")) {
- File var7 = new File(var1[2]);
- File var8 = null;
- if (var1.length == 4) {
- var8 = new File(var1[3]);
- }
-
- var2 = this.exportKeys(var6, var7, var8);
- var3 = "Public key exported to " + var7 + ".";
- if (var8 != null) {
- var3 = var3 + "\nPrivate key exported to " + var8 + ".";
- }
- } else if (var4.equals("ec")) {
- if (var5 != 4) {
- this.exportUsageError();
- }
-
- int var9 = Integer.parseInt(var1[2]);
- File var10 = new File(var1[3]);
- var2 = this.exportCert(var6, var9, var10);
- var3 = "Certificate " + var9 + " exported to " + var10 + ".";
- } else {
- this.exportUsageError();
- }
-
- if (var2) {
- this.save(this.scope, var3);
- }
-
- } else {
- this.exportUsageError();
- }
- }
-
- boolean exportKeys(String var1, File var2, File var3) {
- try {
- Identity var6 = this.scope.getIdentity(var1);
- if (var6 == null) {
- return this.error("There are no identities named " + var1 + " in the system.");
- }
-
- if (var6 instanceof Identity) {
- PublicKey var7 = var6.getPublicKey();
- if (var7 == null) {
- return this.error("identity " + var1 + " does not have a public key.");
- }
-
- FileOutputStream var4 = new FileOutputStream(var2);
- BufferedOutputStream var5 = new BufferedOutputStream(var4);
- ((FilterOutputStream)var5).write(var7.getEncoded());
- var5.flush();
- var4.close();
- }
-
- if (var6 instanceof Signer && var3 != null) {
- Signer var12 = (Signer)var6;
- FileOutputStream var10 = new FileOutputStream(var3);
- BufferedOutputStream var11 = new BufferedOutputStream(var10);
- PrivateKey var8 = var12.getPrivateKey();
- if (var8 == null) {
- return this.error("signer " + var1 + " does not have a private key.");
- }
-
- ((FilterOutputStream)var11).write(var8.getEncoded());
- var11.flush();
- var10.close();
- }
- } catch (IOException var9) {
- this.error("Error: io error", var9);
- }
-
- return true;
- }
-
- boolean exportCert(String var1, int var2, File var3) {
- try {
- Identity var6 = this.scope.getIdentity(var1);
- if (var6 == null) {
- return this.error("There are no identities named " + var1 + " in the system.");
- } else {
- Certificate[] var7 = var6.certificates();
- if (var7.length < var2) {
- return this.error("identity " + var1 + " does not have a cert " + var2 + ".");
- } else {
- Certificate var8 = var7[var2 - 1];
- FileOutputStream var4 = new FileOutputStream(var3);
- BufferedOutputStream var5 = new BufferedOutputStream(var4);
- var8.encode(var5);
- var5.flush();
- var4.close();
- return true;
- }
- }
- } catch (IOException var9) {
- return this.error("Error: io error", var9);
- } catch (KeyException var10) {
- return this.error("Key exception: invalid key", var10);
- }
- }
-
- private boolean exportUsageError() {
- String var1 = "";
- var1 = var1 + "legal options for export (<id> is the identity for which the import is done.)\n";
- var1 = var1 + "\tk\t<id> <pub> {priv}\t\texport a public key,\n\t\t (and optionally a private key) to a file.\n";
- var1 = var1 + "\tc\t<id> <certnum> <certFile>\texport a cert to a files.\n";
- this.out.println(var1);
- return this.error("illegal arguments to export.");
- }
-
- protected void importCmd(String[] var1) {
- boolean var2 = false;
- String var3 = "";
- String var4 = var1[0];
- int var5 = var1.length;
- if (var5 >= 2 && var5 <= 4) {
- String var6 = var1[1];
- String var7 = "";
- if (var5 > 2) {
- var7 = var1[2];
- }
-
- if (var4.equals("ic")) {
- var2 = this.importCertificate(var6, var7);
- var3 = "Imported certificate from " + var7 + " for " + var6 + ".";
- } else if (var4.equals("ik")) {
- var2 = this.importPublicKey(var6, var7);
- var3 = "Set public key from " + var7 + " for " + var6 + ".";
- } else if (var4.equals("ikp") && var5 == 4) {
- var2 = this.setKeyPair(var6, var7, var1[3]);
- var3 = "Set public key from " + var7 + " for " + var6 + ".";
- var3 = var3 + "\nSet private key from " + var1[3] + " for " + var6 + ".";
- } else if (var4.equals("ii") && var5 == 2) {
- var2 = this.setInfo(var6);
- var3 = "Set information for " + var6;
- } else {
- var2 = this.importUsageError();
- }
-
- if (var2) {
- this.save(this.scope, var3);
- }
-
- } else {
- this.importUsageError();
- }
- }
-
- private boolean importUsageError() {
- String var1 = "";
- var1 = var1 + "legal options for import (<id> is the identity for which the import is done.)\n";
- var1 = var1 + "\tk\t<id> <pub>\t\timport a public key from a file.\n";
- var1 = var1 + "\tkp\t<id> <pub> <priv>\timport a key pair from two files.\n";
- var1 = var1 + "\tc\t<id> <cert>\t\timport a certificate from a file.\n";
- this.out.println(var1);
- return this.error("illegal arguments to import.");
- }
-
- private boolean setInfo(String var1) {
- Identity var2 = this.scope.getIdentity(var1);
- if (var2 == null) {
- return this.error("There are no identities named " + var2 + " in the system.");
- } else {
- this.out.println("Please enter the info for this identity.");
- this.out.println("[End with ctrl-D on Unix and ctrl-Z on Win32]");
- DataInputStream var3 = new DataInputStream(System.in);
- String var4 = "";
- String var5 = "";
-
- try {
- while((var5 = var3.readLine()) != null) {
- var4 = var4 + "\n" + var5;
- }
- } catch (IOException var7) {
- this.debug((Throwable)var7);
- return this.error("IOException importing information.");
- }
-
- var2.setInfo(var4);
- return true;
- }
- }
-
- public boolean importCertificate(String var1, String var2) {
- Object var3 = null;
-
- try {
- File var4 = new File(var2);
- if (!var4.exists()) {
- return this.error("File " + var2 + " not found.");
- } else {
- FileInputStream var5 = new FileInputStream(var4);
- DataInputStream var6 = new DataInputStream(var5);
- byte[] var7 = new byte[((FilterInputStream)var6).available()];
- var6.readFully(var7);
- X509Cert var8 = new X509Cert(var7);
- Identity var12 = this.scope.getIdentity(var1);
- if (var12 == null) {
- return this.error(var1 + " not found in the system.");
- } else {
- this.importCertificate((Identity)var12, (Certificate)var8);
- return true;
- }
- }
- } catch (IOException var9) {
- return this.error("Error: io error", var9);
- } catch (KeyManagementException var10) {
- return this.error("key management exception: " + ((Throwable)var10).getMessage(), var10);
- } catch (CertException var11) {
- return this.error("invalid cert: " + var2, var11);
- }
- }
-
- boolean importCertificate(Identity var1, Certificate var2) throws KeyManagementException {
- PublicKey var3 = var2.getPublicKey();
- PublicKey var4 = var1.getPublicKey();
- if (var4 == null) {
- var1.setPublicKey(var3);
- } else if (!var4.equals(var3)) {
- return this.error("Certificate key does not match identity key.");
- }
-
- var1.addCertificate(var2);
- return true;
- }
-
- boolean importPublicKey(String var1, String var2) {
- try {
- Identity var3 = this.scope.getIdentity(var1);
- if (var3 == null) {
- return this.error(var1 + " not found in database.");
- } else {
- File var4 = new File(var2);
- if (!var4.exists()) {
- return this.error("File " + var2 + " not found.");
- } else {
- FileInputStream var5 = new FileInputStream(var4);
- DataInputStream var6 = new DataInputStream(var5);
- byte[] var7 = new byte[((FilterInputStream)var6).available()];
- var6.readFully(var7);
- DerValue var8 = new DerValue(var7);
- X509Key var9 = X509Key.parse(var8);
- PublicKey var10 = var3.getPublicKey();
- if (var10 != null && !var9.equals(var10)) {
- this.message(var3 + " already has a public key." + "\nClearing any exisiting certificates...\n");
- Certificate[] var11 = var3.certificates();
-
- for(int var12 = 0; var12 < var11.length; ++var12) {
- var3.removeCertificate(var11[var12]);
- }
- }
-
- var3.setPublicKey(var9);
- return true;
- }
- }
- } catch (IOException var13) {
- return this.error("Error: io error", var13);
- } catch (KeyException var14) {
- return this.error("Key exception: invalid key", var14);
- }
- }
-
- boolean setKeyPair(String var1, String var2, String var3) {
- try {
- File var4 = new File(var2);
- File var5 = new File(var3);
- if (!var4.exists()) {
- return this.error("File " + var4 + " not found.");
- } else if (!var5.exists()) {
- return this.error("File " + var5 + " not found.");
- } else {
- FileInputStream var6 = new FileInputStream(var4);
- DataInputStream var7 = new DataInputStream(var6);
- byte[] var8 = new byte[((FilterInputStream)var7).available()];
- var7.readFully(var8);
- var6.close();
- DerValue var9 = new DerValue(var8);
- X509Key var10 = X509Key.parse(var9);
- var6 = new FileInputStream(var5);
- var7 = new DataInputStream(var6);
- var8 = new byte[((FilterInputStream)var7).available()];
- var7.readFully(var8);
- var6.close();
- var9 = new DerValue(var8);
- PKCS8Key var11 = PKCS8Key.parse(var9);
- KeyPair var12 = new KeyPair(var10, var11);
- return this.setKeyPair(var1, var12);
- }
- } catch (IOException var13) {
- return true;
- }
- }
-
- boolean setKeyPair(String var1, KeyPair var2) {
- try {
- Signer var3 = (Signer)this.scope.getIdentity(var1);
- if (var3 == null) {
- return this.error("Signer " + var1 + " not found in system.");
- } else {
- var3.setKeyPair(var2);
- return true;
- }
- } catch (KeyException var4) {
- return this.error("Key exception: invalid key", var4);
- } catch (InvalidParameterException var5) {
- return this.error("Internal error!", var5);
- }
- }
-
- private void save(IdentityScope var1, String var2) {
- if (var1 instanceof IdentityDatabase) {
- try {
- IdentityDatabase var3 = (IdentityDatabase)var1;
- var3.save();
- } catch (IOException var4) {
- this.error("IOException trying to save the database.", var4);
- }
- } else {
- this.out.println("Cannot save the database: not a SUN database.");
- }
-
- this.exit(var2);
- }
-
- private void save(IdentityScope var1) {
- this.save(var1, "Operation succesful.");
- }
-
- private void generateCmd(String[] var1) {
- boolean var2 = false;
- String var3 = "";
- String var4 = var1[0];
- int var5 = var1.length;
- Properties var6 = new Properties();
- File var7 = null;
- if (var5 == 2 || var5 == 3) {
- var7 = new File(var1[1]);
-
- try {
- FileInputStream var8 = new FileInputStream(var7);
- var6.load(var8);
- } catch (FileNotFoundException var11) {
- this.error("directive file " + var7 + " not found.");
- } catch (IOException var12) {
- this.error("IOException loading directive file " + var7);
- }
- }
-
- if (var4.equals("gk")) {
- if (var5 == 2) {
- var2 = this.generateKeyPair(var6);
- } else if (var5 < 7 && var5 > 3) {
- ((Hashtable)var6).put("signer.name", var1[1]);
- ((Hashtable)var6).put("algorithm", var1[2]);
- ((Hashtable)var6).put("strength", var1[3]);
- if (var5 > 4) {
- ((Hashtable)var6).put("pub", var1[4]);
- }
-
- if (var5 > 5) {
- ((Hashtable)var6).put("priv", var1[5]);
- }
-
- var2 = this.generateKeyPair(var6);
- }
-
- var3 = "Generated " + ((Hashtable)var6).get("algorithm") + " keys for " + ((Hashtable)var6).get("signer.name") + " (strength: " + ((Hashtable)var6).get("strength") + ").";
- String var13 = var6.getProperty("pub");
- String var9 = var6.getProperty("priv");
- if (var13 != null) {
- var3 = var3 + "\nSaved public key to " + var13 + ".";
- }
-
- if (var9 != null) {
- var3 = var3 + "\nSaved private key to " + var9 + ".";
- }
- } else if (var4.equals("gc")) {
- if (var5 != 2) {
- this.usageError("generate certificate only takes one argument, the directive file.");
- } else {
- var2 = this.generateCertificate(var6);
- var3 = "Generated certificate from directive file " + var7 + ".";
- }
- } else if (var4.equals("gs")) {
- try {
- if (var1.length != 3) {
- this.usageError("wrong number of arguments. gs takes 2 arguments: the directive and jar file.");
- } else {
- File var14 = new File(var1[2]);
- if (!var14.exists()) {
- this.error("JAR file " + var14 + " not found.");
- }
-
- var2 = this.signJar(var6, var14);
- var3 = "Signed JAR file " + var14 + " using directive file " + var7 + ".";
- }
- } catch (Exception var10) {
- this.error("error generating signature: " + ((Throwable)var10).getMessage(), var10);
- }
- } else {
- this.generateUsageError();
- }
-
- if (var2) {
- this.save(this.scope, var3);
- }
-
- }
-
- private boolean generateUsageError() {
- String var1 = "";
- var1 = var1 + "legal options for generate:\n";
- var1 = var1 + "\tk\t<id> <alg> <mod>\t\tgenerate a key pair.\n";
- var1 = var1 + "\tc\t<certdir> \tgenerate a certificate.\n";
- var1 = var1 + "\ts\t<sigdir> <file>\t\tgenerate a signature.\n";
- this.out.println(var1);
- return this.error("illegal arguments to generate.");
- }
-
- boolean generateCertificate(Properties var1) {
- int var2 = -1;
- Object var3 = null;
- Object var4 = null;
- Object var5 = null;
- X509Cert var6 = null;
- Object var7 = null;
- Object var8 = null;
- String var9 = "DSA";
-
- try {
- String var10 = this.assertProp("issuer.name", var1);
- String var11 = this.assertProp("subject.name", var1);
- String var12 = null;
- boolean var13 = var10.equals(var11);
- if (!var13) {
- var12 = this.assertProp("issuer.cert", var1);
- }
-
- String var14 = this.assertProp("subject.real.name", var1);
- String var15 = this.assertProp("subject.org.unit", var1);
- String var16 = this.assertProp("subject.org", var1);
- String var17 = this.assertProp("subject.country", var1);
- String var18 = this.assertProp("start.date", var1);
- String var19 = this.assertProp("end.date", var1);
- String var20 = this.assertProp("serial.number", var1);
- var9 = var1.getProperty("signature.algorithm");
- X500Name var21 = new X500Name(var14, var15, var16, var17);
-
- try {
- var43 = new Date(var18);
- var44 = new Date(var19);
- Date var22 = new Date();
- if (var22.after(var44)) {
- this.out.println("warning: certificate's expiration date is earlier than the current date.");
- }
-
- if (var44.before(var43)) {
- this.out.println("warning: certificate's expiration date is earlier than the start date.");
- }
-
- if (!var13) {
- var2 = Integer.parseInt(var12) - 1;
- }
-
- BigInteger var23 = new BigInteger(var20);
- var42 = new BigInt(var23.toByteArray());
- } catch (NumberFormatException var38) {
- return this.error("Error parsing issuer.cert number.");
- } catch (IllegalArgumentException var39) {
- return this.error("Date formatted incorrectly.");
- } catch (Exception var40) {
- this.debug((Throwable)var40);
- return this.error("error signing: " + ((Throwable)var40).getMessage());
- }
-
- Signer var48 = (Signer)this.scope.getIdentity(var10);
- if (var48 == null) {
- return this.error("no signer " + var10 + " found in the database.");
- } else {
- PrivateKey var45 = var48.getPrivateKey();
- if (var45 == null) {
- return this.error(var48 + " does not have a private key.");
- } else {
- if (var9 == null) {
- var9 = "DSA";
- }
-
- if (!var13) {
- Certificate[] var49 = ((Identity)var48).certificates();
- if (var2 >= var49.length) {
- return this.error("No such cert: " + (var2 + 1) + " for issuer " + var48 + ".");
- }
-
- Certificate var24 = var49[var2];
- if (var24 == null || !(var24 instanceof X509Cert)) {
- return this.error("invalid cert for signer");
- }
-
- var6 = (X509Cert)var24;
- }
-
- try {
- if (var45 == null) {
- return this.error("Signer " + var48 + " has no signing key.");
- } else {
- Identity var50 = this.scope.getIdentity(var11);
- if (var48 == null) {
- return this.error("No such guarantor: " + var10);
- } else if (var50 == null) {
- return this.error("No such identity: " + var11);
- } else {
- PublicKey var51 = var50.getPublicKey();
- if (var51 == null) {
- return this.error(var50 + " does not have a public key.");
- } else if (!var51.getFormat().equals("X.509")) {
- return this.error("Public key format is not X.509");
- } else {
- try {
- if (var51 instanceof X509Key) {
- var46 = (X509Key)var51;
- } else {
- DerValue var25 = new DerValue(var51.getEncoded());
- var46 = X509Key.parse(var25);
- }
- } catch (IOException var33) {
- return this.error("Bad X509 key: " + ((Throwable)var33).getMessage(), var33);
- }
-
- X509Cert var52 = new X509Cert(var21, var46, var43, var44);
- if (var13) {
- var6 = var52;
- }
-
- AlgorithmId var26 = AlgorithmId.get(var9);
- X500Signer var27 = var6.getSigner(var26, var45);
- byte[] var28 = var52.encodeAndSign(var42, var27);
- X509Cert var29 = new X509Cert(var28);
- var50.addCertificate(var29);
- String var30 = var1.getProperty("out.file");
- if (var30 != null) {
- File var31 = new File(var30);
- FileOutputStream var32 = new FileOutputStream(var31);
- var29.encode(var32);
- }
-
- return true;
- }
- }
- }
- } catch (IOException var34) {
- return this.error("IO exception during cert signing", var34);
- } catch (SignatureException var35) {
- return this.error("A signature exception occured", var35);
- } catch (KeyException var36) {
- return this.error("A key exception occured", var36);
- } catch (NoSuchAlgorithmException var37) {
- return this.error("algorithm " + var9 + " not available", var37);
- }
- }
- }
- } catch (IOException var41) {
- ((Throwable)var41).printStackTrace();
- return false;
- }
- }
-
- boolean generateKeyPair(Properties var1) {
- String var2 = this.assertProp("signer.name", var1);
- String var3 = this.assertProp("strength", var1);
- String var4 = this.assertProp("algorithm", var1);
- String var5 = var1.getProperty("provider");
- String var6 = var1.getProperty("pub");
- String var7 = var1.getProperty("priv");
- Identity var8 = this.scope.getIdentity(var2);
- if (var8 == null) {
- this.error(var2 + " not found in system.");
- } else {
- if (var8 instanceof Signer) {
- Signer var9 = (Signer)var8;
- int var10 = Integer.parseInt(var3);
- this.machineSeed(64);
- Object var11 = null;
- Object var12 = null;
-
- try {
- KeyPairGenerator var18 = KeyPairGenerator.getInstance(var4, var5);
- var18.initialize(var10, new SecureRandom());
- var19 = var18.generateKeyPair();
- } catch (NoSuchAlgorithmException var16) {
- return this.error("Algorithm " + var4 + " not available.");
- } catch (Exception var17) {
- return this.error("Invalid algorithm params for key generation.", var17);
- }
-
- try {
- var9.setKeyPair(var19);
- } catch (InvalidParameterException var14) {
- this.err.println("Internal error!");
- ((Throwable)var14).printStackTrace(this.err);
- } catch (KeyException var15) {
- this.err.println("Internal error!");
- ((Throwable)var15).printStackTrace(this.err);
- }
-
- if (var6 != null) {
- File var13 = new File(var6);
- if (!this.saveKey(var19.getPublic(), var13)) {
- this.error("error saving public key to file " + var13);
- }
- }
-
- if (var7 != null) {
- File var20 = new File(var7);
- if (!this.saveKey(var19.getPrivate(), var20)) {
- this.error("error saving private key to file " + var20);
- }
- }
-
- return true;
- }
-
- this.error("Identity " + var8 + " not a signer.");
- }
-
- return false;
- }
-
- private boolean saveKey(Key var1, File var2) {
- try {
- FileOutputStream var3 = new FileOutputStream(var2);
- var3.write(var1.getEncoded());
- var3.close();
- return true;
- } catch (IOException var4) {
- return this.error("IOException saving keys.", var4);
- } catch (ClassCastException var5) {
- return this.error("Not a SUN key- cannot save", var5);
- }
- }
-
- boolean signJar(Properties var1, File var2) throws Exception {
- String var3 = this.assertProp("signature.file", var1);
- if (var3 == null) {
- return false;
- } else {
- var3 = var3.toUpperCase();
- String var4 = var2.getName();
- String var5 = var1.getProperty("out.file");
- if (var5 == null || var5.equals(var4)) {
- var5 = var4 + ".sig";
- }
-
- File var6 = new File(var5);
- FileInputStream var8 = new FileInputStream(var2);
- ZipInputStream var9 = new ZipInputStream(var8);
- FileOutputStream var10 = new FileOutputStream(var6);
- PrintStream var11 = new PrintStream(var10);
- ZipOutputStream var12 = new ZipOutputStream(var11);
- ZipEntry var13 = var9.getNextEntry();
- String var14 = ("META-INF/" + var3 + ".SF").toUpperCase();
-
- for(String var15 = ("META-INF/" + var3 + ".DSA").toUpperCase(); var13 != null; var13 = var9.getNextEntry()) {
- if (Manifest.isManifestName(var13.getName())) {
- byte[] var16 = this.getBytesToEOF(var9);
- Manifest var7 = new Manifest(var16);
- this.writeEntry(new ByteArrayInputStream(var16), var12, var13);
- SignatureFile var17 = this.computeSignatures(var7, var1);
- if (var17 == null) {
- return false;
- }
-
- PKCS7 var18 = var17.getBlock();
- var14 = var17.getName();
- var15 = var17.getBlockName();
- ZipEntry var19 = new ZipEntry(var17.getName());
- ZipEntry var20 = new ZipEntry(var17.getBlockName());
- Date var21 = new Date();
- var19.setTime(var21.getTime());
- var20.setTime(var21.getTime());
- var12.putNextEntry(var19);
- var17.stream(var12);
- this.out.println("Creating entry: " + var19.getName());
- var12.putNextEntry(var20);
- var18.encodeSignedData(var12);
- this.out.println("Creating entry: " + var20.getName());
- } else if (!var13.getName().equalsIgnoreCase(var14) && !var13.getName().equalsIgnoreCase(var15)) {
- this.writeEntry(var9, var12, var13);
- } else {
- this.out.println("(Replaced existing entry: " + var13.getName() + ")");
- }
- }
-
- var12.close();
- return true;
- }
- }
-
- private byte[] getBytesToEOF(InputStream var1) throws IOException {
- ByteArrayOutputStream var2 = new ByteArrayOutputStream();
- byte[] var3 = new byte[1024];
-
- int var4;
- while((var4 = var1.read(var3, 0, var3.length)) != -1) {
- var2.write(var3, 0, var4);
- }
-
- return var2.toByteArray();
- }
-
- private void writeEntry(InputStream var1, ZipOutputStream var2, ZipEntry var3) throws IOException {
- this.out.println("Adding entry: " + var3.getName());
- byte[] var4 = this.getBytesToEOF(var1);
- var2.putNextEntry(var3);
- if (var4.length > 0) {
- ((FilterOutputStream)var2).write(var4);
- }
-
- }
-
- SignatureFile computeSignatures(Manifest var1, Properties var2) throws IOException, InvalidKeyException, SignatureException, NoSuchAlgorithmException {
- String var3 = this.assertProp("signature.file", var2);
- String var4 = this.assertProp("signer", var2);
- String var5 = this.assertProp("cert", var2);
- String var6 = this.assertProp("chain", var2);
- Identity var7 = this.scope.getIdentity(var4);
- Object var8 = null;
- if (var7 == null) {
- this.error(var4 + " not found in database.");
- return null;
- } else if (var7 instanceof Signer) {
- Signer var16 = (Signer)var7;
- PrivateKey var9 = var16.getPrivateKey();
- if (var9 == null) {
- this.error(var16 + " does not have a public key.");
- return null;
- } else {
- int var10 = 0;
- if (var6 != null) {
- var10 = Integer.parseInt(var6);
- }
-
- if (var5 == null) {
- this.error("illegal directive file");
- return null;
- } else if (var3.length() > 8) {
- this.error("signature file specified longer than 8 characters.");
- return null;
- } else {
- int var11 = Integer.parseInt(var5);
- Certificate[] var12 = ((Identity)var16).certificates();
- if (var11 <= var12.length && var11 >= 1) {
- Certificate var13 = var12[var11 - 1];
- if (!(var13 instanceof X509Cert)) {
- this.error("only X509 certificate format supported for signing JAR");
- return null;
- } else {
- SignatureFile var14 = new SignatureFile(var1, var3);
- PKCS7 var15 = this.computePKCS7(var14, var9, (X509Cert)var13);
- var14.setBlock(var15);
- return var14;
- }
- } else {
- this.error("Invalid cert number (" + var11 + "). Valid numbers are 1 through " + var12.length + ".");
- return null;
- }
- }
- }
- } else {
- this.error(var7 + " is not a Signer.");
- return null;
- }
- }
-
- private PKCS7 computePKCS7(SignatureFile var1, PrivateKey var2, X509Cert var3) throws IOException, InvalidKeyException, SignatureException, NoSuchAlgorithmException {
- X500Name var4 = var3.getSubjectName();
- BigInt var5 = var3.getSerialNumber();
- String var6 = var2.getAlgorithm();
- String var7 = "SHA";
- String var8 = "SHA/DSA";
- if (!var6.equals("DSA")) {
- if (var6.equals("RSA")) {
- var8 = "MD5/RSA";
- var7 = "MD5";
- } else {
- this.error("private key is not a DSA or RSA key.");
- }
- }
-
- AlgorithmId var9 = AlgorithmId.get(var7);
- AlgorithmId var10 = AlgorithmId.get(var8);
- Signature var11 = Signature.getInstance(var8);
- var11.initSign(var2);
- ByteArrayOutputStream var12 = new ByteArrayOutputStream();
- var1.stream(var12);
- byte[] var13 = var12.toByteArray();
- ContentInfo var14 = new ContentInfo(var13);
- var11.update(var13);
- byte[] var15 = var11.sign();
- SignerInfo var16 = new SignerInfo(var4, var5, var9, var10, var15);
- AlgorithmId[] var17 = new AlgorithmId[]{var9};
- SignerInfo[] var18 = new SignerInfo[]{var16};
- X509Cert[] var19 = new X509Cert[]{var3};
- return new PKCS7(var17, var14, var19, var18);
- }
-
- void displayCmd(String[] var1) {
- if (var1[0].equals("dc") && var1.length == 2) {
- this.displayCertificate(var1[1]);
- } else {
- String var2 = "";
- var2 = var2 + "legal options for generate:\n";
- var2 = var2 + "\tc\t<cert>\tdisplay a certificate.\n";
- this.out.println(var2);
- this.error("illegal arguments to display.");
- }
- }
-
- private void displayCertificate(String var1) {
- File var2 = new File(var1);
-
- try {
- if (!var2.exists()) {
- this.error("File " + var2 + " not found.");
- } else {
- FileInputStream var3 = new FileInputStream(var2);
- DataInputStream var4 = new DataInputStream(var3);
- byte[] var5 = new byte[((FilterInputStream)var4).available()];
- var4.readFully(var5);
- X509Cert var6 = new X509Cert(var5);
- this.out.println(var6);
- }
- } catch (IOException var7) {
- this.error("IO error", var7);
- }
- }
-
- private void trustCmd(String[] var1) {
- if (var1.length != 3) {
- this.usageError("Invalid number of arguments for set trust.");
- } else {
- String var2 = var1[1];
- Boolean var3 = new Boolean(var1[2]);
- Identity var4 = this.scope.getIdentity(var2);
- if (var4 == null) {
- this.error(var2 + " not found in the database.");
- } else {
- if (this.setTrusted(var4, var3)) {
- this.save(this.scope, var2 + " is trusted: " + var3);
- }
-
- }
- }
- }
-
- private boolean setTrusted(Identity var1, boolean var2) {
- if (var1 instanceof SystemIdentity) {
- SystemIdentity var3 = (SystemIdentity)var1;
- var3.setTrusted(var2);
- } else {
- if (!(var1 instanceof SystemSigner)) {
- return this.error(var1 + " is not a SUN identity.");
- }
-
- SystemSigner var4 = (SystemSigner)var1;
- var4.setTrusted(var2);
- }
-
- return true;
- }
-
- void run(String[] var1) throws KeyManagementException {
- if (var1.length < 1) {
- this.usageError("for more information, see documentation.");
- } else {
- String var2 = var1[0];
- if (var2.startsWith("-")) {
- var2 = var2.substring(1);
- }
-
- var1[0] = var2;
- switch (var2.charAt(0)) {
- case 'c':
- this.createCmd(var1);
- return;
- case 'd':
- this.displayCmd(var1);
- return;
- case 'e':
- this.exportCmd(var1);
- return;
- case 'g':
- this.generateCmd(var1);
- return;
- case 'i':
- this.importCmd(var1);
- return;
- case 'l':
- this.listCmd(var1);
- return;
- case 'r':
- this.removeCmd(var1);
- return;
- case 't':
- this.trustCmd(var1);
- return;
- default:
- this.usage();
- case 'v':
- }
- }
- }
-
- public static void main(String[] var0) throws KeyManagementException {
- Main var1 = new Main(System.out, System.err, System.in, "javakey", true);
- var1.setScope(IdentityScope.getSystemScope());
- if (var1.scope == null) {
- var1.error("could not initialize scope");
- }
-
- var1.run(var0);
- }
-
- byte[] machineSeed(int var1) {
- return SecureRandom.getSeed(var1);
- }
-
- byte[] userSeed(int var1) {
- this.out.println("Please enter some random data (" + var1 + " key strokes) and hit return.");
- InputStream var2 = System.in;
- byte[] var3 = new byte[var1];
- int var4 = 0;
-
- try {
- while(var4 < var1) {
- var3[var4++] = (byte)var2.read();
- }
- } catch (IOException var6) {
- this.err.println("IOException");
- this.debug((Throwable)var6);
- }
-
- return var3;
- }
-
- void usage() {
- if (this.usage == null) {
- this.usage = "";
- this.usage = this.usage + "javakey\n";
- this.usage = this.usage + "\tl\tlist of the identities in the database.\n";
- this.usage = this.usage + "\tc\tcreate an new identity.\n";
- this.usage = this.usage + "\tr\tremove an identity from the database.\n";
- this.usage = this.usage + "\ti\timport a public key, a key pair, etc.\n";
- this.usage = this.usage + "\tg\tgenerate a key pair, a certificate, etc.\n";
- this.usage = this.usage + "\td\tdisplay a certficate.\n";
- }
-
- this.out.println(this.usage);
- }
-
- boolean usageError(String var1) {
- this.usage();
- return this.error(var1);
- }
-
- boolean error(String var1) {
- this.err.println(var1);
- if (this.quitOnError) {
- System.exit(1);
- }
-
- return false;
- }
-
- boolean internalError(String var1) {
- this.err.println("Internal error! " + var1);
- this.err.println("please send mail to bugs@java.sun.com.");
- if (this.quitOnError) {
- System.exit(1);
- }
-
- return false;
- }
-
- boolean error(String var1, Throwable var2) {
- this.debug(var2);
- return this.error(var1 + "[" + var2.getMessage() + "]");
- }
-
- void debug(Throwable var1) {
- if (this.debug) {
- var1.printStackTrace(this.err);
- }
-
- }
-
- void debug(String var1, Throwable var2) {
- if (this.debug) {
- var2.printStackTrace(this.err);
- System.err.println(var1);
- }
-
- }
-
- void debug(String var1) {
- if (this.debug) {
- System.err.println(var1);
- }
-
- }
-
- void message(String var1) {
- this.out.print(var1);
- }
-
- void exit(String var1) {
- this.out.println(var1);
- if (this.quitOnError) {
- System.exit(0);
- }
-
- }
-
- String assertProp(String var1, Properties var2) {
- String var3 = var2.getProperty(var1);
- if (var3 == null) {
- this.error(var1 + " must be specified in the directive file.");
- }
-
- return var3;
- }
- }
-