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 / security / provider / Main.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  27.8 KB  |  1,268 lines

  1. package sun.security.provider;
  2.  
  3. import java.io.BufferedOutputStream;
  4. import java.io.ByteArrayInputStream;
  5. import java.io.ByteArrayOutputStream;
  6. import java.io.DataInputStream;
  7. import java.io.File;
  8. import java.io.FileInputStream;
  9. import java.io.FileNotFoundException;
  10. import java.io.FileOutputStream;
  11. import java.io.FilterInputStream;
  12. import java.io.FilterOutputStream;
  13. import java.io.IOException;
  14. import java.io.InputStream;
  15. import java.io.PrintStream;
  16. import java.math.BigInteger;
  17. import java.security.Certificate;
  18. import java.security.Identity;
  19. import java.security.IdentityScope;
  20. import java.security.InvalidKeyException;
  21. import java.security.InvalidParameterException;
  22. import java.security.Key;
  23. import java.security.KeyException;
  24. import java.security.KeyManagementException;
  25. import java.security.KeyPair;
  26. import java.security.KeyPairGenerator;
  27. import java.security.NoSuchAlgorithmException;
  28. import java.security.PrivateKey;
  29. import java.security.PublicKey;
  30. import java.security.SecureRandom;
  31. import java.security.Signature;
  32. import java.security.SignatureException;
  33. import java.security.Signer;
  34. import java.util.Date;
  35. import java.util.Enumeration;
  36. import java.util.Hashtable;
  37. import java.util.Properties;
  38. import java.util.zip.ZipEntry;
  39. import java.util.zip.ZipInputStream;
  40. import java.util.zip.ZipOutputStream;
  41. import sun.security.pkcs.ContentInfo;
  42. import sun.security.pkcs.PKCS7;
  43. import sun.security.pkcs.PKCS8Key;
  44. import sun.security.pkcs.SignerInfo;
  45. import sun.security.util.BigInt;
  46. import sun.security.util.DerValue;
  47. import sun.security.x509.AlgorithmId;
  48. import sun.security.x509.CertException;
  49. import sun.security.x509.X500Name;
  50. import sun.security.x509.X500Signer;
  51. import sun.security.x509.X509Cert;
  52. import sun.security.x509.X509Key;
  53. import sun.tools.jar.Manifest;
  54. import sun.tools.jar.SignatureFile;
  55.  
  56. public class Main {
  57.    private boolean debug = false;
  58.    private boolean quitOnError = false;
  59.    String program;
  60.    String usage;
  61.    PrintStream out;
  62.    PrintStream err;
  63.    // $FF: renamed from: in java.io.InputStream
  64.    InputStream field_0;
  65.    protected IdentityScope scope;
  66.  
  67.    public Main(PrintStream var1, PrintStream var2, InputStream var3, String var4, boolean var5) {
  68.       this.out = var1;
  69.       this.err = var2;
  70.       this.program = var4;
  71.       this.quitOnError = var5;
  72.    }
  73.  
  74.    protected void setScope(IdentityScope var1) {
  75.       this.scope = var1;
  76.    }
  77.  
  78.    void listCmd(String[] var1) {
  79.       String var2 = var1[0];
  80.       boolean var3 = false;
  81.       if (var2.equals("li")) {
  82.          if (var1.length != 2) {
  83.             this.listUsage();
  84.          } else {
  85.             Identity var4 = this.scope.getIdentity(var1[1]);
  86.             if (var4 == null) {
  87.                this.error("No such identity: " + var1[1] + " in scope " + this.scope);
  88.             } else {
  89.                this.list(var4);
  90.             }
  91.          }
  92.       } else if (!var2.equals("l") && !(var3 = var2.equals("ld"))) {
  93.          this.listUsage();
  94.       } else {
  95.          if (var1.length != 1) {
  96.             this.listUsage();
  97.          }
  98.  
  99.          this.list(var3);
  100.       }
  101.    }
  102.  
  103.    void listUsage() {
  104.       String var1 = "";
  105.       var1 = var1 + "legal options for list:\n";
  106.       var1 = var1 + "\tno argument \tlist all identities in succint form.\n";
  107.       var1 = var1 + "\ti <identity>\tlist an identity in detail.\n";
  108.       var1 = var1 + "\td\t\tdetail: list all identities in detail.";
  109.       this.out.println(var1);
  110.       this.error("illegal arguments to list");
  111.    }
  112.  
  113.    public boolean list(boolean var1) {
  114.       this.out.println();
  115.       this.out.println("Scope: " + this.scope);
  116.       Enumeration var2 = this.scope.identities();
  117.  
  118.       while(var2.hasMoreElements()) {
  119.          Identity var3 = (Identity)var2.nextElement();
  120.          this.out.println();
  121.          this.out.println(var3.toString(var1));
  122.       }
  123.  
  124.       return true;
  125.    }
  126.  
  127.    public void list(Identity var1) {
  128.       this.out.println("Identity: " + var1.getName());
  129.       this.out.println(var1.toString(true));
  130.    }
  131.  
  132.    void createCmd(String[] var1) {
  133.       boolean var2 = false;
  134.       String var3 = var1[0];
  135.       boolean var4 = false;
  136.       int var5 = var1.length;
  137.       boolean var6 = var3.equalsIgnoreCase("c");
  138.       boolean var7 = var3.equalsIgnoreCase("cs");
  139.       boolean var8 = var5 == 2 || var5 == 3;
  140.       if (var5 == 3) {
  141.          var4 = new Boolean(var1[2]);
  142.       }
  143.  
  144.       if (var8 && var6) {
  145.          var2 = this.createIdentity(var1[1], var4);
  146.       } else if (var8 && var7) {
  147.          var2 = this.createSigner(var1[1], var4);
  148.       } else {
  149.          String var9 = "";
  150.          var9 = var9 + "legal options for create:\n";
  151.          var9 = var9 + "\tno arguments\t<name> {trusted}\tcreate a new identity.\n";
  152.          var9 = var9 + "\ts\t\t<name> {trusted}\tcreate a new signer.\n";
  153.          this.out.println(var9);
  154.          this.error("illegal arguments to create");
  155.       }
  156.  
  157.       if (var2) {
  158.          String var13 = "Created identity " + this.scope.getIdentity(var1[1]);
  159.          this.save(this.scope, var13);
  160.       }
  161.  
  162.    }
  163.  
  164.    public boolean createIdentity(String var1, boolean var2) {
  165.       try {
  166.          SystemIdentity var3 = new SystemIdentity(var1, this.scope);
  167.          this.scope.addIdentity(var3);
  168.          var3.setTrusted(var2);
  169.          return true;
  170.       } catch (KeyManagementException var4) {
  171.          return this.error("An error occured trying to add " + var1 + " to " + this.scope, var4);
  172.       } catch (InvalidParameterException var5) {
  173.          return this.error("Invalid parameter trying to add " + var1 + " to " + this.scope, var5);
  174.       }
  175.    }
  176.  
  177.    public boolean createSigner(String var1, boolean var2) {
  178.       try {
  179.          if (this.scope.getIdentity(var1) != null) {
  180.             return this.error("Name conflict. Please remove the identity named " + var1 + " before adding a new identity with that name.");
  181.          } else {
  182.             SystemSigner var3 = new SystemSigner(var1, this.scope);
  183.             this.scope.addIdentity(var3);
  184.             var3.setTrusted(var2);
  185.             return true;
  186.          }
  187.       } catch (KeyManagementException var4) {
  188.          return this.error("An error occured trying to add " + var1 + " to " + this.scope, var4);
  189.       }
  190.    }
  191.  
  192.    protected void removeCmd(String[] var1) {
  193.       String var2 = "";
  194.       boolean var3 = false;
  195.       if (var1.length == 2) {
  196.          var2 = var1[1];
  197.          if (this.scope.getIdentity(var2) == null) {
  198.             var3 = this.error("No one named " + var2 + " in the system.");
  199.          } else {
  200.             var3 = this.remove(var2);
  201.          }
  202.       } else {
  203.          String var4 = "";
  204.          var4 = var4 + "legal options for remove:\n";
  205.          var4 = var4 + "\tno arguments\t<name>\tthe name of the identity to remove\n";
  206.          this.out.println(var4);
  207.          var3 = this.error("illegal arguments to remove");
  208.       }
  209.  
  210.       if (var3) {
  211.          this.save(this.scope, "Removed " + var2 + ".");
  212.       }
  213.  
  214.    }
  215.  
  216.    public boolean remove(String var1) {
  217.       try {
  218.          Identity var2 = this.scope.getIdentity(var1);
  219.          if (var2 == null) {
  220.             return this.error(var1 + " not found in database.");
  221.          } else {
  222.             this.scope.removeIdentity(var2);
  223.             return true;
  224.          }
  225.       } catch (KeyManagementException var3) {
  226.          return this.internalError("remove " + var1);
  227.       }
  228.    }
  229.  
  230.    protected void exportCmd(String[] var1) {
  231.       boolean var2 = false;
  232.       String var3 = "";
  233.       String var4 = var1[0];
  234.       int var5 = var1.length;
  235.       if (var5 >= 3 && var5 <= 4) {
  236.          String var6 = var1[1];
  237.          if (var4.equals("ek")) {
  238.             File var7 = new File(var1[2]);
  239.             File var8 = null;
  240.             if (var1.length == 4) {
  241.                var8 = new File(var1[3]);
  242.             }
  243.  
  244.             var2 = this.exportKeys(var6, var7, var8);
  245.             var3 = "Public key exported to " + var7 + ".";
  246.             if (var8 != null) {
  247.                var3 = var3 + "\nPrivate key exported to " + var8 + ".";
  248.             }
  249.          } else if (var4.equals("ec")) {
  250.             if (var5 != 4) {
  251.                this.exportUsageError();
  252.             }
  253.  
  254.             int var9 = Integer.parseInt(var1[2]);
  255.             File var10 = new File(var1[3]);
  256.             var2 = this.exportCert(var6, var9, var10);
  257.             var3 = "Certificate " + var9 + " exported to " + var10 + ".";
  258.          } else {
  259.             this.exportUsageError();
  260.          }
  261.  
  262.          if (var2) {
  263.             this.save(this.scope, var3);
  264.          }
  265.  
  266.       } else {
  267.          this.exportUsageError();
  268.       }
  269.    }
  270.  
  271.    boolean exportKeys(String var1, File var2, File var3) {
  272.       try {
  273.          Identity var6 = this.scope.getIdentity(var1);
  274.          if (var6 == null) {
  275.             return this.error("There are no identities named " + var1 + " in the system.");
  276.          }
  277.  
  278.          if (var6 instanceof Identity) {
  279.             PublicKey var7 = var6.getPublicKey();
  280.             if (var7 == null) {
  281.                return this.error("identity " + var1 + " does not have a public key.");
  282.             }
  283.  
  284.             FileOutputStream var4 = new FileOutputStream(var2);
  285.             BufferedOutputStream var5 = new BufferedOutputStream(var4);
  286.             ((FilterOutputStream)var5).write(var7.getEncoded());
  287.             var5.flush();
  288.             var4.close();
  289.          }
  290.  
  291.          if (var6 instanceof Signer && var3 != null) {
  292.             Signer var12 = (Signer)var6;
  293.             FileOutputStream var10 = new FileOutputStream(var3);
  294.             BufferedOutputStream var11 = new BufferedOutputStream(var10);
  295.             PrivateKey var8 = var12.getPrivateKey();
  296.             if (var8 == null) {
  297.                return this.error("signer " + var1 + " does not have a private key.");
  298.             }
  299.  
  300.             ((FilterOutputStream)var11).write(var8.getEncoded());
  301.             var11.flush();
  302.             var10.close();
  303.          }
  304.       } catch (IOException var9) {
  305.          this.error("Error: io error", var9);
  306.       }
  307.  
  308.       return true;
  309.    }
  310.  
  311.    boolean exportCert(String var1, int var2, File var3) {
  312.       try {
  313.          Identity var6 = this.scope.getIdentity(var1);
  314.          if (var6 == null) {
  315.             return this.error("There are no identities named " + var1 + " in the system.");
  316.          } else {
  317.             Certificate[] var7 = var6.certificates();
  318.             if (var7.length < var2) {
  319.                return this.error("identity " + var1 + " does not have a cert " + var2 + ".");
  320.             } else {
  321.                Certificate var8 = var7[var2 - 1];
  322.                FileOutputStream var4 = new FileOutputStream(var3);
  323.                BufferedOutputStream var5 = new BufferedOutputStream(var4);
  324.                var8.encode(var5);
  325.                var5.flush();
  326.                var4.close();
  327.                return true;
  328.             }
  329.          }
  330.       } catch (IOException var9) {
  331.          return this.error("Error: io error", var9);
  332.       } catch (KeyException var10) {
  333.          return this.error("Key exception: invalid key", var10);
  334.       }
  335.    }
  336.  
  337.    private boolean exportUsageError() {
  338.       String var1 = "";
  339.       var1 = var1 + "legal options for export (<id> is the identity for which the import is done.)\n";
  340.       var1 = var1 + "\tk\t<id> <pub> {priv}\t\texport a public key,\n\t\t (and optionally a private key) to a file.\n";
  341.       var1 = var1 + "\tc\t<id> <certnum> <certFile>\texport a cert to a  files.\n";
  342.       this.out.println(var1);
  343.       return this.error("illegal arguments to export.");
  344.    }
  345.  
  346.    protected void importCmd(String[] var1) {
  347.       boolean var2 = false;
  348.       String var3 = "";
  349.       String var4 = var1[0];
  350.       int var5 = var1.length;
  351.       if (var5 >= 2 && var5 <= 4) {
  352.          String var6 = var1[1];
  353.          String var7 = "";
  354.          if (var5 > 2) {
  355.             var7 = var1[2];
  356.          }
  357.  
  358.          if (var4.equals("ic")) {
  359.             var2 = this.importCertificate(var6, var7);
  360.             var3 = "Imported certificate from " + var7 + " for " + var6 + ".";
  361.          } else if (var4.equals("ik")) {
  362.             var2 = this.importPublicKey(var6, var7);
  363.             var3 = "Set public key from " + var7 + " for " + var6 + ".";
  364.          } else if (var4.equals("ikp") && var5 == 4) {
  365.             var2 = this.setKeyPair(var6, var7, var1[3]);
  366.             var3 = "Set public key from " + var7 + " for " + var6 + ".";
  367.             var3 = var3 + "\nSet private key from " + var1[3] + " for " + var6 + ".";
  368.          } else if (var4.equals("ii") && var5 == 2) {
  369.             var2 = this.setInfo(var6);
  370.             var3 = "Set information for " + var6;
  371.          } else {
  372.             var2 = this.importUsageError();
  373.          }
  374.  
  375.          if (var2) {
  376.             this.save(this.scope, var3);
  377.          }
  378.  
  379.       } else {
  380.          this.importUsageError();
  381.       }
  382.    }
  383.  
  384.    private boolean importUsageError() {
  385.       String var1 = "";
  386.       var1 = var1 + "legal options for import (<id> is the identity for which the import is done.)\n";
  387.       var1 = var1 + "\tk\t<id> <pub>\t\timport a public key from a file.\n";
  388.       var1 = var1 + "\tkp\t<id> <pub> <priv>\timport a key pair from two files.\n";
  389.       var1 = var1 + "\tc\t<id> <cert>\t\timport a certificate from a file.\n";
  390.       this.out.println(var1);
  391.       return this.error("illegal arguments to import.");
  392.    }
  393.  
  394.    private boolean setInfo(String var1) {
  395.       Identity var2 = this.scope.getIdentity(var1);
  396.       if (var2 == null) {
  397.          return this.error("There are no identities named " + var2 + " in the system.");
  398.       } else {
  399.          this.out.println("Please enter the info for this identity.");
  400.          this.out.println("[End with ctrl-D on Unix and ctrl-Z on Win32]");
  401.          DataInputStream var3 = new DataInputStream(System.in);
  402.          String var4 = "";
  403.          String var5 = "";
  404.  
  405.          try {
  406.             while((var5 = var3.readLine()) != null) {
  407.                var4 = var4 + "\n" + var5;
  408.             }
  409.          } catch (IOException var7) {
  410.             this.debug((Throwable)var7);
  411.             return this.error("IOException importing information.");
  412.          }
  413.  
  414.          var2.setInfo(var4);
  415.          return true;
  416.       }
  417.    }
  418.  
  419.    public boolean importCertificate(String var1, String var2) {
  420.       Object var3 = null;
  421.  
  422.       try {
  423.          File var4 = new File(var2);
  424.          if (!var4.exists()) {
  425.             return this.error("File " + var2 + "  not found.");
  426.          } else {
  427.             FileInputStream var5 = new FileInputStream(var4);
  428.             DataInputStream var6 = new DataInputStream(var5);
  429.             byte[] var7 = new byte[((FilterInputStream)var6).available()];
  430.             var6.readFully(var7);
  431.             X509Cert var8 = new X509Cert(var7);
  432.             Identity var12 = this.scope.getIdentity(var1);
  433.             if (var12 == null) {
  434.                return this.error(var1 + " not found in the system.");
  435.             } else {
  436.                this.importCertificate((Identity)var12, (Certificate)var8);
  437.                return true;
  438.             }
  439.          }
  440.       } catch (IOException var9) {
  441.          return this.error("Error: io error", var9);
  442.       } catch (KeyManagementException var10) {
  443.          return this.error("key management exception: " + ((Throwable)var10).getMessage(), var10);
  444.       } catch (CertException var11) {
  445.          return this.error("invalid cert: " + var2, var11);
  446.       }
  447.    }
  448.  
  449.    boolean importCertificate(Identity var1, Certificate var2) throws KeyManagementException {
  450.       PublicKey var3 = var2.getPublicKey();
  451.       PublicKey var4 = var1.getPublicKey();
  452.       if (var4 == null) {
  453.          var1.setPublicKey(var3);
  454.       } else if (!var4.equals(var3)) {
  455.          return this.error("Certificate key does not match identity key.");
  456.       }
  457.  
  458.       var1.addCertificate(var2);
  459.       return true;
  460.    }
  461.  
  462.    boolean importPublicKey(String var1, String var2) {
  463.       try {
  464.          Identity var3 = this.scope.getIdentity(var1);
  465.          if (var3 == null) {
  466.             return this.error(var1 + " not found in database.");
  467.          } else {
  468.             File var4 = new File(var2);
  469.             if (!var4.exists()) {
  470.                return this.error("File " + var2 + " not found.");
  471.             } else {
  472.                FileInputStream var5 = new FileInputStream(var4);
  473.                DataInputStream var6 = new DataInputStream(var5);
  474.                byte[] var7 = new byte[((FilterInputStream)var6).available()];
  475.                var6.readFully(var7);
  476.                DerValue var8 = new DerValue(var7);
  477.                X509Key var9 = X509Key.parse(var8);
  478.                PublicKey var10 = var3.getPublicKey();
  479.                if (var10 != null && !var9.equals(var10)) {
  480.                   this.message(var3 + " already has a public key." + "\nClearing any exisiting certificates...\n");
  481.                   Certificate[] var11 = var3.certificates();
  482.  
  483.                   for(int var12 = 0; var12 < var11.length; ++var12) {
  484.                      var3.removeCertificate(var11[var12]);
  485.                   }
  486.                }
  487.  
  488.                var3.setPublicKey(var9);
  489.                return true;
  490.             }
  491.          }
  492.       } catch (IOException var13) {
  493.          return this.error("Error: io error", var13);
  494.       } catch (KeyException var14) {
  495.          return this.error("Key exception: invalid key", var14);
  496.       }
  497.    }
  498.  
  499.    boolean setKeyPair(String var1, String var2, String var3) {
  500.       try {
  501.          File var4 = new File(var2);
  502.          File var5 = new File(var3);
  503.          if (!var4.exists()) {
  504.             return this.error("File " + var4 + " not found.");
  505.          } else if (!var5.exists()) {
  506.             return this.error("File " + var5 + " not found.");
  507.          } else {
  508.             FileInputStream var6 = new FileInputStream(var4);
  509.             DataInputStream var7 = new DataInputStream(var6);
  510.             byte[] var8 = new byte[((FilterInputStream)var7).available()];
  511.             var7.readFully(var8);
  512.             var6.close();
  513.             DerValue var9 = new DerValue(var8);
  514.             X509Key var10 = X509Key.parse(var9);
  515.             var6 = new FileInputStream(var5);
  516.             var7 = new DataInputStream(var6);
  517.             var8 = new byte[((FilterInputStream)var7).available()];
  518.             var7.readFully(var8);
  519.             var6.close();
  520.             var9 = new DerValue(var8);
  521.             PKCS8Key var11 = PKCS8Key.parse(var9);
  522.             KeyPair var12 = new KeyPair(var10, var11);
  523.             return this.setKeyPair(var1, var12);
  524.          }
  525.       } catch (IOException var13) {
  526.          return true;
  527.       }
  528.    }
  529.  
  530.    boolean setKeyPair(String var1, KeyPair var2) {
  531.       try {
  532.          Signer var3 = (Signer)this.scope.getIdentity(var1);
  533.          if (var3 == null) {
  534.             return this.error("Signer " + var1 + " not found in system.");
  535.          } else {
  536.             var3.setKeyPair(var2);
  537.             return true;
  538.          }
  539.       } catch (KeyException var4) {
  540.          return this.error("Key exception: invalid key", var4);
  541.       } catch (InvalidParameterException var5) {
  542.          return this.error("Internal error!", var5);
  543.       }
  544.    }
  545.  
  546.    private void save(IdentityScope var1, String var2) {
  547.       if (var1 instanceof IdentityDatabase) {
  548.          try {
  549.             IdentityDatabase var3 = (IdentityDatabase)var1;
  550.             var3.save();
  551.          } catch (IOException var4) {
  552.             this.error("IOException trying to save the database.", var4);
  553.          }
  554.       } else {
  555.          this.out.println("Cannot save the database: not a SUN database.");
  556.       }
  557.  
  558.       this.exit(var2);
  559.    }
  560.  
  561.    private void save(IdentityScope var1) {
  562.       this.save(var1, "Operation succesful.");
  563.    }
  564.  
  565.    private void generateCmd(String[] var1) {
  566.       boolean var2 = false;
  567.       String var3 = "";
  568.       String var4 = var1[0];
  569.       int var5 = var1.length;
  570.       Properties var6 = new Properties();
  571.       File var7 = null;
  572.       if (var5 == 2 || var5 == 3) {
  573.          var7 = new File(var1[1]);
  574.  
  575.          try {
  576.             FileInputStream var8 = new FileInputStream(var7);
  577.             var6.load(var8);
  578.          } catch (FileNotFoundException var11) {
  579.             this.error("directive file " + var7 + " not found.");
  580.          } catch (IOException var12) {
  581.             this.error("IOException loading directive file " + var7);
  582.          }
  583.       }
  584.  
  585.       if (var4.equals("gk")) {
  586.          if (var5 == 2) {
  587.             var2 = this.generateKeyPair(var6);
  588.          } else if (var5 < 7 && var5 > 3) {
  589.             ((Hashtable)var6).put("signer.name", var1[1]);
  590.             ((Hashtable)var6).put("algorithm", var1[2]);
  591.             ((Hashtable)var6).put("strength", var1[3]);
  592.             if (var5 > 4) {
  593.                ((Hashtable)var6).put("pub", var1[4]);
  594.             }
  595.  
  596.             if (var5 > 5) {
  597.                ((Hashtable)var6).put("priv", var1[5]);
  598.             }
  599.  
  600.             var2 = this.generateKeyPair(var6);
  601.          }
  602.  
  603.          var3 = "Generated " + ((Hashtable)var6).get("algorithm") + " keys for " + ((Hashtable)var6).get("signer.name") + " (strength: " + ((Hashtable)var6).get("strength") + ").";
  604.          String var13 = var6.getProperty("pub");
  605.          String var9 = var6.getProperty("priv");
  606.          if (var13 != null) {
  607.             var3 = var3 + "\nSaved public key to " + var13 + ".";
  608.          }
  609.  
  610.          if (var9 != null) {
  611.             var3 = var3 + "\nSaved private key to " + var9 + ".";
  612.          }
  613.       } else if (var4.equals("gc")) {
  614.          if (var5 != 2) {
  615.             this.usageError("generate certificate only takes one argument, the directive file.");
  616.          } else {
  617.             var2 = this.generateCertificate(var6);
  618.             var3 = "Generated certificate from directive file " + var7 + ".";
  619.          }
  620.       } else if (var4.equals("gs")) {
  621.          try {
  622.             if (var1.length != 3) {
  623.                this.usageError("wrong number of arguments. gs takes 2 arguments: the directive and jar file.");
  624.             } else {
  625.                File var14 = new File(var1[2]);
  626.                if (!var14.exists()) {
  627.                   this.error("JAR file " + var14 + " not found.");
  628.                }
  629.  
  630.                var2 = this.signJar(var6, var14);
  631.                var3 = "Signed JAR file " + var14 + " using directive file " + var7 + ".";
  632.             }
  633.          } catch (Exception var10) {
  634.             this.error("error generating signature: " + ((Throwable)var10).getMessage(), var10);
  635.          }
  636.       } else {
  637.          this.generateUsageError();
  638.       }
  639.  
  640.       if (var2) {
  641.          this.save(this.scope, var3);
  642.       }
  643.  
  644.    }
  645.  
  646.    private boolean generateUsageError() {
  647.       String var1 = "";
  648.       var1 = var1 + "legal options for generate:\n";
  649.       var1 = var1 + "\tk\t<id> <alg> <mod>\t\tgenerate a key pair.\n";
  650.       var1 = var1 + "\tc\t<certdir> \tgenerate a certificate.\n";
  651.       var1 = var1 + "\ts\t<sigdir> <file>\t\tgenerate a signature.\n";
  652.       this.out.println(var1);
  653.       return this.error("illegal arguments to generate.");
  654.    }
  655.  
  656.    boolean generateCertificate(Properties var1) {
  657.       int var2 = -1;
  658.       Object var3 = null;
  659.       Object var4 = null;
  660.       Object var5 = null;
  661.       X509Cert var6 = null;
  662.       Object var7 = null;
  663.       Object var8 = null;
  664.       String var9 = "DSA";
  665.  
  666.       try {
  667.          String var10 = this.assertProp("issuer.name", var1);
  668.          String var11 = this.assertProp("subject.name", var1);
  669.          String var12 = null;
  670.          boolean var13 = var10.equals(var11);
  671.          if (!var13) {
  672.             var12 = this.assertProp("issuer.cert", var1);
  673.          }
  674.  
  675.          String var14 = this.assertProp("subject.real.name", var1);
  676.          String var15 = this.assertProp("subject.org.unit", var1);
  677.          String var16 = this.assertProp("subject.org", var1);
  678.          String var17 = this.assertProp("subject.country", var1);
  679.          String var18 = this.assertProp("start.date", var1);
  680.          String var19 = this.assertProp("end.date", var1);
  681.          String var20 = this.assertProp("serial.number", var1);
  682.          var9 = var1.getProperty("signature.algorithm");
  683.          X500Name var21 = new X500Name(var14, var15, var16, var17);
  684.  
  685.          try {
  686.             var43 = new Date(var18);
  687.             var44 = new Date(var19);
  688.             Date var22 = new Date();
  689.             if (var22.after(var44)) {
  690.                this.out.println("warning: certificate's expiration date is earlier than the current date.");
  691.             }
  692.  
  693.             if (var44.before(var43)) {
  694.                this.out.println("warning: certificate's expiration date is earlier than the start date.");
  695.             }
  696.  
  697.             if (!var13) {
  698.                var2 = Integer.parseInt(var12) - 1;
  699.             }
  700.  
  701.             BigInteger var23 = new BigInteger(var20);
  702.             var42 = new BigInt(var23.toByteArray());
  703.          } catch (NumberFormatException var38) {
  704.             return this.error("Error parsing issuer.cert number.");
  705.          } catch (IllegalArgumentException var39) {
  706.             return this.error("Date formatted incorrectly.");
  707.          } catch (Exception var40) {
  708.             this.debug((Throwable)var40);
  709.             return this.error("error signing: " + ((Throwable)var40).getMessage());
  710.          }
  711.  
  712.          Signer var48 = (Signer)this.scope.getIdentity(var10);
  713.          if (var48 == null) {
  714.             return this.error("no signer " + var10 + " found in the database.");
  715.          } else {
  716.             PrivateKey var45 = var48.getPrivateKey();
  717.             if (var45 == null) {
  718.                return this.error(var48 + " does not have a private key.");
  719.             } else {
  720.                if (var9 == null) {
  721.                   var9 = "DSA";
  722.                }
  723.  
  724.                if (!var13) {
  725.                   Certificate[] var49 = ((Identity)var48).certificates();
  726.                   if (var2 >= var49.length) {
  727.                      return this.error("No such cert: " + (var2 + 1) + " for issuer " + var48 + ".");
  728.                   }
  729.  
  730.                   Certificate var24 = var49[var2];
  731.                   if (var24 == null || !(var24 instanceof X509Cert)) {
  732.                      return this.error("invalid cert for signer");
  733.                   }
  734.  
  735.                   var6 = (X509Cert)var24;
  736.                }
  737.  
  738.                try {
  739.                   if (var45 == null) {
  740.                      return this.error("Signer " + var48 + " has no signing key.");
  741.                   } else {
  742.                      Identity var50 = this.scope.getIdentity(var11);
  743.                      if (var48 == null) {
  744.                         return this.error("No such guarantor: " + var10);
  745.                      } else if (var50 == null) {
  746.                         return this.error("No such identity: " + var11);
  747.                      } else {
  748.                         PublicKey var51 = var50.getPublicKey();
  749.                         if (var51 == null) {
  750.                            return this.error(var50 + " does not have a public key.");
  751.                         } else if (!var51.getFormat().equals("X.509")) {
  752.                            return this.error("Public key format is not X.509");
  753.                         } else {
  754.                            try {
  755.                               if (var51 instanceof X509Key) {
  756.                                  var46 = (X509Key)var51;
  757.                               } else {
  758.                                  DerValue var25 = new DerValue(var51.getEncoded());
  759.                                  var46 = X509Key.parse(var25);
  760.                               }
  761.                            } catch (IOException var33) {
  762.                               return this.error("Bad X509 key: " + ((Throwable)var33).getMessage(), var33);
  763.                            }
  764.  
  765.                            X509Cert var52 = new X509Cert(var21, var46, var43, var44);
  766.                            if (var13) {
  767.                               var6 = var52;
  768.                            }
  769.  
  770.                            AlgorithmId var26 = AlgorithmId.get(var9);
  771.                            X500Signer var27 = var6.getSigner(var26, var45);
  772.                            byte[] var28 = var52.encodeAndSign(var42, var27);
  773.                            X509Cert var29 = new X509Cert(var28);
  774.                            var50.addCertificate(var29);
  775.                            String var30 = var1.getProperty("out.file");
  776.                            if (var30 != null) {
  777.                               File var31 = new File(var30);
  778.                               FileOutputStream var32 = new FileOutputStream(var31);
  779.                               var29.encode(var32);
  780.                            }
  781.  
  782.                            return true;
  783.                         }
  784.                      }
  785.                   }
  786.                } catch (IOException var34) {
  787.                   return this.error("IO exception during cert signing", var34);
  788.                } catch (SignatureException var35) {
  789.                   return this.error("A signature exception occured", var35);
  790.                } catch (KeyException var36) {
  791.                   return this.error("A key exception occured", var36);
  792.                } catch (NoSuchAlgorithmException var37) {
  793.                   return this.error("algorithm " + var9 + " not available", var37);
  794.                }
  795.             }
  796.          }
  797.       } catch (IOException var41) {
  798.          ((Throwable)var41).printStackTrace();
  799.          return false;
  800.       }
  801.    }
  802.  
  803.    boolean generateKeyPair(Properties var1) {
  804.       String var2 = this.assertProp("signer.name", var1);
  805.       String var3 = this.assertProp("strength", var1);
  806.       String var4 = this.assertProp("algorithm", var1);
  807.       String var5 = var1.getProperty("provider");
  808.       String var6 = var1.getProperty("pub");
  809.       String var7 = var1.getProperty("priv");
  810.       Identity var8 = this.scope.getIdentity(var2);
  811.       if (var8 == null) {
  812.          this.error(var2 + " not found in system.");
  813.       } else {
  814.          if (var8 instanceof Signer) {
  815.             Signer var9 = (Signer)var8;
  816.             int var10 = Integer.parseInt(var3);
  817.             this.machineSeed(64);
  818.             Object var11 = null;
  819.             Object var12 = null;
  820.  
  821.             try {
  822.                KeyPairGenerator var18 = KeyPairGenerator.getInstance(var4, var5);
  823.                var18.initialize(var10, new SecureRandom());
  824.                var19 = var18.generateKeyPair();
  825.             } catch (NoSuchAlgorithmException var16) {
  826.                return this.error("Algorithm " + var4 + " not available.");
  827.             } catch (Exception var17) {
  828.                return this.error("Invalid algorithm params for key generation.", var17);
  829.             }
  830.  
  831.             try {
  832.                var9.setKeyPair(var19);
  833.             } catch (InvalidParameterException var14) {
  834.                this.err.println("Internal error!");
  835.                ((Throwable)var14).printStackTrace(this.err);
  836.             } catch (KeyException var15) {
  837.                this.err.println("Internal error!");
  838.                ((Throwable)var15).printStackTrace(this.err);
  839.             }
  840.  
  841.             if (var6 != null) {
  842.                File var13 = new File(var6);
  843.                if (!this.saveKey(var19.getPublic(), var13)) {
  844.                   this.error("error saving public key to file " + var13);
  845.                }
  846.             }
  847.  
  848.             if (var7 != null) {
  849.                File var20 = new File(var7);
  850.                if (!this.saveKey(var19.getPrivate(), var20)) {
  851.                   this.error("error saving private key to file " + var20);
  852.                }
  853.             }
  854.  
  855.             return true;
  856.          }
  857.  
  858.          this.error("Identity " + var8 + " not a signer.");
  859.       }
  860.  
  861.       return false;
  862.    }
  863.  
  864.    private boolean saveKey(Key var1, File var2) {
  865.       try {
  866.          FileOutputStream var3 = new FileOutputStream(var2);
  867.          var3.write(var1.getEncoded());
  868.          var3.close();
  869.          return true;
  870.       } catch (IOException var4) {
  871.          return this.error("IOException saving keys.", var4);
  872.       } catch (ClassCastException var5) {
  873.          return this.error("Not a SUN key- cannot save", var5);
  874.       }
  875.    }
  876.  
  877.    boolean signJar(Properties var1, File var2) throws Exception {
  878.       String var3 = this.assertProp("signature.file", var1);
  879.       if (var3 == null) {
  880.          return false;
  881.       } else {
  882.          var3 = var3.toUpperCase();
  883.          String var4 = var2.getName();
  884.          String var5 = var1.getProperty("out.file");
  885.          if (var5 == null || var5.equals(var4)) {
  886.             var5 = var4 + ".sig";
  887.          }
  888.  
  889.          File var6 = new File(var5);
  890.          FileInputStream var8 = new FileInputStream(var2);
  891.          ZipInputStream var9 = new ZipInputStream(var8);
  892.          FileOutputStream var10 = new FileOutputStream(var6);
  893.          PrintStream var11 = new PrintStream(var10);
  894.          ZipOutputStream var12 = new ZipOutputStream(var11);
  895.          ZipEntry var13 = var9.getNextEntry();
  896.          String var14 = ("META-INF/" + var3 + ".SF").toUpperCase();
  897.  
  898.          for(String var15 = ("META-INF/" + var3 + ".DSA").toUpperCase(); var13 != null; var13 = var9.getNextEntry()) {
  899.             if (Manifest.isManifestName(var13.getName())) {
  900.                byte[] var16 = this.getBytesToEOF(var9);
  901.                Manifest var7 = new Manifest(var16);
  902.                this.writeEntry(new ByteArrayInputStream(var16), var12, var13);
  903.                SignatureFile var17 = this.computeSignatures(var7, var1);
  904.                if (var17 == null) {
  905.                   return false;
  906.                }
  907.  
  908.                PKCS7 var18 = var17.getBlock();
  909.                var14 = var17.getName();
  910.                var15 = var17.getBlockName();
  911.                ZipEntry var19 = new ZipEntry(var17.getName());
  912.                ZipEntry var20 = new ZipEntry(var17.getBlockName());
  913.                Date var21 = new Date();
  914.                var19.setTime(var21.getTime());
  915.                var20.setTime(var21.getTime());
  916.                var12.putNextEntry(var19);
  917.                var17.stream(var12);
  918.                this.out.println("Creating entry: " + var19.getName());
  919.                var12.putNextEntry(var20);
  920.                var18.encodeSignedData(var12);
  921.                this.out.println("Creating entry: " + var20.getName());
  922.             } else if (!var13.getName().equalsIgnoreCase(var14) && !var13.getName().equalsIgnoreCase(var15)) {
  923.                this.writeEntry(var9, var12, var13);
  924.             } else {
  925.                this.out.println("(Replaced existing entry: " + var13.getName() + ")");
  926.             }
  927.          }
  928.  
  929.          var12.close();
  930.          return true;
  931.       }
  932.    }
  933.  
  934.    private byte[] getBytesToEOF(InputStream var1) throws IOException {
  935.       ByteArrayOutputStream var2 = new ByteArrayOutputStream();
  936.       byte[] var3 = new byte[1024];
  937.  
  938.       int var4;
  939.       while((var4 = var1.read(var3, 0, var3.length)) != -1) {
  940.          var2.write(var3, 0, var4);
  941.       }
  942.  
  943.       return var2.toByteArray();
  944.    }
  945.  
  946.    private void writeEntry(InputStream var1, ZipOutputStream var2, ZipEntry var3) throws IOException {
  947.       this.out.println("Adding entry: " + var3.getName());
  948.       byte[] var4 = this.getBytesToEOF(var1);
  949.       var2.putNextEntry(var3);
  950.       if (var4.length > 0) {
  951.          ((FilterOutputStream)var2).write(var4);
  952.       }
  953.  
  954.    }
  955.  
  956.    SignatureFile computeSignatures(Manifest var1, Properties var2) throws IOException, InvalidKeyException, SignatureException, NoSuchAlgorithmException {
  957.       String var3 = this.assertProp("signature.file", var2);
  958.       String var4 = this.assertProp("signer", var2);
  959.       String var5 = this.assertProp("cert", var2);
  960.       String var6 = this.assertProp("chain", var2);
  961.       Identity var7 = this.scope.getIdentity(var4);
  962.       Object var8 = null;
  963.       if (var7 == null) {
  964.          this.error(var4 + " not found in database.");
  965.          return null;
  966.       } else if (var7 instanceof Signer) {
  967.          Signer var16 = (Signer)var7;
  968.          PrivateKey var9 = var16.getPrivateKey();
  969.          if (var9 == null) {
  970.             this.error(var16 + " does not have a public key.");
  971.             return null;
  972.          } else {
  973.             int var10 = 0;
  974.             if (var6 != null) {
  975.                var10 = Integer.parseInt(var6);
  976.             }
  977.  
  978.             if (var5 == null) {
  979.                this.error("illegal directive file");
  980.                return null;
  981.             } else if (var3.length() > 8) {
  982.                this.error("signature file specified longer than 8 characters.");
  983.                return null;
  984.             } else {
  985.                int var11 = Integer.parseInt(var5);
  986.                Certificate[] var12 = ((Identity)var16).certificates();
  987.                if (var11 <= var12.length && var11 >= 1) {
  988.                   Certificate var13 = var12[var11 - 1];
  989.                   if (!(var13 instanceof X509Cert)) {
  990.                      this.error("only X509 certificate format supported for signing JAR");
  991.                      return null;
  992.                   } else {
  993.                      SignatureFile var14 = new SignatureFile(var1, var3);
  994.                      PKCS7 var15 = this.computePKCS7(var14, var9, (X509Cert)var13);
  995.                      var14.setBlock(var15);
  996.                      return var14;
  997.                   }
  998.                } else {
  999.                   this.error("Invalid cert number (" + var11 + "). Valid numbers are 1 through " + var12.length + ".");
  1000.                   return null;
  1001.                }
  1002.             }
  1003.          }
  1004.       } else {
  1005.          this.error(var7 + " is not a Signer.");
  1006.          return null;
  1007.       }
  1008.    }
  1009.  
  1010.    private PKCS7 computePKCS7(SignatureFile var1, PrivateKey var2, X509Cert var3) throws IOException, InvalidKeyException, SignatureException, NoSuchAlgorithmException {
  1011.       X500Name var4 = var3.getSubjectName();
  1012.       BigInt var5 = var3.getSerialNumber();
  1013.       String var6 = var2.getAlgorithm();
  1014.       String var7 = "SHA";
  1015.       String var8 = "SHA/DSA";
  1016.       if (!var6.equals("DSA")) {
  1017.          if (var6.equals("RSA")) {
  1018.             var8 = "MD5/RSA";
  1019.             var7 = "MD5";
  1020.          } else {
  1021.             this.error("private key is not a DSA or RSA key.");
  1022.          }
  1023.       }
  1024.  
  1025.       AlgorithmId var9 = AlgorithmId.get(var7);
  1026.       AlgorithmId var10 = AlgorithmId.get(var8);
  1027.       Signature var11 = Signature.getInstance(var8);
  1028.       var11.initSign(var2);
  1029.       ByteArrayOutputStream var12 = new ByteArrayOutputStream();
  1030.       var1.stream(var12);
  1031.       byte[] var13 = var12.toByteArray();
  1032.       ContentInfo var14 = new ContentInfo(var13);
  1033.       var11.update(var13);
  1034.       byte[] var15 = var11.sign();
  1035.       SignerInfo var16 = new SignerInfo(var4, var5, var9, var10, var15);
  1036.       AlgorithmId[] var17 = new AlgorithmId[]{var9};
  1037.       SignerInfo[] var18 = new SignerInfo[]{var16};
  1038.       X509Cert[] var19 = new X509Cert[]{var3};
  1039.       return new PKCS7(var17, var14, var19, var18);
  1040.    }
  1041.  
  1042.    void displayCmd(String[] var1) {
  1043.       if (var1[0].equals("dc") && var1.length == 2) {
  1044.          this.displayCertificate(var1[1]);
  1045.       } else {
  1046.          String var2 = "";
  1047.          var2 = var2 + "legal options for generate:\n";
  1048.          var2 = var2 + "\tc\t<cert>\tdisplay a certificate.\n";
  1049.          this.out.println(var2);
  1050.          this.error("illegal arguments to display.");
  1051.       }
  1052.    }
  1053.  
  1054.    private void displayCertificate(String var1) {
  1055.       File var2 = new File(var1);
  1056.  
  1057.       try {
  1058.          if (!var2.exists()) {
  1059.             this.error("File " + var2 + " not found.");
  1060.          } else {
  1061.             FileInputStream var3 = new FileInputStream(var2);
  1062.             DataInputStream var4 = new DataInputStream(var3);
  1063.             byte[] var5 = new byte[((FilterInputStream)var4).available()];
  1064.             var4.readFully(var5);
  1065.             X509Cert var6 = new X509Cert(var5);
  1066.             this.out.println(var6);
  1067.          }
  1068.       } catch (IOException var7) {
  1069.          this.error("IO error", var7);
  1070.       }
  1071.    }
  1072.  
  1073.    private void trustCmd(String[] var1) {
  1074.       if (var1.length != 3) {
  1075.          this.usageError("Invalid number of arguments for set trust.");
  1076.       } else {
  1077.          String var2 = var1[1];
  1078.          Boolean var3 = new Boolean(var1[2]);
  1079.          Identity var4 = this.scope.getIdentity(var2);
  1080.          if (var4 == null) {
  1081.             this.error(var2 + " not found in the database.");
  1082.          } else {
  1083.             if (this.setTrusted(var4, var3)) {
  1084.                this.save(this.scope, var2 + " is trusted: " + var3);
  1085.             }
  1086.  
  1087.          }
  1088.       }
  1089.    }
  1090.  
  1091.    private boolean setTrusted(Identity var1, boolean var2) {
  1092.       if (var1 instanceof SystemIdentity) {
  1093.          SystemIdentity var3 = (SystemIdentity)var1;
  1094.          var3.setTrusted(var2);
  1095.       } else {
  1096.          if (!(var1 instanceof SystemSigner)) {
  1097.             return this.error(var1 + " is not a SUN identity.");
  1098.          }
  1099.  
  1100.          SystemSigner var4 = (SystemSigner)var1;
  1101.          var4.setTrusted(var2);
  1102.       }
  1103.  
  1104.       return true;
  1105.    }
  1106.  
  1107.    void run(String[] var1) throws KeyManagementException {
  1108.       if (var1.length < 1) {
  1109.          this.usageError("for more information, see documentation.");
  1110.       } else {
  1111.          String var2 = var1[0];
  1112.          if (var2.startsWith("-")) {
  1113.             var2 = var2.substring(1);
  1114.          }
  1115.  
  1116.          var1[0] = var2;
  1117.          switch (var2.charAt(0)) {
  1118.             case 'c':
  1119.                this.createCmd(var1);
  1120.                return;
  1121.             case 'd':
  1122.                this.displayCmd(var1);
  1123.                return;
  1124.             case 'e':
  1125.                this.exportCmd(var1);
  1126.                return;
  1127.             case 'g':
  1128.                this.generateCmd(var1);
  1129.                return;
  1130.             case 'i':
  1131.                this.importCmd(var1);
  1132.                return;
  1133.             case 'l':
  1134.                this.listCmd(var1);
  1135.                return;
  1136.             case 'r':
  1137.                this.removeCmd(var1);
  1138.                return;
  1139.             case 't':
  1140.                this.trustCmd(var1);
  1141.                return;
  1142.             default:
  1143.                this.usage();
  1144.             case 'v':
  1145.          }
  1146.       }
  1147.    }
  1148.  
  1149.    public static void main(String[] var0) throws KeyManagementException {
  1150.       Main var1 = new Main(System.out, System.err, System.in, "javakey", true);
  1151.       var1.setScope(IdentityScope.getSystemScope());
  1152.       if (var1.scope == null) {
  1153.          var1.error("could not initialize scope");
  1154.       }
  1155.  
  1156.       var1.run(var0);
  1157.    }
  1158.  
  1159.    byte[] machineSeed(int var1) {
  1160.       return SecureRandom.getSeed(var1);
  1161.    }
  1162.  
  1163.    byte[] userSeed(int var1) {
  1164.       this.out.println("Please enter some random data (" + var1 + " key strokes) and hit return.");
  1165.       InputStream var2 = System.in;
  1166.       byte[] var3 = new byte[var1];
  1167.       int var4 = 0;
  1168.  
  1169.       try {
  1170.          while(var4 < var1) {
  1171.             var3[var4++] = (byte)var2.read();
  1172.          }
  1173.       } catch (IOException var6) {
  1174.          this.err.println("IOException");
  1175.          this.debug((Throwable)var6);
  1176.       }
  1177.  
  1178.       return var3;
  1179.    }
  1180.  
  1181.    void usage() {
  1182.       if (this.usage == null) {
  1183.          this.usage = "";
  1184.          this.usage = this.usage + "javakey\n";
  1185.          this.usage = this.usage + "\tl\tlist of the identities in the database.\n";
  1186.          this.usage = this.usage + "\tc\tcreate an new identity.\n";
  1187.          this.usage = this.usage + "\tr\tremove an identity from the database.\n";
  1188.          this.usage = this.usage + "\ti\timport a public key, a key pair, etc.\n";
  1189.          this.usage = this.usage + "\tg\tgenerate a key pair, a certificate, etc.\n";
  1190.          this.usage = this.usage + "\td\tdisplay a certficate.\n";
  1191.       }
  1192.  
  1193.       this.out.println(this.usage);
  1194.    }
  1195.  
  1196.    boolean usageError(String var1) {
  1197.       this.usage();
  1198.       return this.error(var1);
  1199.    }
  1200.  
  1201.    boolean error(String var1) {
  1202.       this.err.println(var1);
  1203.       if (this.quitOnError) {
  1204.          System.exit(1);
  1205.       }
  1206.  
  1207.       return false;
  1208.    }
  1209.  
  1210.    boolean internalError(String var1) {
  1211.       this.err.println("Internal error! " + var1);
  1212.       this.err.println("please send mail to bugs@java.sun.com.");
  1213.       if (this.quitOnError) {
  1214.          System.exit(1);
  1215.       }
  1216.  
  1217.       return false;
  1218.    }
  1219.  
  1220.    boolean error(String var1, Throwable var2) {
  1221.       this.debug(var2);
  1222.       return this.error(var1 + "[" + var2.getMessage() + "]");
  1223.    }
  1224.  
  1225.    void debug(Throwable var1) {
  1226.       if (this.debug) {
  1227.          var1.printStackTrace(this.err);
  1228.       }
  1229.  
  1230.    }
  1231.  
  1232.    void debug(String var1, Throwable var2) {
  1233.       if (this.debug) {
  1234.          var2.printStackTrace(this.err);
  1235.          System.err.println(var1);
  1236.       }
  1237.  
  1238.    }
  1239.  
  1240.    void debug(String var1) {
  1241.       if (this.debug) {
  1242.          System.err.println(var1);
  1243.       }
  1244.  
  1245.    }
  1246.  
  1247.    void message(String var1) {
  1248.       this.out.print(var1);
  1249.    }
  1250.  
  1251.    void exit(String var1) {
  1252.       this.out.println(var1);
  1253.       if (this.quitOnError) {
  1254.          System.exit(0);
  1255.       }
  1256.  
  1257.    }
  1258.  
  1259.    String assertProp(String var1, Properties var2) {
  1260.       String var3 = var2.getProperty(var1);
  1261.       if (var3 == null) {
  1262.          this.error(var1 + " must be specified in the directive file.");
  1263.       }
  1264.  
  1265.       return var3;
  1266.    }
  1267. }
  1268.