#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <locale.h>
#include <cryptoutil.h>
#define MAX_PASS_TRIES 5
#define DEFAULT_TOKEN_PROMPT gettext("Enter PIN for %s: ")
#define DEFAULT_TOKEN_REPROMPT gettext("Re-enter PIN for %s: ")
#define DEFAULT_TOKEN_MINSIZE gettext("PIN must be at least %d characters.\n")
#define DEFAULT_USER_PROMPT gettext("Enter passphrase: ")
#define DEFAULT_USER_REPROMPT gettext("Re-enter passphrase: ")
#define DEFAULT_USER_MINSIZE \
gettext("Passphrase must be at least %d characters.\n")
#define DEFAULT_PK11TOKEN SOFT_TOKEN_LABEL
char *
pkcs11_default_token(void)
{
return (DEFAULT_PK11TOKEN);
}
int
pkcs11_get_pass(char *token_name, char **pdata, size_t *psize, size_t min_psize,
boolean_t with_confirmation)
{
char prompt[1024];
char *tmpbuf = NULL;
char *databuf = NULL;
int tries;
if (token_name != NULL)
(void) snprintf(prompt, sizeof (prompt), DEFAULT_TOKEN_PROMPT,
token_name);
else
(void) snprintf(prompt, sizeof (prompt), DEFAULT_USER_PROMPT);
for (tries = MAX_PASS_TRIES; tries > 0; tries--) {
tmpbuf = getpassphrase(prompt);
if (tmpbuf == NULL)
return (-1);
if (strnlen(tmpbuf, min_psize) >= min_psize)
break;
if (token_name != NULL)
(void) printf(DEFAULT_TOKEN_MINSIZE, min_psize);
else
(void) printf(DEFAULT_USER_MINSIZE, min_psize);
}
if (tries == 0) {
(void) printf(gettext("Exceeded number of attempts.\n"));
return (-1);
}
databuf = strdup(tmpbuf);
(void) memset(tmpbuf, 0, strlen(tmpbuf));
if (databuf == NULL)
return (-1);
if (with_confirmation) {
if (token_name != NULL)
(void) snprintf(prompt, sizeof (prompt),
DEFAULT_TOKEN_REPROMPT, token_name);
else
(void) snprintf(prompt, sizeof (prompt),
DEFAULT_USER_REPROMPT);
tmpbuf = getpassphrase(prompt);
if (tmpbuf == NULL) {
(void) memset(databuf, 0, strlen(databuf));
free(databuf);
return (-2);
}
if (strcmp(databuf, tmpbuf) != 0) {
(void) memset(tmpbuf, 0, strlen(tmpbuf));
(void) memset(databuf, 0, strlen(databuf));
free(databuf);
return (-2);
}
}
*pdata = databuf;
*psize = strlen(databuf);
return (0);
}