1 /* Main.java -- Implementation of the keytool security tool
2 Copyright (C) 2006 Free Software Foundation, Inc.
4 This file is part of GNU Classpath.
6 GNU Classpath is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2, or (at your option)
11 GNU Classpath is distributed in the hope that it will be useful, but
12 WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with GNU Classpath; see the file COPYING. If not, write to the
18 Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
21 Linking this library statically or dynamically with other modules is
22 making a combined work based on this library. Thus, the terms and
23 conditions of the GNU General Public License cover the whole
26 As a special exception, the copyright holders of this library give you
27 permission to link this library with independent modules to produce an
28 executable, regardless of the license terms of these independent
29 modules, and to copy and distribute the resulting executable under
30 terms of your choice, provided that you also meet, for each linked
31 independent module, the terms and conditions of the license of that
32 module. An independent module is a module which is not derived from
33 or based on this library. If you modify this library, you may extend
34 this exception to your version of the library, but you are not
35 obligated to do so. If you do not wish to do so, delete this
36 exception statement from your version. */
39 package gnu
.classpath
.tools
.keytool
;
41 import gnu
.classpath
.tools
.HelpPrinter
;
42 import gnu
.classpath
.tools
.common
.ProviderUtil
;
43 import gnu
.java
.security
.Registry
;
44 import gnu
.javax
.crypto
.jce
.GnuCrypto
;
45 import gnu
.javax
.security
.auth
.callback
.GnuCallbacks
;
47 import java
.util
.logging
.Logger
;
50 * The GNU Classpath implementation of the keytool security tool.
52 * Except for the <code>-identitydb</code> command, available for importing
53 * JDK 1.1 <i>identities</i> into a key store, this implementation is intended
54 * to be compatible with the behaviour described in the public documentation of
55 * the same tool included in JDK 1.4.
59 private static final Logger log
= Logger
.getLogger(Main
.class.getName());
60 /** The relative file path to the command tool's help text. */
61 private static final String HELP_PATH
= "keytool/keytool.txt"; //$NON-NLS-1$
62 /** The Preferences key name for the last issued certificate serial nbr. */
63 static final String LAST_SERIAL_NUMBER
= "lastSerialNumber"; //$NON-NLS-1$
64 /** Constant denoting the X.509 certificate type. */
65 static final String X_509
= "X.509"; //$NON-NLS-1$
67 /** Whether we have already printed the help text or not. */
68 private boolean helpPrinted
;
69 /** The new position of GnuCRYPTO provider if it is not already installed. */
70 private int gnuCryptoProviderNdx
= -2;
71 /** The new position of GNU Callbacks provider if it is not already installed. */
72 private int gnuCallbacksNdx
= -2;
79 public static final void main(String
[] args
)
81 log
.entering(Main
.class.getName(), "main", args
); //$NON-NLS-1$
83 Main tool
= new Main();
89 catch (SecurityException x
)
91 log
.throwing(Main
.class.getName(), "main", x
); //$NON-NLS-1$
92 System
.err
.println(Messages
.getString("Main.6") + x
.getMessage()); //$NON-NLS-1$
96 log
.throwing(Main
.class.getName(), "main", x
); //$NON-NLS-1$
97 System
.err
.println(Messages
.getString("Main.8") + x
); //$NON-NLS-1$
104 log
.exiting(Main
.class.getName(), "main"); //$NON-NLS-1$
108 // helper methods -----------------------------------------------------------
110 private void start(String
[] args
) throws Exception
112 log
.entering(this.getClass().getName(), "start", args
); //$NON-NLS-1$
115 args
= new String
[0];
117 int limit
= args
.length
;
118 log
.finest("args.length=" + limit
); //$NON-NLS-1$
125 log
.finest("args[" + i
+ "]=" + opt
); //$NON-NLS-1$ //$NON-NLS-2$
126 if (opt
== null || opt
.length() == 0)
130 if ("-genkey".equals(opt
)) //$NON-NLS-1$
131 cmd
= new GenKeyCmd();
132 else if ("-import".equals(opt
)) //$NON-NLS-1$
133 cmd
= new ImportCmd();
134 else if ("-selfcert".equals(opt
)) //$NON-NLS-1$
135 cmd
= new SelfCertCmd();
136 else if ("-identitydb".equals(opt
)) //$NON-NLS-1$
137 cmd
= new IdentityDBCmd();
138 else if ("-certreq".equals(opt
)) //$NON-NLS-1$
139 cmd
= new CertReqCmd();
140 else if ("-export".equals(opt
)) //$NON-NLS-1$
141 cmd
= new ExportCmd();
142 else if ("-list".equals(opt
)) //$NON-NLS-1$
144 else if ("-printcert".equals(opt
)) //$NON-NLS-1$
145 cmd
= new PrintCertCmd();
146 else if ("-keyclone".equals(opt
)) //$NON-NLS-1$
147 cmd
= new KeyCloneCmd();
148 else if ("-storepasswd".equals(opt
)) //$NON-NLS-1$
149 cmd
= new StorePasswdCmd();
150 else if ("-keypasswd".equals(opt
)) //$NON-NLS-1$
151 cmd
= new KeyPasswdCmd();
152 else if ("-delete".equals(opt
)) //$NON-NLS-1$
153 cmd
= new DeleteCmd();
154 else if ("-help".equals(opt
)) //$NON-NLS-1$
161 log
.fine("Unknown command [" + opt
+ "] at index #" + i
//$NON-NLS-1$ //$NON-NLS-2$
162 + ". Arguments from that token onward will be ignored"); //$NON-NLS-1$
168 i
= cmd
.processArgs(args
, i
);
173 // the -help command is the default; i.e.
180 if (i
< limit
) // more options than needed
181 log
.fine("Last recognized argument is assumed at index #" + (i
- 1) //$NON-NLS-1$
182 + ". Remaining arguments (" + args
[i
] + "...) will be ignored"); //$NON-NLS-1$ //$NON-NLS-2$
184 log
.exiting(this.getClass().getName(), "start"); //$NON-NLS-1$
189 log
.entering(this.getClass().getName(), "setup"); //$NON-NLS-1$
191 gnuCryptoProviderNdx
= ProviderUtil
.addProvider(new GnuCrypto());
192 gnuCallbacksNdx
= ProviderUtil
.addProvider(new GnuCallbacks());
194 log
.exiting(this.getClass().getName(), "setup"); //$NON-NLS-1$
197 private void teardown()
199 log
.entering(this.getClass().getName(), "teardown"); //$NON-NLS-1$
201 // if we added our own providers remove them
202 if (gnuCryptoProviderNdx
> 0)
203 ProviderUtil
.removeProvider(Registry
.GNU_CRYPTO
);
205 if (gnuCallbacksNdx
> 0)
206 ProviderUtil
.removeProvider("GNU-CALLBACKS"); //$NON-NLS-1$
208 log
.exiting(this.getClass().getName(), "teardown"); //$NON-NLS-1$
211 private void printHelp()
216 HelpPrinter
.printHelp(HELP_PATH
);