keyutil.c
上传用户:lyxiangda
上传日期:2007-01-12
资源大小:3042k
文件大小:9k
源码类别:

CA认证

开发平台:

WINDOWS

  1. /*
  2.  * The contents of this file are subject to the Mozilla Public
  3.  * License Version 1.1 (the "License"); you may not use this file
  4.  * except in compliance with the License. You may obtain a copy of
  5.  * the License at http://www.mozilla.org/MPL/
  6.  * 
  7.  * Software distributed under the License is distributed on an "AS
  8.  * IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or
  9.  * implied. See the License for the specific language governing
  10.  * rights and limitations under the License.
  11.  * 
  12.  * The Original Code is the Netscape security libraries.
  13.  * 
  14.  * The Initial Developer of the Original Code is Netscape
  15.  * Communications Corporation.  Portions created by Netscape are 
  16.  * Copyright (C) 1994-2000 Netscape Communications Corporation.  All
  17.  * Rights Reserved.
  18.  * 
  19.  * Contributor(s):
  20.  * 
  21.  * Alternatively, the contents of this file may be used under the
  22.  * terms of the GNU General Public License Version 2 or later (the
  23.  * "GPL"), in which case the provisions of the GPL are applicable 
  24.  * instead of those above.  If you wish to allow use of your 
  25.  * version of this file only under the terms of the GPL and not to
  26.  * allow others to use your version of this file under the MPL,
  27.  * indicate your decision by deleting the provisions above and
  28.  * replace them with the notice and other provisions required by
  29.  * the GPL.  If you do not delete the provisions above, a recipient
  30.  * may use your version of this file under either the MPL or the
  31.  * GPL.
  32.  */
  33. #include <stdio.h>
  34. #include <string.h>
  35. #include "secutil.h"
  36. #if defined(XP_UNIX)
  37. #include <unistd.h>
  38. #include <sys/time.h>
  39. #include <termios.h>
  40. #endif
  41. #include "secopt.h"
  42. #if defined(XP_WIN)
  43. #include <time.h>
  44. #include <conio.h>
  45. #endif
  46. #if defined(__sun) && !defined(SVR4)
  47. extern int fclose(FILE*);
  48. extern int fprintf(FILE *, char *, ...);
  49. extern int getopt(int, char**, char*);
  50. extern int isatty(int);
  51. extern char *optarg;
  52. extern char *sys_errlist[];
  53. #define strerror(errno) sys_errlist[errno]
  54. #endif
  55. #include "nspr.h"
  56. #include "prtypes.h"
  57. #include "prtime.h"
  58. #include "prlong.h"
  59. static char *progName;
  60. static SECStatus
  61. ListKeys(SECKEYKeyDBHandle *handle, FILE *out)
  62. {
  63.     int rt;
  64.     rt = SECU_PrintKeyNames(handle, out);
  65.     if (rt) {
  66. SECU_PrintError(progName, "unable to list nicknames");
  67. return SECFailure;
  68.     }
  69.     return SECSuccess;
  70. }
  71. static SECStatus
  72. DumpPublicKey(SECKEYKeyDBHandle *handle, char *nickname, FILE *out)
  73. {
  74.     SECKEYLowPrivateKey *privKey;
  75.     SECKEYLowPublicKey *publicKey;
  76.     /* check if key actually exists */
  77.     if (SECU_CheckKeyNameExists(handle, nickname) == PR_FALSE) {
  78. SECU_PrintError(progName, "the key "%s" does not exist", nickname);
  79. return SECFailure;
  80.     }
  81.     /* Read in key */
  82.     privKey = SECU_GetPrivateKey(handle, nickname);
  83.     if (!privKey) {
  84. return SECFailure;
  85.     }
  86.     publicKey = SECKEY_LowConvertToPublicKey(privKey);
  87.     /* Output public key (in the clear) */
  88.     switch(publicKey->keyType) {
  89.       case rsaKey:
  90. fprintf(out, "RSA Public-Key:n");
  91. SECU_PrintInteger(out, &publicKey->u.rsa.modulus, "modulus", 1);
  92. SECU_PrintInteger(out, &publicKey->u.rsa.publicExponent,
  93.   "publicExponent", 1);
  94. break;
  95.       case dsaKey:
  96. fprintf(out, "DSA Public-Key:n");
  97. SECU_PrintInteger(out, &publicKey->u.dsa.params.prime, "prime", 1);
  98. SECU_PrintInteger(out, &publicKey->u.dsa.params.subPrime,
  99.   "subPrime", 1);
  100. SECU_PrintInteger(out, &publicKey->u.dsa.params.base, "base", 1);
  101. SECU_PrintInteger(out, &publicKey->u.dsa.publicValue, "publicValue", 1);
  102. break;
  103.       default:
  104. fprintf(out, "unknown key typen");
  105. break;
  106.     }
  107.     return SECSuccess;
  108. }
  109. static SECStatus
  110. DumpPrivateKey(SECKEYKeyDBHandle *handle, char *nickname, FILE *out)
  111. {
  112.     SECKEYLowPrivateKey *key;
  113.     /* check if key actually exists */
  114.     if (SECU_CheckKeyNameExists(handle, nickname) == PR_FALSE) {
  115. SECU_PrintError(progName, "the key "%s" does not exist", nickname);
  116. return SECFailure;
  117.     }
  118.     /* Read in key */
  119.     key = SECU_GetPrivateKey(handle, nickname);
  120.     if (!key) {
  121. SECU_PrintError(progName, "error retrieving key");
  122. return SECFailure;
  123.     }
  124.     switch(key->keyType) {
  125.       case rsaKey:
  126. fprintf(out, "RSA Private-Key:n");
  127. SECU_PrintInteger(out, &key->u.rsa.modulus, "modulus", 1);
  128. SECU_PrintInteger(out, &key->u.rsa.publicExponent, "publicExponent", 1);
  129. SECU_PrintInteger(out, &key->u.rsa.privateExponent,
  130.   "privateExponent", 1);
  131. SECU_PrintInteger(out, &key->u.rsa.prime1, "prime1", 1);
  132. SECU_PrintInteger(out, &key->u.rsa.prime2, "prime2", 1);
  133. SECU_PrintInteger(out, &key->u.rsa.exponent1, "exponent1", 1);
  134. SECU_PrintInteger(out, &key->u.rsa.exponent2, "exponent2", 1);
  135. SECU_PrintInteger(out, &key->u.rsa.coefficient, "coefficient", 1);
  136. break;
  137.       case dsaKey:
  138. fprintf(out, "DSA Private-Key:n");
  139. SECU_PrintInteger(out, &key->u.dsa.params.prime, "prime", 1);
  140. SECU_PrintInteger(out, &key->u.dsa.params.subPrime, "subPrime", 1);
  141. SECU_PrintInteger(out, &key->u.dsa.params.base, "base", 1);
  142. SECU_PrintInteger(out, &key->u.dsa.publicValue, "publicValue", 1);
  143. SECU_PrintInteger(out, &key->u.dsa.privateValue, "privateValue", 1);
  144. break;
  145.       default:
  146. fprintf(out, "unknown key typen");
  147. break;
  148.     }
  149.     return SECSuccess;
  150. }
  151. static SECStatus
  152. ChangePassword(SECKEYKeyDBHandle *handle)
  153. {
  154.     SECStatus rv;
  155.     /* Write out database with a new password */
  156.     rv = SECU_ChangeKeyDBPassword(handle, NULL);
  157.     if (rv) {
  158. SECU_PrintError(progName, "unable to change key password");
  159.     }
  160.     return rv;
  161. }
  162. static SECStatus
  163. DeletePrivateKey (SECKEYKeyDBHandle *keyHandle, char *nickName)
  164. {
  165.     SECStatus rv;
  166.     rv = SECU_DeleteKeyByName (keyHandle, nickName);
  167.     if (rv != SECSuccess)
  168. fprintf(stderr, "%s: problem deleting private key (%s)n",
  169. progName, SECU_Strerror(PR_GetError()));
  170.     return (rv);
  171. }
  172. static void
  173. Usage(const char *progName)
  174. {
  175.     fprintf(stderr,
  176.     "Usage:  %s -p name [-d keydir]n", progName);
  177.     fprintf(stderr,
  178.     "        %s -P name [-d keydir]n", progName);
  179.     fprintf(stderr,
  180.     "        %s -D name [-d keydir]n", progName);
  181.     fprintf(stderr,
  182.     "        %s -l [-d keydir]n", progName);
  183.     fprintf(stderr,
  184.     "        %s -c [-d keydir]n", progName);
  185.     fprintf(stderr, "%-20s Pretty print public key info for named keyn",
  186.     "-p nickname");
  187.     fprintf(stderr, "%-20s Pretty print private key info for named keyn",
  188.     "-P nickname");
  189.     fprintf(stderr, "%-20s Delete named private key from the key databasen",
  190.     "-D nickname");
  191.     fprintf(stderr, "%-20s List the nicknames for the keys in a databasen",
  192.     "-l");
  193.     fprintf(stderr, "%-20s Change the key database passwordn",
  194.     "-c");
  195.     fprintf(stderr, "n");
  196.     fprintf(stderr, "%-20s Key database directory (default is ~/.netscape)n",
  197.     "-d keydir");
  198.     exit(-1);
  199. }
  200. int main(int argc, char **argv)
  201. {
  202.     int o, changePassword, deleteKey, dumpPublicKey, dumpPrivateKey, list;
  203.     char *nickname;
  204.     SECStatus rv;
  205.     SECKEYKeyDBHandle *keyHandle;
  206.     progName = strrchr(argv[0], '/');
  207.     progName = progName ? progName+1 : argv[0];
  208.     /* Parse command line arguments */
  209.     changePassword = deleteKey = dumpPublicKey = dumpPrivateKey = list = 0;
  210.     nickname = NULL;
  211.     while ((o = getopt(argc, argv, "ADP:cd:glp:")) != -1) {
  212. switch (o) {
  213.   case '?':
  214.     Usage(progName);
  215.     break;
  216.   case 'A':
  217.     fprintf(stderr, "%s: Can no longer add a key.", progName);
  218.     fprintf(stderr, " Use pkcs12 to import a key.nn");
  219.     Usage(progName);
  220.     break;
  221.   case 'D':
  222.     deleteKey = 1;
  223.     nickname = optarg;
  224.     break;
  225.   case 'P':
  226.     dumpPrivateKey = 1;
  227.     nickname = optarg;
  228.     break;
  229.   case 'c':
  230.     changePassword = 1;
  231.     break;
  232.   case 'd':
  233.     SECU_ConfigDirectory(optarg);
  234.     break;
  235.   case 'g':
  236.     fprintf(stderr, "%s: Can no longer generate a key.", progName);
  237.     fprintf(stderr, " Use certutil to generate a cert request.nn");
  238.     Usage(progName);
  239.     break;
  240.   case 'l':
  241.     list = 1;
  242.     break;
  243.   case 'p':
  244.     dumpPublicKey = 1;
  245.     nickname = optarg;
  246.     break;
  247. }
  248.     }
  249.     if (dumpPublicKey+changePassword+dumpPrivateKey+list+deleteKey != 1)
  250. Usage(progName);
  251.     if ((list || changePassword) && nickname)
  252. Usage(progName);
  253.     if ((dumpPublicKey || dumpPrivateKey || deleteKey) && !nickname)
  254. Usage(progName);
  255.     /* Call the libsec initialization routines */
  256.     PR_Init( PR_SYSTEM_THREAD, PR_PRIORITY_NORMAL, 1);
  257.     SEC_Init();
  258.     /*
  259.      * XXX Note that the following opens the key database writable.
  260.      * If dumpPublicKey or dumpPrivateKey or list, though, we only want
  261.      * to open it read-only.  There needs to be a better interface
  262.      * to the initialization routines so that we can specify which way
  263.      * to open it.
  264.      */
  265.     rv = SECU_PKCS11Init();
  266.     if (rv != SECSuccess) {
  267.         SECU_PrintError(progName, "SECU_PKCS11Init failed");
  268. return -1;
  269.     }
  270.     keyHandle = SECKEY_GetDefaultKeyDB();
  271.     if (keyHandle == NULL) {
  272.         SECU_PrintError(progName, "could not open key database");
  273. return -1;
  274.     }
  275.     if (dumpPublicKey) {
  276. rv = DumpPublicKey(keyHandle, nickname, stdout);
  277.     } else
  278.     if (changePassword) {
  279. rv = ChangePassword(keyHandle);
  280.     } else
  281.     if (dumpPrivateKey) {
  282. rv = DumpPrivateKey(keyHandle, nickname, stdout);
  283.     } else
  284.     if (list) {
  285. rv = ListKeys(keyHandle, stdout);
  286.     } else
  287.     if (deleteKey) {
  288. rv = DeletePrivateKey(keyHandle, nickname);
  289.     }
  290.     
  291.     return rv ? -1 : 0;
  292. }