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

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 "prtypes.h"
  34. #include "prtime.h"
  35. #include "prlong.h"
  36. #include "secutil.h"
  37. #include "secitem.h"
  38. #include "pk11func.h"
  39. #include "pqgutil.h"
  40. #include "secrng.h"
  41. #if defined(XP_UNIX)
  42. #include <unistd.h>
  43. #endif
  44. #include "plgetopt.h"
  45. #define BPB 8 /* bits per byte. */
  46. char               *progName;
  47. void
  48. Usage(void)
  49. {
  50.     fprintf(stderr, "Usage:  %sn", progName);
  51.     fprintf(stderr, 
  52. "-a   Output DER-encoded PQG params, BTOA encoded.n"
  53. "     -l prime-length       Length of prime in bits (1024 is default)n"
  54. "     -o file               Output to this file (default is stdout)n"
  55. "-b   Output DER-encoded PQG params in binaryn"
  56. "     -l prime-length       Length of prime in bits (1024 is default)n"
  57. "     -o file               Output to this file (default is stdout)n"
  58. "-r   Output P, Q and G in ASCII hexadecimal. n"
  59. "     -l prime-length       Length of prime in bits (1024 is default)n"
  60. "     -o file               Output to this file (default is stdout)n"   
  61. "-g bits       Generate SEED this many bits long.n"
  62. );
  63.     exit(-1);
  64. }
  65. int
  66. outputPQGParams(PQGParams * pqgParams, PRBool output_binary, PRBool output_raw,
  67.                 FILE * outFile)
  68. {
  69.     PRArenaPool   * arena  = NULL;
  70.     char          * PQG;
  71.     SECItem         encodedParams;
  72.     if (output_raw) {
  73.      SECItem item;
  74. PQG_GetPrimeFromParams(pqgParams, &item);
  75. SECU_PrintInteger(outFile, &item,    "Prime",    1);
  76. SECITEM_FreeItem(&item, PR_FALSE);
  77. PQG_GetSubPrimeFromParams(pqgParams, &item);
  78. SECU_PrintInteger(outFile, &item, "Subprime", 1);
  79. SECITEM_FreeItem(&item, PR_FALSE);
  80. PQG_GetBaseFromParams(pqgParams, &item);
  81. SECU_PrintInteger(outFile, &item,     "Base",     1);
  82. SECITEM_FreeItem(&item, PR_FALSE);
  83. fprintf(outFile, "n");
  84. return 0;
  85.     }
  86.     encodedParams.data = NULL;
  87.     encodedParams.len  = 0;
  88.     arena = PORT_NewArena(DER_DEFAULT_CHUNKSIZE);
  89.     SEC_ASN1EncodeItem(arena, &encodedParams, pqgParams,
  90.        SECKEY_PQGParamsTemplate);
  91.     if (output_binary) {
  92. fwrite(encodedParams.data, encodedParams.len, sizeof(char), outFile);
  93. printf("n");
  94. return 0;
  95.     }
  96.     /* must be output ASCII */
  97.     PQG = BTOA_DataToAscii(encodedParams.data, encodedParams.len);    
  98.     fprintf(outFile,"%s",PQG);
  99.     printf("n");
  100.     return 0;
  101. }
  102. int
  103. outputPQGVerify(PQGVerify * pqgVerify, PRBool output_binary, PRBool output_raw,
  104.                 FILE * outFile)
  105. {
  106.     if (output_raw) {
  107.      SECItem item;
  108. unsigned int counter;
  109. PQG_GetHFromVerify(pqgVerify, &item);
  110. SECU_PrintInteger(outFile, &item,        "h",        1);
  111. SECITEM_FreeItem(&item, PR_FALSE);
  112. PQG_GetSeedFromVerify(pqgVerify, &item);
  113. SECU_PrintInteger(outFile, &item,     "SEED",     1);
  114. fprintf(outFile, "    g:       %dn", item.len * BPB);
  115. SECITEM_FreeItem(&item, PR_FALSE);
  116. counter = PQG_GetCounterFromVerify(pqgVerify);
  117. fprintf(outFile, "    counter: %dn", counter);
  118. fprintf(outFile, "n");
  119. return 0;
  120.     }
  121.     return 0;
  122. }
  123. int
  124. main(int argc, char **argv)
  125. {
  126.     FILE          * outFile  = NULL;
  127.     PQGParams     * pqgParams  = NULL;
  128.     PQGVerify     * pqgVerify           = NULL;
  129.     int             keySizeInBits = 1024;
  130.     int             j;
  131.     int             o;
  132.     int             g                   = 0;
  133.     SECStatus       rv  = 0;
  134.     SECStatus       passed  = 0;
  135.     PRBool          output_ascii = PR_FALSE;
  136.     PRBool          output_binary = PR_FALSE;
  137.     PRBool          output_raw = PR_FALSE;
  138.     PLOptState *optstate;
  139.     PLOptStatus status;
  140.     progName = strrchr(argv[0], '/');
  141.     if (!progName)
  142. progName = strrchr(argv[0], '\');
  143.     progName = progName ? progName+1 : argv[0];
  144.     /* Parse command line arguments */
  145.     optstate = PL_CreateOptState(argc, argv, "l:abro:g:" );
  146.     while ((status = PL_GetNextOpt(optstate)) == PL_OPT_OK) {
  147. switch (optstate->option) {
  148.   case 'l':
  149.     keySizeInBits = atoi(optstate->value);
  150.     break;
  151.   case 'a':
  152.     output_ascii = PR_TRUE;  
  153.     break;
  154.   case 'b':
  155.     output_binary = PR_TRUE;
  156.     break;
  157.   case 'r':
  158.     output_raw = PR_TRUE;
  159.     break;
  160.   case 'o':
  161.     outFile = fopen(optstate->value, "wb");
  162.     if (!outFile) {
  163. fprintf(stderr, "%s: unable to open "%s" for writingn",
  164. progName, optstate->value);
  165. rv = -1;
  166.     }
  167.     break;
  168.   case 'g':
  169.     g = atoi(optstate->value);
  170.     break;
  171.   default:
  172.   case '?':
  173.     Usage();
  174.     break;
  175. }
  176.     }
  177.     if (rv != 0) {
  178. return rv;
  179.     }
  180.     /* exactly 1 of these options must be set. */
  181.     if (1 != ((output_ascii  != PR_FALSE) + 
  182.       (output_binary != PR_FALSE) +
  183.       (output_raw    != PR_FALSE))) {
  184. Usage();
  185.     }
  186.     j = PQG_PBITS_TO_INDEX(keySizeInBits);
  187.     if (j < 0) {
  188. fprintf(stderr, "%s: Illegal prime length, n"
  189. "tacceptable values are between 512 and 1024,n"
  190. "tand divisible by 64n", progName);
  191. return -1;
  192.     }
  193.     if (g != 0 && (g < 160 || g >= 2048 || g % 8 != 0)) {
  194. fprintf(stderr, "%s: Illegal g bits, n"
  195. "tacceptable values are between 160 and 2040,n"
  196. "tand divisible by 8n", progName);
  197. return -1;
  198.     }
  199.     if (outFile == NULL) {
  200. outFile = stdout;
  201.     }
  202.     RNG_RNGInit();
  203.     RNG_SystemInfoForRNG();
  204.     if (g) 
  205. rv = PQG_ParamGenSeedLen((unsigned)j, (unsigned)(g/8), 
  206.                          &pqgParams, &pqgVerify);
  207.     else 
  208. rv = PQG_ParamGen((unsigned)j, &pqgParams, &pqgVerify);
  209.     if (rv != SECSuccess || pqgParams == NULL) {
  210. fprintf(stderr, "%s: PQG parameter generation failed.n", progName);
  211. goto loser;
  212.     } 
  213.     fprintf(stderr, "%s: PQG parameter generation completed.n", progName);
  214.     o = outputPQGParams(pqgParams, output_binary, output_raw, outFile);
  215.     o = outputPQGVerify(pqgVerify, output_binary, output_raw, outFile);
  216.     rv = PQG_VerifyParams(pqgParams, pqgVerify, &passed);
  217.     if (rv != SECSuccess) {
  218. fprintf(stderr, "%s: PQG parameter verification aborted.n", progName);
  219. goto loser;
  220.     }
  221.     if (passed != SECSuccess) {
  222. fprintf(stderr, "%s: PQG parameters failed verification.n", progName);
  223. goto loser;
  224.     } 
  225.     fprintf(stderr, "%s: PQG parameters passed verification.n", progName);
  226.     PQG_DestroyParams(pqgParams);
  227.     PQG_DestroyVerify(pqgVerify);
  228.     return 0;
  229. loser:
  230.     PQG_DestroyParams(pqgParams);
  231.     PQG_DestroyVerify(pqgVerify);
  232.     return 1;
  233. }