-----BEGIN PGP SIGNED MESSAGE----- Hash: RIPEMD160 Hello Nils,
Nils Larsch schrieb: > Cornelius Koelbel wrote: >> Hello, >> >> I liked the pkcs11-tool very much and used it with aladdin's own >> pkcs11-lib. But I could not manage to initialize the token and i >> could not change the pin. >> >> The Aladdin eToken can only be initialized after having logged in >> as a user and having closed this session again. > > sounds like a bug I tried to get some more information from Aladdin, since I guess (hope ;-) this is no bug in their pkcs11 implementation but I am still in discussion with Aladdin regarding this issue. > >> >> The PIN can only be changed, when logged in as a User before. >> >> So I wrote some small patches that worked for, so I could now >> initialize the token and change the PIN. I am not a real >> programmer and I guess the patches may not be valid for other >> tokens. Maybe for the initilization-patch there should be an >> if-statement or a commandline switch, that activates this code. >> >> Take a look at it and think of it. If there are any questions I >> will be pleased to answer them... >> >> The patches are against pkcs11-tool.c version 0.10.1. > > please use unified diffs, normal diffs are difficult to read => at > least I will ignore them if I don't have much time. I attached a unified diff, hope this helps reading it. For my conviniences I named the files pkcs11-tool.c-orig and my changes pkcs11-tool.c-cko. (-> version1) >> >>> /* Add for aladdin eToken with aladdin's libetpkcs11.so Before >>> initializing the token, we have to login to the token. cko */ >>> >>> rv = p11->C_OpenSession(opt_slot, CKF_SERIAL_SESSION| >>> CKF_RW_SESSION, NULL, NULL, &session); if (rv != CKR_OK) >>> p11_fatal("C_OpenSession", rv); >>> >>> login(session, 0); // login as CKU_USER >>> >>> /* we need to close the session again. */ rv = >>> p11->C_CloseSession(session); /* end of Aladdin specific stuff >>> */ > > are you sure that this workaround wont cause problems for other > pkcs11 libs ? It would cause problems, if someone who wants to initialize the token, has forgotten the user pin. I resorted the if statements at the beginning, so that I am able to change my user pin by doing the parameters "-l -c". For initilizing the token I also would prefer a solution at the command line like "-l --init-token" but unfortunately the session that is opened by the -l option is not closed before the init-token function is called. And there must not be any open sessions... May be it would be a possible solution to not having to change the init_token function by adding an additional login-function, that closes the session right after having logged in. In patch version 2 I added a "fake_login" function, that does exactly this. Thus I was able to initialize the Aladdin etoken this way: ./pkcs11-tool --module /usr/local/lib/libetpkcs11.so --fake-login - --init-token --label test > >>> >> 879a897,902 >>> /* cko: first we need to login to the token! */ rv = >>> p11->C_Login(sess, CKU_USER, (CK_UTF8CHAR *) old_pin, old_pin >>> == NULL ? 0 : strlen(old_pin)); if (rv != CKR_OK) >>> p11_fatal("C_Login", rv); /* end */ > > this will certainly cause problem if you try to change the so-pin > You are right. I removed it and changed it this way, that I can accomplish it by using -l -c. But how am I supposed to change the SO_PIN using the existing Code? I need a C_Login(CKU_SO) and a C_SetPin. Kind regards Cornelius -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.2.2 (GNU/Linux) Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org iD8DBQFEPEcRtVsWxaSPzvkRA0yIAJ9e51wSjukj4OuuR/o1vIIvuM/8FQCgpEzv 92jSHhtXVY94e0n5s6BzWkQ= =N3Om -----END PGP SIGNATURE-----
--- pkcs11-tool.c-orig 2006-03-30 23:14:25.000000000 +0200 +++ pkcs11-tool.c-cko 2006-04-12 01:45:23.000000000 +0200 @@ -372,6 +372,7 @@ case 'c': do_change_pin = 1; need_session |= CKF_SERIAL_SESSION; /* no need for a R/W session */ + need_session |= NEED_SESSION_RW; /* cko */ action_count++; break; case 's': @@ -495,15 +496,12 @@ CK_TOKEN_INFO info; get_token_info(opt_slot, &info); - if (!(info.flags & CKF_TOKEN_INITIALIZED)) - fatal("Token not initialized\n"); + //if (!(info.flags & CKF_TOKEN_INITIALIZED)) + // fatal("Token not initialized\n"); if (info.flags & CKF_LOGIN_REQUIRED) opt_login++; } - if (do_init_token) - init_token(opt_slot); - if (need_session) { int flags = CKF_SERIAL_SESSION; @@ -515,16 +513,24 @@ p11_fatal("C_OpenSession", rv); } - if (do_change_pin) - /* To be sure we won't mix things up with the -l or -p options, - * we safely stop here. */ - return change_pin(opt_slot, session); - if (opt_login || opt_pin || do_init_pin) { int r = login(session, need_to_be_so); if (r != 0) return r; } + /* + We put the do_change_pin _behind_ the opt_login to have the possibility to + do a "-c -l" to change the PIN with the Aladdin etpkcs11, since we need to login + before changing the pin + */ + if (do_change_pin) + /* To be sure we won't mix things up with the -l or -p options, + * we safely stop here. */ + return change_pin(opt_slot, session); + + if (do_init_token) + init_token(opt_slot); + if (do_init_pin) { init_pin(opt_slot, session); @@ -753,6 +759,7 @@ get_token_info(opt_slot, &info); + /* Identify which pin to enter */ if (info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) { @@ -787,13 +794,32 @@ char new_buf[21], *new_pin = NULL; CK_TOKEN_INFO info; CK_RV rv; + CK_SESSION_HANDLE session; // cko if (!opt_object_label) fatal("The token label must be specified using --label\n"); snprintf(token_label, sizeof (token_label), "%-32.32s", opt_object_label); - + get_token_info(slot, &info); + /* Add for aladdin eToken with aladdin's libetpkcs11.so + Before initializing the token, we have to login + to the token. cko */ + /* This would be nice, if it could be done by --init-token -l, + but the -l option does not close the session again and we + need to close it! :( */ + + rv = p11->C_OpenSession(opt_slot, CKF_SERIAL_SESSION| CKF_RW_SESSION, + NULL, NULL, &session); + if (rv != CKR_OK) + p11_fatal("C_OpenSession", rv); + + login(session, 0); // login as CKU_USER + + /* we need to close the session again. */ + rv = p11->C_CloseSession(session); + /* end of Aladdin specific stuff */ + if (!(info.flags & CKF_PROTECTED_AUTHENTICATION_PATH)) { if (opt_so_pin == NULL) { new_pin = getpass("Please enter the new SO PIN: "); @@ -877,6 +903,15 @@ } } + /* cko: first we need to login to the token! */ + /* This would only be necessary, if we would not use the -l option (see above) + I guess, this hurts noone!? + */ +// rv = p11->C_Login(sess, CKU_USER ...and sometimes CKU_SO, (CK_UTF8CHAR *) old_pin, old_pin == NULL ? 0 : strlen(old_pin)); +// if (rv != CKR_OK) +// p11_fatal("C_Login", rv); + /* end */ + rv = p11->C_SetPIN(sess, (CK_UTF8CHAR *) old_pin, old_pin == NULL ? 0 : strlen(old_pin), (CK_UTF8CHAR *) new_pin, new_pin == NULL ? 0 : strlen(new_pin));
--- pkcs11-tool.c-orig 2006-03-30 23:14:25.000000000 +0200 +++ pkcs11-tool.c 2006-04-12 02:06:37.000000000 +0200 @@ -61,6 +61,7 @@ { "hash", 0, 0, 'h' }, { "mechanism", 1, 0, 'm' }, + { "fake-login", 0, 0, 'f' }, { "login", 0, 0, 'l' }, { "pin", 1, 0, 'p' }, { "so-pin", 1, 0, OPT_SO_PIN }, @@ -99,6 +100,7 @@ "Hash some data", "Specify mechanism (use -M for a list of supported mechanisms)", + "Log into the token and close the session. Needed for Aladdin Token initialization.", "Log into the token first (not needed when using --pin)", "Supply User PIN on the command line (if used in scripts: careful!)", "Supply SO PIN on the command line (if used in scripts: careful!)", @@ -194,6 +196,7 @@ static void list_mechs(CK_SLOT_ID); static void list_objects(CK_SESSION_HANDLE); static int login(CK_SESSION_HANDLE, int); +static void fake_login(CK_SLOT_ID); static void init_token(CK_SLOT_ID); static void init_pin(CK_SLOT_ID, CK_SESSION_HANDLE); static int change_pin(CK_SLOT_ID, CK_SESSION_HANDLE); @@ -267,6 +270,7 @@ int do_init_pin = 0; int do_change_pin = 0; int action_count = 0; + int need_fake_login = 0; CK_RV rv; while (1) { @@ -354,6 +358,9 @@ case 'i': opt_input = optarg; break; + case 'f': + need_fake_login = 1; + break; case 'l': need_session |= NEED_SESSION_RW; opt_login = 1; @@ -372,6 +379,7 @@ case 'c': do_change_pin = 1; need_session |= CKF_SERIAL_SESSION; /* no need for a R/W session */ + need_session |= NEED_SESSION_RW; /* cko */ action_count++; break; case 's': @@ -495,15 +503,12 @@ CK_TOKEN_INFO info; get_token_info(opt_slot, &info); - if (!(info.flags & CKF_TOKEN_INITIALIZED)) - fatal("Token not initialized\n"); + //if (!(info.flags & CKF_TOKEN_INITIALIZED)) + // fatal("Token not initialized\n"); if (info.flags & CKF_LOGIN_REQUIRED) opt_login++; } - if (do_init_token) - init_token(opt_slot); - if (need_session) { int flags = CKF_SERIAL_SESSION; @@ -515,16 +520,28 @@ p11_fatal("C_OpenSession", rv); } - if (do_change_pin) - /* To be sure we won't mix things up with the -l or -p options, - * we safely stop here. */ - return change_pin(opt_slot, session); - if (opt_login || opt_pin || do_init_pin) { int r = login(session, need_to_be_so); if (r != 0) return r; } + /* + We put the do_change_pin _behind_ the opt_login to have the possibility to + do a "-c -l" to change the PIN with the Aladdin etpkcs11, since we need to login + before changing the pin + */ + if (do_change_pin) + /* To be sure we won't mix things up with the -l or -p options, + * we safely stop here. */ + return change_pin(opt_slot, session); + + /* cko: Need to login to the token for Aladdin initialization */ + if (need_fake_login) + fake_login(opt_slot); + + if (do_init_token) + init_token(opt_slot); + if (do_init_pin) { init_pin(opt_slot, session); @@ -753,6 +770,7 @@ get_token_info(opt_slot, &info); + /* Identify which pin to enter */ if (info.flags & CKF_PROTECTED_AUTHENTICATION_PATH) { @@ -780,6 +798,22 @@ return 0; } + +void fake_login(CK_SLOT_ID slot) +{ + CK_TOKEN_INFO info; + CK_RV rv; + CK_SESSION_HANDLE session; + + get_token_info(slot, &info); + rv = p11->C_OpenSession(opt_slot, CKF_SERIAL_SESSION| CKF_RW_SESSION, + NULL, NULL, &session); + if (rv != CKR_OK) + p11_fatal("C_OpenSession", rv); + login(session, 0); // login as CKU_USER + rv = p11->C_CloseSession(session); +} + void init_token(CK_SLOT_ID slot) { @@ -787,13 +821,15 @@ char new_buf[21], *new_pin = NULL; CK_TOKEN_INFO info; CK_RV rv; + CK_SESSION_HANDLE session; // cko if (!opt_object_label) fatal("The token label must be specified using --label\n"); snprintf(token_label, sizeof (token_label), "%-32.32s", opt_object_label); - + get_token_info(slot, &info); + if (!(info.flags & CKF_PROTECTED_AUTHENTICATION_PATH)) { if (opt_so_pin == NULL) { new_pin = getpass("Please enter the new SO PIN: "); @@ -877,6 +913,15 @@ } } + /* cko: first we need to login to the token! */ + /* This would only be necessary, if we would not use the -l option (see above) + I guess, this hurts noone!? + */ +// rv = p11->C_Login(sess, CKU_USER ...and sometimes CKU_SO, (CK_UTF8CHAR *) old_pin, old_pin == NULL ? 0 : strlen(old_pin)); +// if (rv != CKR_OK) +// p11_fatal("C_Login", rv); + /* end */ + rv = p11->C_SetPIN(sess, (CK_UTF8CHAR *) old_pin, old_pin == NULL ? 0 : strlen(old_pin), (CK_UTF8CHAR *) new_pin, new_pin == NULL ? 0 : strlen(new_pin));
_______________________________________________ opensc-devel mailing list opensc-devel@lists.opensc-project.org http://www.opensc-project.org/mailman/listinfo/opensc-devel