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

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 "modutil.h"
  34. #include "secmodti.h"
  35. #include "pk11func.h"
  36. extern PK11DefaultArrayEntry PK11_DefaultArray[];
  37. extern int num_pk11_default_mechanisms;
  38. extern SECStatus PK11_UpdateSlotAttribute(PK11SlotInfo*, PK11DefaultArrayEntry*,
  39. PRBool);
  40. /*************************************************************************
  41.  *
  42.  * F i p s M o d e
  43.  * If arg=="true", enable FIPS mode on the internal module.  If arg=="false",
  44.  * disable FIPS mode on the internal module.
  45.  */
  46. Error
  47. FipsMode(char *arg)
  48. {
  49. char *internal_name;
  50. if(!PORT_Strcasecmp(arg, "true")) {
  51. if(!PK11_IsFIPS()) {
  52. internal_name = PR_smprintf("%s",
  53. SECMOD_GetInternalModule()->commonName);
  54. if(SECMOD_DeleteInternalModule(internal_name) != SECSuccess) {
  55. PR_smprintf_free(internal_name);
  56. PR_fprintf(PR_STDERR, errStrings[FIPS_SWITCH_FAILED_ERR]);
  57. return FIPS_SWITCH_FAILED_ERR;
  58. }
  59. PR_smprintf_free(internal_name);
  60. PR_fprintf(PR_STDOUT, msgStrings[FIPS_ENABLED_MSG]);
  61. } else {
  62. PR_fprintf(PR_STDERR, errStrings[FIPS_ALREADY_ON_ERR]);
  63. return FIPS_ALREADY_ON_ERR;
  64. }
  65. } else if(!PORT_Strcasecmp(arg, "false")) {
  66. if(PK11_IsFIPS()) {
  67. internal_name = PR_smprintf("%s",
  68. SECMOD_GetInternalModule()->commonName);
  69. if(SECMOD_DeleteInternalModule(internal_name) != SECSuccess) {
  70. PR_smprintf_free(internal_name);
  71. PR_fprintf(PR_STDERR, errStrings[FIPS_SWITCH_FAILED_ERR]);
  72. return FIPS_SWITCH_FAILED_ERR;
  73. }
  74. PR_smprintf_free(internal_name);
  75. PR_fprintf(PR_STDOUT, msgStrings[FIPS_DISABLED_MSG]);
  76. } else {
  77. PR_fprintf(PR_STDERR, errStrings[FIPS_ALREADY_OFF_ERR]);
  78. return FIPS_ALREADY_OFF_ERR;
  79. }
  80. } else {
  81. PR_fprintf(PR_STDERR, errStrings[INVALID_FIPS_ARG]);
  82. return INVALID_FIPS_ARG;
  83. }
  84. return SUCCESS;
  85. }
  86. /************************************************************************
  87.  * Cipher and Mechanism name-bitmask translation tables
  88.  */
  89. typedef struct {
  90. char *name;
  91. unsigned long mask;
  92. } MaskString;
  93. static MaskString mechanismStrings[] = {
  94. {"RSA", PUBLIC_MECH_RSA_FLAG},
  95. {"DSA", PUBLIC_MECH_DSA_FLAG},
  96. {"RC2", PUBLIC_MECH_RC2_FLAG},
  97. {"RC4", PUBLIC_MECH_RC4_FLAG},
  98. {"RC5", PUBLIC_MECH_RC5_FLAG},
  99. {"DES", PUBLIC_MECH_DES_FLAG},
  100. {"DH", PUBLIC_MECH_DH_FLAG},
  101. {"FORTEZZA", PUBLIC_MECH_FORTEZZA_FLAG},
  102. {"SHA1", PUBLIC_MECH_SHA1_FLAG},
  103. {"MD5", PUBLIC_MECH_MD5_FLAG},
  104. {"MD2", PUBLIC_MECH_MD2_FLAG},
  105. {"SSL", PUBLIC_MECH_SSL_FLAG},
  106. {"TLS", PUBLIC_MECH_TLS_FLAG},
  107. {"RANDOM", PUBLIC_MECH_RANDOM_FLAG},
  108. {"FRIENDLY", PUBLIC_MECH_FRIENDLY_FLAG}
  109. };
  110. static int numMechanismStrings = 13;
  111. static MaskString cipherStrings[] = {
  112. {"FORTEZZA", PUBLIC_CIPHER_FORTEZZA_FLAG}
  113. };
  114. static int numCipherStrings= 1;
  115. /* Maximum length of a colon-separated list of all the strings in an 
  116.  * array. */
  117. #define MAX_STRING_LIST_LEN 240 /* or less */
  118. /************************************************************************
  119.  * 
  120.  * g e t F l a g s F r o m S t r i n g
  121.  *
  122.  * Parses a mechanism list passed on the command line and converts it
  123.  * to an unsigned long bitmask.
  124.  * string is a colon-separated string of constants
  125.  * array is an array of MaskStrings.
  126.  * elements is the number of elements in array.
  127.  */
  128. static unsigned long
  129. getFlagsFromString(char *string, MaskString array[], int elements)
  130. {
  131. unsigned long ret = 0;
  132. short i = 0;
  133. char *cp;
  134. char *buf;
  135. char *end;
  136. if(!string || !string[0]) {
  137. return ret;
  138. }
  139. /* Make a temporary copy of the string */
  140. buf = PR_Malloc(strlen(string)+1);
  141. if(!buf) {
  142. out_of_memory();
  143. }
  144. strcpy(buf, string);
  145. /* Look at each element of the list passed in */
  146. for(cp=buf; cp && *cp; cp = (end ? end+1 : NULL) ) {
  147. /* Look at the string up to the next colon */
  148. end = strchr(cp, ':');
  149. if(end) {
  150. *end = '';
  151. }
  152. /* Find which element this is */
  153. for(i=0; i < elements; i++) {
  154. if( !PORT_Strcasecmp(cp, array[i].name) ) {
  155. break;
  156. }
  157. }
  158. if(i == elements) {
  159. /* Skip a bogus string, but print a warning message */
  160. PR_fprintf(PR_STDERR, errStrings[INVALID_CONSTANT_ERR], cp);
  161. continue;
  162. }
  163. ret |= array[i].mask;
  164. }
  165. PR_Free(buf);
  166. return ret;
  167. }
  168. /**********************************************************************
  169.  *
  170.  * g e t S t r i n g F r o m F l a g s
  171.  * 
  172.  * The return string's memory is owned by this function.  Copy it
  173.  * if you need it permanently or you want to change it.
  174.  */
  175. static char *
  176. getStringFromFlags(unsigned long flags, MaskString array[], int elements)
  177. {
  178. static char buf[MAX_STRING_LIST_LEN];
  179. int i;
  180. int count=0;
  181. buf[0] = '';
  182. for(i=0; i<elements; i++) {
  183. if( flags & array[i].mask ) {
  184. ++count;
  185. if(count!=1) {
  186. strcat(buf, ":");
  187. }
  188. strcat(buf, array[i].name);
  189. }
  190. }
  191. return buf;
  192. }
  193. /**********************************************************************
  194.  *
  195.  * A d d M o d u l e
  196.  *
  197.  * Add the named module, with the given library file, ciphers, and
  198.  * default mechanism flags
  199.  */
  200. Error
  201. AddModule(char *moduleName, char *libFile, char *cipherString,
  202. char *mechanismString)
  203. {
  204. unsigned long ciphers;
  205. unsigned long mechanisms;
  206. SECStatus status;
  207. mechanisms =
  208. getFlagsFromString(mechanismString, mechanismStrings,
  209.   numMechanismStrings);
  210. ciphers =
  211. getFlagsFromString(cipherString, cipherStrings, numCipherStrings);
  212. status =
  213. SECMOD_AddNewModule(moduleName, libFile,
  214.   SECMOD_PubMechFlagstoInternal(mechanisms),
  215.   SECMOD_PubCipherFlagstoInternal(ciphers) );
  216. if(status != SECSuccess) {
  217. PR_fprintf(PR_STDERR, errStrings[ADD_MODULE_FAILED_ERR], moduleName);
  218. return ADD_MODULE_FAILED_ERR;
  219. } else {
  220. PR_fprintf(PR_STDOUT, msgStrings[ADD_MODULE_SUCCESS_MSG], moduleName);
  221. return SUCCESS;
  222. }
  223. }
  224. /***********************************************************************
  225.  *
  226.  * D e l e t e M o d u l e
  227.  *
  228.  * Deletes the named module from the database.
  229.  */
  230. Error
  231. DeleteModule(char *moduleName)
  232. {
  233. SECStatus status;
  234. int type;
  235. status = SECMOD_DeleteModule(moduleName, &type);
  236. if(status != SECSuccess) {
  237. if(type == SECMOD_FIPS || type == SECMOD_INTERNAL) {
  238. PR_fprintf(PR_STDERR, errStrings[DELETE_INTERNAL_ERR]);
  239. return DELETE_INTERNAL_ERR;
  240. } else {
  241. PR_fprintf(PR_STDERR, errStrings[DELETE_FAILED_ERR], moduleName);
  242. return DELETE_FAILED_ERR;
  243. }
  244. }
  245. PR_fprintf(PR_STDOUT, msgStrings[DELETE_SUCCESS_MSG], moduleName);
  246. return SUCCESS;
  247. }
  248. /************************************************************************
  249.  *
  250.  * L i s t M o d u l e s
  251.  *
  252.  * Lists all the modules in the database, along with their slots and tokens.
  253.  */
  254. Error
  255. ListModules()
  256. {
  257. SECMODListLock *lock;
  258. SECMODModuleList *list;
  259. SECMODModuleList *mlp;
  260. Error ret=UNSPECIFIED_ERR;
  261. int count = 0, i;
  262. lock = SECMOD_GetDefaultModuleListLock();
  263. if(!lock) {
  264. PR_fprintf(PR_STDERR, errStrings[NO_LIST_LOCK_ERR]);
  265. return NO_LIST_LOCK_ERR;
  266. }
  267. SECMOD_GetReadLock(lock);
  268. list = SECMOD_GetDefaultModuleList();
  269. if(!list) {
  270. PR_fprintf(PR_STDERR, errStrings[NO_MODULE_LIST_ERR]);
  271. ret = NO_MODULE_LIST_ERR;
  272. goto loser;
  273. }
  274. PR_fprintf(PR_STDOUT,
  275. "nListing of PKCS #11 Modulesn"
  276. "-----------------------------------------------------------n");
  277. for(mlp=list; mlp != NULL; mlp = mlp->next) {
  278. ++count;
  279. if(count!=1) {
  280. PR_fprintf(PR_STDOUT, "n");
  281. }
  282. PR_fprintf(PR_STDOUT, "%3d. %sn", count, mlp->module->commonName);
  283. if(mlp->module->dllName) {
  284. PR_fprintf(PR_STDOUT, "tlibrary name: %sn", mlp->module->dllName);
  285. }
  286. if(mlp->module->slotCount == 0) {
  287. PR_fprintf(PR_STDOUT,
  288. "t slots: There are no slots attached to this modulen");
  289. } else {
  290. PR_fprintf(PR_STDOUT,
  291. "t slots: %d slot%s attachedn", mlp->module->slotCount,
  292. (mlp->module->slotCount==1 ? "" : "s") );
  293. }
  294. if(mlp->module->loaded == 0) {
  295. PR_fprintf(PR_STDOUT, "tstatus: Not loadedn");
  296. } else {
  297. PR_fprintf(PR_STDOUT, "tstatus: loadedn");
  298. }
  299. /* Print slot and token names */
  300. for (i = 0; i < mlp->module->slotCount; i++) {
  301. PK11SlotInfo *slot = mlp->module->slots[i];
  302. PR_fprintf(PR_STDOUT, "n");
  303. PR_fprintf(PR_STDOUT, "t slot: %sn", PK11_GetSlotName(slot));
  304. PR_fprintf(PR_STDOUT, "ttoken: %sn", PK11_GetTokenName(slot));
  305. }
  306.     }
  307. PR_fprintf(PR_STDOUT,
  308. "-----------------------------------------------------------n");
  309. ret = SUCCESS;
  310. loser:
  311. SECMOD_ReleaseReadLock(lock);
  312. return ret;
  313. }
  314. /* Strings describing PK11DisableReasons */
  315. static int numDisableReasonStr = 5;
  316. static char *disableReasonStr[] = {
  317. "no reason",
  318. "user disabled",
  319. "could not initialize token",
  320. "could not verify token",
  321. "token not present"
  322. };
  323. /***********************************************************************
  324.  *
  325.  * L i s t M o d u l e
  326.  *
  327.  * Lists detailed information about the named module.
  328.  */
  329. Error
  330. ListModule(char *moduleName)
  331. {
  332. SECMODModule *module;
  333. PK11SlotInfo *slot;
  334. int slotnum;
  335. CK_INFO modinfo;
  336. CK_SLOT_INFO slotinfo;
  337. CK_TOKEN_INFO tokeninfo;
  338. char *ciphers, *mechanisms;
  339. PK11DisableReasons reason;
  340. if(!moduleName) {
  341. return SUCCESS;
  342. }
  343. module = SECMOD_FindModule(moduleName);
  344. if(!module) {
  345. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_MODULE_ERR], moduleName);
  346. return NO_SUCH_MODULE_ERR;
  347. }
  348. if(PK11_GetModInfo(module, &modinfo) != SECSuccess) {
  349. PR_fprintf(PR_STDERR, errStrings[MOD_INFO_ERR], moduleName);
  350. return MOD_INFO_ERR;
  351. }
  352. /* Module info */
  353. PR_fprintf(PR_STDOUT, 
  354. "n-----------------------------------------------------------n");
  355. PR_fprintf(PR_STDOUT, "Name: %sn", module->commonName);
  356. if(module->internal || !module->dllName) {
  357. PR_fprintf(PR_STDOUT, "Library file: **Internal ONLY module**n");
  358. } else {
  359. PR_fprintf(PR_STDOUT, "Library file: %sn", module->dllName);
  360. }
  361. PR_fprintf(PR_STDOUT, "Manufacturer: %.32sn", modinfo.manufacturerID);
  362. PR_fprintf(PR_STDOUT, "Description: %.32sn", modinfo.libraryDescription);
  363. PR_fprintf(PR_STDOUT, "PKCS #11 Version %d.%dn",
  364. modinfo.cryptokiVersion.major, modinfo.cryptokiVersion.minor);
  365. PR_fprintf(PR_STDOUT, "Library Version: %d.%dn",
  366. modinfo.libraryVersion.major, modinfo.libraryVersion.minor);
  367. /* Get cipher and mechanism flags */
  368. ciphers = getStringFromFlags(module->ssl[0], cipherStrings,
  369.   numCipherStrings);
  370. if(ciphers[0] == '') {
  371. ciphers = "None";
  372. }
  373. PR_fprintf(PR_STDOUT, "Cipher Enable Flags: %sn", ciphers);
  374. mechanisms = NULL;
  375. if(module->slotCount > 0) {
  376. mechanisms = getStringFromFlags(module->slots[0]->defaultFlags,
  377. mechanismStrings, numMechanismStrings);
  378. }
  379. if(mechanisms[0] =='') {
  380. mechanisms = "None";
  381. }
  382. PR_fprintf(PR_STDOUT, "Default Mechanism Flags: %sn", mechanisms);
  383. #define PAD "  "
  384. /* Loop over each slot */
  385. for(slotnum=0; slotnum < module->slotCount; slotnum++) {
  386. slot = module->slots[slotnum];
  387. if(PK11_GetSlotInfo(slot, &slotinfo) != SECSuccess) {
  388. PR_fprintf(PR_STDERR, errStrings[SLOT_INFO_ERR],
  389. PK11_GetSlotName(slot));
  390. return SLOT_INFO_ERR;
  391. }
  392. if(PK11_GetTokenInfo(slot, &tokeninfo) != SECSuccess) {
  393. PR_fprintf(PR_STDERR, errStrings[TOKEN_INFO_ERR],
  394.   slot->token_name);
  395. return TOKEN_INFO_ERR;
  396. }
  397. /* Slot Info */
  398. PR_fprintf(PR_STDOUT, "n"PAD"Slot: %sn", PK11_GetSlotName(slot));
  399. mechanisms = getStringFromFlags(slot->defaultFlags,
  400. mechanismStrings, numMechanismStrings);
  401. if(mechanisms[0] =='') {
  402.      mechanisms = "None";
  403. }
  404. PR_fprintf(PR_STDOUT, PAD"Slot Mechanism Flags: %sn", mechanisms);
  405. PR_fprintf(PR_STDOUT, PAD"Manufacturer: %.32sn",
  406. slotinfo.manufacturerID);
  407. if(slot->isHW) {
  408. PR_fprintf(PR_STDOUT, PAD"Type: Hardwaren");
  409. } else {
  410. PR_fprintf(PR_STDOUT, PAD"Type: Softwaren");
  411. }
  412. PR_fprintf(PR_STDOUT, PAD"Version Number: %d.%dn",
  413. slotinfo.hardwareVersion.major, slotinfo.hardwareVersion.minor);
  414. PR_fprintf(PR_STDOUT, PAD"Firmware Version: %d.%dn",
  415. slotinfo.firmwareVersion.major, slotinfo.firmwareVersion.minor);
  416. if(slot->disabled) {
  417. reason  = PK11_GetDisabledReason(slot);
  418. if(reason < numDisableReasonStr) {
  419. PR_fprintf(PR_STDOUT, PAD"Status: DISABLED (%s)n",
  420.   disableReasonStr[reason]);
  421. } else {
  422. PR_fprintf(PR_STDOUT, PAD"Status: DISABLEDn");
  423. }
  424. } else {
  425. PR_fprintf(PR_STDOUT, PAD"Status: Enabledn");
  426. }
  427. /* Token Info */
  428. PR_fprintf(PR_STDOUT, PAD"Token Name: %.32sn",
  429. tokeninfo.label);
  430. PR_fprintf(PR_STDOUT, PAD"Token Manufacturer: %.32sn",
  431. tokeninfo.manufacturerID);
  432. PR_fprintf(PR_STDOUT, PAD"Token Model: %.16sn", tokeninfo.model);
  433. PR_fprintf(PR_STDOUT, PAD"Token Serial Number: %.16sn",
  434. tokeninfo.serialNumber);
  435. PR_fprintf(PR_STDOUT, PAD"Token Version: %d.%dn",
  436. tokeninfo.hardwareVersion.major, tokeninfo.hardwareVersion.minor);
  437. PR_fprintf(PR_STDOUT, PAD"Token Firmware Version: %d.%dn",
  438. tokeninfo.firmwareVersion.major, tokeninfo.firmwareVersion.minor);
  439. if(tokeninfo.flags & CKF_WRITE_PROTECTED) {
  440. PR_fprintf(PR_STDOUT, PAD"Access: Write Protectedn");
  441. } else {
  442. PR_fprintf(PR_STDOUT, PAD"Access: NOT Write Protectedn");
  443. }
  444. if(tokeninfo.flags & CKF_LOGIN_REQUIRED) {
  445. PR_fprintf(PR_STDOUT, PAD"Login Type: Login requiredn");
  446. } else {
  447. PR_fprintf(PR_STDOUT, PAD
  448.   "Login Type: Public (no login required)n");
  449. }
  450. if(tokeninfo.flags & CKF_USER_PIN_INITIALIZED) {
  451. PR_fprintf(PR_STDOUT, PAD"User Pin: Initializedn");
  452. } else {
  453. PR_fprintf(PR_STDOUT, PAD"User Pin: NOT Initializedn");
  454. }
  455. }
  456. PR_fprintf(PR_STDOUT, 
  457. "n-----------------------------------------------------------n");
  458. return SUCCESS;
  459. }
  460. /************************************************************************
  461.  *
  462.  * C h a n g e P W
  463.  */
  464. Error
  465. ChangePW(char *tokenName, char *pwFile, char *newpwFile)
  466. {
  467. char *oldpw=NULL, *newpw=NULL, *newpw2=NULL;
  468. PK11SlotInfo *slot;
  469. Error ret=UNSPECIFIED_ERR;
  470. PRBool matching;
  471. slot = PK11_FindSlotByName(tokenName);
  472. if(!slot) {
  473. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_TOKEN_ERR], tokenName);
  474. return NO_SUCH_TOKEN_ERR;
  475. }
  476. PK11_SetPasswordFunc(SECU_GetModulePassword);
  477. /* Get old password */
  478. if(! PK11_NeedUserInit(slot)) {
  479. if(pwFile) {
  480. oldpw = SECU_GetPasswordString(pwFile, "");
  481. if(PK11_CheckUserPassword(slot, oldpw) != SECSuccess) {
  482. PR_fprintf(PR_STDERR, errStrings[BAD_PW_ERR]);
  483. ret=BAD_PW_ERR;
  484. goto loser;
  485. }
  486. } else {
  487. for(matching=PR_FALSE; !matching; ) {
  488. oldpw = SECU_GetPasswordString(NULL, "Enter old password: ");
  489. if(PK11_CheckUserPassword(slot, oldpw) == SECSuccess) {
  490. matching = PR_TRUE;
  491. } else {
  492. PR_fprintf(PR_STDOUT, msgStrings[BAD_PW_MSG]);
  493. }
  494. }
  495. }
  496. }
  497. /* Get new password */
  498. if(newpwFile) {
  499. newpw = SECU_GetPasswordString(newpwFile, "");
  500. } else {
  501. for(matching=PR_FALSE; !matching; ) {
  502. newpw = SECU_GetPasswordString(NULL, "Enter new password: ");
  503. newpw2 = SECU_GetPasswordString(NULL, "Re-enter new password: ");
  504. if(strcmp(newpw, newpw2)) {
  505. PR_fprintf(PR_STDOUT, msgStrings[PW_MATCH_MSG]);
  506. } else {
  507. matching = PR_TRUE;
  508. }
  509. }
  510. }
  511. /* Change the password */
  512. if(PK11_NeedUserInit(slot)) {
  513. if(PK11_InitPin(slot, NULL /*ssopw*/, newpw) != SECSuccess) {
  514. PR_fprintf(PR_STDERR, errStrings[CHANGEPW_FAILED_ERR], tokenName);
  515. ret = CHANGEPW_FAILED_ERR;
  516. goto loser;
  517. }
  518. } else {
  519. if(PK11_ChangePW(slot, oldpw, newpw) != SECSuccess) {
  520. PR_fprintf(PR_STDERR, errStrings[CHANGEPW_FAILED_ERR], tokenName);
  521. ret = CHANGEPW_FAILED_ERR;
  522. goto loser;
  523. }
  524. }
  525. PR_fprintf(PR_STDOUT, msgStrings[CHANGEPW_SUCCESS_MSG], tokenName);
  526. ret = SUCCESS;
  527. loser:
  528. if(oldpw) {
  529. memset(oldpw, 0, strlen(oldpw));
  530. PORT_Free(oldpw);
  531. }
  532. if(newpw) {
  533. memset(newpw, 0, strlen(newpw));
  534. PORT_Free(newpw);
  535. }
  536. if(newpw2) {
  537. memset(newpw2, 0, strlen(newpw));
  538. PORT_Free(newpw2);
  539. }
  540. return ret;
  541. }
  542. /***********************************************************************
  543.  *
  544.  * E n a b l e M o d u l e
  545.  *
  546.  * If enable==PR_TRUE, enables the module or slot.
  547.  * If enable==PR_FALSE, disables the module or slot.
  548.  * moduleName is the name of the module.
  549.  * slotName is the name of the slot.  It is optional.
  550.  */
  551. Error
  552. EnableModule(char *moduleName, char *slotName, PRBool enable)
  553. {
  554. int i;
  555. SECMODModule *module;
  556. PK11SlotInfo *slot = NULL;
  557. PRBool found = PR_FALSE;
  558. module = SECMOD_FindModule(moduleName);
  559. if(!module) {
  560. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_MODULE_ERR], moduleName);
  561. return NO_SUCH_MODULE_ERR;
  562. }
  563. for(i=0; i < module->slotCount; i++) {
  564. slot = module->slots[i];
  565. if(slotName && strcmp(PK11_GetSlotName(slot), slotName)) {
  566. /* Not the right slot */
  567. continue;
  568. }
  569. if(enable) {
  570. if(! PK11_UserEnableSlot(slot)) {
  571. PR_fprintf(PR_STDERR, errStrings[ENABLE_FAILED_ERR],
  572. "enable", PK11_GetSlotName(slot));
  573. return ENABLE_FAILED_ERR;
  574. } else {
  575. found = PR_TRUE;
  576. PR_fprintf(PR_STDOUT, msgStrings[ENABLE_SUCCESS_MSG],
  577. PK11_GetSlotName(slot), "enabled");
  578. }
  579. } else {
  580. if(! PK11_UserDisableSlot(slot)) {
  581. PR_fprintf(PR_STDERR, errStrings[ENABLE_FAILED_ERR],
  582. "disable", PK11_GetSlotName(slot));
  583. return ENABLE_FAILED_ERR;
  584. } else {
  585. found = PR_TRUE;
  586. PR_fprintf(PR_STDOUT, msgStrings[ENABLE_SUCCESS_MSG],
  587. PK11_GetSlotName(slot), "disabled");
  588. }
  589. }
  590. }
  591. if(slotName && !found) {
  592. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_SLOT_ERR], slotName);
  593. return NO_SUCH_SLOT_ERR;
  594. }
  595. /* Delete and re-add module to save changes */
  596. if( SECMOD_DeletePermDB(module) != SECSuccess ) {
  597. PR_fprintf(PR_STDERR, errStrings[UPDATE_MOD_FAILED_ERR], moduleName);
  598. return UPDATE_MOD_FAILED_ERR;
  599. }
  600. if( SECMOD_AddPermDB(module) != SECSuccess ) {
  601. /* We're in big trouble here */
  602. PR_fprintf(PR_STDERR, errStrings[UPDATE_MOD_FAILED_ERR], moduleName);
  603. return UPDATE_MOD_FAILED_ERR;
  604. }
  605. return SUCCESS;
  606. }
  607. /*************************************************************************
  608.  *
  609.  * S e t D e f a u l t M o d u l e
  610.  *
  611.  */
  612. Error
  613. SetDefaultModule(char *moduleName, char *slotName, char *mechanisms)
  614. {
  615. SECMODModule *module;
  616. PK11SlotInfo *slot;
  617. int s, i;
  618. unsigned long mechFlags = getFlagsFromString(mechanisms, mechanismStrings,
  619. numMechanismStrings);
  620. PRBool found = PR_FALSE;
  621. Error errcode = UNSPECIFIED_ERR;
  622. mechFlags =  SECMOD_PubMechFlagstoInternal(mechFlags);
  623. module = SECMOD_FindModule(moduleName);
  624. if(!module) {
  625. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_MODULE_ERR], moduleName);
  626. errcode = NO_SUCH_MODULE_ERR;
  627. goto loser;
  628. }
  629. /* Go through each slot */
  630. for(s=0; s < module->slotCount; s++) {
  631. slot = module->slots[s];
  632. if ((slotName != NULL) &&
  633. !((strcmp(PK11_GetSlotName(slot),slotName) == 0) ||
  634. (strcmp(PK11_GetTokenName(slot),slotName) == 0)) ) {
  635.     /* we are only interested in changing the one slot */
  636.     continue;
  637. }
  638. found = PR_TRUE;
  639. /* Go through each mechanism */
  640. for(i=0; i < num_pk11_default_mechanisms; i++) {
  641. if(PK11_DefaultArray[i].flag & mechFlags) {
  642. /* Enable this default mechanism */
  643. PK11_UpdateSlotAttribute(slot, &(PK11_DefaultArray[i]),
  644. PR_TRUE);
  645. }
  646. }
  647. }
  648. if (slotName && !found) {
  649. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_SLOT_ERR], slotName);
  650. errcode = NO_SUCH_SLOT_ERR;
  651. goto loser;
  652. }
  653. /* Delete and re-add module to save changes */
  654. if( SECMOD_DeletePermDB(module) != SECSuccess ) {
  655. PR_fprintf(PR_STDERR, errStrings[DEFAULT_FAILED_ERR],
  656.   moduleName);
  657. errcode = DEFAULT_FAILED_ERR;
  658. goto loser;
  659. }
  660. if( SECMOD_AddPermDB(module) != SECSuccess ) {
  661. /* We're in big trouble here */
  662. PR_fprintf(PR_STDERR, errStrings[DEFAULT_FAILED_ERR],
  663.   moduleName);
  664. errcode = DEFAULT_FAILED_ERR;
  665. goto loser;
  666. }
  667. PR_fprintf(PR_STDOUT, msgStrings[DEFAULT_SUCCESS_MSG]);
  668. errcode = SUCCESS;
  669. loser:
  670. return errcode;
  671. }
  672. /************************************************************************
  673.  *
  674.  * U n s e t D e f a u l t M o d u l e
  675.  */
  676. Error
  677. UnsetDefaultModule(char *moduleName, char *slotName, char *mechanisms)
  678. {
  679. SECMODModule * module;
  680. PK11SlotInfo *slot;
  681. int s, i;
  682. unsigned long mechFlags = getFlagsFromString(mechanisms,
  683. mechanismStrings, numMechanismStrings);
  684. PRBool found = PR_FALSE;
  685. mechFlags =  SECMOD_PubMechFlagstoInternal(mechFlags);
  686. module = SECMOD_FindModule(moduleName);
  687. if(!module) {
  688. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_MODULE_ERR], moduleName);
  689. return NO_SUCH_MODULE_ERR;
  690. }
  691. for(s=0; s < module->slotCount; s++) {
  692. slot = module->slots[s];
  693. if ((slotName != NULL) &&
  694. !((strcmp(PK11_GetSlotName(slot),slotName) == 0) ||
  695. (strcmp(PK11_GetTokenName(slot),slotName) == 0)) ) {
  696.     /* we are only interested in changing the one slot */
  697.     continue;
  698. }
  699. for(i=0; i <num_pk11_default_mechanisms; i++) {
  700. if(PK11_DefaultArray[i].flag & mechFlags) {
  701. PK11_UpdateSlotAttribute(slot, &(PK11_DefaultArray[i]),
  702. PR_FALSE);
  703. }
  704. }
  705. }
  706. if (slotName && !found) {
  707. PR_fprintf(PR_STDERR, errStrings[NO_SUCH_SLOT_ERR], slotName);
  708. return NO_SUCH_SLOT_ERR;
  709. }
  710. /* Delete and re-add module to save changes */
  711. if( SECMOD_DeletePermDB(module) != SECSuccess ) {
  712. PR_fprintf(PR_STDERR, errStrings[UNDEFAULT_FAILED_ERR],
  713.   moduleName);
  714. return UNDEFAULT_FAILED_ERR;
  715. }
  716. if( SECMOD_AddPermDB(module) != SECSuccess ) {
  717. /* We're in big trouble here */
  718. PR_fprintf(PR_STDERR, errStrings[UNDEFAULT_FAILED_ERR],
  719.   moduleName);
  720. return UNDEFAULT_FAILED_ERR;
  721. }
  722. PR_fprintf(PR_STDOUT, msgStrings[UNDEFAULT_SUCCESS_MSG]);
  723. return SUCCESS;
  724. }