summaryrefslogtreecommitdiff
path: root/usr/src
diff options
context:
space:
mode:
Diffstat (limited to 'usr/src')
-rw-r--r--usr/src/cmd/cmd-crypto/decrypt/decrypt.c92
-rw-r--r--usr/src/cmd/cmd-crypto/digest/digest.c53
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/create.c70
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/delete.c4
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/export.c9
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/import.c13
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/list.c41
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/modify.c102
-rw-r--r--usr/src/cmd/cmd-crypto/kmfcfg/util.c41
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/common.c107
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/delete.c633
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/download.c32
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/export.c672
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/gencert.c566
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/gencsr.c388
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/genkey.c212
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/import.c810
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/list.c724
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/pktool.c40
-rw-r--r--usr/src/cmd/cmd-crypto/pktool/setpin.c81
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c416
-rw-r--r--usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/ksslutil.c28
-rw-r--r--usr/src/lib/libkmf/include/algorithm.h2
-rw-r--r--usr/src/lib/libkmf/include/kmfapi.h383
-rw-r--r--usr/src/lib/libkmf/include/kmfapiP.h106
-rw-r--r--usr/src/lib/libkmf/include/kmfpolicy.h21
-rw-r--r--usr/src/lib/libkmf/include/kmftypes.h543
-rw-r--r--usr/src/lib/libkmf/include/rdn_parser.h2
-rw-r--r--usr/src/lib/libkmf/libkmf/common/algoid.c12
-rw-r--r--usr/src/lib/libkmf/libkmf/common/algorithm.c14
-rw-r--r--usr/src/lib/libkmf/libkmf/common/certgetsetop.c423
-rw-r--r--usr/src/lib/libkmf/libkmf/common/certop.c2233
-rw-r--r--usr/src/lib/libkmf/libkmf/common/client.c51
-rw-r--r--usr/src/lib/libkmf/libkmf/common/csrcrlop.c410
-rw-r--r--usr/src/lib/libkmf/libkmf/common/generalop.c767
-rw-r--r--usr/src/lib/libkmf/libkmf/common/keyop.c640
-rw-r--r--usr/src/lib/libkmf/libkmf/common/mapfile-vers337
-rw-r--r--usr/src/lib/libkmf/libkmf/common/pk11keys.c234
-rw-r--r--usr/src/lib/libkmf/libkmf/common/pk11tokens.c101
-rw-r--r--usr/src/lib/libkmf/libkmf/common/policy.c289
-rw-r--r--usr/src/lib/libkmf/libkmf/common/rdn_parser.c49
-rw-r--r--usr/src/lib/libkmf/libkmf/sparc/Makefile9
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_nss/common/mapfile-vers47
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_nss/common/nss_spi.c2267
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_openssl/common/mapfile-vers10
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c2705
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_pkcs11/Makefile.com18
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_pkcs11/common/mapfile-vers37
-rw-r--r--usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c1884
49 files changed, 11548 insertions, 7180 deletions
diff --git a/usr/src/cmd/cmd-crypto/decrypt/decrypt.c b/usr/src/cmd/cmd-crypto/decrypt/decrypt.c
index 6119704da3..01282d9028 100644
--- a/usr/src/cmd/cmd-crypto/decrypt/decrypt.c
+++ b/usr/src/cmd/cmd-crypto/decrypt/decrypt.c
@@ -326,9 +326,9 @@ algorithm_list()
mech_aliases[mech].keysize_max != 0)
(void) printf(" %5lu %5lu\n",
(mech_aliases[mech].keysize_min *
- mech_aliases[mech].keysize_unit),
+ mech_aliases[mech].keysize_unit),
(mech_aliases[mech].keysize_max *
- mech_aliases[mech].keysize_unit));
+ mech_aliases[mech].keysize_unit));
else
(void) printf("\n");
@@ -395,7 +395,7 @@ generate_pkcs5_key(CK_SESSION_HANDLE hSession,
mechanism.ulParameterLen = sizeof (params);
rv = C_GenerateKey(hSession, &mechanism, tmpl,
- attrs, hKey);
+ attrs, hKey);
return (rv);
}
@@ -522,7 +522,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if (aflag) {
/* Determine if algorithm is valid */
for (mech_match = 0; mech_match < MECH_ALIASES_COUNT;
- mech_match++) {
+ mech_match++) {
if (strcmp(algo_str,
mech_aliases[mech_match].alias) == 0) {
mech_type = mech_aliases[mech_match].type;
@@ -623,12 +623,12 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if (info.ulMinKeySize && (info.ulMinKeySize <
mech_aliases[mek].keysize_min))
mech_aliases[mek].keysize_min =
- info.ulMinKeySize;
+ info.ulMinKeySize;
if (info.ulMaxKeySize && (info.ulMaxKeySize >
mech_aliases[mek].keysize_max))
mech_aliases[mek].keysize_max =
- info.ulMaxKeySize;
+ info.ulMaxKeySize;
mech_aliases[mek].available = B_TRUE;
}
@@ -650,7 +650,8 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
*/
i = 0;
if (Kflag) {
- kmfrv = KMF_PK11TokenLookup(NULL, token_label, &token_slot_id);
+ kmfrv = kmf_pk11_token_lookup(NULL, token_label,
+ &token_slot_id);
if (kmfrv != KMF_OK) {
cryptoerror(LOG_STDERR,
gettext("no matching PKCS#11 token"));
@@ -701,7 +702,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
/* Open a session */
rv = C_OpenSession(slotID, CKF_SERIAL_SESSION,
- NULL_PTR, NULL, &hSession);
+ NULL_PTR, NULL, &hSession);
if (rv != CKR_OK) {
cryptoerror(LOG_STDERR,
@@ -725,8 +726,8 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if ((get_random_data(pivbuf,
mech_aliases[mech_match].ivlen)) != 0) {
cryptoerror(LOG_STDERR, gettext(
- "Unable to generate random "
- "data for initialization vector."));
+ "Unable to generate random "
+ "data for initialization vector."));
goto cleanup;
}
}
@@ -737,7 +738,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
rv = pkcs11_mech2keytype(mech_type, &keytype);
if (rv != CKR_OK) {
cryptoerror(LOG_STDERR,
- gettext("unable to find key type for algorithm."));
+ gettext("unable to find key type for algorithm."));
goto cleanup;
}
@@ -745,14 +746,14 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if (iflag) {
if ((infd = open(inputfile, O_RDONLY | O_NONBLOCK)) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "can not open input file %s"), inputfile);
+ "can not open input file %s"), inputfile);
goto cleanup;
}
/* Get info on input file */
if (fstat(infd, &insbuf) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "can not stat input file %s"), inputfile);
+ "can not stat input file %s"), inputfile);
goto cleanup;
}
}
@@ -768,13 +769,13 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if (oflag) {
outfilename = outputfile;
if ((stat(outputfile, &outsbuf) != -1) &&
- (insbuf.st_ino == outsbuf.st_ino)) {
+ (insbuf.st_ino == outsbuf.st_ino)) {
char *dir;
/* create temp file on same dir */
dir = dirname(outputfile);
(void) snprintf(tmpnam, sizeof (tmpnam),
- "%s/encrXXXXXX", dir);
+ "%s/encrXXXXXX", dir);
outfilename = tmpnam;
if ((outfd = mkstemp(tmpnam)) == -1) {
cryptoerror(LOG_STDERR, gettext(
@@ -785,8 +786,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
} else {
/* Create file for output */
if ((outfd = open(outfilename,
- O_CREAT|O_WRONLY|O_TRUNC,
- 0644)) == -1) {
+ O_CREAT|O_WRONLY|O_TRUNC, 0644)) == -1) {
cryptoerror(LOG_STDERR, gettext(
"cannot open output file %s"),
outfilename);
@@ -801,7 +801,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
*/
if (cmd->type == CKA_DECRYPT) {
if (read(infd, &version, sizeof (version)) !=
- sizeof (version)) {
+ sizeof (version)) {
cryptoerror(LOG_STDERR, gettext(
"failed to get format version from "
"input file."));
@@ -827,11 +827,10 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
* Read iteration count and salt data.
*/
if (read(infd, &iterations,
- sizeof (iterations)) !=
- sizeof (iterations)) {
+ sizeof (iterations)) != sizeof (iterations)) {
cryptoerror(LOG_STDERR, gettext(
- "failed to get iterations from "
- "input file."));
+ "failed to get iterations from "
+ "input file."));
goto cleanup;
}
/* convert to host byte order */
@@ -844,18 +843,18 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
goto cleanup;
}
if (read(infd, salt, sizeof (salt))
- != sizeof (salt)) {
+ != sizeof (salt)) {
cryptoerror(LOG_STDERR, gettext(
- "failed to get salt data from "
- "input file."));
+ "failed to get salt data from "
+ "input file."));
goto cleanup;
}
break;
default:
cryptoerror(LOG_STDERR, gettext(
- "Unrecognized format version read from "
- "input file - expected %d, got %d."),
- SUNW_ENCRYPT_FILE_VERSION, version);
+ "Unrecognized format version read from "
+ "input file - expected %d, got %d."),
+ SUNW_ENCRYPT_FILE_VERSION, version);
goto cleanup;
break;
}
@@ -884,7 +883,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
if (rv != 0) {
cryptoerror(LOG_STDERR,
gettext("unable to generate random "
- "data for key salt."));
+ "data for key salt."));
goto cleanup;
}
}
@@ -926,8 +925,7 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
template[nattr].ulValueLen = keysize;
nattr++;
- rv = C_CreateObject(hSession, template,
- nattr, &key);
+ rv = C_CreateObject(hSession, template, nattr, &key);
} else {
/*
* If the encryption type has a fixed key length,
@@ -945,10 +943,9 @@ execute_cmd(struct CommandInfo *cmd, char *algo_str)
* the passphrase entered by the user.
*/
rv = generate_pkcs5_key(hSession,
- salt, sizeof (salt),
- iterations,
- pkeydata, keytype, keysize,
- keylen, cmd->type, &key);
+ salt, sizeof (salt), iterations,
+ pkeydata, keytype, keysize,
+ keylen, cmd->type, &key);
}
if (rv != CKR_OK) {
@@ -979,10 +976,10 @@ do_crypto:
CK_ULONG netiter;
if (write(outfd, &netversion, sizeof (netversion))
- != sizeof (netversion)) {
+ != sizeof (netversion)) {
cryptoerror(LOG_STDERR, gettext(
- "failed to write version number "
- "to output file."));
+ "failed to write version number "
+ "to output file."));
goto cleanup;
}
/*
@@ -991,16 +988,15 @@ do_crypto:
*/
netiter = htonl(iterations);
if (write(outfd, &netiter,
- sizeof (netiter)) != sizeof (netiter)) {
+ sizeof (netiter)) != sizeof (netiter)) {
cryptoerror(LOG_STDERR, gettext(
"failed to write iterations to output"));
goto cleanup;
}
- if (ivlen > 0 &&
- write(outfd, pivbuf, ivlen) != ivlen) {
+ if (ivlen > 0 && write(outfd, pivbuf, ivlen) != ivlen) {
cryptoerror(LOG_STDERR, gettext(
- "failed to write initialization vector "
- "to output"));
+ "failed to write initialization vector "
+ "to output"));
goto cleanup;
}
if (write(outfd, salt, sizeof (salt)) != sizeof (salt)) {
@@ -1142,7 +1138,7 @@ crypt_multipart(struct CommandInfo *cmd, CK_SESSION_HANDLE hSession,
/* Start with the initial buffer */
resultlen = resultbuflen;
rv = cmd->Update(hSession, databuf, (CK_ULONG)nread,
- resultbuf, &resultlen);
+ resultbuf, &resultlen);
/* Need a bigger buffer? */
if (rv == CKR_BUFFER_TOO_SMALL) {
@@ -1164,7 +1160,7 @@ crypt_multipart(struct CommandInfo *cmd, CK_SESSION_HANDLE hSession,
/* Try again with bigger buffer */
rv = cmd->Update(hSession, databuf, (CK_ULONG)nread,
- resultbuf, &resultlen);
+ resultbuf, &resultlen);
}
if (rv != CKR_OK) {
@@ -1300,21 +1296,21 @@ cryptoreadfile(char *filename, CK_BYTE_PTR *pdata, CK_ULONG_PTR pdatalen)
/* read the file into a buffer */
if ((fd = open(filename, O_RDONLY | O_NONBLOCK)) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "cannot open %s"), filename);
+ "cannot open %s"), filename);
return (-1);
}
if (fstat(fd, &statbuf) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "cannot stat %s"), filename);
+ "cannot stat %s"), filename);
(void) close(fd);
return (-1);
}
if (!S_ISREG(statbuf.st_mode)) {
cryptoerror(LOG_STDERR, gettext(
- "%s not a regular file"), filename);
+ "%s not a regular file"), filename);
(void) close(fd);
return (-1);
}
diff --git a/usr/src/cmd/cmd-crypto/digest/digest.c b/usr/src/cmd/cmd-crypto/digest/digest.c
index 4ef01b23fb..12d2d092ee 100644
--- a/usr/src/cmd/cmd-crypto/digest/digest.c
+++ b/usr/src/cmd/cmd-crypto/digest/digest.c
@@ -171,7 +171,7 @@ main(int argc, char **argv)
mac_cmd = B_FALSE;
else {
cryptoerror(LOG_STDERR, gettext(
- "command name must be either digest or mac\n"));
+ "command name must be either digest or mac\n"));
exit(EXIT_USAGE);
}
@@ -256,7 +256,7 @@ algorithm_list(boolean_t mac_cmd)
if (mac_cmd)
(void) printf(gettext("Algorithm Keysize: Min "
- "Max (bits)\n"
+ "Max (bits)\n"
"------------------------------------------\n"));
for (mech = 0; mech < MECH_ALIASES_COUNT; mech++) {
@@ -271,9 +271,9 @@ algorithm_list(boolean_t mac_cmd)
mech_aliases[mech].keysize_max != 0)
(void) printf(" %5lu %5lu\n",
(mech_aliases[mech].keysize_min *
- mech_aliases[mech].keysize_unit),
+ mech_aliases[mech].keysize_unit),
(mech_aliases[mech].keysize_max *
- mech_aliases[mech].keysize_unit));
+ mech_aliases[mech].keysize_unit));
else
(void) printf("\n");
@@ -337,8 +337,7 @@ generate_pkcs5_key(CK_SESSION_HANDLE hSession,
mechanism.pParameter = &params;
mechanism.ulParameterLen = sizeof (params);
- rv = C_GenerateKey(hSession, &mechanism, tmpl,
- attrs, hKey);
+ rv = C_GenerateKey(hSession, &mechanism, tmpl, attrs, hKey);
return (rv);
}
@@ -461,7 +460,7 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
* Determine if algorithm/mechanism is valid
*/
for (mech_match = 0; mech_match < MECH_ALIASES_COUNT;
- mech_match++) {
+ mech_match++) {
if (strcmp(algo_str,
mech_aliases[mech_match].alias) == 0) {
mech_type = mech_aliases[mech_match].type;
@@ -570,12 +569,12 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
if (info.ulMinKeySize && (info.ulMinKeySize <
mech_aliases[mek].keysize_min))
mech_aliases[mek].keysize_min =
- info.ulMinKeySize;
+ info.ulMinKeySize;
if (info.ulMaxKeySize && (info.ulMaxKeySize >
mech_aliases[mek].keysize_max))
mech_aliases[mek].keysize_max =
- info.ulMaxKeySize;
+ info.ulMaxKeySize;
mech_aliases[mek].available = B_TRUE;
}
@@ -595,7 +594,8 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
*/
i = 0;
if (Kflag) {
- kmfrv = KMF_PK11TokenLookup(NULL, token_label, &token_slot_id);
+ kmfrv = kmf_pk11_token_lookup(NULL, token_label,
+ &token_slot_id);
if (kmfrv != KMF_OK) {
cryptoerror(LOG_STDERR,
gettext("no matching PKCS#11 token"));
@@ -652,7 +652,7 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
/* Mechanism is supported. Go ahead & open a session */
rv = C_OpenSession(slotID, CKF_SERIAL_SESSION,
- NULL_PTR, NULL, &hSession);
+ NULL_PTR, NULL, &hSession);
if (rv != CKR_OK) {
cryptoerror(LOG_STDERR,
@@ -705,8 +705,7 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
template[nattr].ulValueLen = keylen;
nattr++;
- rv = C_CreateObject(hSession, template,
- nattr, &key);
+ rv = C_CreateObject(hSession, template, nattr, &key);
} else if (Kflag) {
@@ -739,10 +738,8 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
*/
(void) memset(salt, 0x0a, sizeof (salt));
rv = generate_pkcs5_key(hSession,
- salt, sizeof (salt),
- iterations, pkeydata,
- keytype, keylen, keysize,
- &key);
+ salt, sizeof (salt), iterations, pkeydata,
+ keytype, keylen, keysize, &key);
}
if (rv != CKR_OK) {
@@ -783,8 +780,8 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
do {
if (filecount > 0 && filelist != NULL) {
filename = filelist[i];
- if ((fd = open(filename, O_RDONLY
- | O_NONBLOCK)) == -1) {
+ if ((fd = open(filename, O_RDONLY | O_NONBLOCK)) ==
+ -1) {
cryptoerror(LOG_STDERR, gettext(
"can not open input file %s\n"), filename);
exitcode = EXIT_USAGE;
@@ -799,16 +796,16 @@ execute_cmd(char *algo_str, int filecount, char **filelist, boolean_t mac_cmd)
*/
if (mac_cmd) {
rv = do_mac(hSession, &mech, fd, key, &resultbuf,
- &resultlen);
+ &resultlen);
} else {
rv = do_digest(hSession, &mech, fd, &resultbuf,
- &resultlen);
+ &resultlen);
}
if (rv != CKR_OK) {
cryptoerror(LOG_STDERR,
gettext("crypto operation failed for "
- "file %s: %s\n"),
+ "file %s: %s\n"),
filename ? filename : "STDIN",
pkcs11_strerror(rv));
exitcode = EXIT_FAILURE;
@@ -937,7 +934,7 @@ do_digest(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pmech,
/* There was a read error */
if (nread == -1) {
cryptoerror(LOG_STDERR, gettext(
- "error reading file: %s"), strerror(saved_errno));
+ "error reading file: %s"), strerror(saved_errno));
return (CKR_GENERAL_ERROR);
} else {
return (rv);
@@ -1003,7 +1000,7 @@ do_mac(CK_SESSION_HANDLE hSession, CK_MECHANISM_PTR pmech,
/* There was a read error */
if (nread == -1) {
cryptoerror(LOG_STDERR, gettext("error reading file: %s"),
- strerror(saved_errno));
+ strerror(saved_errno));
return (CKR_GENERAL_ERROR);
} else {
return (rv);
@@ -1033,21 +1030,21 @@ getkey(char *filename, CK_BYTE_PTR *pkeydata)
/* read the key file into a buffer */
if ((fd = open(filename, O_RDONLY | O_NONBLOCK)) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "can't open %s\n"), filename);
+ "can't open %s\n"), filename);
return (-1);
}
if (fstat(fd, &statbuf) == -1) {
cryptoerror(LOG_STDERR, gettext(
- "can't stat %s\n"), filename);
+ "can't stat %s\n"), filename);
(void) close(fd);
return (-1);
}
if (!S_ISREG(statbuf.st_mode)) {
cryptoerror(LOG_STDERR, gettext(
- "%s not a regular file\n"), filename);
+ "%s not a regular file\n"), filename);
(void) close(fd);
return (-1);
}
@@ -1066,7 +1063,7 @@ getkey(char *filename, CK_BYTE_PTR *pkeydata)
if (read(fd, keybuf, keylen) != keylen) {
cryptoerror(LOG_STDERR, gettext(
- "can't read %s\n"), filename);
+ "can't read %s\n"), filename);
(void) close(fd);
return (-1);
}
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/create.c b/usr/src/cmd/cmd-crypto/kmfcfg/create.c
index ceacf5f5d5..3b10424d13 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/create.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/create.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -50,30 +50,30 @@ kc_create(int argc, char *argv[])
(void) memset(&plc, 0, sizeof (KMF_POLICY_RECORD));
while ((opt = getopt_av(argc, argv,
- "i:(dbfile)"
- "p:(policy)"
- "d:(ignore-date)"
- "e:(ignore-unknown-eku)"
- "a:(ignore-trust-anchor)"
- "v:(validity-adjusttime)"
- "t:(ta-name)"
- "s:(ta-serial)"
- "o:(ocsp-responder)"
- "P:(ocsp-proxy)"
- "r:(ocsp-use-cert-responder)"
- "T:(ocsp-response-lifetime)"
- "R:(ocsp-ignore-response-sign)"
- "n:(ocsp-responder-cert-name)"
- "A:(ocsp-responder-cert-serial)"
- "c:(crl-basefilename)"
- "I:(crl-directory)"
- "g:(crl-get-crl-uri)"
- "X:(crl-proxy)"
- "S:(crl-ignore-crl-sign)"
- "D:(crl-ignore-crl-date)"
- "u:(keyusage)"
- "E:(ekunames)"
- "O:(ekuoids)")) != EOF) {
+ "i:(dbfile)"
+ "p:(policy)"
+ "d:(ignore-date)"
+ "e:(ignore-unknown-eku)"
+ "a:(ignore-trust-anchor)"
+ "v:(validity-adjusttime)"
+ "t:(ta-name)"
+ "s:(ta-serial)"
+ "o:(ocsp-responder)"
+ "P:(ocsp-proxy)"
+ "r:(ocsp-use-cert-responder)"
+ "T:(ocsp-response-lifetime)"
+ "R:(ocsp-ignore-response-sign)"
+ "n:(ocsp-responder-cert-name)"
+ "A:(ocsp-responder-cert-serial)"
+ "c:(crl-basefilename)"
+ "I:(crl-directory)"
+ "g:(crl-get-crl-uri)"
+ "X:(crl-proxy)"
+ "S:(crl-ignore-crl-sign)"
+ "D:(crl-ignore-crl-date)"
+ "u:(keyusage)"
+ "E:(ekunames)"
+ "O:(ekuoids)")) != EOF) {
switch (opt) {
case 'i':
filename = get_string(optarg_av, &rv);
@@ -142,14 +142,14 @@ kc_create(int argc, char *argv[])
} else {
KMF_X509_NAME taDN;
/* for syntax checking */
- if (KMF_DNParser(plc.ta_name,
+ if (kmf_dn_parser(plc.ta_name,
&taDN) != KMF_OK) {
(void) fprintf(stderr,
gettext("Error name "
"input.\n"));
rv = KC_ERR_USAGE;
} else {
- KMF_FreeDN(&taDN);
+ kmf_free_dn(&taDN);
}
}
break;
@@ -162,7 +162,7 @@ kc_create(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- ret = KMF_HexString2Bytes(
+ ret = kmf_hexstr_to_bytes(
(uchar_t *)plc.ta_serial,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
@@ -250,7 +250,7 @@ kc_create(int argc, char *argv[])
} else {
KMF_X509_NAME respDN;
/* for syntax checking */
- if (KMF_DNParser(
+ if (kmf_dn_parser(
plc.VAL_OCSP_RESP_CERT_NAME,
&respDN) != KMF_OK) {
(void) fprintf(stderr,
@@ -258,7 +258,7 @@ kc_create(int argc, char *argv[])
"input.\n"));
rv = KC_ERR_USAGE;
} else {
- KMF_FreeDN(&respDN);
+ kmf_free_dn(&respDN);
ocsp_set_attr++;
}
}
@@ -273,7 +273,7 @@ kc_create(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- ret = KMF_HexString2Bytes((uchar_t *)
+ ret = kmf_hexstr_to_bytes((uchar_t *)
plc.VAL_OCSP_RESP_CERT_SERIAL,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
@@ -343,7 +343,7 @@ kc_create(int argc, char *argv[])
break;
case 'D':
plc.VAL_CRL_IGNORE_DATE =
- get_boolean(optarg_av);
+ get_boolean(optarg_av);
if (plc.VAL_CRL_IGNORE_DATE == -1) {
(void) fprintf(stderr,
gettext("Error boolean input.\n"));
@@ -471,7 +471,7 @@ kc_create(int argc, char *argv[])
/*
* Does a sanity check on the new policy.
*/
- ret = KMF_VerifyPolicy(&plc);
+ ret = kmf_verify_policy(&plc);
if (ret != KMF_OK) {
print_sanity_error(ret);
rv = KC_ERR_ADD_POLICY;
@@ -481,7 +481,7 @@ kc_create(int argc, char *argv[])
/*
* Add to the DB.
*/
- ret = KMF_AddPolicyToDB(&plc, filename, B_FALSE);
+ ret = kmf_add_policy_to_db(&plc, filename, B_FALSE);
if (ret != KMF_OK) {
(void) fprintf(stderr,
gettext("Error adding policy to database: 0x%04x\n"), ret);
@@ -492,7 +492,7 @@ out:
if (filename != NULL)
free(filename);
- KMF_FreePolicyRecord(&plc);
+ kmf_free_policy_record(&plc);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/delete.c b/usr/src/cmd/cmd-crypto/kmfcfg/delete.c
index 7e0a1c7d45..318a0df475 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/delete.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/delete.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -117,7 +117,7 @@ kc_delete(int argc, char *argv[])
goto out;
}
- kmfrv = KMF_DeletePolicyFromDB(policyname, filename);
+ kmfrv = kmf_delete_policy_from_db(policyname, filename);
if (kmfrv != KMF_OK)
rv = KC_ERR_DELETE_POLICY;
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/export.c b/usr/src/cmd/cmd-crypto/kmfcfg/export.c
index c1ddab153c..92cf4336fb 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/export.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/export.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -49,7 +49,7 @@ kc_export(int argc, char *argv[])
extern char *optarg_av;
while ((opt = getopt_av(argc, argv,
- "d:(dbfile)p:(policy)o:(outfile)")) != EOF) {
+ "d:(dbfile)p:(policy)o:(outfile)")) != EOF) {
switch (opt) {
case 'd':
filename = get_string(optarg_av, &rv);
@@ -133,13 +133,14 @@ kc_export(int argc, char *argv[])
KMF_RETURN ret;
found++;
- ret = KMF_VerifyPolicy(&pnode->plc);
+ ret = kmf_verify_policy(&pnode->plc);
if (ret != KMF_OK) {
print_sanity_error(ret);
rv = KC_ERR_VERIFY_POLICY;
break;
}
- rv = KMF_AddPolicyToDB(&pnode->plc, outfile, B_FALSE);
+ rv = kmf_add_policy_to_db(&pnode->plc, outfile,
+ B_FALSE);
}
pnode = pnode->next;
}
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/import.c b/usr/src/cmd/cmd-crypto/kmfcfg/import.c
index b55caac068..f47b50fd76 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/import.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/import.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -50,7 +50,7 @@ kc_import(int argc, char *argv[])
extern char *optarg_av;
while ((opt = getopt_av(argc, argv,
- "d:(dbfile)p:(policy)i:(infile)")) != EOF) {
+ "d:(dbfile)p:(policy)i:(infile)")) != EOF) {
switch (opt) {
case 'd':
filename = get_string(optarg_av, &rv);
@@ -135,21 +135,22 @@ kc_import(int argc, char *argv[])
KMF_RETURN ret;
found++;
- ret = KMF_VerifyPolicy(&pnode->plc);
+ ret = kmf_verify_policy(&pnode->plc);
if (ret != KMF_OK) {
print_sanity_error(ret);
rv = KC_ERR_VERIFY_POLICY;
break;
}
- rv = KMF_AddPolicyToDB(&pnode->plc, filename, B_FALSE);
+ rv = kmf_add_policy_to_db(&pnode->plc, filename,
+ B_FALSE);
}
pnode = pnode->next;
}
if (!found) {
(void) fprintf(stderr,
- gettext("Could not find policy \"%s\" in %s\n"),
- policyname, infile);
+ gettext("Could not find policy \"%s\" in %s\n"),
+ policyname, infile);
rv = KC_ERR_FIND_POLICY;
}
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/list.c b/usr/src/cmd/cmd-crypto/kmfcfg/list.c
index e68e2b8643..b05400a2fd 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/list.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/list.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -44,32 +44,32 @@ show_policy(KMF_POLICY_RECORD *plc)
(void) printf("Name: %s\n", plc->name);
(void) printf(gettext("Ignore Date: %s\n"),
- plc->ignore_date ? gettext("true") : gettext("false"));
+ plc->ignore_date ? gettext("true") : gettext("false"));
(void) printf(gettext("Ignore Unknown EKUs: %s\n"),
- plc->ignore_unknown_ekus ? gettext("true") : gettext("false"));
+ plc->ignore_unknown_ekus ? gettext("true") : gettext("false"));
(void) printf(gettext("Ignore TA: %s\n"),
- plc->ignore_trust_anchor ? gettext("true") : gettext("false"));
+ plc->ignore_trust_anchor ? gettext("true") : gettext("false"));
(void) printf(gettext("Validity Adjusted Time: %s\n"),
- plc->validity_adjusttime ?
- plc->validity_adjusttime : "<null>");
+ plc->validity_adjusttime ? plc->validity_adjusttime : "<null>");
if (plc->ta_name == NULL && plc->ta_serial == NULL) {
(void) printf(gettext("Trust Anchor Certificate: <null>\n"));
} else {
(void) printf(gettext("Trust Anchor Certificate:\n"));
(void) printf(gettext("\tName: %s\n"),
- plc->ta_name ? plc->ta_name : "<null>");
+ plc->ta_name ? plc->ta_name : "<null>");
(void) printf(gettext("\tSerial Number: %s\n"),
- plc->ta_serial ? plc->ta_serial : "<null>");
+ plc->ta_serial ? plc->ta_serial : "<null>");
}
if (plc->ku_bits != 0) {
(void) printf(gettext("Key Usage Bits: "));
for (i = KULOWBIT; i <= KUHIGHBIT; i++) {
- char *s = ku2str((plc->ku_bits & (1<<i)));
+ char *s = kmf_ku_to_string(
+ (plc->ku_bits & (1<<i)));
if (s != NULL) {
(void) printf("%s ", s);
}
@@ -82,10 +82,11 @@ show_policy(KMF_POLICY_RECORD *plc)
if (plc->eku_set.eku_count > 0) {
(void) printf(gettext("Extended Key Usage Values:\n"));
for (i = 0; i < plc->eku_set.eku_count; i++) {
- char *s = KMF_OID2EKUString(&plc->eku_set.ekulist[i]);
+ char *s = kmf_oid_to_eku_string(
+ &plc->eku_set.ekulist[i]);
(void) printf("\t%s\t(%s)\n",
- KMF_OID2String(&plc->eku_set.ekulist[i]),
- s ? s : "unknown");
+ kmf_oid_to_string(&plc->eku_set.ekulist[i]),
+ s ? s : "unknown");
}
} else {
(void) printf(gettext("Extended Key Usage Values: <null>\n"));
@@ -142,20 +143,20 @@ show_policy(KMF_POLICY_RECORD *plc)
plc->validation_info.crl_info.directory : "<null>");
(void) printf(gettext("\tDownload and cache CRL: %s\n"),
- plc->validation_info.crl_info.get_crl_uri ?
- gettext("true") : gettext("false"));
+ plc->validation_info.crl_info.get_crl_uri ?
+ gettext("true") : gettext("false"));
(void) printf(gettext("\tProxy: %s\n"),
plc->validation_info.crl_info.proxy ?
plc->validation_info.crl_info.proxy : "<null>");
(void) printf(gettext("\tIgnore CRL signature: %s\n"),
- plc->validation_info.crl_info.ignore_crl_sign ?
- gettext("true") : gettext("false"));
+ plc->validation_info.crl_info.ignore_crl_sign ?
+ gettext("true") : gettext("false"));
(void) printf(gettext("\tIgnore CRL validity date: %s\n"),
- plc->validation_info.crl_info.ignore_crl_date ?
- gettext("true") : gettext("false"));
+ plc->validation_info.crl_info.ignore_crl_date ?
+ gettext("true") : gettext("false"));
}
(void) printf("\n");
@@ -234,11 +235,11 @@ kc_list(int argc, char *argv[])
pnode = plclist;
while (pnode != NULL) {
if (policyname == NULL ||
- strcmp(policyname, pnode->plc.name) == 0) {
+ strcmp(policyname, pnode->plc.name) == 0) {
KMF_POLICY_RECORD *plc = &pnode->plc;
found++;
- rv = KMF_VerifyPolicy(plc);
+ rv = kmf_verify_policy(plc);
if (rv != KMF_OK) {
(void) fprintf(stderr, gettext(
"Policy Name: '%s' is invalid\n"),
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/modify.c b/usr/src/cmd/cmd-crypto/kmfcfg/modify.c
index 413bda3be7..de9f7539ee 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/modify.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/modify.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -82,34 +82,34 @@ kc_modify(int argc, char *argv[])
(void) memset(&oplc, 0, sizeof (KMF_POLICY_RECORD));
while ((opt = getopt_av(argc, argv,
- "i:(dbfile)"
- "p:(policy)"
- "d:(ignore-date)"
- "e:(ignore-unknown-eku)"
- "a:(ignore-trust-anchor)"
- "v:(validity-adjusttime)"
- "t:(ta-name)"
- "s:(ta-serial)"
- "o:(ocsp-responder)"
- "P:(ocsp-proxy)"
- "r:(ocsp-use-cert-responder)"
- "T:(ocsp-response-lifetime)"
- "R:(ocsp-ignore-response-sign)"
- "n:(ocsp-responder-cert-name)"
- "A:(ocsp-responder-cert-serial)"
- "y:(ocsp-none)"
- "c:(crl-basefilename)"
- "I:(crl-directory)"
- "g:(crl-get-crl-uri)"
- "X:(crl-proxy)"
- "S:(crl-ignore-crl-sign)"
- "D:(crl-ignore-crl-date)"
- "z:(crl-none)"
- "u:(keyusage)"
- "Y:(keyusage-none)"
- "E:(ekunames)"
- "O:(ekuoids)"
- "Z:(eku-none)")) != EOF) {
+ "i:(dbfile)"
+ "p:(policy)"
+ "d:(ignore-date)"
+ "e:(ignore-unknown-eku)"
+ "a:(ignore-trust-anchor)"
+ "v:(validity-adjusttime)"
+ "t:(ta-name)"
+ "s:(ta-serial)"
+ "o:(ocsp-responder)"
+ "P:(ocsp-proxy)"
+ "r:(ocsp-use-cert-responder)"
+ "T:(ocsp-response-lifetime)"
+ "R:(ocsp-ignore-response-sign)"
+ "n:(ocsp-responder-cert-name)"
+ "A:(ocsp-responder-cert-serial)"
+ "y:(ocsp-none)"
+ "c:(crl-basefilename)"
+ "I:(crl-directory)"
+ "g:(crl-get-crl-uri)"
+ "X:(crl-proxy)"
+ "S:(crl-ignore-crl-sign)"
+ "D:(crl-ignore-crl-date)"
+ "z:(crl-none)"
+ "u:(keyusage)"
+ "Y:(keyusage-none)"
+ "E:(ekunames)"
+ "O:(ekuoids)"
+ "Z:(eku-none)")) != EOF) {
switch (opt) {
case 'i':
filename = get_string(optarg_av, &rv);
@@ -186,14 +186,14 @@ kc_modify(int argc, char *argv[])
} else {
KMF_X509_NAME taDN;
/* for syntax checking */
- if (KMF_DNParser(plc.ta_name,
+ if (kmf_dn_parser(plc.ta_name,
&taDN) != KMF_OK) {
(void) fprintf(stderr,
gettext("Error name "
"input.\n"));
rv = KC_ERR_USAGE;
} else {
- KMF_FreeDN(&taDN);
+ kmf_free_dn(&taDN);
flags |= KC_TA_NAME;
}
}
@@ -207,7 +207,7 @@ kc_modify(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- ret = KMF_HexString2Bytes(
+ ret = kmf_hexstr_to_bytes(
(uchar_t *)plc.ta_serial,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
@@ -227,7 +227,7 @@ kc_modify(int argc, char *argv[])
break;
case 'o':
plc.VAL_OCSP_RESPONDER_URI =
- get_string(optarg_av, &rv);
+ get_string(optarg_av, &rv);
if (plc.VAL_OCSP_RESPONDER_URI == NULL) {
(void) fprintf(stderr,
gettext("Error responder "
@@ -302,7 +302,7 @@ kc_modify(int argc, char *argv[])
} else {
KMF_X509_NAME respDN;
/* for syntax checking */
- if (KMF_DNParser(
+ if (kmf_dn_parser(
plc.VAL_OCSP_RESP_CERT_NAME,
&respDN) != KMF_OK) {
(void) fprintf(stderr,
@@ -310,7 +310,7 @@ kc_modify(int argc, char *argv[])
"input.\n"));
rv = KC_ERR_USAGE;
} else {
- KMF_FreeDN(&respDN);
+ kmf_free_dn(&respDN);
flags |= KC_OCSP_RESP_CERT_NAME;
ocsp_set_attr++;
}
@@ -326,7 +326,7 @@ kc_modify(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- ret = KMF_HexString2Bytes((uchar_t *)
+ ret = kmf_hexstr_to_bytes((uchar_t *)
plc.VAL_OCSP_RESP_CERT_SERIAL,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
@@ -412,7 +412,7 @@ kc_modify(int argc, char *argv[])
break;
case 'D':
plc.VAL_CRL_IGNORE_DATE =
- get_boolean(optarg_av);
+ get_boolean(optarg_av);
if (plc.VAL_CRL_IGNORE_DATE == -1) {
(void) fprintf(stderr,
gettext("Error boolean input.\n"));
@@ -536,7 +536,7 @@ kc_modify(int argc, char *argv[])
}
/* Try to load the named policy from the DB */
- ret = KMF_GetPolicy(filename, plc.name, &oplc);
+ ret = kmf_get_policy(filename, plc.name, &oplc);
if (ret != KMF_OK) {
(void) fprintf(stderr,
gettext("Error loading policy \"%s\" from %s\n"), filename,
@@ -558,7 +558,7 @@ kc_modify(int argc, char *argv[])
if (oplc.validity_adjusttime)
free(oplc.validity_adjusttime);
oplc.validity_adjusttime =
- plc.validity_adjusttime;
+ plc.validity_adjusttime;
}
if (flags & KC_TA_NAME) {
@@ -629,7 +629,7 @@ kc_modify(int argc, char *argv[])
if (oplc.VAL_OCSP_RESPONDER_URI)
free(oplc.VAL_OCSP_RESPONDER_URI);
oplc.VAL_OCSP_RESPONDER_URI =
- plc.VAL_OCSP_RESPONDER_URI;
+ plc.VAL_OCSP_RESPONDER_URI;
}
if (flags & KC_OCSP_PROXY) {
@@ -640,31 +640,31 @@ kc_modify(int argc, char *argv[])
if (flags & KC_OCSP_URI_FROM_CERT)
oplc.VAL_OCSP_URI_FROM_CERT =
- plc.VAL_OCSP_URI_FROM_CERT;
+ plc.VAL_OCSP_URI_FROM_CERT;
if (flags & KC_OCSP_RESP_LIFETIME) {
if (oplc.VAL_OCSP_RESP_LIFETIME)
free(oplc.VAL_OCSP_RESP_LIFETIME);
oplc.VAL_OCSP_RESP_LIFETIME =
- plc.VAL_OCSP_RESP_LIFETIME;
+ plc.VAL_OCSP_RESP_LIFETIME;
}
if (flags & KC_OCSP_IGNORE_RESP_SIGN)
oplc.VAL_OCSP_IGNORE_RESP_SIGN =
- plc.VAL_OCSP_IGNORE_RESP_SIGN;
+ plc.VAL_OCSP_IGNORE_RESP_SIGN;
if (flags & KC_OCSP_RESP_CERT_NAME) {
if (oplc.VAL_OCSP_RESP_CERT_NAME)
free(oplc.VAL_OCSP_RESP_CERT_NAME);
oplc.VAL_OCSP_RESP_CERT_NAME =
- plc.VAL_OCSP_RESP_CERT_NAME;
+ plc.VAL_OCSP_RESP_CERT_NAME;
}
if (flags & KC_OCSP_RESP_CERT_SERIAL) {
if (oplc.VAL_OCSP_RESP_CERT_SERIAL)
free(oplc.VAL_OCSP_RESP_CERT_SERIAL);
oplc.VAL_OCSP_RESP_CERT_SERIAL =
- plc.VAL_OCSP_RESP_CERT_SERIAL;
+ plc.VAL_OCSP_RESP_CERT_SERIAL;
}
if (oplc.VAL_OCSP_RESP_CERT_NAME != NULL &&
@@ -792,7 +792,7 @@ kc_modify(int argc, char *argv[])
/* Release current EKU list (if any) */
if (oplc.eku_set.eku_count > 0) {
- KMF_FreeEKUPolicy(&oplc.eku_set);
+ kmf_free_eku_policy(&oplc.eku_set);
oplc.eku_set.eku_count = 0;
oplc.eku_set.ekulist = NULL;
}
@@ -804,13 +804,13 @@ kc_modify(int argc, char *argv[])
*/
if (flags & KC_EKUS) {
/* Release current EKU list (if any) */
- KMF_FreeEKUPolicy(&oplc.eku_set);
+ kmf_free_eku_policy(&oplc.eku_set);
oplc.eku_set = plc.eku_set;
}
}
/* Do a sanity check on the modified policy */
- ret = KMF_VerifyPolicy(&oplc);
+ ret = kmf_verify_policy(&oplc);
if (ret != KMF_OK) {
print_sanity_error(ret);
rv = KC_ERR_VERIFY_POLICY;
@@ -818,7 +818,7 @@ kc_modify(int argc, char *argv[])
}
/* The modify operation is a delete followed by an add */
- ret = KMF_DeletePolicyFromDB(oplc.name, filename);
+ ret = kmf_delete_policy_from_db(oplc.name, filename);
if (ret != KMF_OK) {
rv = KC_ERR_DELETE_POLICY;
goto out;
@@ -827,7 +827,7 @@ kc_modify(int argc, char *argv[])
/*
* Now add the modified policy back to the DB.
*/
- ret = KMF_AddPolicyToDB(&oplc, filename, B_FALSE);
+ ret = kmf_add_policy_to_db(&oplc, filename, B_FALSE);
if (ret != KMF_OK) {
(void) fprintf(stderr,
gettext("Error adding policy to database: 0x%04x\n"), ret);
@@ -839,7 +839,7 @@ out:
if (filename != NULL)
free(filename);
- KMF_FreePolicyRecord(&oplc);
+ kmf_free_policy_record(&oplc);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/kmfcfg/util.c b/usr/src/cmd/cmd-crypto/kmfcfg/util.c
index f3bdc633f2..3fce0c839d 100644
--- a/usr/src/cmd/cmd-crypto/kmfcfg/util.c
+++ b/usr/src/cmd/cmd-crypto/kmfcfg/util.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -61,7 +61,7 @@ free_policy_list(POLICY_LIST *plist)
while (n != NULL) {
old = n;
- KMF_FreePolicyRecord(&n->plc);
+ kmf_free_policy_record(&n->plc);
n = n->next;
free(old);
}
@@ -104,10 +104,10 @@ load_policies(char *file, POLICY_LIST **policy_list)
* Search for the policy that matches the given name.
*/
if (!xmlStrcmp((const xmlChar *)node->name,
- (const xmlChar *)KMF_POLICY_ELEMENT)) {
+ (const xmlChar *)KMF_POLICY_ELEMENT)) {
/* Check the name attribute */
c = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_NAME_ATTR);
+ (const xmlChar *)KMF_POLICY_NAME_ATTR);
/* If a match, parse the rest of the data */
if (c != NULL) {
@@ -115,9 +115,9 @@ load_policies(char *file, POLICY_LIST **policy_list)
newitem = malloc(sizeof (POLICY_LIST));
if (newitem != NULL) {
(void) memset(newitem, 0,
- sizeof (POLICY_LIST));
+ sizeof (POLICY_LIST));
kmfrv = parsePolicyElement(node,
- &newitem->plc);
+ &newitem->plc);
} else {
kmfrv = KMF_ERR_MEMORY;
goto end;
@@ -167,7 +167,7 @@ parseKUlist(char *kustring)
p = strtok(kustring, ",");
while (p != NULL) {
- cur_bit = KMF_StringToKeyUsage(p);
+ cur_bit = kmf_string_to_ku(p);
if (cur_bit == 0) {
kubits = 0;
break;
@@ -185,8 +185,7 @@ addToEKUList(KMF_EKU_POLICY *ekus, KMF_OID *newoid)
if (newoid != NULL && ekus != NULL) {
ekus->eku_count++;
ekus->ekulist = realloc(
- ekus->ekulist,
- ekus->eku_count * sizeof (KMF_OID));
+ ekus->ekulist, ekus->eku_count * sizeof (KMF_OID));
if (ekus->ekulist != NULL) {
ekus->ekulist[ekus->eku_count-1] = *newoid;
}
@@ -211,7 +210,7 @@ parseEKUNames(char *ekulist, KMF_POLICY_RECORD *plc)
/* If no tokens found, then maybe its just a single EKU value */
if (p == NULL) {
- newoid = kmf_ekuname2oid(ekulist);
+ newoid = kmf_ekuname_to_oid(ekulist);
if (newoid != NULL) {
addToEKUList(ekus, newoid);
free(newoid);
@@ -221,7 +220,7 @@ parseEKUNames(char *ekulist, KMF_POLICY_RECORD *plc)
}
while (p != NULL) {
- newoid = kmf_ekuname2oid(p);
+ newoid = kmf_ekuname_to_oid(p);
if (newoid != NULL) {
addToEKUList(ekus, newoid);
free(newoid);
@@ -233,7 +232,7 @@ parseEKUNames(char *ekulist, KMF_POLICY_RECORD *plc)
}
if (rv != KC_OK)
- KMF_FreeEKUPolicy(ekus);
+ kmf_free_eku_policy(ekus);
return (rv);
}
@@ -243,7 +242,7 @@ parseEKUOIDs(char *ekulist, KMF_POLICY_RECORD *plc)
{
int rv = KC_OK;
char *p;
- KMF_OID *newoid;
+ KMF_OID newoid = {NULL, 0};
KMF_EKU_POLICY *ekus = &plc->eku_set;
if (ekulist == NULL || !strlen(ekulist))
@@ -254,20 +253,16 @@ parseEKUOIDs(char *ekulist, KMF_POLICY_RECORD *plc)
*/
p = strtok(ekulist, ",");
if (p == NULL) {
- newoid = kmf_string2oid(ekulist);
- if (newoid != NULL) {
- addToEKUList(ekus, newoid);
- free(newoid);
+ if (kmf_string_to_oid(ekulist, &newoid) == KMF_OK) {
+ addToEKUList(ekus, &newoid);
} else {
rv = KC_ERR_USAGE;
}
}
while (p != NULL && rv == 0) {
- newoid = kmf_string2oid(p);
- if (newoid != NULL) {
- addToEKUList(ekus, newoid);
- free(newoid);
+ if (kmf_string_to_oid(p, &newoid) == KMF_OK) {
+ addToEKUList(ekus, &newoid);
} else {
rv = KC_ERR_USAGE;
break;
@@ -276,7 +271,7 @@ parseEKUOIDs(char *ekulist, KMF_POLICY_RECORD *plc)
}
if (rv != KC_OK)
- KMF_FreeEKUPolicy(ekus);
+ kmf_free_eku_policy(ekus);
return (rv);
}
@@ -438,7 +433,7 @@ getopt_av(int argc, char * const *argv, const char *optstring)
/* First time or when optstring changes from previous one */
if (_save_optstr != optstring) {
if (opts_av != NULL)
- free(opts_av);
+ free(opts_av);
opts_av = NULL;
_save_optstr = optstring;
_save_numopts = populate_opts((char *)optstring);
diff --git a/usr/src/cmd/cmd-crypto/pktool/common.c b/usr/src/cmd/cmd-crypto/pktool/common.c
index e4f6feb404..b80e320606 100644
--- a/usr/src/cmd/cmd-crypto/pktool/common.c
+++ b/usr/src/cmd/cmd-crypto/pktool/common.c
@@ -253,7 +253,7 @@ yesno(char *prompt, char *invalid, boolean_t dflt)
/* Indicate invalid input, and try again. */
if (invalid != NULL)
- (void) printf("%s", invalid);
+ (void) printf("%s", invalid);
}
return (dflt);
}
@@ -401,7 +401,7 @@ getopt_av(int argc, char * const *argv, const char *optstring)
/* First time or when optstring changes from previous one */
if (_save_optstr != optstring) {
if (opts_av != NULL)
- free(opts_av);
+ free(opts_av);
opts_av = NULL;
_save_optstr = optstring;
_save_numopts = populate_opts((char *)optstring);
@@ -521,10 +521,10 @@ Str2Lifetime(char *ltimestr, uint32_t *ltime)
!strcasecmp(timetok, "days")) {
*ltime = num * SECSPERDAY;
} else if (!strcasecmp(timetok, "hour") ||
- !strcasecmp(timetok, "hours")) {
+ !strcasecmp(timetok, "hours")) {
*ltime = num * SECSPERHOUR;
} else if (!strcasecmp(timetok, "year") ||
- !strcasecmp(timetok, "years")) {
+ !strcasecmp(timetok, "years")) {
*ltime = num * SECSPERDAY * DAYSPERNYEAR;
} else {
*ltime = 0;
@@ -560,8 +560,7 @@ OT2Int(char *objclass)
if (!strcasecmp(objclass, "public")) {
if (retval)
return (-1);
- return (retval | PK_PUBLIC_OBJ | PK_CERT_OBJ |
- PK_PUBKEY_OBJ);
+ return (retval | PK_PUBLIC_OBJ | PK_CERT_OBJ | PK_PUBKEY_OBJ);
} else if (!strcasecmp(objclass, "private")) {
if (retval)
return (-1);
@@ -604,6 +603,8 @@ Str2Format(char *formstr)
return (KMF_FORMAT_PEM);
if (!strcasecmp(formstr, "pkcs12"))
return (KMF_FORMAT_PKCS12);
+ if (!strcasecmp(formstr, "raw"))
+ return (KMF_FORMAT_RAWKEY);
return (KMF_FORMAT_UNDEF);
}
@@ -613,18 +614,32 @@ KMF_RETURN
select_token(void *kmfhandle, char *token,
int readonly)
{
+ KMF_ATTRIBUTE attlist[10];
+ int i = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
KMF_RETURN rv = KMF_OK;
- KMF_CONFIG_PARAMS config;
if (token == NULL)
return (KMF_ERR_BAD_PARAMETER);
- (void) memset(&config, 0, sizeof (config));
- config.kstype = KMF_KEYSTORE_PK11TOKEN;
- config.pkcs11config.label = token;
- config.pkcs11config.readonly = readonly;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ i++;
- rv = KMF_ConfigureKeystore(kmfhandle, &config);
+ if (token) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_LABEL_ATTR, token,
+ strlen(token));
+ i++;
+ }
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_READONLY_ATTR, &readonly,
+ sizeof (readonly));
+ i++;
+
+ rv = kmf_configure_keystore(kmfhandle, i, attlist);
if (rv == KMF_ERR_TOKEN_SELECTED)
rv = KMF_OK;
return (rv);
@@ -634,17 +649,37 @@ select_token(void *kmfhandle, char *token,
KMF_RETURN
configure_nss(void *kmfhandle, char *dir, char *prefix)
{
+
+ KMF_ATTRIBUTE attlist[10];
+ int i = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
KMF_RETURN rv = KMF_OK;
- KMF_CONFIG_PARAMS config;
- (void) memset(&config, 0, sizeof (config));
- config.kstype = KMF_KEYSTORE_NSS;
- config.nssconfig.configdir = dir;
- config.nssconfig.certPrefix = prefix;
- config.nssconfig.keyPrefix = prefix;
- config.nssconfig.secModName = NULL;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ i++;
+
+ if (dir) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DIRPATH_ATTR, dir,
+ strlen(dir));
+ i++;
+ }
+
+ if (prefix) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CERTPREFIX_ATTR, prefix,
+ strlen(prefix));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYPREFIX_ATTR, prefix,
+ strlen(prefix));
+ i++;
+ }
- rv = KMF_ConfigureKeystore(kmfhandle, &config);
+ rv = kmf_configure_keystore(kmfhandle, i, attlist);
if (rv == KMF_KEYSTORE_ALREADY_INITIALIZED)
rv = KMF_OK;
@@ -662,12 +697,11 @@ get_pk12_password(KMF_CREDENTIAL *cred)
* Get the password to use for the PK12 encryption.
*/
(void) strlcpy(prompt,
- gettext("Enter password to use for "
- "accessing the PKCS12 file: "),
- sizeof (prompt));
+ gettext("Enter password to use for "
+ "accessing the PKCS12 file: "), sizeof (prompt));
if (get_pin(prompt, NULL, (uchar_t **)&cred->cred,
- (ulong_t *)&cred->credlen) != CKR_OK) {
+ (ulong_t *)&cred->credlen) != CKR_OK) {
cred->cred = NULL;
cred->credlen = 0;
}
@@ -862,7 +896,7 @@ verify_keyusage(char *kustr, uint16_t *kubits, int *critical)
k = strtok(kustr, ",");
while (k != NULL) {
- kuval = KMF_StringToKeyUsage(k);
+ kuval = kmf_string_to_ku(k);
if (kuval == 0) {
*kubits = 0;
return (KMF_ERR_BAD_PARAMETER);
@@ -938,11 +972,10 @@ get_token_password(KMF_KEYSTORE_TYPE kstype,
* Login to the token first.
*/
(void) snprintf(prompt, sizeof (prompt),
- gettext(DEFAULT_TOKEN_PROMPT),
- token_spec);
+ gettext(DEFAULT_TOKEN_PROMPT), token_spec);
if (get_pin(prompt, NULL, (uchar_t **)&cred->cred,
- (ulong_t *)&cred->credlen) != CKR_OK) {
+ (ulong_t *)&cred->credlen) != CKR_OK) {
cred->cred = NULL;
cred->credlen = 0;
}
@@ -983,22 +1016,20 @@ display_error(void *handle, KMF_RETURN errcode, char *prefix)
char *plugin_errmsg = NULL;
char *kmf_errmsg = NULL;
- rv1 = KMF_GetPluginErrorString(handle, &plugin_errmsg);
- rv2 = KMF_GetKMFErrorString(errcode, &kmf_errmsg);
+ rv1 = kmf_get_plugin_error_str(handle, &plugin_errmsg);
+ rv2 = kmf_get_kmf_error_str(errcode, &kmf_errmsg);
cryptoerror(LOG_STDERR, "%s:", prefix);
if (rv1 == KMF_OK && plugin_errmsg) {
- cryptoerror(LOG_STDERR,
- gettext("keystore error: %s"),
- plugin_errmsg);
- KMF_FreeString(plugin_errmsg);
+ cryptoerror(LOG_STDERR, gettext("keystore error: %s"),
+ plugin_errmsg);
+ kmf_free_str(plugin_errmsg);
}
if (rv2 == KMF_OK && kmf_errmsg) {
- cryptoerror(LOG_STDERR,
- gettext("libkmf error: %s"),
- kmf_errmsg);
- KMF_FreeString(kmf_errmsg);
+ cryptoerror(LOG_STDERR, gettext("libkmf error: %s"),
+ kmf_errmsg);
+ kmf_free_str(kmf_errmsg);
}
if (rv1 != KMF_OK && rv2 != KMF_OK)
diff --git a/usr/src/cmd/cmd-crypto/pktool/delete.c b/usr/src/cmd/cmd-crypto/pktool/delete.c
index f2dcfbd8d2..b1a1bcb96b 100644
--- a/usr/src/cmd/cmd-crypto/pktool/delete.c
+++ b/usr/src/cmd/cmd-crypto/pktool/delete.c
@@ -39,71 +39,143 @@
#include <kmfapi.h>
static KMF_RETURN
-pk_destroy_keys(void *handle, KMF_KEY_HANDLE *keys,
- KMF_FINDKEY_PARAMS *fkparams, uint32_t numkeys)
+pk_destroy_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
{
int i;
KMF_RETURN rv = KMF_OK;
- KMF_DELETEKEY_PARAMS dkparams;
+ uint32_t *numkeys;
+ KMF_KEY_HANDLE *keys = NULL;
+ int del_num = 0;
+ KMF_ATTRIBUTE delete_attlist[16];
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
+ boolean_t destroy = B_TRUE;
+ KMF_CREDENTIAL cred;
+ char *slotlabel = NULL;
+
+ len = sizeof (kstype);
+ rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, &len);
+ if (rv != KMF_OK)
+ return (rv);
+
+ kmf_set_attr_at_index(delete_attlist, del_num,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ del_num++;
- (void) memset(&dkparams, 0, sizeof (dkparams));
- dkparams.kstype = fkparams->kstype;
+ /* "destroy" is optional. Default is TRUE */
+ (void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
+ (void *)&destroy, NULL);
- switch (fkparams->kstype) {
+ kmf_set_attr_at_index(delete_attlist, del_num,
+ KMF_DESTROY_BOOL_ATTR, &destroy, sizeof (boolean_t));
+ del_num++;
+
+ switch (kstype) {
case KMF_KEYSTORE_NSS:
- dkparams.nssparms = fkparams->nssparms;
- dkparams.cred = fkparams->cred;
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv == KMF_OK) {
+ if (cred.credlen > 0) {
+ kmf_set_attr_at_index(delete_attlist, del_num,
+ KMF_CREDENTIAL_ATTR, &cred,
+ sizeof (KMF_CREDENTIAL));
+ del_num++;
+ }
+ }
+
+ slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist,
+ numattr);
+ if (slotlabel != NULL) {
+ kmf_set_attr_at_index(delete_attlist, del_num,
+ KMF_TOKEN_LABEL_ATTR, slotlabel,
+ strlen(slotlabel));
+ del_num++;
+ }
break;
case KMF_KEYSTORE_OPENSSL:
break;
case KMF_KEYSTORE_PK11TOKEN:
- dkparams.cred = fkparams->cred;
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv == KMF_OK) {
+ if (cred.credlen > 0) {
+ kmf_set_attr_at_index(delete_attlist, del_num,
+ KMF_CREDENTIAL_ATTR, &cred,
+ sizeof (KMF_CREDENTIAL));
+ del_num++;
+ }
+ }
break;
default:
return (PK_ERR_USAGE);
}
- for (i = 0; rv == KMF_OK && i < numkeys; i++) {
- rv = KMF_DeleteKeyFromKeystore(handle, &dkparams, &keys[i]);
+ numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (numkeys == NULL)
+ return (PK_ERR_USAGE);
+
+ keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (keys == NULL)
+ return (PK_ERR_USAGE);
+
+ for (i = 0; rv == KMF_OK && i < *numkeys; i++) {
+ int num = del_num;
+
+ kmf_set_attr_at_index(delete_attlist, num,
+ KMF_KEY_HANDLE_ATTR, &keys[i], sizeof (KMF_KEY_HANDLE));
+ num++;
+
+ rv = kmf_delete_key_from_keystore(handle, num, delete_attlist);
}
return (rv);
}
static KMF_RETURN
-pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc,
- int *keysdeleted)
+pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr,
+ char *desc, int *keysdeleted)
{
KMF_RETURN rv = KMF_OK;
uint32_t numkeys = 0;
+ int num = numattr;
*keysdeleted = 0;
numkeys = 0;
- rv = KMF_FindKey(kmfhandle, parms, NULL, &numkeys);
+
+ kmf_set_attr_at_index(attlist, num,
+ KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t));
+ num++;
+
+ rv = kmf_find_key(kmfhandle, num, attlist);
+
if (rv == KMF_OK && numkeys > 0) {
KMF_KEY_HANDLE *keys = NULL;
char prompt[1024];
(void) snprintf(prompt, sizeof (prompt),
- gettext("%d %s key(s) found, do you want "
- "to delete them (y/N) ?"), numkeys,
- (desc != NULL ? desc : ""));
+ gettext("%d %s key(s) found, do you want "
+ "to delete them (y/N) ?"), numkeys,
+ (desc != NULL ? desc : ""));
if (!yesno(prompt,
- gettext("Respond with yes or no.\n"),
- B_FALSE)) {
+ gettext("Respond with yes or no.\n"),
+ B_FALSE)) {
return (KMF_OK);
}
keys = (KMF_KEY_HANDLE *)malloc(numkeys *
- sizeof (KMF_KEY_HANDLE));
+ sizeof (KMF_KEY_HANDLE));
if (keys == NULL)
return (KMF_ERR_MEMORY);
(void) memset(keys, 0, numkeys *
- sizeof (KMF_KEY_HANDLE));
+ sizeof (KMF_KEY_HANDLE));
+
+ kmf_set_attr_at_index(attlist, num,
+ KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
+ num++;
- rv = KMF_FindKey(kmfhandle, parms, keys, &numkeys);
+ rv = kmf_find_key(kmfhandle, num, attlist);
if (rv == KMF_OK) {
- rv = pk_destroy_keys(kmfhandle, keys,
- parms, numkeys);
+ rv = pk_destroy_keys(kmfhandle, attlist, num);
}
free(keys);
@@ -118,26 +190,34 @@ pk_delete_keys(KMF_HANDLE_T kmfhandle, KMF_FINDKEY_PARAMS *parms, char *desc,
}
static KMF_RETURN
-pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *fcparms,
- KMF_DELETECERT_PARAMS *dcparms)
+pk_delete_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attlist, int numattr)
{
KMF_RETURN rv = KMF_OK;
uint32_t numcerts = 0;
+ int num = numattr;
+
+ kmf_set_attr_at_index(attlist, num,
+ KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
+ num++;
- rv = KMF_FindCert(kmfhandle, fcparms, NULL, &numcerts);
+ rv = kmf_find_cert(kmfhandle, num, attlist);
if (rv == KMF_OK && numcerts > 0) {
char prompt[1024];
(void) snprintf(prompt, sizeof (prompt),
- gettext("%d certificate(s) found, do you want "
- "to delete them (y/N) ?"), numcerts);
+ gettext("%d certificate(s) found, do you want "
+ "to delete them (y/N) ?"), numcerts);
if (!yesno(prompt,
- gettext("Respond with yes or no.\n"),
- B_FALSE)) {
+ gettext("Respond with yes or no.\n"),
+ B_FALSE)) {
return (KMF_OK);
}
- rv = KMF_DeleteCertFromKeystore(kmfhandle, dcparms);
+ /*
+ * Use numattr because delete cert does not require
+ * KMF_COUNT_ATTR attribute.
+ */
+ rv = kmf_delete_cert_from_keystore(kmfhandle, numattr, attlist);
} else if (rv == KMF_ERR_CERT_NOT_FOUND) {
rv = KMF_OK;
@@ -152,36 +232,73 @@ delete_nss_keys(KMF_HANDLE_T kmfhandle, char *dir, char *prefix,
KMF_CREDENTIAL *tokencred)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDKEY_PARAMS parms;
char *keytype = NULL;
int nk, numkeys = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_CLASS keyclass;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- (void) memset(&parms, 0, sizeof (parms));
- parms.kstype = KMF_KEYSTORE_NSS;
- parms.findLabel = objlabel;
- parms.cred = *tokencred;
- parms.nssparms.slotlabel = token;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ objlabel, strlen(objlabel));
+ numattr++;
+ }
+
+ if (tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (token && strlen(token)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
if (oclass & PK_PRIKEY_OBJ) {
- parms.keyclass = KMF_ASYM_PRI;
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
keytype = "private";
- rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
+ rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
numkeys += nk;
}
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- parms.keyclass = KMF_SYMMETRIC;
+ int num = numattr;
+
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
keytype = "symmetric";
- rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
+ rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
numkeys += nk;
}
if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
- parms.keyclass = KMF_ASYM_PUB;
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PUB;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
keytype = "public";
- rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
+ rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
numkeys += nk;
}
if (rv == KMF_OK && numkeys == 0)
@@ -199,32 +316,59 @@ delete_nss_certs(KMF_HANDLE_T kmfhandle,
KMF_CERT_VALIDITY find_criteria_flag)
{
KMF_RETURN rv = KMF_OK;
- KMF_DELETECERT_PARAMS dcparms;
- KMF_FINDCERT_PARAMS fcargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- (void) memset(&dcparms, 0, sizeof (dcparms));
- dcparms.kstype = KMF_KEYSTORE_NSS;
- dcparms.certLabel = objlabel;
- dcparms.issuer = issuer;
- dcparms.subject = subject;
- dcparms.serial = serno;
- dcparms.find_cert_validity = find_criteria_flag;
- dcparms.nssparms.slotlabel = token;
-
- (void) memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_NSS;
- fcargs.certLabel = objlabel;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serno;
- fcargs.find_cert_validity = find_criteria_flag;
- fcargs.nssparms.slotlabel = token;
-
- rv = pk_delete_certs(kmfhandle, &fcargs, &dcparms);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, objlabel,
+ strlen(objlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serno != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serno,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
+ sizeof (KMF_CERT_VALIDITY));
+ numattr++;
+
+ if (token != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token,
+ strlen(token));
+ numattr++;
+ }
+
+ rv = pk_delete_certs(kmfhandle, attrlist, numattr);
return (rv);
}
@@ -232,23 +376,38 @@ delete_nss_certs(KMF_HANDLE_T kmfhandle,
static KMF_RETURN
delete_nss_crl(void *kmfhandle,
char *dir, char *prefix, char *token,
- char *issuernickname, char *subject)
+ char *issuer, char *subject)
{
KMF_RETURN rv = KMF_OK;
- KMF_DELETECRL_PARAMS dcrlparms;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[8];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- (void) memset(&dcrlparms, 0, sizeof (dcrlparms));
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- dcrlparms.kstype = KMF_KEYSTORE_NSS;
- dcrlparms.nssparms.slotlabel = token;
- dcrlparms.nssparms.crl_issuerName = issuernickname;
- dcrlparms.nssparms.crl_subjName = subject;
+ if (token != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
+ issuer, strlen(issuer));
+ numattr++;
+ }
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
+ subject, strlen(subject));
+ numattr++;
+ }
- rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
+ rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
return (rv);
}
@@ -259,9 +418,14 @@ delete_pk11_keys(KMF_HANDLE_T kmfhandle,
KMF_CREDENTIAL *tokencred)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDKEY_PARAMS parms;
int nk, numkeys = 0;
-
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_CLASS keyclass;
+ boolean_t token_bool = B_TRUE;
+ KMF_KEY_ALG keytype = 0;
+ boolean_t private;
/*
* Symmetric keys and RSA/DSA private keys are always
* created with the "CKA_PRIVATE" field == TRUE, so
@@ -275,30 +439,69 @@ delete_pk11_keys(KMF_HANDLE_T kmfhandle,
return (rv);
}
- (void) memset(&parms, 0, sizeof (parms));
- parms.kstype = KMF_KEYSTORE_PK11TOKEN;
- parms.findLabel = (char *)objlabel;
- parms.keytype = 0;
- parms.pkcs11parms.private = ((oclass & PK_PRIVATE_OBJ) > 0);
- parms.pkcs11parms.token = 1;
- parms.cred.cred = tokencred->cred;
- parms.cred.credlen = tokencred->credlen;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ objlabel, strlen(objlabel));
+ numattr++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ private = ((oclass & PK_PRIVATE_OBJ) > 0);
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
+ &private, sizeof (private));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
+ &keytype, sizeof (keytype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
+ &token_bool, sizeof (token_bool));
+ numattr++;
if (oclass & PK_PRIKEY_OBJ) {
- parms.keyclass = KMF_ASYM_PRI;
- rv = pk_delete_keys(kmfhandle, &parms, "private", &nk);
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
+ rv = pk_delete_keys(kmfhandle, attrlist, num, "private", &nk);
numkeys += nk;
}
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- parms.keyclass = KMF_SYMMETRIC;
- rv = pk_delete_keys(kmfhandle, &parms, "symmetric", &nk);
+ int num = numattr;
+
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
+ rv = pk_delete_keys(kmfhandle, attrlist, num, "symmetric", &nk);
numkeys += nk;
}
if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
- parms.keyclass = KMF_ASYM_PUB;
- rv = pk_delete_keys(kmfhandle, &parms, "public", &nk);
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PUB;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
+ rv = pk_delete_keys(kmfhandle, attrlist, num, "public", &nk);
numkeys += nk;
}
if (rv == KMF_OK && numkeys == 0)
@@ -314,8 +517,9 @@ delete_pk11_certs(KMF_HANDLE_T kmfhandle,
KMF_CERT_VALIDITY find_criteria_flag)
{
KMF_RETURN kmfrv;
- KMF_DELETECERT_PARAMS dparms;
- KMF_FINDCERT_PARAMS fcargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
kmfrv = select_token(kmfhandle, token, FALSE);
@@ -323,16 +527,39 @@ delete_pk11_certs(KMF_HANDLE_T kmfhandle,
return (kmfrv);
}
- (void) memset(&dparms, 0, sizeof (dparms));
- dparms.kstype = KMF_KEYSTORE_PK11TOKEN;
- dparms.certLabel = objlabel;
- dparms.issuer = issuer;
- dparms.subject = subject;
- dparms.serial = serno;
- dparms.find_cert_validity = find_criteria_flag;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
+ objlabel, strlen(objlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
+ issuer, strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
+ subject, strlen(subject));
+ numattr++;
+ }
+
+ if (serno != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
+ serno, sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
+ &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
+ numattr++;
- fcargs = dparms;
- kmfrv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
+ kmfrv = pk_delete_certs(kmfhandle, attrlist, numattr);
return (kmfrv);
}
@@ -343,24 +570,49 @@ delete_file_certs(KMF_HANDLE_T kmfhandle,
char *subject, KMF_CERT_VALIDITY find_criteria_flag)
{
KMF_RETURN rv;
- KMF_DELETECERT_PARAMS dparms;
- KMF_FINDCERT_PARAMS fcargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_NAME_ATTR,
+ issuer, strlen(issuer));
+ numattr++;
+ }
- (void *)memset(&dparms, 0, sizeof (dparms));
- (void *)memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_OPENSSL;
- fcargs.certLabel = NULL;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serial;
- fcargs.sslparms.dirpath = dir;
- fcargs.sslparms.certfile = filename;
- fcargs.find_cert_validity = find_criteria_flag;
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SUBJECT_NAME_ATTR,
+ subject, strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_BIGINT_ATTR,
+ serial, sizeof (KMF_BIGINT));
+ numattr++;
+ }
- /* For now, delete parameters and find parameters are the same */
- dparms = fcargs;
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
+ dir, strlen(dir));
+ numattr++;
+ }
+
+ if (filename != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+ }
- rv = pk_delete_certs(kmfhandle, &fcargs, &dparms);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_VALIDITY_ATTR,
+ &find_criteria_flag, sizeof (KMF_CERT_VALIDITY));
+ numattr++;
+
+ rv = pk_delete_certs(kmfhandle, attrlist, numattr);
return (rv);
}
@@ -370,25 +622,51 @@ delete_file_keys(KMF_HANDLE_T kmfhandle, int oclass,
char *dir, char *infile)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDKEY_PARAMS parms;
char *keytype = "";
int nk, numkeys = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_CLASS keyclass;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
+ dir, strlen(dir));
+ numattr++;
+ }
- (void) memset(&parms, 0, sizeof (parms));
- parms.kstype = KMF_KEYSTORE_OPENSSL;
- parms.sslparms.dirpath = dir;
- parms.sslparms.keyfile = infile;
+ if (infile != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
+ infile, strlen(infile));
+ numattr++;
+ }
if (oclass & (PK_PUBKEY_OBJ | PK_PRIKEY_OBJ)) {
- parms.keyclass = KMF_ASYM_PRI;
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
keytype = "Asymmetric";
- rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
+ rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
numkeys += nk;
}
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- parms.keyclass = KMF_SYMMETRIC;
+ int num = numattr;
+
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num, KMF_KEYCLASS_ATTR,
+ &keyclass, sizeof (keyclass));
+ num++;
+
keytype = "symmetric";
- rv = pk_delete_keys(kmfhandle, &parms, keytype, &nk);
+ rv = pk_delete_keys(kmfhandle, attrlist, num, keytype, &nk);
numkeys += nk;
}
if (rv == KMF_OK && numkeys == 0)
@@ -401,15 +679,26 @@ static KMF_RETURN
delete_file_crl(void *kmfhandle, char *dir, char *filename)
{
KMF_RETURN rv;
- KMF_DELETECRL_PARAMS dcrlparms;
-
- (void) memset(&dcrlparms, 0, sizeof (dcrlparms));
-
- dcrlparms.kstype = KMF_KEYSTORE_OPENSSL;
- dcrlparms.sslparms.dirpath = dir;
- dcrlparms.sslparms.crlfile = filename;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[4];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (dir) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_DIRPATH_ATTR,
+ dir, strlen(dir));
+ numattr++;
+ }
+ if (filename) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+ }
- rv = KMF_DeleteCRL(kmfhandle, &dcrlparms);
+ rv = kmf_delete_crl(kmfhandle, numattr, attrlist);
return (rv);
}
@@ -444,11 +733,11 @@ pk_delete(int argc, char *argv[])
/* Parse command line options. Do NOT i18n/l10n. */
while ((opt = getopt_av(argc, argv,
- "T:(token)y:(objtype)l:(label)"
- "k:(keystore)s:(subject)n:(nickname)"
- "d:(dir)p:(prefix)S:(serial)i:(issuer)"
- "c:(criteria)"
- "f:(infile)")) != EOF) {
+ "T:(token)y:(objtype)l:(label)"
+ "k:(keystore)s:(subject)n:(nickname)"
+ "d:(dir)p:(prefix)S:(serial)i:(issuer)"
+ "c:(criteria)"
+ "f:(infile)")) != EOF) {
if (EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
@@ -498,7 +787,7 @@ pk_delete(int argc, char *argv[])
find_criteria = optarg_av;
if (!strcasecmp(find_criteria, "valid"))
find_criteria_flag =
- KMF_NONEXPIRED_CERTS;
+ KMF_NONEXPIRED_CERTS;
else if (!strcasecmp(find_criteria, "expired"))
find_criteria_flag = KMF_EXPIRED_CERTS;
else if (!strcasecmp(find_criteria, "both"))
@@ -518,17 +807,17 @@ pk_delete(int argc, char *argv[])
/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
- kstype != KMF_KEYSTORE_PK11TOKEN) {
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
(void) fprintf(stderr, gettext("The objtype parameter "
- "is only relevant if keystore=pkcs11\n"));
+ "is only relevant if keystore=pkcs11\n"));
return (PK_ERR_USAGE);
}
/* If no object class specified, delete everything but CRLs */
if (oclass == 0)
oclass = PK_CERT_OBJ | PK_PUBKEY_OBJ | PK_PRIKEY_OBJ |
- PK_SYMKEY_OBJ;
+ PK_SYMKEY_OBJ;
/* No additional args allowed. */
argc -= optind_av;
@@ -547,11 +836,11 @@ pk_delete(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
+ rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
if (rv != KMF_OK || bytes == NULL) {
(void) fprintf(stderr, gettext("serial number "
- "must be specified as a hex number "
- "(ex: 0x0102030405ffeeddee)\n"));
+ "must be specified as a hex number "
+ "(ex: 0x0102030405ffeeddee)\n"));
return (PK_ERR_USAGE);
}
serial.val = bytes;
@@ -559,94 +848,92 @@ pk_delete(int argc, char *argv[])
}
if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
- kstype == KMF_KEYSTORE_NSS) &&
- (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
+ kstype == KMF_KEYSTORE_NSS) &&
+ (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ))) {
(void) get_token_password(kstype, token_spec,
- &tokencred);
+ &tokencred);
}
- if ((kmfrv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
+ if ((kmfrv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK)
return (kmfrv);
switch (kstype) {
case KMF_KEYSTORE_PK11TOKEN:
if (oclass & PK_KEY_OBJ) {
kmfrv = delete_pk11_keys(kmfhandle,
- token_spec, oclass,
- object_label,
- &tokencred);
+ token_spec, oclass,
+ object_label, &tokencred);
/*
* If deleting groups of objects, it is OK
* to ignore the "key not found" case so that
* we can continue to find other objects.
*/
if (kmfrv == KMF_ERR_KEY_NOT_FOUND &&
- (oclass != PK_KEY_OBJ))
+ (oclass != PK_KEY_OBJ))
kmfrv = KMF_OK;
if (kmfrv != KMF_OK)
break;
}
if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
kmfrv = delete_pk11_certs(kmfhandle,
- token_spec,
- object_label,
- &serial, issuer,
- subject, find_criteria_flag);
+ token_spec, object_label,
+ &serial, issuer,
+ subject, find_criteria_flag);
/*
* If cert delete failed, but we are looking at
* other objects, then it is OK.
*/
if (kmfrv == KMF_ERR_CERT_NOT_FOUND &&
- (oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
+ (oclass & (PK_CRL_OBJ | PK_KEY_OBJ)))
kmfrv = KMF_OK;
if (kmfrv != KMF_OK)
break;
}
if (oclass & PK_CRL_OBJ)
kmfrv = delete_file_crl(kmfhandle,
- dir, infile);
+ dir, infile);
break;
case KMF_KEYSTORE_NSS:
if (oclass & PK_KEY_OBJ) {
kmfrv = delete_nss_keys(kmfhandle,
- dir, prefix, token_spec,
- oclass, (char *)object_label,
- &tokencred);
+ dir, prefix, token_spec,
+ oclass, (char *)object_label,
+ &tokencred);
if (kmfrv != KMF_OK)
break;
}
if (oclass & PK_CERT_OBJ) {
kmfrv = delete_nss_certs(kmfhandle,
- dir, prefix, token_spec,
- (char *)object_label,
- &serial, issuer, subject,
- find_criteria_flag);
+ dir, prefix, token_spec,
+ (char *)object_label,
+ &serial, issuer, subject,
+ find_criteria_flag);
if (kmfrv != KMF_OK)
break;
}
if (oclass & PK_CRL_OBJ)
kmfrv = delete_nss_crl(kmfhandle,
- dir, prefix, token_spec,
- (char *)object_label, subject);
+ dir, prefix, token_spec,
+ (char *)object_label, subject);
break;
case KMF_KEYSTORE_OPENSSL:
if (oclass & PK_KEY_OBJ) {
kmfrv = delete_file_keys(kmfhandle, oclass,
- dir, infile);
+ dir, infile);
if (kmfrv != KMF_OK)
break;
}
if (oclass & (PK_CERT_OBJ)) {
kmfrv = delete_file_certs(kmfhandle,
- dir, infile, &serial, issuer,
- subject, find_criteria_flag);
+ dir, infile, &serial, issuer,
+ subject, find_criteria_flag);
if (kmfrv != KMF_OK)
break;
}
if (oclass & PK_CRL_OBJ)
kmfrv = delete_file_crl(kmfhandle,
- dir, infile);
+ dir, infile);
break;
default:
rv = PK_ERR_USAGE;
@@ -655,11 +942,11 @@ pk_delete(int argc, char *argv[])
if (kmfrv != KMF_OK) {
display_error(kmfhandle, kmfrv,
- gettext("Error deleting objects"));
+ gettext("Error deleting objects"));
}
if (serial.val != NULL)
free(serial.val);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
return (kmfrv);
}
diff --git a/usr/src/cmd/cmd-crypto/pktool/download.c b/usr/src/cmd/cmd-crypto/pktool/download.c
index 1eabc85ee3..a0b1591ad5 100644
--- a/usr/src/cmd/cmd-crypto/pktool/download.c
+++ b/usr/src/cmd/cmd-crypto/pktool/download.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -121,8 +121,8 @@ pk_download(int argc, char *argv[])
/* Check if the file exists and might be overwritten. */
if (access(fullpath, F_OK) == 0) {
cryptoerror(LOG_STDERR,
- gettext("Warning: file \"%s\" exists, "
- "will be overwritten."), fullpath);
+ gettext("Warning: file \"%s\" exists, "
+ "will be overwritten."), fullpath);
if (yesno(gettext("Continue with download? "),
gettext("Respond with yes or no.\n"), B_FALSE) == B_FALSE) {
return (0);
@@ -131,7 +131,7 @@ pk_download(int argc, char *argv[])
rv = verify_file(fullpath);
if (rv != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("The file (%s) "
- "cannot be created.\n"), fullpath);
+ "cannot be created.\n"), fullpath);
return (PK_ERR_USAGE);
}
}
@@ -171,7 +171,7 @@ pk_download(int argc, char *argv[])
oclass = PK_CRL_OBJ;
}
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing KMF\n"));
rv = PK_ERR_USAGE;
goto end;
@@ -179,10 +179,10 @@ pk_download(int argc, char *argv[])
/* Now we are ready to download */
if (oclass & PK_CRL_OBJ) {
- rv = KMF_DownloadCRL(kmfhandle, url, proxy, proxy_port, 30,
+ rv = kmf_download_crl(kmfhandle, url, proxy, proxy_port, 30,
fullpath, &format);
} else if (oclass & PK_CERT_OBJ) {
- rv = KMF_DownloadCert(kmfhandle, url, proxy, proxy_port, 30,
+ rv = kmf_download_cert(kmfhandle, url, proxy, proxy_port, 30,
fullpath, &format);
}
@@ -231,26 +231,22 @@ pk_download(int argc, char *argv[])
* If the downloaded file is outdated, give a warning.
*/
if (oclass & PK_CRL_OBJ) {
- KMF_CHECKCRLDATE_PARAMS params;
-
- params.crl_name = fullpath;
- ch_rv = KMF_CheckCRLDate(kmfhandle, &params);
-
+ ch_rv = kmf_check_crl_date(kmfhandle, fullpath);
} else { /* certificate */
- ch_rv = KMF_ReadInputFile(kmfhandle, fullpath, &cert);
+ ch_rv = kmf_read_input_file(kmfhandle, fullpath, &cert);
if (ch_rv != KMF_OK)
goto end;
if (format == KMF_FORMAT_PEM) {
int len;
- ch_rv = KMF_Pem2Der(cert.Data, cert.Length,
+ ch_rv = kmf_pem_to_der(cert.Data, cert.Length,
&cert_der.Data, &len);
if (ch_rv != KMF_OK)
goto end;
cert_der.Length = (size_t)len;
}
- ch_rv = KMF_CheckCertDate(kmfhandle,
+ ch_rv = kmf_check_cert_date(kmfhandle,
format == KMF_FORMAT_ASN1 ? &cert : &cert_der);
}
@@ -266,9 +262,9 @@ end:
if (fullpath)
free(fullpath);
- KMF_FreeData(&cert);
- KMF_FreeData(&cert_der);
+ kmf_free_data(&cert);
+ kmf_free_data(&cert_der);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/pktool/export.c b/usr/src/cmd/cmd-crypto/pktool/export.c
index 9170a00468..1d3b36e703 100644
--- a/usr/src/cmd/cmd-crypto/pktool/export.c
+++ b/usr/src/cmd/cmd-crypto/pktool/export.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -44,31 +44,40 @@
#include <kmfapi.h>
static KMF_RETURN
-pk_find_export_cert(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *parms,
- KMF_X509_DER_CERT *cert)
+pk_find_export_cert(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist,
+ int numattr, KMF_X509_DER_CERT *cert)
{
KMF_RETURN rv = KMF_OK;
uint32_t numcerts = 0;
numcerts = 0;
(void) memset(cert, 0, sizeof (KMF_X509_DER_CERT));
- rv = KMF_FindCert(kmfhandle, parms, NULL, &numcerts);
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &numcerts, sizeof (uint32_t));
+ numattr++;
+
+ rv = kmf_find_cert(kmfhandle, numattr, attrlist);
if (rv != KMF_OK) {
return (rv);
}
if (numcerts == 0) {
cryptoerror(LOG_STDERR,
- gettext("No matching certificates found."));
+ gettext("No matching certificates found."));
return (KMF_ERR_CERT_NOT_FOUND);
} else if (numcerts == 1) {
- rv = KMF_FindCert(kmfhandle, parms, cert, &numcerts);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_X509_DER_CERT_ATTR, cert,
+ sizeof (KMF_X509_DER_CERT));
+ numattr++;
+ rv = kmf_find_cert(kmfhandle, numattr, attrlist);
} else if (numcerts > 1) {
cryptoerror(LOG_STDERR,
- gettext("%d certificates found, refine the "
- "search parameters to eliminate ambiguity\n"),
- numcerts);
+ gettext("%d certificates found, refine the "
+ "search parameters to eliminate ambiguity\n"),
+ numcerts);
return (KMF_ERR_BAD_PARAMETER);
}
return (rv);
@@ -77,36 +86,80 @@ pk_find_export_cert(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *parms,
static KMF_RETURN
pk_export_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
char *issuer, char *subject, KMF_BIGINT *serial,
- KMF_ENCODE_FORMAT ofmt,
char *dir, char *infile, char *filename)
{
KMF_RETURN rv = KMF_OK;
- KMF_STORECERT_PARAMS scparms;
KMF_X509_DER_CERT kmfcert;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
/* If searching for public objects or certificates, find certs now */
if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
- KMF_FINDCERT_PARAMS fcargs;
-
- (void) memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_OPENSSL;
- fcargs.certLabel = NULL;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serial;
- fcargs.sslparms.dirpath = dir;
- fcargs.sslparms.certfile = infile;
- fcargs.sslparms.format = ofmt;
-
- rv = pk_find_export_cert(kmfhandle, &fcargs, &kmfcert);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir,
+ strlen(dir));
+ numattr++;
+ }
+
+ if (infile != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, infile,
+ strlen(infile));
+ numattr++;
+ }
+
+ rv = pk_find_export_cert(kmfhandle, attrlist, numattr,
+ &kmfcert);
if (rv == KMF_OK) {
- (void) memset(&scparms, 0, sizeof (scparms));
- scparms.kstype = KMF_KEYSTORE_OPENSSL;
- scparms.sslparms.certfile = filename;
- rv = KMF_StoreCert(kmfhandle, &scparms,
- &kmfcert.certificate);
+ kstype = KMF_KEYSTORE_OPENSSL;
+ numattr = 0;
- KMF_FreeKMFCert(kmfhandle, &kmfcert);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_DATA_ATTR, &kmfcert.certificate,
+ sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, filename,
+ strlen(filename));
+ numattr++;
+
+ rv = kmf_store_cert(kmfhandle, numattr,
+ attrlist);
+
+ kmf_free_kmf_cert(kmfhandle, &kmfcert);
}
}
return (rv);
@@ -120,31 +173,70 @@ pk_export_pk12_nss(KMF_HANDLE_T kmfhandle,
char *filename)
{
KMF_RETURN rv = KMF_OK;
- KMF_EXPORTP12_PARAMS p12parms;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_CREDENTIAL p12cred = { NULL, 0};
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- (void) memset(&p12parms, 0, sizeof (p12parms));
if (token_spec == NULL)
token_spec = DEFAULT_NSS_TOKEN;
- p12parms.kstype = KMF_KEYSTORE_NSS;
- p12parms.certLabel = certlabel;
- p12parms.issuer = issuer;
- p12parms.subject = subject;
- p12parms.serial = serial;
- p12parms.idstr = NULL;
- if (tokencred != NULL)
- p12parms.cred = *tokencred;
- p12parms.nssparms.slotlabel = token_spec;
+ kstype = KMF_KEYSTORE_NSS;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, certlabel, strlen(certlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer, strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject, strlen(subject));
+ numattr++;
+ }
- (void) get_pk12_password(&p12parms.p12cred);
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial, sizeof (KMF_BIGINT));
+ numattr++;
+ }
- rv = KMF_ExportPK12(kmfhandle, &p12parms, filename);
- if (p12parms.p12cred.cred)
- free(p12parms.p12cred.cred);
+ if (tokencred != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token_spec, strlen(token_spec));
+ numattr++;
+
+ (void) get_pk12_password(&p12cred);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PK12CRED_ATTR, &p12cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OUTPUT_FILENAME_ATTR, filename, strlen(filename));
+ numattr++;
+
+ rv = kmf_export_pk12(kmfhandle, numattr, attrlist);
+
+ if (p12cred.cred)
+ free(p12cred.cred);
return (rv);
}
@@ -155,26 +247,47 @@ pk_export_pk12_files(KMF_HANDLE_T kmfhandle,
char *outfile)
{
KMF_RETURN rv;
- KMF_EXPORTP12_PARAMS p12parms;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_CREDENTIAL p12cred = { NULL, 0};
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
+
+ kstype = KMF_KEYSTORE_OPENSSL;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ numattr++;
+ }
- (void) memset(&p12parms, 0, sizeof (p12parms));
+ if (certfile != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, certfile, strlen(certfile));
+ numattr++;
+ }
+
+ if (keyfile != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_FILENAME_ATTR, keyfile, strlen(keyfile));
+ numattr++;
+ }
- p12parms.kstype = KMF_KEYSTORE_OPENSSL;
- p12parms.certLabel = NULL;
- p12parms.issuer = NULL;
- p12parms.subject = NULL;
- p12parms.serial = 0;
- p12parms.idstr = NULL;
- p12parms.sslparms.dirpath = dir;
- p12parms.sslparms.certfile = certfile;
- p12parms.sslparms.keyfile = keyfile;
+ (void) get_pk12_password(&p12cred);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PK12CRED_ATTR, &p12cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
- (void) get_pk12_password(&p12parms.p12cred);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OUTPUT_FILENAME_ATTR, outfile, strlen(outfile));
+ numattr++;
- rv = KMF_ExportPK12(kmfhandle, &p12parms, outfile);
+ rv = kmf_export_pk12(kmfhandle, numattr, attrlist);
- if (p12parms.p12cred.cred)
- free(p12parms.p12cred.cred);
+ if (p12cred.cred)
+ free(p12cred.cred);
return (rv);
}
@@ -186,8 +299,10 @@ pk_export_nss_objects(KMF_HANDLE_T kmfhandle, char *token_spec,
char *prefix, char *filename)
{
KMF_RETURN rv = KMF_OK;
- KMF_STORECERT_PARAMS scparms;
KMF_X509_DER_CERT kmfcert;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
@@ -195,27 +310,73 @@ pk_export_nss_objects(KMF_HANDLE_T kmfhandle, char *token_spec,
/* If searching for public objects or certificates, find certs now */
if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
- KMF_FINDCERT_PARAMS fcargs;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, certlabel,
+ strlen(certlabel));
+ numattr++;
+ }
- (void) memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_NSS;
- fcargs.certLabel = certlabel;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serial;
- fcargs.nssparms.slotlabel = token_spec;
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
- rv = pk_find_export_cert(kmfhandle, &fcargs, &kmfcert);
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token_spec,
+ strlen(token_spec));
+ numattr++;
+ }
+
+ rv = pk_find_export_cert(kmfhandle, attrlist, numattr,
+ &kmfcert);
if (rv == KMF_OK) {
- (void) memset(&scparms, 0, sizeof (scparms));
- scparms.kstype = KMF_KEYSTORE_OPENSSL;
- scparms.sslparms.certfile = filename;
- scparms.sslparms.format = kfmt;
+ kstype = KMF_KEYSTORE_OPENSSL;
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
- rv = KMF_StoreCert(kmfhandle, &scparms,
- &kmfcert.certificate);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_DATA_ATTR, &kmfcert.certificate,
+ sizeof (KMF_DATA));
+ numattr++;
- KMF_FreeKMFCert(kmfhandle, &kmfcert);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, filename,
+ strlen(filename));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &kfmt, sizeof (kfmt));
+ numattr++;
+
+ rv = kmf_store_cert(kmfhandle, numattr, attrlist);
+
+ kmf_free_kmf_cert(kmfhandle, &kmfcert);
}
}
return (rv);
@@ -227,29 +388,179 @@ pk_export_pk12_pk11(KMF_HANDLE_T kmfhandle, char *token_spec,
KMF_BIGINT *serial, KMF_CREDENTIAL *tokencred, char *filename)
{
KMF_RETURN rv = KMF_OK;
- KMF_EXPORTP12_PARAMS p12parms;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_CREDENTIAL p12cred = { NULL, 0};
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
rv = select_token(kmfhandle, token_spec, TRUE);
if (rv != KMF_OK) {
return (rv);
}
- (void) memset(&p12parms, 0, sizeof (p12parms));
+ kstype = KMF_KEYSTORE_PK11TOKEN;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, certlabel, strlen(certlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer, strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject, strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial, sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ if (tokencred != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ (void) get_pk12_password(&p12cred);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PK12CRED_ATTR, &p12cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OUTPUT_FILENAME_ATTR, filename, strlen(filename));
+ numattr++;
+
+ rv = kmf_export_pk12(kmfhandle, numattr, attrlist);
+
+ if (p12cred.cred)
+ free(p12cred.cred);
+
+ return (rv);
+}
+
+static KMF_RETURN
+pk_export_pk11_keys(KMF_HANDLE_T kmfhandle, char *token,
+ KMF_CREDENTIAL *cred, KMF_ENCODE_FORMAT format,
+ char *label, char *filename)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ uint32_t numkeys = 1;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_HANDLE key;
+ KMF_KEY_CLASS keyclass = KMF_SYMMETRIC;
+ boolean_t is_token = B_TRUE;
+
+ if (EMPTYSTRING(label)) {
+ cryptoerror(LOG_STDERR, gettext("A label "
+ "must be specified to export a key."));
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ rv = select_token(kmfhandle, token, TRUE);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (cred != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ label, strlen(label));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &numkeys, sizeof (numkeys));
+ numattr++;
- p12parms.kstype = KMF_KEYSTORE_PK11TOKEN;
- p12parms.certLabel = certlabel;
- p12parms.issuer = issuer;
- p12parms.subject = subject;
- p12parms.serial = serial;
- p12parms.idstr = NULL;
- if (tokencred != NULL)
- p12parms.cred = *tokencred;
- (void) get_pk12_password(&p12parms.p12cred);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &key, sizeof (key));
+ numattr++;
- rv = KMF_ExportPK12(kmfhandle, &p12parms, filename);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
+ &is_token, sizeof (is_token));
+ numattr++;
- if (p12parms.p12cred.cred)
- free(p12parms.p12cred.cred);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &format, sizeof (format));
+ numattr++;
+
+ rv = kmf_find_key(kmfhandle, numattr, attrlist);
+ if (rv == KMF_OK && key.keyclass == KMF_SYMMETRIC) {
+ KMF_RAW_SYM_KEY rkey;
+
+ (void) memset(&rkey, 0, sizeof (KMF_RAW_SYM_KEY));
+ rv = kmf_get_sym_key_value(kmfhandle, &key, &rkey);
+ if (rv == KMF_OK) {
+ int fd, n, total = 0;
+
+ fd = open(filename, O_CREAT | O_RDWR |O_TRUNC, 0600);
+ if (fd == -1) {
+ rv = KMF_ERR_OPEN_FILE;
+ goto done;
+ }
+ do {
+ n = write(fd, rkey.keydata.val + total,
+ rkey.keydata.len - total);
+ if (n < 0) {
+ if (errno == EINTR)
+ continue;
+ close(fd);
+ rv = KMF_ERR_WRITE_FILE;
+ goto done;
+ }
+ total += n;
+
+ } while (total < rkey.keydata.len);
+ close(fd);
+ }
+done:
+ kmf_free_bigint(&rkey.keydata);
+ kmf_free_kmf_key(kmfhandle, &key);
+ } else if (rv == KMF_OK) {
+ KMF_KEYSTORE_TYPE sslks = KMF_KEYSTORE_OPENSSL;
+ printf(gettext("Found %d asymmetric keys\n"), numkeys);
+
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &sslks, sizeof (sslks));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_RAW_KEY_ATTR,
+ key.keyp, sizeof (KMF_RAW_KEY_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &format, sizeof (format));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+
+ rv = kmf_store_key(kmfhandle, numattr, attrlist);
+ kmf_free_kmf_key(kmfhandle, &key);
+ }
return (rv);
}
@@ -261,9 +572,10 @@ pk_export_pk11_objects(KMF_HANDLE_T kmfhandle, char *token_spec,
char *filename)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDCERT_PARAMS fcparms;
- KMF_STORECERT_PARAMS scparms;
KMF_X509_DER_CERT kmfcert;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
rv = select_token(kmfhandle, token_spec, TRUE);
@@ -271,25 +583,64 @@ pk_export_pk11_objects(KMF_HANDLE_T kmfhandle, char *token_spec,
return (rv);
}
- (void) memset(&fcparms, 0, sizeof (fcparms));
- fcparms.kstype = KMF_KEYSTORE_PK11TOKEN;
- fcparms.certLabel = certlabel;
- fcparms.issuer = issuer;
- fcparms.subject = subject;
- fcparms.serial = serial;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- rv = pk_find_export_cert(kmfhandle, &fcparms, &kmfcert);
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, certlabel,
+ strlen(certlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ rv = pk_find_export_cert(kmfhandle, attrlist, numattr, &kmfcert);
if (rv == KMF_OK) {
- (void) memset(&scparms, 0, sizeof (scparms));
- scparms.kstype = KMF_KEYSTORE_OPENSSL;
- scparms.sslparms.certfile = filename;
- scparms.sslparms.format = kfmt;
+ kstype = KMF_KEYSTORE_OPENSSL;
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_DATA_ATTR, &kmfcert.certificate,
+ sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, filename, strlen(filename));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &kfmt, sizeof (kfmt));
+ numattr++;
- rv = KMF_StoreCert(kmfhandle, &scparms,
- &kmfcert.certificate);
+ rv = kmf_store_cert(kmfhandle, numattr, attrlist);
- KMF_FreeKMFCert(kmfhandle, &kmfcert);
+ kmf_free_kmf_cert(kmfhandle, &kmfcert);
}
return (rv);
}
@@ -324,13 +675,13 @@ pk_export(int argc, char *argv[])
/* Parse command line options. Do NOT i18n/l10n. */
while ((opt = getopt_av(argc, argv,
- "k:(keystore)y:(objtype)T:(token)"
- "d:(dir)p:(prefix)"
- "l:(label)n:(nickname)s:(subject)"
- "i:(issuer)S:(serial)"
- "K:(keyfile)c:(certfile)"
- "F:(outformat)"
- "I:(infile)o:(outfile)")) != EOF) {
+ "k:(keystore)y:(objtype)T:(token)"
+ "d:(dir)p:(prefix)"
+ "l:(label)n:(nickname)s:(subject)"
+ "i:(issuer)S:(serial)"
+ "K:(keyfile)c:(certfile)"
+ "F:(outformat)"
+ "I:(infile)o:(outfile)")) != EOF) {
if (EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
switch (opt) {
@@ -416,7 +767,7 @@ pk_export(int argc, char *argv[])
/* Filename arg is required. */
if (EMPTYSTRING(filename)) {
cryptoerror(LOG_STDERR, gettext("You must specify "
- "an 'outfile' parameter when exporting.\n"));
+ "an 'outfile' parameter when exporting.\n"));
return (PK_ERR_USAGE);
}
@@ -428,10 +779,10 @@ pk_export(int argc, char *argv[])
/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
- kstype != KMF_KEYSTORE_PK11TOKEN) {
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
(void) fprintf(stderr, gettext("The objtype parameter "
- "is only relevant if keystore=pkcs11\n"));
+ "is only relevant if keystore=pkcs11\n"));
return (PK_ERR_USAGE);
}
@@ -443,16 +794,16 @@ pk_export(int argc, char *argv[])
if (kstype == KMF_KEYSTORE_OPENSSL) {
if (kfmt != KMF_FORMAT_PKCS12) {
cryptoerror(LOG_STDERR, gettext("PKCS12 "
- "is the only export format "
- "supported for the 'file' "
- "keystore.\n"));
+ "is the only export format "
+ "supported for the 'file' "
+ "keystore.\n"));
return (PK_ERR_USAGE);
}
if (EMPTYSTRING(keyfile) || EMPTYSTRING(certfile)) {
cryptoerror(LOG_STDERR, gettext("A cert file"
- "and a key file must be specified "
- "when exporting to PKCS12 from the "
- "'file' keystore.\n"));
+ "and a key file must be specified "
+ "when exporting to PKCS12 from the "
+ "'file' keystore.\n"));
return (PK_ERR_USAGE);
}
}
@@ -460,8 +811,8 @@ pk_export(int argc, char *argv[])
/* Check if the file exists and might be overwritten. */
if (access(filename, F_OK) == 0) {
cryptoerror(LOG_STDERR,
- gettext("Warning: file \"%s\" exists, "
- "will be overwritten."), filename);
+ gettext("Warning: file \"%s\" exists, "
+ "will be overwritten."), filename);
if (yesno(gettext("Continue with export? "),
gettext("Respond with yes or no.\n"), B_FALSE) == B_FALSE) {
return (0);
@@ -470,7 +821,7 @@ pk_export(int argc, char *argv[])
rv = verify_file(filename);
if (rv != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("The file (%s) "
- "cannot be created.\n"), filename);
+ "cannot be created.\n"), filename);
return (PK_ERR_USAGE);
}
}
@@ -479,11 +830,11 @@ pk_export(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
+ rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
if (rv != KMF_OK || bytes == NULL) {
(void) fprintf(stderr, gettext("serial number "
- "must be specified as a hex number "
- "(ex: 0x0102030405ffeeddee)\n"));
+ "must be specified as a hex number "
+ "(ex: 0x0102030405ffeeddee)\n"));
return (PK_ERR_USAGE);
}
serial.val = bytes;
@@ -491,61 +842,62 @@ pk_export(int argc, char *argv[])
}
if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
- kstype == KMF_KEYSTORE_NSS) &&
- (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ) ||
- kfmt == KMF_FORMAT_PKCS12)) {
+ kstype == KMF_KEYSTORE_NSS) &&
+ (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ) ||
+ kfmt == KMF_FORMAT_PKCS12)) {
(void) get_token_password(kstype, token_spec,
- &tokencred);
+ &tokencred);
}
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing "
- "KMF: 0x%02x\n"), rv);
+ "KMF: 0x%02x\n"), rv);
return (rv);
}
switch (kstype) {
case KMF_KEYSTORE_PK11TOKEN:
if (kfmt == KMF_FORMAT_PKCS12)
- rv = pk_export_pk12_pk11(
- kmfhandle,
- token_spec,
- certlabel,
- issuer, subject,
- &serial, &tokencred,
- filename);
+ rv = pk_export_pk12_pk11(kmfhandle,
+ token_spec, certlabel,
+ issuer, subject,
+ &serial, &tokencred,
+ filename);
+ else if ((oclass & PK_KEY_OBJ) ||
+ kfmt == KMF_FORMAT_RAWKEY)
+ rv = pk_export_pk11_keys(kmfhandle,
+ token_spec, &tokencred, kfmt,
+ certlabel, filename);
else
rv = pk_export_pk11_objects(kmfhandle,
- token_spec,
- certlabel,
- issuer, subject,
- &serial, kfmt,
- filename);
+ token_spec, certlabel,
+ issuer, subject, &serial, kfmt,
+ filename);
break;
case KMF_KEYSTORE_NSS:
if (dir == NULL)
dir = PK_DEFAULT_DIRECTORY;
if (kfmt == KMF_FORMAT_PKCS12)
rv = pk_export_pk12_nss(kmfhandle,
- token_spec, dir, prefix,
- certlabel, issuer,
- subject, &serial,
- &tokencred, filename);
+ token_spec, dir, prefix,
+ certlabel, issuer,
+ subject, &serial,
+ &tokencred, filename);
else
rv = pk_export_nss_objects(kmfhandle,
- token_spec,
- oclass, certlabel, issuer, subject,
- &serial, kfmt, dir, prefix, filename);
+ token_spec,
+ oclass, certlabel, issuer, subject,
+ &serial, kfmt, dir, prefix, filename);
break;
case KMF_KEYSTORE_OPENSSL:
if (kfmt == KMF_FORMAT_PKCS12)
rv = pk_export_pk12_files(kmfhandle,
- certfile, keyfile, dir,
- filename);
+ certfile, keyfile, dir,
+ filename);
else
rv = pk_export_file_objects(kmfhandle, oclass,
- issuer, subject, &serial, kfmt,
- dir, infile, filename);
+ issuer, subject, &serial,
+ dir, infile, filename);
break;
default:
rv = PK_ERR_USAGE;
@@ -554,13 +906,13 @@ pk_export(int argc, char *argv[])
if (rv != KMF_OK) {
display_error(kmfhandle, rv,
- gettext("Error exporting objects"));
+ gettext("Error exporting objects"));
}
if (serial.val != NULL)
free(serial.val);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/pktool/gencert.c b/usr/src/cmd/cmd-crypto/pktool/gencert.c
index 5555c5e386..689b547caf 100644
--- a/usr/src/cmd/cmd-crypto/pktool/gencert.c
+++ b/usr/src/cmd/cmd-crypto/pktool/gencert.c
@@ -56,40 +56,38 @@ gencert_pkcs11(KMF_HANDLE_T kmfhandle,
uint16_t kubits, int kucrit, KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv = KMF_OK;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
- KMF_STORECERT_PARAMS sc_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_CERTIFICATE signedCert;
KMF_X509_NAME certSubject;
KMF_X509_NAME certIssuer;
KMF_DATA x509DER;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
(void) memset(&signedCert, 0, sizeof (signedCert));
(void) memset(&certSubject, 0, sizeof (certSubject));
(void) memset(&certIssuer, 0, sizeof (certIssuer));
(void) memset(&x509DER, 0, sizeof (x509DER));
- (void) memset(&kp_params, 0, sizeof (kp_params));
/* If the subject name cannot be parsed, flag it now and exit */
- if (KMF_DNParser(subject, &certSubject) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certSubject) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed.\n"));
+ gettext("Subject name cannot be parsed.\n"));
return (PK_ERR_USAGE);
}
/* For a self-signed cert, the issuser and subject are the same */
- if (KMF_DNParser(subject, &certIssuer) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certIssuer) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed.\n"));
+ gettext("Subject name cannot be parsed.\n"));
return (PK_ERR_USAGE);
}
- kp_params.kstype = KMF_KEYSTORE_PK11TOKEN;
- kp_params.keylabel = certlabel;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
- kp_params.cred.cred = tokencred->cred;
- kp_params.cred.credlen = tokencred->credlen;
+ keylength = keylen; /* bits */
+ keytype = keyAlg;
/* Select a PKCS11 token */
kmfrv = select_token(kmfhandle, token, FALSE);
@@ -98,57 +96,129 @@ gencert_pkcs11(KMF_HANDLE_T kmfhandle,
return (kmfrv);
}
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYALG_ATTR, &keytype,
+ sizeof (keytype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLENGTH_ATTR, &keylength,
+ sizeof (keylength));
+ numattr++;
+
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, certlabel,
+ strlen(certlabel));
+ numattr++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PRIVKEY_HANDLE_ATTR, &prik,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PUBKEY_HANDLE_ATTR, &pubk,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
return (kmfrv);
}
- SET_VALUE(KMF_SetCertPubKey(kmfhandle, &pubk, &signedCert),
- "keypair");
+ SET_VALUE(kmf_set_cert_pubkey(kmfhandle, &pubk, &signedCert),
+ "keypair");
- SET_VALUE(KMF_SetCertVersion(&signedCert, 2), "version number");
+ SET_VALUE(kmf_set_cert_version(&signedCert, 2), "version number");
- SET_VALUE(KMF_SetCertSerialNumber(&signedCert, serial),
- "serial number");
+ SET_VALUE(kmf_set_cert_serial(&signedCert, serial),
+ "serial number");
- SET_VALUE(KMF_SetCertValidityTimes(&signedCert, NULL, ltime),
- "validity time");
+ SET_VALUE(kmf_set_cert_validity(&signedCert, NULL, ltime),
+ "validity time");
- SET_VALUE(KMF_SetCertSignatureAlgorithm(&signedCert, sigAlg),
- "signature algorithm");
+ SET_VALUE(kmf_set_cert_sig_alg(&signedCert, sigAlg),
+ "signature algorithm");
- SET_VALUE(KMF_SetCertSubjectName(&signedCert, &certSubject),
- "subject name");
+ SET_VALUE(kmf_set_cert_subject(&signedCert, &certSubject),
+ "subject name");
- SET_VALUE(KMF_SetCertIssuerName(&signedCert, &certIssuer),
- "issuer name");
+ SET_VALUE(kmf_set_cert_issuer(&signedCert, &certIssuer),
+ "issuer name");
if (altname != NULL)
- SET_VALUE(KMF_SetCertSubjectAltName(&signedCert, altcrit,
- alttype, altname), "subjectAltName");
+ SET_VALUE(kmf_set_cert_subject_altname(&signedCert, altcrit,
+ alttype, altname), "subjectAltName");
if (kubits != 0)
- SET_VALUE(KMF_SetCertKeyUsage(&signedCert, kucrit, kubits),
- "KeyUsage");
+ SET_VALUE(kmf_set_cert_ku(&signedCert, kucrit, kubits),
+ "KeyUsage");
- if ((kmfrv = KMF_SignCertRecord(kmfhandle, &prik,
- &signedCert, &x509DER)) != KMF_OK) {
+ /*
+ * Construct attributes for the kmf_sign_cert operation.
+ */
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE_ATTR));
+ numattr++;
+
+ /* cert data that is to be signed */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_X509_CERTIFICATE_ATTR,
+ &signedCert, sizeof (KMF_X509_CERTIFICATE));
+ numattr++;
+
+ /* output buffer for the signed cert */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+
+ if ((kmfrv = kmf_sign_cert(kmfhandle, numattr, attrlist)) !=
+ KMF_OK) {
goto cleanup;
}
- (void) memset(&sc_params, 0, sizeof (sc_params));
- sc_params.kstype = KMF_KEYSTORE_PK11TOKEN;
- sc_params.certLabel = certlabel;
-
/*
* Store the cert in the DB.
*/
- kmfrv = KMF_StoreCert(kmfhandle, &sc_params, &x509DER);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
+ certlabel, strlen(certlabel));
+ numattr++;
+ }
+
+ kmfrv = kmf_store_cert(kmfhandle, numattr, attrlist);
+
cleanup:
- KMF_FreeData(&x509DER);
- KMF_FreeDN(&certSubject);
- KMF_FreeDN(&certIssuer);
+ kmf_free_data(&x509DER);
+ kmf_free_dn(&certSubject);
+ kmf_free_dn(&certIssuer);
return (kmfrv);
}
@@ -162,8 +232,6 @@ gencert_file(KMF_HANDLE_T kmfhandle,
char *dir, char *outcert, char *outkey)
{
KMF_RETURN kmfrv;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
- KMF_STORECERT_PARAMS sc_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_CERTIFICATE signedCert;
KMF_X509_NAME certSubject;
@@ -171,26 +239,30 @@ gencert_file(KMF_HANDLE_T kmfhandle,
KMF_DATA x509DER;
char *fullcertpath = NULL;
char *fullkeypath = NULL;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ KMF_ATTRIBUTE attrlist[10];
+ int numattr = 0;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
+ KMF_ENCODE_FORMAT format;
(void) memset(&signedCert, 0, sizeof (signedCert));
(void) memset(&certSubject, 0, sizeof (certSubject));
(void) memset(&certIssuer, 0, sizeof (certIssuer));
(void) memset(&x509DER, 0, sizeof (x509DER));
- (void) memset(&kp_params, 0, sizeof (kp_params));
- (void) memset(&sc_params, 0, sizeof (sc_params));
if (EMPTYSTRING(outcert) || EMPTYSTRING(outkey)) {
cryptoerror(LOG_STDERR,
- gettext("No output file was specified for "
- "the cert or key\n"));
+ gettext("No output file was specified for "
+ "the cert or key\n"));
return (PK_ERR_USAGE);
}
if (dir != NULL) {
fullcertpath = get_fullpath(dir, outcert);
if (fullcertpath == NULL) {
cryptoerror(LOG_STDERR,
- gettext("Cannot create file %s in "
- "directory %s\n"), dir, outcert);
+ gettext("Cannot create file %s in directory %s\n"),
+ dir, outcert);
return (PK_ERR_USAGE);
}
} else {
@@ -198,9 +270,8 @@ gencert_file(KMF_HANDLE_T kmfhandle,
}
if (verify_file(fullcertpath)) {
cryptoerror(LOG_STDERR,
- gettext("Cannot write the indicated output "
- "certificate file (%s).\n"),
- fullcertpath);
+ gettext("Cannot write the indicated output "
+ "certificate file (%s).\n"), fullcertpath);
free(fullcertpath);
return (PK_ERR_USAGE);
}
@@ -208,8 +279,8 @@ gencert_file(KMF_HANDLE_T kmfhandle,
fullkeypath = get_fullpath(dir, outkey);
if (fullkeypath == NULL) {
cryptoerror(LOG_STDERR,
- gettext("Cannot create file %s in "
- "directory %s\n"), dir, outkey);
+ gettext("Cannot create file %s in directory %s\n"),
+ dir, outkey);
free(fullcertpath);
return (PK_ERR_USAGE);
}
@@ -218,83 +289,146 @@ gencert_file(KMF_HANDLE_T kmfhandle,
}
if (verify_file(fullkeypath)) {
cryptoerror(LOG_STDERR,
- gettext("Cannot write the indicated output "
- "key file (%s).\n"),
- fullkeypath);
+ gettext("Cannot write the indicated output "
+ "key file (%s).\n"), fullkeypath);
free(fullkeypath);
free(fullcertpath);
return (PK_ERR_USAGE);
}
/* If the subject name cannot be parsed, flag it now and exit */
- if (KMF_DNParser(subject, &certSubject) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certSubject) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed (%s)\n"),
- subject);
+ gettext("Subject name cannot be parsed (%s)\n"), subject);
return (PK_ERR_USAGE);
}
/* For a self-signed cert, the issuser and subject are the same */
- if (KMF_DNParser(subject, &certIssuer) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certIssuer) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed (%s)\n"),
- subject);
- KMF_FreeDN(&certSubject);
+ gettext("Subject name cannot be parsed (%s)\n"), subject);
+ kmf_free_dn(&certSubject);
return (PK_ERR_USAGE);
}
- kp_params.kstype = KMF_KEYSTORE_OPENSSL;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
+ keylength = keylen; /* bits */
+ keytype = keyAlg;
+ format = fmt;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYALG_ATTR, &keytype,
+ sizeof (keytype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLENGTH_ATTR, &keylength,
+ sizeof (keylength));
+ numattr++;
+
+ if (fullkeypath != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_FILENAME_ATTR, fullkeypath,
+ strlen(fullkeypath));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &format,
+ sizeof (format));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PRIVKEY_HANDLE_ATTR, &prik,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kp_params.sslparms.keyfile = fullkeypath;
- kp_params.sslparms.format = fmt;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PUBKEY_HANDLE_ATTR, &pubk,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
goto cleanup;
}
- SET_VALUE(KMF_SetCertPubKey(kmfhandle, &pubk, &signedCert),
- "keypair");
- SET_VALUE(KMF_SetCertVersion(&signedCert, 2), "version number");
+ SET_VALUE(kmf_set_cert_pubkey(kmfhandle, &pubk, &signedCert),
+ "keypair");
+
+ SET_VALUE(kmf_set_cert_version(&signedCert, 2), "version number");
- SET_VALUE(KMF_SetCertSerialNumber(&signedCert, serial),
- "serial number");
+ SET_VALUE(kmf_set_cert_serial(&signedCert, serial),
+ "serial number");
- SET_VALUE(KMF_SetCertValidityTimes(&signedCert, NULL, ltime),
- "validity time");
+ SET_VALUE(kmf_set_cert_validity(&signedCert, NULL, ltime),
+ "validity time");
- SET_VALUE(KMF_SetCertSignatureAlgorithm(&signedCert, sigAlg),
- "signature algorithm");
+ SET_VALUE(kmf_set_cert_sig_alg(&signedCert, sigAlg),
+ "signature algorithm");
- SET_VALUE(KMF_SetCertSubjectName(&signedCert, &certSubject),
- "subject name");
+ SET_VALUE(kmf_set_cert_subject(&signedCert, &certSubject),
+ "subject name");
- SET_VALUE(KMF_SetCertIssuerName(&signedCert, &certIssuer),
- "issuer name");
+ SET_VALUE(kmf_set_cert_issuer(&signedCert, &certIssuer),
+ "issuer name");
if (altname != NULL)
- SET_VALUE(KMF_SetCertSubjectAltName(&signedCert, altcrit,
- alttype, altname), "subjectAltName");
+ SET_VALUE(kmf_set_cert_subject_altname(&signedCert, altcrit,
+ alttype, altname), "subjectAltName");
if (kubits != 0)
- SET_VALUE(KMF_SetCertKeyUsage(&signedCert, kucrit, kubits),
- "KeyUsage");
-
- if ((kmfrv = KMF_SignCertRecord(kmfhandle, &prik,
- &signedCert, &x509DER)) != KMF_OK) {
+ SET_VALUE(kmf_set_cert_ku(&signedCert, kucrit, kubits),
+ "KeyUsage");
+ /*
+ * Construct attributes for the kmf_sign_cert operation.
+ */
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE_ATTR));
+ numattr++;
+
+ /* cert data that is to be signed */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_X509_CERTIFICATE_ATTR,
+ &signedCert, sizeof (KMF_X509_CERTIFICATE));
+ numattr++;
+
+ /* output buffer for the signed cert */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+
+ if ((kmfrv = kmf_sign_cert(kmfhandle, numattr, attrlist)) !=
+ KMF_OK) {
goto cleanup;
}
- sc_params.kstype = KMF_KEYSTORE_OPENSSL;
- sc_params.sslparms.certfile = fullcertpath;
- sc_params.sslparms.keyfile = fullkeypath;
- sc_params.sslparms.format = fmt;
/*
* Store the cert in the DB.
*/
- kmfrv = KMF_StoreCert(kmfhandle, &sc_params, &x509DER);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
+ fullcertpath, strlen(fullcertpath));
+ numattr++;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &fmt, sizeof (fmt));
+ numattr++;
+
+ kmfrv = kmf_store_cert(kmfhandle, numattr, attrlist);
cleanup:
if (fullkeypath != NULL)
@@ -302,9 +436,9 @@ cleanup:
if (fullcertpath != NULL)
free(fullcertpath);
- KMF_FreeData(&x509DER);
- KMF_FreeDN(&certSubject);
- KMF_FreeDN(&certIssuer);
+ kmf_free_data(&x509DER);
+ kmf_free_dn(&certSubject);
+ kmf_free_dn(&certIssuer);
return (kmfrv);
}
@@ -320,13 +454,16 @@ gencert_nss(KMF_HANDLE_T kmfhandle,
int kucrit, KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
- KMF_STORECERT_PARAMS sc_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_CERTIFICATE signedCert;
KMF_X509_NAME certSubject;
KMF_X509_NAME certIssuer;
KMF_DATA x509DER;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
if (token == NULL)
token = DEFAULT_NSS_TOKEN;
@@ -341,81 +478,164 @@ gencert_nss(KMF_HANDLE_T kmfhandle,
(void) memset(&x509DER, 0, sizeof (x509DER));
/* If the subject name cannot be parsed, flag it now and exit */
- if (KMF_DNParser(subject, &certSubject) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certSubject) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed.\n"));
+ gettext("Subject name cannot be parsed.\n"));
return (PK_ERR_USAGE);
}
/* For a self-signed cert, the issuser and subject are the same */
- if (KMF_DNParser(subject, &certIssuer) != KMF_OK) {
+ if (kmf_dn_parser(subject, &certIssuer) != KMF_OK) {
cryptoerror(LOG_STDERR,
- gettext("Subject name cannot be parsed.\n"));
+ gettext("Subject name cannot be parsed.\n"));
return (PK_ERR_USAGE);
}
- (void) memset(&kp_params, 0, sizeof (kp_params));
+ keylength = keylen; /* bits */
+ keytype = keyAlg;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYALG_ATTR, &keytype,
+ sizeof (keytype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLENGTH_ATTR, &keylength,
+ sizeof (keylength));
+ numattr++;
+
+ if (nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, nickname,
+ strlen(nickname));
+ numattr++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (token != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token,
+ strlen(token));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PRIVKEY_HANDLE_ATTR, &prik,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kp_params.kstype = KMF_KEYSTORE_NSS;
- kp_params.keylabel = nickname;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
- kp_params.cred.cred = tokencred->cred;
- kp_params.cred.credlen = tokencred->credlen;
- kp_params.nssparms.slotlabel = token;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PUBKEY_HANDLE_ATTR, &pubk,
+ sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
return (kmfrv);
}
- SET_VALUE(KMF_SetCertPubKey(kmfhandle, &pubk, &signedCert),
- "keypair");
+ SET_VALUE(kmf_set_cert_pubkey(kmfhandle, &pubk, &signedCert),
+ "keypair");
- SET_VALUE(KMF_SetCertVersion(&signedCert, 2), "version number");
+ SET_VALUE(kmf_set_cert_version(&signedCert, 2), "version number");
- SET_VALUE(KMF_SetCertSerialNumber(&signedCert, serial),
- "serial number");
+ SET_VALUE(kmf_set_cert_serial(&signedCert, serial),
+ "serial number");
- SET_VALUE(KMF_SetCertValidityTimes(&signedCert, NULL, ltime),
- "validity time");
+ SET_VALUE(kmf_set_cert_validity(&signedCert, NULL, ltime),
+ "validity time");
- SET_VALUE(KMF_SetCertSignatureAlgorithm(&signedCert, sigAlg),
- "signature algorithm");
+ SET_VALUE(kmf_set_cert_sig_alg(&signedCert, sigAlg),
+ "signature algorithm");
- SET_VALUE(KMF_SetCertSubjectName(&signedCert, &certSubject),
- "subject name");
+ SET_VALUE(kmf_set_cert_subject(&signedCert, &certSubject),
+ "subject name");
- SET_VALUE(KMF_SetCertIssuerName(&signedCert, &certIssuer),
- "issuer name");
+ SET_VALUE(kmf_set_cert_issuer(&signedCert, &certIssuer),
+ "issuer name");
if (altname != NULL)
- SET_VALUE(KMF_SetCertSubjectAltName(&signedCert, altcrit,
- alttype, altname), "subjectAltName");
+ SET_VALUE(kmf_set_cert_subject_altname(&signedCert, altcrit,
+ alttype, altname), "subjectAltName");
if (kubits)
- SET_VALUE(KMF_SetCertKeyUsage(&signedCert, kucrit, kubits),
- "subjectAltName");
+ SET_VALUE(kmf_set_cert_ku(&signedCert, kucrit, kubits),
+ "subjectAltName");
- if ((kmfrv = KMF_SignCertRecord(kmfhandle, &prik,
- &signedCert, &x509DER)) != KMF_OK) {
+ /*
+ * Construct attributes for the kmf_sign_cert operation.
+ */
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE_ATTR));
+ numattr++;
+
+ /* cert data that is to be signed */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_X509_CERTIFICATE_ATTR,
+ &signedCert, sizeof (KMF_X509_CERTIFICATE));
+ numattr++;
+
+ /* output buffer for the signed cert */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+
+ if ((kmfrv = kmf_sign_cert(kmfhandle, numattr, attrlist)) !=
+ KMF_OK) {
goto cleanup;
}
- sc_params.kstype = KMF_KEYSTORE_NSS;
- sc_params.certLabel = nickname;
- sc_params.nssparms.trustflag = trust;
- sc_params.nssparms.slotlabel = token;
-
/*
* Store the cert in the DB.
*/
- kmfrv = KMF_StoreCert(kmfhandle, &sc_params, &x509DER);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_DATA_ATTR,
+ &x509DER, sizeof (KMF_DATA));
+ numattr++;
+
+ if (nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
+ nickname, strlen(nickname));
+ numattr++;
+ }
+
+ if (trust != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TRUSTFLAG_ATTR,
+ trust, strlen(trust));
+ numattr++;
+ }
+
+ if (token != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
+
+ kmfrv = kmf_store_cert(kmfhandle, numattr, attrlist);
cleanup:
- KMF_FreeData(&x509DER);
- KMF_FreeDN(&certSubject);
- KMF_FreeDN(&certIssuer);
+ kmf_free_data(&x509DER);
+ kmf_free_dn(&certSubject);
+ kmf_free_dn(&certIssuer);
return (kmfrv);
}
@@ -456,10 +676,10 @@ pk_gencert(int argc, char *argv[])
int altcrit = 0, kucrit = 0;
while ((opt = getopt_av(argc, argv,
- "ik:(keystore)s:(subject)n:(nickname)A:(altname)"
- "T:(token)d:(dir)p:(prefix)t:(keytype)y:(keylen)"
- "r:(trust)L:(lifetime)l:(label)c:(outcert)"
- "K:(outkey)S:(serial)F:(format)u:(keyusage)")) != EOF) {
+ "ik:(keystore)s:(subject)n:(nickname)A:(altname)"
+ "T:(token)d:(dir)p:(prefix)t:(keytype)y:(keylen)"
+ "r:(trust)L:(lifetime)l:(label)c:(outcert)"
+ "K:(outkey)S:(serial)F:(format)u:(keyusage)")) != EOF) {
if (opt != 'i' && EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
@@ -514,11 +734,11 @@ pk_gencert(int argc, char *argv[])
break;
case 'y':
if (sscanf(optarg_av, "%d",
- &keylen) != 1) {
+ &keylen) != 1) {
cryptoerror(LOG_STDERR,
- gettext("key length must be"
- "a numeric value (%s)\n"),
- optarg_av);
+ gettext("key length must be"
+ "a numeric value (%s)\n"),
+ optarg_av);
return (PK_ERR_USAGE);
}
break;
@@ -562,7 +782,7 @@ pk_gencert(int argc, char *argv[])
return (PK_ERR_USAGE);
}
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing KMF\n"));
return (PK_ERR_USAGE);
}
@@ -591,13 +811,13 @@ pk_gencert(int argc, char *argv[])
if (Str2Lifetime(lifetime, &ltime) != 0) {
cryptoerror(LOG_STDERR,
- gettext("Error parsing lifetime string\n"));
+ gettext("Error parsing lifetime string\n"));
return (PK_ERR_USAGE);
}
if (Str2KeyType(keytype, &keyAlg, &sigAlg) != 0) {
cryptoerror(LOG_STDERR, gettext("Unrecognized keytype (%s).\n"),
- keytype);
+ keytype);
return (PK_ERR_USAGE);
}
@@ -630,20 +850,20 @@ pk_gencert(int argc, char *argv[])
if (serstr == NULL) {
(void) fprintf(stderr, gettext("A serial number "
- "must be specified as a hex number when creating"
- " a self-signed certificate "
- "(ex: serial=0x0102030405feedface)\n"));
+ "must be specified as a hex number when creating"
+ " a self-signed certificate "
+ "(ex: serial=0x0102030405feedface)\n"));
rv = PK_ERR_USAGE;
goto end;
} else {
uchar_t *bytes = NULL;
size_t bytelen;
- rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
+ rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
if (rv != KMF_OK || bytes == NULL) {
(void) fprintf(stderr, gettext("serial number "
- "must be specified as a hex number "
- "(ex: 0x0102030405ffeeddee)\n"));
+ "must be specified as a hex number "
+ "(ex: 0x0102030405ffeeddee)\n"));
rv = PK_ERR_USAGE;
goto end;
}
@@ -655,8 +875,8 @@ pk_gencert(int argc, char *argv[])
rv = verify_altname(altname, &alttype, &altcrit);
if (rv != KMF_OK) {
(void) fprintf(stderr, gettext("Subject AltName "
- "must be specified as a name=value pair. "
- "See the man page for details.\n"));
+ "must be specified as a name=value pair. "
+ "See the man page for details.\n"));
rv = PK_ERR_USAGE;
goto end;
} else {
@@ -671,8 +891,8 @@ pk_gencert(int argc, char *argv[])
rv = verify_keyusage(keyusagestr, &kubits, &kucrit);
if (rv != KMF_OK) {
(void) fprintf(stderr, gettext("KeyUsage "
- "must be specified as a comma-separated list. "
- "See the man page for details.\n"));
+ "must be specified as a comma-separated list. "
+ "See the man page for details.\n"));
rv = PK_ERR_USAGE;
goto end;
}
@@ -695,26 +915,26 @@ pk_gencert(int argc, char *argv[])
dir = PK_DEFAULT_DIRECTORY;
rv = gencert_nss(kmfhandle,
- tokenname, subname, altname, alttype, altcrit,
- certlabel, dir, prefix, keyAlg, sigAlg, keylen,
- trust, ltime, &serial, kubits, kucrit, &tokencred);
+ tokenname, subname, altname, alttype, altcrit,
+ certlabel, dir, prefix, keyAlg, sigAlg, keylen,
+ trust, ltime, &serial, kubits, kucrit, &tokencred);
} else if (kstype == KMF_KEYSTORE_PK11TOKEN) {
rv = gencert_pkcs11(kmfhandle,
- tokenname, subname, altname, alttype, altcrit,
- certlabel, keyAlg, sigAlg, keylen, ltime,
- &serial, kubits, kucrit, &tokencred);
+ tokenname, subname, altname, alttype, altcrit,
+ certlabel, keyAlg, sigAlg, keylen, ltime,
+ &serial, kubits, kucrit, &tokencred);
} else if (kstype == KMF_KEYSTORE_OPENSSL) {
rv = gencert_file(kmfhandle,
- keyAlg, sigAlg, keylen, fmt,
- ltime, subname, altname, alttype, altcrit,
- &serial, kubits, kucrit, dir, outcert, outkey);
+ keyAlg, sigAlg, keylen, fmt,
+ ltime, subname, altname, alttype, altcrit,
+ &serial, kubits, kucrit, dir, outcert, outkey);
}
if (rv != KMF_OK)
display_error(kmfhandle, rv,
- gettext("Error creating certificate and keypair"));
+ gettext("Error creating certificate and keypair"));
end:
if (subname)
free(subname);
@@ -724,6 +944,6 @@ end:
if (serial.val != NULL)
free(serial.val);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/pktool/gencsr.c b/usr/src/cmd/cmd-crypto/pktool/gencsr.c
index fcc00d01c8..e8bf92de03 100644
--- a/usr/src/cmd/cmd-crypto/pktool/gencsr.c
+++ b/usr/src/cmd/cmd-crypto/pktool/gencsr.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -57,17 +57,19 @@ gencsr_pkcs11(KMF_HANDLE_T kmfhandle,
KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv = KMF_OK;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
- KMF_DELETEKEY_PARAMS dk_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_NAME csrSubject;
KMF_CSR_DATA csr;
KMF_ALGORITHM_INDEX sigAlg;
KMF_DATA signedCsr = {NULL, 0};
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ boolean_t storekey = TRUE;
+
(void) memset(&csr, 0, sizeof (csr));
(void) memset(&csrSubject, 0, sizeof (csrSubject));
- (void) memset(&kp_params, 0, sizeof (kp_params));
if (keyAlg == KMF_DSA)
sigAlg = KMF_ALGID_SHA1WithDSA;
@@ -76,61 +78,99 @@ gencsr_pkcs11(KMF_HANDLE_T kmfhandle,
/* If the subject name cannot be parsed, flag it now and exit */
- if ((kmfrv = KMF_DNParser(subject, &csrSubject)) != KMF_OK) {
+ if ((kmfrv = kmf_dn_parser(subject, &csrSubject)) != KMF_OK) {
return (kmfrv);
}
- kp_params.kstype = KMF_KEYSTORE_PK11TOKEN;
- kp_params.keylabel = certlabel;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
- kp_params.cred.cred = tokencred->cred;
- kp_params.cred.credlen = tokencred->credlen;
-
/* Select a PKCS11 token */
kmfrv = select_token(kmfhandle, token, FALSE);
if (kmfrv != KMF_OK) {
return (kmfrv);
}
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (certlabel != NULL && strlen(certlabel)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ certlabel, strlen(certlabel));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLENGTH_ATTR,
+ &keylen, sizeof (keylen));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
+ &keyAlg, sizeof (keyAlg));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+
+ if (token && strlen(token)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PUBKEY_HANDLE_ATTR,
+ &pubk, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVKEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_STOREKEY_BOOL_ATTR,
+ &storekey, sizeof (storekey));
+ numattr++;
+
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
return (kmfrv);
}
- SET_VALUE(KMF_SetCSRPubKey(kmfhandle, &pubk, &csr), "keypair");
+ SET_VALUE(kmf_set_csr_pubkey(kmfhandle, &pubk, &csr), "keypair");
- SET_VALUE(KMF_SetCSRVersion(&csr, 2), "version number");
+ SET_VALUE(kmf_set_csr_version(&csr, 2), "version number");
- SET_VALUE(KMF_SetCSRSubjectName(&csr, &csrSubject),
- "subject name");
+ SET_VALUE(kmf_set_csr_subject(&csr, &csrSubject), "subject name");
- SET_VALUE(KMF_SetCSRSignatureAlgorithm(&csr, sigAlg),
- "SignatureAlgorithm");
+ SET_VALUE(kmf_set_csr_sig_alg(&csr, sigAlg),
+ "SignatureAlgorithm");
if (altname != NULL) {
- SET_VALUE(KMF_SetCSRSubjectAltName(&csr, altname, altcrit,
- alttype), "SetCSRSubjectAltName");
+ SET_VALUE(kmf_set_csr_subject_altname(&csr, altname, altcrit,
+ alttype), "SetCSRSubjectAltName");
}
if (kubits != 0) {
- SET_VALUE(KMF_SetCSRKeyUsage(&csr, kucrit, kubits),
- "SetCSRKeyUsage");
+ SET_VALUE(kmf_set_csr_ku(&csr, kucrit, kubits),
+ "SetCSRKeyUsage");
}
- if ((kmfrv = KMF_SignCSR(kmfhandle, &csr, &prik, &signedCsr)) ==
- KMF_OK) {
- kmfrv = KMF_CreateCSRFile(&signedCsr, fmt, csrfile);
+ if ((kmfrv = kmf_sign_csr(kmfhandle, &csr, &prik, &signedCsr)) ==
+ KMF_OK) {
+ kmfrv = kmf_create_csr_file(&signedCsr, fmt, csrfile);
}
cleanup:
- (void) KMF_FreeData(&signedCsr);
- (void) KMF_FreeKMFKey(kmfhandle, &prik);
+ (void) kmf_free_data(&signedCsr);
+ (void) kmf_free_kmf_key(kmfhandle, &prik);
/* delete the key */
- (void) memset(&dk_params, 0, sizeof (dk_params));
- dk_params.kstype = KMF_KEYSTORE_PK11TOKEN;
- (void) KMF_DeleteKeyFromKeystore(kmfhandle, &dk_params, &pubk);
- (void) KMF_FreeSignedCSR(&csr);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PUBKEY_HANDLE_ATTR,
+ &pubk, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ (void) kmf_delete_key_from_keystore(kmfhandle, numattr, attrlist);
+
+ (void) kmf_free_signed_csr(&csr);
return (kmfrv);
}
@@ -144,7 +184,6 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
char *dir, char *outcsr, char *outkey)
{
KMF_RETURN kmfrv;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_NAME csrSubject;
KMF_CSR_DATA csr;
@@ -153,22 +192,26 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
char *fullcsrpath = NULL;
char *fullkeypath = NULL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ boolean_t storekey = TRUE;
+
(void) memset(&csr, 0, sizeof (csr));
(void) memset(&csrSubject, 0, sizeof (csrSubject));
- (void) memset(&kp_params, 0, sizeof (kp_params));
if (EMPTYSTRING(outcsr) || EMPTYSTRING(outkey)) {
cryptoerror(LOG_STDERR,
- gettext("No output file was specified for "
- "the csr or key\n"));
+ gettext("No output file was specified for "
+ "the csr or key\n"));
return (KMF_ERR_BAD_PARAMETER);
}
if (dir != NULL) {
fullcsrpath = get_fullpath(dir, outcsr);
if (fullcsrpath == NULL) {
cryptoerror(LOG_STDERR,
- gettext("Cannot create file %s in "
- "directory %s\n"), dir, outcsr);
+ gettext("Cannot create file %s in "
+ "directory %s\n"), dir, outcsr);
return (PK_ERR_USAGE);
}
} else {
@@ -176,8 +219,8 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
}
if (verify_file(fullcsrpath)) {
cryptoerror(LOG_STDERR,
- gettext("Cannot write the indicated output "
- "certificate file (%s).\n"), fullcsrpath);
+ gettext("Cannot write the indicated output "
+ "certificate file (%s).\n"), fullcsrpath);
free(fullcsrpath);
return (PK_ERR_USAGE);
}
@@ -185,8 +228,8 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
fullkeypath = get_fullpath(dir, outkey);
if (fullkeypath == NULL) {
cryptoerror(LOG_STDERR,
- gettext("Cannot create file %s in "
- "directory %s\n"), dir, outkey);
+ gettext("Cannot create file %s in "
+ "directory %s\n"), dir, outkey);
free(fullcsrpath);
return (PK_ERR_USAGE);
}
@@ -195,8 +238,8 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
}
if (verify_file(fullcsrpath)) {
cryptoerror(LOG_STDERR,
- gettext("Cannot write the indicated output "
- "key file (%s).\n"), fullkeypath);
+ gettext("Cannot write the indicated output "
+ "key file (%s).\n"), fullkeypath);
free(fullcsrpath);
return (PK_ERR_USAGE);
}
@@ -207,43 +250,69 @@ gencsr_file(KMF_HANDLE_T kmfhandle,
sigAlg = KMF_ALGID_MD5WithRSA;
/* If the subject name cannot be parsed, flag it now and exit */
- if ((kmfrv = KMF_DNParser(subject, &csrSubject)) != KMF_OK) {
+ if ((kmfrv = kmf_dn_parser(subject, &csrSubject)) != KMF_OK) {
return (kmfrv);
}
- kp_params.kstype = KMF_KEYSTORE_OPENSSL;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
+ fullkeypath, strlen(fullkeypath));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLENGTH_ATTR,
+ &keylen, sizeof (keylen));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
+ &keyAlg, sizeof (keyAlg));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &fmt, sizeof (fmt));
+ numattr++;
- kp_params.sslparms.keyfile = fullkeypath;
- kp_params.sslparms.format = fmt;
+ (void) memset(&prik, 0, sizeof (prik));
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVKEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ (void) memset(&pubk, 0, sizeof (pubk));
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PUBKEY_HANDLE_ATTR,
+ &pubk, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_STOREKEY_BOOL_ATTR,
+ &storekey, sizeof (storekey));
+ numattr++;
+
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
goto cleanup;
}
- SET_VALUE(KMF_SetCSRPubKey(kmfhandle, &pubk, &csr),
- "SetCSRPubKey");
+ SET_VALUE(kmf_set_csr_pubkey(kmfhandle, &pubk, &csr),
+ "SetCSRPubKey");
- SET_VALUE(KMF_SetCSRVersion(&csr, 2), "SetCSRVersion");
+ SET_VALUE(kmf_set_csr_version(&csr, 2), "SetCSRVersion");
- SET_VALUE(KMF_SetCSRSubjectName(&csr, &csrSubject),
- "SetCSRSubjectName");
+ SET_VALUE(kmf_set_csr_subject(&csr, &csrSubject),
+ "kmf_set_csr_subject");
- SET_VALUE(KMF_SetCSRSignatureAlgorithm(&csr, sigAlg),
- "SetCSRSignatureAlgorithm");
+ SET_VALUE(kmf_set_csr_sig_alg(&csr, sigAlg), "kmf_set_csr_sig_alg");
if (altname != NULL) {
- SET_VALUE(KMF_SetCSRSubjectAltName(&csr, altname, altcrit,
- alttype), "SetCSRSubjectAltName");
+ SET_VALUE(kmf_set_csr_subject_altname(&csr, altname, altcrit,
+ alttype), "kmf_set_csr_subject_altname");
}
if (kubits != NULL) {
- SET_VALUE(KMF_SetCSRKeyUsage(&csr, kucrit, kubits),
- "SetCSRKeyUsage");
+ SET_VALUE(kmf_set_csr_ku(&csr, kucrit, kubits),
+ "kmf_set_csr_ku");
}
- if ((kmfrv = KMF_SignCSR(kmfhandle, &csr, &prik, &signedCsr)) ==
- KMF_OK) {
- kmfrv = KMF_CreateCSRFile(&signedCsr, fmt, fullcsrpath);
+ if ((kmfrv = kmf_sign_csr(kmfhandle, &csr, &prik, &signedCsr)) ==
+ KMF_OK) {
+ kmfrv = kmf_create_csr_file(&signedCsr, fmt, fullcsrpath);
}
cleanup:
@@ -252,9 +321,9 @@ cleanup:
if (fullcsrpath)
free(fullcsrpath);
- KMF_FreeData(&signedCsr);
- KMF_FreeKMFKey(kmfhandle, &prik);
- KMF_FreeSignedCSR(&csr);
+ kmf_free_data(&signedCsr);
+ kmf_free_kmf_key(kmfhandle, &prik);
+ kmf_free_signed_csr(&csr);
return (kmfrv);
}
@@ -270,13 +339,16 @@ gencsr_nss(KMF_HANDLE_T kmfhandle,
KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv;
- KMF_CREATEKEYPAIR_PARAMS kp_params;
KMF_KEY_HANDLE pubk, prik;
KMF_X509_NAME csrSubject;
KMF_CSR_DATA csr;
KMF_ALGORITHM_INDEX sigAlg;
KMF_DATA signedCsr = {NULL, 0};
- KMF_DELETEKEY_PARAMS dk_params;
+
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ boolean_t storekey = TRUE;
if (token == NULL)
token = DEFAULT_NSS_TOKEN;
@@ -294,56 +366,104 @@ gencsr_nss(KMF_HANDLE_T kmfhandle,
(void) memset(&csrSubject, 0, sizeof (csrSubject));
/* If the subject name cannot be parsed, flag it now and exit */
- if ((kmfrv = KMF_DNParser(subject, &csrSubject)) != KMF_OK) {
+ if ((kmfrv = kmf_dn_parser(subject, &csrSubject)) != KMF_OK) {
return (kmfrv);
}
- (void) memset(&kp_params, 0, sizeof (kp_params));
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (nickname != NULL && strlen(nickname)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ nickname, strlen(nickname));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLENGTH_ATTR,
+ &keylen, sizeof (keylen));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYALG_ATTR,
+ &keyAlg, sizeof (keyAlg));
+ numattr++;
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (token && strlen(token)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PUBKEY_HANDLE_ATTR,
+ &pubk, sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kp_params.kstype = KMF_KEYSTORE_NSS;
- kp_params.keylabel = nickname;
- kp_params.keylength = keylen; /* bits */
- kp_params.keytype = keyAlg;
- kp_params.cred.cred = tokencred->cred;
- kp_params.cred.credlen = tokencred->credlen;
- kp_params.nssparms.slotlabel = token;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVKEY_HANDLE_ATTR,
+ &prik, sizeof (KMF_KEY_HANDLE));
+ numattr++;
- kmfrv = KMF_CreateKeypair(kmfhandle, &kp_params, &prik, &pubk);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_STOREKEY_BOOL_ATTR,
+ &storekey, sizeof (storekey));
+ numattr++;
+
+ kmfrv = kmf_create_keypair(kmfhandle, numattr, attrlist);
if (kmfrv != KMF_OK) {
goto cleanup;
}
- SET_VALUE(KMF_SetCSRPubKey(kmfhandle, &pubk, &csr), "SetCSRPubKey");
- SET_VALUE(KMF_SetCSRVersion(&csr, 2), "SetCSRVersion");
- SET_VALUE(KMF_SetCSRSubjectName(&csr, &csrSubject),
- "SetCSRSubjectName");
- SET_VALUE(KMF_SetCSRSignatureAlgorithm(&csr, sigAlg),
- "SetCSRSignatureAlgorithm");
+ SET_VALUE(kmf_set_csr_pubkey(kmfhandle, &pubk, &csr),
+ "kmf_set_csr_pubkey");
+ SET_VALUE(kmf_set_csr_version(&csr, 2), "kmf_set_csr_version");
+ SET_VALUE(kmf_set_csr_subject(&csr, &csrSubject),
+ "kmf_set_csr_subject");
+ SET_VALUE(kmf_set_csr_sig_alg(&csr, sigAlg), "kmf_set_csr_sig_alg");
if (altname != NULL) {
- SET_VALUE(KMF_SetCSRSubjectAltName(&csr, altname, altcrit,
- alttype), "SetCSRSubjectAltName");
+ SET_VALUE(kmf_set_csr_subject_altname(&csr, altname, altcrit,
+ alttype), "kmf_set_csr_subject_altname");
}
if (kubits != NULL) {
- SET_VALUE(KMF_SetCSRKeyUsage(&csr, kucrit, kubits),
- "SetCSRKeyUsage");
+ SET_VALUE(kmf_set_csr_ku(&csr, kucrit, kubits),
+ "kmf_set_csr_ku");
}
- if ((kmfrv = KMF_SignCSR(kmfhandle, &csr, &prik, &signedCsr)) ==
- KMF_OK) {
- kmfrv = KMF_CreateCSRFile(&signedCsr, fmt, csrfile);
+ if ((kmfrv = kmf_sign_csr(kmfhandle, &csr, &prik, &signedCsr)) ==
+ KMF_OK) {
+ kmfrv = kmf_create_csr_file(&signedCsr, fmt, csrfile);
}
cleanup:
- (void) KMF_FreeData(&signedCsr);
- (void) KMF_FreeKMFKey(kmfhandle, &prik);
+ (void) kmf_free_data(&signedCsr);
+ (void) kmf_free_kmf_key(kmfhandle, &prik);
+
/* delete the key */
- (void) memset(&dk_params, 0, sizeof (dk_params));
- dk_params.kstype = KMF_KEYSTORE_NSS;
- dk_params.cred.cred = tokencred->cred;
- dk_params.cred.credlen = tokencred->credlen;
- dk_params.nssparms.slotlabel = token;
- (void) KMF_DeleteKeyFromKeystore(kmfhandle, &dk_params, &pubk);
- (void) KMF_FreeSignedCSR(&csr);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PUBKEY_HANDLE_ATTR,
+ &pubk, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ tokencred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (token && strlen(token)) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token, strlen(token));
+ numattr++;
+ }
+
+ (void) kmf_delete_key_from_keystore(kmfhandle, numattr, attrlist);
+
+ (void) kmf_free_signed_csr(&csr);
return (kmfrv);
}
@@ -380,10 +500,10 @@ pk_gencsr(int argc, char *argv[])
int altcrit = 0, kucrit = 0;
while ((opt = getopt_av(argc, argv,
- "ik:(keystore)s:(subject)n:(nickname)A:(altname)"
- "u:(keyusage)T:(token)d:(dir)p:(prefix)t:(keytype)"
- "y:(keylen)l:(label)c:(outcsr)"
- "K:(outkey)F:(format)")) != EOF) {
+ "ik:(keystore)s:(subject)n:(nickname)A:(altname)"
+ "u:(keyusage)T:(token)d:(dir)p:(prefix)t:(keytype)"
+ "y:(keylen)l:(label)c:(outcsr)"
+ "K:(outkey)F:(format)")) != EOF) {
if (opt != 'i' && EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
@@ -436,11 +556,10 @@ pk_gencsr(int argc, char *argv[])
break;
case 'y':
if (sscanf(optarg_av, "%d",
- &keylen) != 1) {
+ &keylen) != 1) {
cryptoerror(LOG_STDERR,
- gettext("Unrecognized "
- "key length (%s)\n"),
- optarg_av);
+ gettext("Unrecognized "
+ "key length (%s)\n"), optarg_av);
return (PK_ERR_USAGE);
}
break;
@@ -461,8 +580,8 @@ pk_gencsr(int argc, char *argv[])
break;
default:
cryptoerror(LOG_STDERR, gettext(
- "unrecognized gencsr option '%s'\n"),
- argv[optind_av]);
+ "unrecognized gencsr option '%s'\n"),
+ argv[optind_av]);
return (PK_ERR_USAGE);
}
}
@@ -473,7 +592,7 @@ pk_gencsr(int argc, char *argv[])
return (PK_ERR_USAGE);
}
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing KMF\n"));
return (PK_ERR_USAGE);
}
@@ -484,7 +603,7 @@ pk_gencsr(int argc, char *argv[])
if (EMPTYSTRING(outcsr)) {
(void) printf(gettext("A filename must be specified to hold"
- "the final certificate request data.\n"));
+ "the final certificate request data.\n"));
return (PK_ERR_USAGE);
} else {
/*
@@ -494,7 +613,7 @@ pk_gencsr(int argc, char *argv[])
rv = verify_file(outcsr);
if (rv != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("output file (%s) "
- "cannot be created.\n"), outcsr);
+ "cannot be created.\n"), outcsr);
return (PK_ERR_USAGE);
}
}
@@ -512,13 +631,12 @@ pk_gencsr(int argc, char *argv[])
if (format && (fmt = Str2Format(format)) == KMF_FORMAT_UNDEF) {
cryptoerror(LOG_STDERR,
- gettext("Error parsing format string (%s).\n"),
- format);
+ gettext("Error parsing format string (%s).\n"), format);
return (PK_ERR_USAGE);
}
if (format && fmt != KMF_FORMAT_ASN1 && fmt != KMF_FORMAT_PEM) {
cryptoerror(LOG_STDERR,
- gettext("CSR must be DER or PEM format.\n"));
+ gettext("CSR must be DER or PEM format.\n"));
return (PK_ERR_USAGE);
}
@@ -551,8 +669,8 @@ pk_gencsr(int argc, char *argv[])
rv = verify_altname(altname, &alttype, &altcrit);
if (rv != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Subject AltName "
- "must be specified as a name=value pair. "
- "See the man page for details."));
+ "must be specified as a name=value pair. "
+ "See the man page for details."));
goto end;
} else {
/* advance the altname past the '=' sign */
@@ -566,14 +684,14 @@ pk_gencsr(int argc, char *argv[])
rv = verify_keyusage(kustr, &kubits, &kucrit);
if (rv != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("KeyUsage "
- "must be specified as a comma-separated list. "
- "See the man page for details."));
+ "must be specified as a comma-separated list. "
+ "See the man page for details."));
goto end;
}
}
if ((rv = Str2KeyType(keytype, &keyAlg, &sigAlg)) != 0) {
cryptoerror(LOG_STDERR, gettext("Unrecognized keytype (%s).\n"),
- keytype);
+ keytype);
goto end;
}
@@ -594,28 +712,28 @@ pk_gencsr(int argc, char *argv[])
dir = PK_DEFAULT_DIRECTORY;
rv = gencsr_nss(kmfhandle,
- tokenname, subname, altname, alttype, altcrit,
- certlabel, dir, prefix,
- keyAlg, keylen, kubits, kucrit,
- fmt, outcsr, &tokencred);
+ tokenname, subname, altname, alttype, altcrit,
+ certlabel, dir, prefix,
+ keyAlg, keylen, kubits, kucrit,
+ fmt, outcsr, &tokencred);
} else if (kstype == KMF_KEYSTORE_PK11TOKEN) {
rv = gencsr_pkcs11(kmfhandle,
- tokenname, subname, altname, alttype, altcrit,
- certlabel, keyAlg, keylen,
- kubits, kucrit, fmt, outcsr, &tokencred);
+ tokenname, subname, altname, alttype, altcrit,
+ certlabel, keyAlg, keylen,
+ kubits, kucrit, fmt, outcsr, &tokencred);
} else if (kstype == KMF_KEYSTORE_OPENSSL) {
rv = gencsr_file(kmfhandle,
- keyAlg, keylen, fmt, subname, altname,
- alttype, altcrit, kubits, kucrit,
- dir, outcsr, outkey);
+ keyAlg, keylen, fmt, subname, altname,
+ alttype, altcrit, kubits, kucrit,
+ dir, outcsr, outkey);
}
end:
if (rv != KMF_OK)
display_error(kmfhandle, rv,
- gettext("Error creating CSR or keypair"));
+ gettext("Error creating CSR or keypair"));
if (subname)
free(subname);
@@ -623,7 +741,7 @@ end:
if (tokencred.cred != NULL)
free(tokencred.cred);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
if (rv != KMF_OK)
return (PK_ERR_USAGE);
diff --git a/usr/src/cmd/cmd-crypto/pktool/genkey.c b/usr/src/cmd/cmd-crypto/pktool/genkey.c
index 55890649bb..e9a121ded7 100644
--- a/usr/src/cmd/cmd-crypto/pktool/genkey.c
+++ b/usr/src/cmd/cmd-crypto/pktool/genkey.c
@@ -42,8 +42,12 @@ genkey_nss(KMF_HANDLE_T kmfhandle, char *token, char *dir, char *prefix,
char *keylabel, KMF_KEY_ALG keyAlg, int keylen, KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv = KMF_OK;
- KMF_CREATESYMKEY_PARAMS csk_params;
KMF_KEY_HANDLE key;
+ KMF_ATTRIBUTE attlist[20];
+ int i = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
if (keylabel == NULL) {
cryptoerror(LOG_STDERR,
@@ -56,14 +60,48 @@ genkey_nss(KMF_HANDLE_T kmfhandle, char *token, char *dir, char *prefix,
return (kmfrv);
(void) memset(&key, 0, sizeof (KMF_KEY_HANDLE));
- csk_params.kstype = KMF_KEYSTORE_NSS;
- csk_params.nssparms.slotlabel = token;
- csk_params.keytype = keyAlg;
- csk_params.keylength = keylen;
- csk_params.keylabel = keylabel;
- csk_params.cred.cred = tokencred->cred;
- csk_params.cred.credlen = tokencred->credlen;
- kmfrv = KMF_CreateSymKey(kmfhandle, &csk_params, &key);
+
+ keytype = keyAlg;
+ keylength = keylen;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYALG_ATTR, &keytype, sizeof (keytype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength));
+ i++;
+
+ if (keylabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLABEL_ATTR, keylabel,
+ strlen(keylabel));
+ i++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ i++;
+ }
+
+ if (token != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_LABEL_ATTR, token,
+ strlen(token));
+ i++;
+ }
+
+ kmfrv = kmf_create_sym_key(kmfhandle, i, attlist);
return (kmfrv);
}
@@ -75,13 +113,17 @@ genkey_pkcs11(KMF_HANDLE_T kmfhandle, char *token,
KMF_CREDENTIAL *tokencred)
{
KMF_RETURN kmfrv = KMF_OK;
- KMF_CREATESYMKEY_PARAMS params;
KMF_KEY_HANDLE key;
KMF_RAW_SYM_KEY *rkey = NULL;
boolean_t sensitive = B_FALSE;
boolean_t not_extractable = B_FALSE;
char *hexstr = NULL;
int hexstrlen;
+ KMF_ATTRIBUTE attlist[20];
+ int i = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
if (keylabel == NULL) {
cryptoerror(LOG_STDERR,
@@ -122,15 +164,51 @@ genkey_pkcs11(KMF_HANDLE_T kmfhandle, char *token,
}
(void) memset(&key, 0, sizeof (KMF_KEY_HANDLE));
- params.kstype = KMF_KEYSTORE_PK11TOKEN;
- params.keytype = keyAlg;
- params.keylength = keylen; /* bits */
- params.keylabel = keylabel;
- params.pkcs11parms.sensitive = sensitive;
- params.pkcs11parms.not_extractable = not_extractable;
- params.cred.cred = tokencred->cred;
- params.cred.credlen = tokencred->credlen;
- kmfrv = KMF_CreateSymKey(kmfhandle, &params, &key);
+
+ keytype = keyAlg;
+ keylength = keylen; /* bits */
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYALG_ATTR, &keytype, sizeof (keytype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength));
+ i++;
+
+ if (keylabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLABEL_ATTR, keylabel,
+ strlen(keylabel));
+ i++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ i++;
+ }
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_SENSITIVE_BOOL_ATTR, &sensitive,
+ sizeof (sensitive));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_NON_EXTRACTABLE_BOOL_ATTR, &not_extractable,
+ sizeof (not_extractable));
+ i++;
+
+ kmfrv = kmf_create_sym_key(kmfhandle, i, attlist);
if (kmfrv != KMF_OK) {
goto out;
}
@@ -148,7 +226,7 @@ genkey_pkcs11(KMF_HANDLE_T kmfhandle, char *token,
goto out;
}
(void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY));
- kmfrv = KMF_GetSymKeyValue(kmfhandle, &key, rkey);
+ kmfrv = kmf_get_sym_key_value(kmfhandle, &key, rkey);
if (kmfrv != KMF_OK) {
goto out;
}
@@ -166,7 +244,7 @@ genkey_pkcs11(KMF_HANDLE_T kmfhandle, char *token,
}
out:
- KMF_FreeRawSymKey(rkey);
+ kmf_free_raw_sym_key(rkey);
if (hexstr != NULL)
free(hexstr);
@@ -180,11 +258,16 @@ genkey_file(KMF_HANDLE_T kmfhandle, KMF_KEY_ALG keyAlg, int keylen, char *dir,
char *outkey, boolean_t print_hex)
{
KMF_RETURN kmfrv = KMF_OK;
- KMF_CREATESYMKEY_PARAMS csk_params;
KMF_KEY_HANDLE key;
KMF_RAW_SYM_KEY *rkey = NULL;
char *hexstr = NULL;
int hexstrlen;
+ KMF_ATTRIBUTE attlist[20];
+ int i = 0;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
+ char *dirpath;
if (EMPTYSTRING(outkey)) {
cryptoerror(LOG_STDERR,
@@ -194,21 +277,50 @@ genkey_file(KMF_HANDLE_T kmfhandle, KMF_KEY_ALG keyAlg, int keylen, char *dir,
if (verify_file(outkey)) {
cryptoerror(LOG_STDERR,
- gettext("Cannot write the indicated output "
- "key file (%s).\n"), outkey);
+ gettext("Cannot write the indicated output "
+ "key file (%s).\n"), outkey);
return (KMF_ERR_BAD_PARAMETER);
}
(void) memset(&key, 0, sizeof (KMF_KEY_HANDLE));
- csk_params.kstype = KMF_KEYSTORE_OPENSSL;
- csk_params.keytype = keyAlg;
- csk_params.keylength = keylen;
- csk_params.cred.cred = NULL;
- csk_params.cred.credlen = 0;
- csk_params.sslparms.dirpath = (dir == NULL) ? "." : dir;
- csk_params.sslparms.keyfile = outkey;
-
- kmfrv = KMF_CreateSymKey(kmfhandle, &csk_params, &key);
+
+ keytype = keyAlg;
+ keylength = keylen;
+
+ dirpath = (dir == NULL) ? "." : dir;
+
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, &key, sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYALG_ATTR, &keytype, sizeof (keytype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLENGTH_ATTR, &keylength, sizeof (keylength));
+ i++;
+
+ if (dirpath != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DIRPATH_ATTR, dirpath,
+ strlen(dirpath));
+ i++;
+ }
+
+ if (outkey != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_FILENAME_ATTR, outkey,
+ strlen(outkey));
+ i++;
+ }
+
+ kmfrv = kmf_create_sym_key(kmfhandle, i, attlist);
if (kmfrv != KMF_OK) {
goto out;
}
@@ -220,7 +332,7 @@ genkey_file(KMF_HANDLE_T kmfhandle, KMF_KEY_ALG keyAlg, int keylen, char *dir,
goto out;
}
(void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY));
- kmfrv = KMF_GetSymKeyValue(kmfhandle, &key, rkey);
+ kmfrv = kmf_get_sym_key_value(kmfhandle, &key, rkey);
if (kmfrv != KMF_OK) {
goto out;
}
@@ -237,7 +349,7 @@ genkey_file(KMF_HANDLE_T kmfhandle, KMF_KEY_ALG keyAlg, int keylen, char *dir,
}
out:
- KMF_FreeRawSymKey(rkey);
+ kmf_free_raw_sym_key(rkey);
if (hexstr != NULL)
free(hexstr);
@@ -256,7 +368,7 @@ pk_genkey(int argc, char *argv[])
char *tokenname = NULL;
char *dir = NULL;
char *prefix = NULL;
- char *keytype = "AES";
+ char *keytype = "generic";
char *keylenstr = NULL;
int keylen = 0;
char *keylabel = NULL;
@@ -265,14 +377,14 @@ pk_genkey(int argc, char *argv[])
char *extstr = NULL;
char *printstr = NULL;
KMF_HANDLE_T kmfhandle = NULL;
- KMF_KEY_ALG keyAlg = KMF_AES;
+ KMF_KEY_ALG keyAlg = KMF_GENERIC_SECRET;
boolean_t print_hex = B_FALSE;
KMF_CREDENTIAL tokencred = {NULL, 0};
while ((opt = getopt_av(argc, argv,
- "k:(keystore)l:(label)T:(token)d:(dir)p:(prefix)"
- "t:(keytype)y:(keylen)K:(outkey)P:(print)"
- "s:(sensitive)e:(extractable)")) != EOF) {
+ "k:(keystore)l:(label)T:(token)d:(dir)p:(prefix)"
+ "t:(keytype)y:(keylen)K:(outkey)P:(print)"
+ "s:(sensitive)e:(extractable)")) != EOF) {
if (EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
switch (opt) {
@@ -344,7 +456,7 @@ pk_genkey(int argc, char *argv[])
/* Check keytype. If not specified, default to AES */
if (keytype != NULL && Str2SymKeyType(keytype, &keyAlg) != 0) {
cryptoerror(LOG_STDERR, gettext("Unrecognized keytype(%s).\n"),
- keytype);
+ keytype);
return (PK_ERR_USAGE);
}
@@ -362,20 +474,20 @@ pk_genkey(int argc, char *argv[])
else /* AES, ARCFOUR, or GENERIC SECRET */ {
if (keylenstr == NULL) {
cryptoerror(LOG_STDERR,
- gettext("Key length must be specified for "
- "AES, ARCFOUR or GENERIC symmetric keys.\n"));
+ gettext("Key length must be specified for "
+ "AES, ARCFOUR or GENERIC symmetric keys.\n"));
return (PK_ERR_USAGE);
}
if (sscanf(keylenstr, "%d", &keylen) != 1) {
cryptoerror(LOG_STDERR,
- gettext("Unrecognized key length (%s).\n"),
- keytype);
+ gettext("Unrecognized key length (%s).\n"),
+ keytype);
return (PK_ERR_USAGE);
}
if (keylen == 0 || (keylen % 8) != 0) {
cryptoerror(LOG_STDERR,
- gettext("Key length bitlength must be a "
- "multiple of 8.\n"));
+ gettext("Key length bitlength must be a "
+ "multiple of 8.\n"));
return (PK_ERR_USAGE);
}
}
@@ -418,7 +530,7 @@ pk_genkey(int argc, char *argv[])
if (kstype == KMF_KEYSTORE_PK11TOKEN || kstype == KMF_KEYSTORE_NSS)
(void) get_token_password(kstype, tokenname, &tokencred);
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing KMF\n"));
goto end;
}
@@ -437,12 +549,12 @@ pk_genkey(int argc, char *argv[])
end:
if (rv != KMF_OK)
display_error(kmfhandle, rv,
- gettext("Error generating key"));
+ gettext("Error generating key"));
if (tokencred.cred != NULL)
free(tokencred.cred);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
if (rv != KMF_OK)
return (PK_ERR_USAGE);
diff --git a/usr/src/cmd/cmd-crypto/pktool/import.c b/usr/src/cmd/cmd-crypto/pktool/import.c
index ac706b82ab..0efe59abb0 100644
--- a/usr/src/cmd/cmd-crypto/pktool/import.c
+++ b/usr/src/cmd/cmd-crypto/pktool/import.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -56,25 +56,38 @@ pk_import_pk12_files(KMF_HANDLE_T kmfhandle, KMF_CREDENTIAL *cred,
int ncerts = 0;
int nkeys = 0;
int i;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
- rv = KMF_ImportPK12(kmfhandle, outfile, cred,
- &certs, &ncerts, &keys, &nkeys);
+ rv = kmf_import_objects(kmfhandle, outfile, cred,
+ &certs, &ncerts, &keys, &nkeys);
if (rv == KMF_OK) {
(void) printf(gettext("Found %d certificate(s) and %d "
- "key(s) in %s\n"), ncerts, nkeys, outfile);
+ "key(s) in %s\n"), ncerts, nkeys, outfile);
}
if (rv == KMF_OK && ncerts > 0) {
- KMF_STORECERT_PARAMS params;
char newcertfile[MAXPATHLEN];
- (void) memset(&params, 0, sizeof (KMF_STORECERT_PARAMS));
- params.kstype = KMF_KEYSTORE_OPENSSL;
- params.sslparms.dirpath = dir;
- params.sslparms.format = outformat;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &outformat, sizeof (outformat));
+ numattr++;
for (i = 0; rv == KMF_OK && i < ncerts; i++) {
+ int num = numattr;
+
/*
* If storing more than 1 cert, gotta change
* the name so we don't overwrite the previous one.
@@ -82,40 +95,84 @@ pk_import_pk12_files(KMF_HANDLE_T kmfhandle, KMF_CREDENTIAL *cred,
*/
if (i > 0) {
(void) snprintf(newcertfile,
- sizeof (newcertfile),
- "%s_%d", certfile, i);
- params.sslparms.certfile = newcertfile;
+ sizeof (newcertfile), "%s_%d", certfile, i);
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_FILENAME_ATTR, newcertfile,
+ strlen(newcertfile));
+ num++;
} else {
- params.sslparms.certfile = certfile;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_FILENAME_ATTR, certfile,
+ strlen(certfile));
+ num++;
}
- rv = KMF_StoreCert(kmfhandle, &params, &certs[i]);
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i], sizeof (KMF_DATA));
+ num++;
+ rv = kmf_store_cert(kmfhandle, num, attrlist);
}
}
if (rv == KMF_OK && nkeys > 0) {
- KMF_STOREKEY_PARAMS skparms;
char newkeyfile[MAXPATHLEN];
- (void) memset(&skparms, 0, sizeof (skparms));
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (keydir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, keydir,
+ strlen(keydir));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &outformat,
+ sizeof (outformat));
+ numattr++;
+
+ if (cred != NULL && cred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, cred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
/* The order of certificates and keys should match */
for (i = 0; rv == KMF_OK && i < nkeys; i++) {
- skparms.kstype = KMF_KEYSTORE_OPENSSL;
- skparms.sslparms.dirpath = keydir;
- skparms.sslparms.format = outformat;
- skparms.cred = *cred;
- skparms.certificate = &certs[i];
+ int num = numattr;
if (i > 0) {
(void) snprintf(newkeyfile,
- sizeof (newkeyfile),
- "%s_%d", keyfile, i);
- skparms.sslparms.keyfile = newkeyfile;
+ sizeof (newkeyfile), "%s_%d", keyfile, i);
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEY_FILENAME_ATTR, newkeyfile,
+ strlen(newkeyfile));
+ num++;
} else {
- skparms.sslparms.keyfile = keyfile;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEY_FILENAME_ATTR, keyfile,
+ strlen(keyfile));
+ num++;
}
- rv = KMF_StorePrivateKey(kmfhandle, &skparms,
- &keys[i]);
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i],
+ sizeof (KMF_DATA));
+ num++;
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_RAW_KEY_ATTR, &keys[i],
+ sizeof (KMF_RAW_KEY_DATA));
+ num++;
+
+ rv = kmf_store_key(kmfhandle, num, attrlist);
}
}
/*
@@ -123,12 +180,12 @@ pk_import_pk12_files(KMF_HANDLE_T kmfhandle, KMF_CREDENTIAL *cred,
*/
if (certs) {
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
free(certs);
}
if (keys) {
for (i = 0; i < nkeys; i++)
- KMF_FreeRawKey(&keys[i]);
+ kmf_free_raw_key(&keys[i]);
free(keys);
}
@@ -150,55 +207,105 @@ pk_import_pk12_nss(
int ncerts = 0;
int nkeys = 0;
int i;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- rv = KMF_ImportPK12(kmfhandle, filename, kmfcred,
- &certs, &ncerts, &keys, &nkeys);
+ rv = kmf_import_objects(kmfhandle, filename, kmfcred,
+ &certs, &ncerts, &keys, &nkeys);
if (rv == KMF_OK)
(void) printf(gettext("Found %d certificate(s) and %d "
- "key(s) in %s\n"), ncerts, nkeys, filename);
+ "key(s) in %s\n"), ncerts, nkeys, filename);
if (rv == KMF_OK) {
- KMF_STORECERT_PARAMS params;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token_spec,
+ strlen(token_spec));
+ numattr++;
+ }
- (void) memset(&params, 0, sizeof (KMF_STORECERT_PARAMS));
- params.kstype = KMF_KEYSTORE_NSS;
- params.nssparms.slotlabel = token_spec;
- params.nssparms.trustflag = trustflags;
+ if (trustflags != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TRUSTFLAG_ATTR, trustflags,
+ strlen(trustflags));
+ numattr++;
+ }
for (i = 0; rv == KMF_OK && i < ncerts; i++) {
- if (i == 0)
- params.certLabel = nickname;
- else
- params.certLabel = NULL;
+ int num = numattr;
- rv = KMF_StoreCert(kmfhandle, &params, &certs[i]);
+ if (i == 0 && nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_LABEL_ATTR, nickname,
+ strlen(nickname));
+ num++;
+ }
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i], sizeof (KMF_DATA));
+ num++;
+ rv = kmf_store_cert(kmfhandle, num, attrlist);
}
if (rv != KMF_OK) {
display_error(kmfhandle, rv,
- gettext("Error storing certificate "
- "in PKCS11 token"));
+ gettext("Error storing certificate in NSS token"));
}
}
if (rv == KMF_OK) {
- KMF_STOREKEY_PARAMS skparms;
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token_spec,
+ strlen(token_spec));
+ numattr++;
+ }
+
+ if (nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, nickname,
+ strlen(nickname));
+ numattr++;
+ }
+
+ if (tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
/* The order of certificates and keys should match */
for (i = 0; i < nkeys; i++) {
- (void) memset(&skparms, 0,
- sizeof (KMF_STOREKEY_PARAMS));
- skparms.kstype = KMF_KEYSTORE_NSS;
- skparms.cred = *tokencred;
- skparms.label = nickname;
- skparms.certificate = &certs[i];
- skparms.nssparms.slotlabel = token_spec;
+ int num = numattr;
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i],
+ sizeof (KMF_DATA));
+ num++;
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_RAW_KEY_ATTR, &keys[i],
+ sizeof (KMF_RAW_KEY_DATA));
+ num++;
- rv = KMF_StorePrivateKey(kmfhandle, &skparms, &keys[i]);
+ rv = kmf_store_key(kmfhandle, num, attrlist);
}
}
@@ -207,12 +314,12 @@ pk_import_pk12_nss(
*/
if (certs) {
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
free(certs);
}
if (keys) {
for (i = 0; i < nkeys; i++)
- KMF_FreeRawKey(&keys[i]);
+ kmf_free_raw_key(&keys[i]);
free(keys);
}
@@ -227,31 +334,47 @@ pk_import_cert(
char *dir, char *prefix, char *trustflags)
{
KMF_RETURN rv = KMF_OK;
- KMF_IMPORTCERT_PARAMS params;
+ KMF_ATTRIBUTE attrlist[32];
+ int i = 0;
if (kstype == KMF_KEYSTORE_PK11TOKEN) {
rv = select_token(kmfhandle, token_spec, FALSE);
-
- if (rv != KMF_OK) {
- return (rv);
- }
+ } else if (kstype == KMF_KEYSTORE_NSS) {
+ rv = configure_nss(kmfhandle, dir, prefix);
}
+ if (rv != KMF_OK)
+ return (rv);
- (void) memset(&params, 0, sizeof (params));
- params.kstype = kstype;
- params.certfile = filename;
- params.certLabel = label;
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (KMF_KEYSTORE_TYPE));
+ i++;
- if (kstype == KMF_KEYSTORE_NSS) {
- rv = configure_nss(kmfhandle, dir, prefix);
- if (rv != KMF_OK)
- return (rv);
- params.nssparms.trustflag = trustflags;
- params.nssparms.slotlabel = token_spec;
+ kmf_set_attr_at_index(attrlist, i, KMF_CERT_FILENAME_ATTR,
+ filename, strlen(filename));
+ i++;
+
+ if (label != NULL) {
+ kmf_set_attr_at_index(attrlist, i, KMF_CERT_LABEL_ATTR,
+ label, strlen(label));
+ i++;
}
- rv = KMF_ImportCert(kmfhandle, &params);
+ if (kstype == KMF_KEYSTORE_NSS) {
+ if (trustflags != NULL) {
+ kmf_set_attr_at_index(attrlist, i, KMF_TRUSTFLAG_ATTR,
+ trustflags, strlen(trustflags));
+ i++;
+ }
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_TOKEN_LABEL_ATTR,
+ token_spec, strlen(token_spec));
+ i++;
+ }
+ }
+
+ rv = kmf_import_cert(kmfhandle, i, attrlist);
return (rv);
}
@@ -262,20 +385,33 @@ pk_import_file_crl(void *kmfhandle,
char *outdir,
KMF_ENCODE_FORMAT outfmt)
{
- KMF_IMPORTCRL_PARAMS icrl_params;
- KMF_OPENSSL_PARAMS sslparams;
-
- sslparams.crlfile = infile;
- sslparams.dirpath = outdir;
- sslparams.outcrlfile = outfile;
- sslparams.format = outfmt;
- sslparams.crl_check = B_FALSE;
-
- icrl_params.kstype = KMF_KEYSTORE_OPENSSL;
- icrl_params.sslparms = sslparams;
-
- return (KMF_ImportCRL(kmfhandle, &icrl_params));
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[8];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+ if (infile) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_FILENAME_ATTR, infile, strlen(infile));
+ numattr++;
+ }
+ if (outdir) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, outdir, strlen(outdir));
+ numattr++;
+ }
+ if (outfile) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_OUTFILE_ATTR, outfile, strlen(outfile));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ENCODE_FORMAT_ATTR, &outfmt, sizeof (outfmt));
+ numattr++;
+ return (kmf_import_crl(kmfhandle, numattr, attrlist));
}
static KMF_RETURN
@@ -285,19 +421,28 @@ pk_import_nss_crl(void *kmfhandle,
char *outdir,
char *prefix)
{
- KMF_IMPORTCRL_PARAMS icrl_params;
KMF_RETURN rv;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[4];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
rv = configure_nss(kmfhandle, outdir, prefix);
if (rv != KMF_OK)
return (rv);
- icrl_params.kstype = KMF_KEYSTORE_NSS;
- icrl_params.nssparms.slotlabel = NULL;
- icrl_params.nssparms.crlfile = infile;
- icrl_params.nssparms.crl_check = verify_crl_flag;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+ if (infile) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_FILENAME_ATTR,
+ infile, strlen(infile));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_CHECK_ATTR,
+ &verify_crl_flag, sizeof (verify_crl_flag));
+ numattr++;
- return (KMF_ImportCRL(kmfhandle, &icrl_params));
+ return (kmf_import_crl(kmfhandle, numattr, attrlist));
}
@@ -315,6 +460,9 @@ pk_import_pk12_pk11(
int ncerts = 0;
int nkeys = 0;
int i;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
rv = select_token(kmfhandle, token_spec, FALSE);
@@ -322,46 +470,72 @@ pk_import_pk12_pk11(
return (rv);
}
- rv = KMF_ImportPK12(kmfhandle, filename, p12cred,
- &certs, &ncerts, &keys, &nkeys);
+ rv = kmf_import_objects(kmfhandle, filename, p12cred,
+ &certs, &ncerts, &keys, &nkeys);
if (rv == KMF_OK) {
- KMF_STOREKEY_PARAMS skparms;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (label != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, label,
+ strlen(label));
+ numattr++;
+ }
+
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
/* The order of certificates and keys should match */
for (i = 0; i < nkeys; i++) {
- (void) memset(&skparms, 0,
- sizeof (KMF_STOREKEY_PARAMS));
- skparms.kstype = KMF_KEYSTORE_PK11TOKEN;
- skparms.certificate = &certs[i];
- if (tokencred != NULL)
- skparms.cred = *tokencred;
- if (i == 0)
- skparms.label = label;
- else
- skparms.label = NULL;
+ int num = numattr;
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i],
+ sizeof (KMF_DATA));
+ num++;
+
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_RAW_KEY_ATTR, &keys[i],
+ sizeof (KMF_RAW_KEY_DATA));
+ num++;
+
+ rv = kmf_store_key(kmfhandle, num, attrlist);
- rv = KMF_StorePrivateKey(kmfhandle, &skparms,
- &keys[i]);
}
}
if (rv == KMF_OK) {
- KMF_STORECERT_PARAMS params;
(void) printf(gettext("Found %d certificate(s) and %d "
- "key(s) in %s\n"), ncerts, nkeys, filename);
- (void) memset(&params, 0, sizeof (KMF_STORECERT_PARAMS));
-
- params.kstype = KMF_KEYSTORE_PK11TOKEN;
+ "key(s) in %s\n"), ncerts, nkeys, filename);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
for (i = 0; rv == KMF_OK && i < ncerts; i++) {
- if (i == 0)
- params.certLabel = label;
- else
- params.certLabel = NULL;
+ int num = numattr;
+
+ if (i == 0 && label != NULL) {
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_LABEL_ATTR, label, strlen(label));
+ num++;
+ }
- rv = KMF_StoreCert(kmfhandle, &params, &certs[i]);
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CERT_DATA_ATTR, &certs[i], sizeof (KMF_DATA));
+ num++;
+
+ rv = kmf_store_cert(kmfhandle, num, attrlist);
}
}
@@ -370,18 +544,199 @@ pk_import_pk12_pk11(
*/
if (certs) {
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
free(certs);
}
if (keys) {
for (i = 0; i < nkeys; i++)
- KMF_FreeRawKey(&keys[i]);
+ kmf_free_raw_key(&keys[i]);
free(keys);
}
return (rv);
}
+static KMF_RETURN
+pk_import_keys(KMF_HANDLE_T kmfhandle,
+ KMF_KEYSTORE_TYPE kstype, char *token_spec,
+ KMF_CREDENTIAL *cred, char *filename,
+ char *label, char *senstr, char *extstr)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEYSTORE_TYPE fileks = KMF_KEYSTORE_OPENSSL;
+ int numattr = 0;
+ KMF_KEY_HANDLE key;
+ KMF_RAW_KEY_DATA rawkey;
+ KMF_KEY_CLASS class = KMF_ASYM_PRI;
+ int numkeys = 1;
+
+ if (kstype == KMF_KEYSTORE_PK11TOKEN) {
+ rv = select_token(kmfhandle, token_spec, FALSE);
+ }
+ if (rv != KMF_OK)
+ return (rv);
+ /*
+ * First, set up to read the keyfile using the FILE plugin
+ * mechanisms.
+ */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &fileks, sizeof (fileks));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &numkeys, sizeof (numkeys));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &key, sizeof (key));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_RAW_KEY_ATTR,
+ &rawkey, sizeof (rawkey));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYCLASS_ATTR,
+ &class, sizeof (class));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+
+ rv = kmf_find_key(kmfhandle, numattr, attrlist);
+ if (rv == KMF_OK) {
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (cred != NULL && cred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (label != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, label, strlen(label));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_RAW_KEY_ATTR, &rawkey, sizeof (rawkey));
+ numattr++;
+
+ rv = kmf_store_key(kmfhandle, numattr, attrlist);
+ if (rv == KMF_OK) {
+ printf(gettext("Importing %d keys\n"), numkeys);
+ }
+
+ kmf_free_kmf_key(kmfhandle, &key);
+ kmf_free_raw_key(&rawkey);
+ } else {
+ cryptoerror(LOG_STDERR,
+ gettext("Failed to load key from file (%s)\n"),
+ filename);
+ }
+ return (rv);
+}
+
+static KMF_RETURN
+pk_import_rawkey(KMF_HANDLE_T kmfhandle,
+ KMF_KEYSTORE_TYPE kstype, char *token,
+ KMF_CREDENTIAL *cred,
+ char *filename, char *label, KMF_KEY_ALG keyAlg,
+ char *senstr, char *extstr)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
+ uint32_t keylen;
+ boolean_t sensitive = B_FALSE;
+ boolean_t not_extractable = B_FALSE;
+ KMF_DATA keydata = {NULL, 0};
+ KMF_KEY_HANDLE rawkey;
+
+ rv = kmf_read_input_file(kmfhandle, filename, &keydata);
+ if (rv != KMF_OK)
+ return (rv);
+
+ rv = select_token(kmfhandle, token, FALSE);
+
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+ if (senstr != NULL) {
+ if (tolower(senstr[0]) == 'y')
+ sensitive = B_TRUE;
+ else if (tolower(senstr[0]) == 'n')
+ sensitive = B_FALSE;
+ else {
+ cryptoerror(LOG_STDERR,
+ gettext("Incorrect sensitive option value.\n"));
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+ }
+
+ if (extstr != NULL) {
+ if (tolower(extstr[0]) == 'y')
+ not_extractable = B_FALSE;
+ else if (tolower(extstr[0]) == 'n')
+ not_extractable = B_TRUE;
+ else {
+ cryptoerror(LOG_STDERR,
+ gettext("Incorrect extractable option value.\n"));
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+ }
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_HANDLE_ATTR, &rawkey, sizeof (rawkey));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYALG_ATTR, &keyAlg, sizeof (KMF_KEY_ALG));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_DATA_ATTR, keydata.Data, keydata.Length);
+ numattr++;
+
+ /* Key length is given in bits not bytes */
+ keylen = keydata.Length * 8;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLENGTH_ATTR, &keylen, sizeof (keydata.Length));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SENSITIVE_BOOL_ATTR, &sensitive, sizeof (sensitive));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_NON_EXTRACTABLE_BOOL_ATTR, &not_extractable,
+ sizeof (not_extractable));
+ numattr++;
+
+ if (label != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, label, strlen(label));
+ numattr++;
+ }
+ if (cred != NULL && cred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+ rv = kmf_create_sym_key(kmfhandle, numattr, attrlist);
+
+ return (rv);
+}
+
/*
* Import objects from into KMF repositories.
*/
@@ -396,12 +751,15 @@ pk_import(int argc, char *argv[])
char *keyfile = NULL;
char *certfile = NULL;
char *crlfile = NULL;
- char *certlabel = NULL;
+ char *label = NULL;
char *dir = NULL;
char *keydir = NULL;
char *prefix = NULL;
char *trustflags = NULL;
char *verify_crl = NULL;
+ char *keytype = "generic";
+ char *senstr = NULL;
+ char *extstr = NULL;
boolean_t verify_crl_flag = B_FALSE;
int oclass = 0;
KMF_KEYSTORE_TYPE kstype = 0;
@@ -411,16 +769,18 @@ pk_import(int argc, char *argv[])
KMF_CREDENTIAL pk12cred = { NULL, 0 };
KMF_CREDENTIAL tokencred = { NULL, 0 };
KMF_HANDLE_T kmfhandle = NULL;
+ KMF_KEY_ALG keyAlg = KMF_GENERIC_SECRET;
/* Parse command line options. Do NOT i18n/l10n. */
while ((opt = getopt_av(argc, argv,
- "T:(token)i:(infile)"
- "k:(keystore)y:(objtype)"
- "d:(dir)p:(prefix)"
- "n:(certlabel)N:(label)"
- "K:(outkey)c:(outcert)"
- "v:(verifycrl)l:(outcrl)"
- "t:(trust)D:(keydir)F:(outformat)")) != EOF) {
+ "T:(token)i:(infile)"
+ "k:(keystore)y:(objtype)"
+ "d:(dir)p:(prefix)"
+ "n:(certlabel)N:(label)"
+ "K:(outkey)c:(outcert)"
+ "v:(verifycrl)l:(outcrl)"
+ "E:(keytype)s:(sensitive)x:(extractable)"
+ "t:(trust)D:(keydir)F:(outformat)")) != EOF) {
if (EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
switch (opt) {
@@ -472,9 +832,9 @@ pk_import(int argc, char *argv[])
break;
case 'n':
case 'N':
- if (certlabel)
+ if (label)
return (PK_ERR_USAGE);
- certlabel = optarg_av;
+ label = optarg_av;
break;
case 'F':
okfmt = Str2Format(optarg_av);
@@ -495,6 +855,19 @@ pk_import(int argc, char *argv[])
else
return (PK_ERR_USAGE);
break;
+ case 'E':
+ keytype = optarg_av;
+ break;
+ case 's':
+ if (senstr)
+ return (PK_ERR_USAGE);
+ senstr = optarg_av;
+ break;
+ case 'x':
+ if (extstr)
+ return (PK_ERR_USAGE);
+ extstr = optarg_av;
+ break;
default:
return (PK_ERR_USAGE);
break;
@@ -508,7 +881,7 @@ pk_import(int argc, char *argv[])
/* Filename arg is required. */
if (EMPTYSTRING(filename)) {
cryptoerror(LOG_STDERR, gettext("The 'infile' parameter"
- "is required for the import operation.\n"));
+ "is required for the import operation.\n"));
return (PK_ERR_USAGE);
}
@@ -520,10 +893,10 @@ pk_import(int argc, char *argv[])
/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
- kstype != KMF_KEYSTORE_PK11TOKEN) {
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
(void) fprintf(stderr, gettext("The objtype parameter "
- "is only relevant if keystore=pkcs11\n"));
+ "is only relevant if keystore=pkcs11\n"));
return (PK_ERR_USAGE);
}
@@ -532,57 +905,85 @@ pk_import(int argc, char *argv[])
* into NSS or PKCS#11.
*/
if (kstype == KMF_KEYSTORE_NSS &&
- (oclass != PK_CRL_OBJ) && EMPTYSTRING(certlabel)) {
+ (oclass != PK_CRL_OBJ) && EMPTYSTRING(label)) {
cryptoerror(LOG_STDERR, gettext("The 'label' argument "
- "is required for this operation\n"));
+ "is required for this operation\n"));
return (PK_ERR_USAGE);
}
- /*
- * PKCS11 only imports PKCS#12 files or PEM/DER Cert files.
- */
- if (kstype == KMF_KEYSTORE_PK11TOKEN) {
- /* we do not import private keys except in PKCS12 bundles */
- if (oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)) {
- cryptoerror(LOG_STDERR, gettext(
- "The PKCS11 keystore only imports PKCS12 "
- "files or raw certificate data files "
- " or CRL file.\n"));
- return (PK_ERR_USAGE);
+ if ((rv = kmf_get_file_format(filename, &kfmt)) != KMF_OK) {
+ /*
+ * Allow for raw key data to be imported.
+ */
+ if (rv == KMF_ERR_ENCODING) {
+ rv = KMF_OK;
+ kfmt = KMF_FORMAT_RAWKEY;
+ /*
+ * Set the object class only if it was not
+ * given on the command line or if it was
+ * specified as a symmetric key object.
+ */
+ if (oclass == 0 || (oclass & PK_SYMKEY_OBJ)) {
+ oclass = PK_SYMKEY_OBJ;
+ } else {
+ cryptoerror(LOG_STDERR, gettext(
+ "The input file does not contain the "
+ "object type indicated on command "
+ "line."));
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+ } else {
+ cryptoerror(LOG_STDERR,
+ gettext("File format not recognized."));
+ return (rv);
}
}
- if ((rv = KMF_GetFileFormat(filename, &kfmt)) != KMF_OK) {
- cryptoerror(LOG_STDERR,
- gettext("File format not recognized."));
- return (rv);
+ /* Check parameters for raw key import operation */
+ if (kfmt == KMF_FORMAT_RAWKEY) {
+ if (keytype != NULL &&
+ Str2SymKeyType(keytype, &keyAlg) != 0) {
+ cryptoerror(LOG_STDERR,
+ gettext("Unrecognized keytype(%s).\n"), keytype);
+ return (PK_ERR_USAGE);
+ }
+ if (senstr != NULL && extstr != NULL &&
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
+ cryptoerror(LOG_STDERR,
+ gettext("The sensitive or extractable option "
+ "applies only when importing a key from a file "
+ "into a PKCS#11 keystore.\n"));
+ return (PK_ERR_USAGE);
+ }
}
+
+ /* If no objtype was given, treat it as a certificate */
if (oclass == 0 && (kfmt == KMF_FORMAT_ASN1 ||
- kfmt == KMF_FORMAT_PEM))
+ kfmt == KMF_FORMAT_PEM))
oclass = PK_CERT_OBJ;
if (kstype == KMF_KEYSTORE_NSS) {
if (oclass == PK_CRL_OBJ &&
- (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) {
+ (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) {
cryptoerror(LOG_STDERR, gettext(
- "CRL data can only be imported as DER or "
- "PEM format"));
+ "CRL data can only be imported as DER or "
+ "PEM format"));
return (PK_ERR_USAGE);
}
if (oclass == PK_CERT_OBJ &&
- (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) {
+ (kfmt != KMF_FORMAT_ASN1 && kfmt != KMF_FORMAT_PEM)) {
cryptoerror(LOG_STDERR, gettext(
- "Certificates can only be imported as DER or "
- "PEM format"));
+ "Certificates can only be imported as DER or "
+ "PEM format"));
return (PK_ERR_USAGE);
}
/* we do not import private keys except in PKCS12 bundles */
if (oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)) {
cryptoerror(LOG_STDERR, gettext(
- "Private key data can only be imported as part "
- "of a PKCS12 file.\n"));
+ "Private key data can only be imported as part "
+ "of a PKCS12 file.\n"));
return (PK_ERR_USAGE);
}
}
@@ -590,9 +991,9 @@ pk_import(int argc, char *argv[])
if (kstype == KMF_KEYSTORE_OPENSSL && oclass != PK_CRL_OBJ) {
if (EMPTYSTRING(keyfile) || EMPTYSTRING(certfile)) {
cryptoerror(LOG_STDERR, gettext(
- "The 'outkey' and 'outcert' parameters "
- "are required for the import operation "
- "when the 'file' keystore is used.\n"));
+ "The 'outkey' and 'outcert' parameters "
+ "are required for the import operation "
+ "when the 'file' keystore is used.\n"));
return (PK_ERR_USAGE);
}
}
@@ -604,16 +1005,17 @@ pk_import(int argc, char *argv[])
if (kfmt == KMF_FORMAT_PKCS12) {
(void) get_pk12_password(&pk12cred);
+ }
- if (kstype == KMF_KEYSTORE_PK11TOKEN ||
- kstype == KMF_KEYSTORE_NSS)
- (void) get_token_password(kstype, token_spec,
- &tokencred);
+ if ((kfmt == KMF_FORMAT_PKCS12 || kfmt == KMF_FORMAT_RAWKEY ||
+ (kfmt == KMF_FORMAT_PEM && (oclass & PK_KEY_OBJ))) &&
+ (kstype == KMF_KEYSTORE_PK11TOKEN || kstype == KMF_KEYSTORE_NSS)) {
+ (void) get_token_password(kstype, token_spec, &tokencred);
}
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
cryptoerror(LOG_STDERR, gettext("Error initializing "
- "KMF: 0x%02x\n"), rv);
+ "KMF: 0x%02x\n"), rv);
goto end;
}
@@ -621,64 +1023,64 @@ pk_import(int argc, char *argv[])
case KMF_KEYSTORE_PK11TOKEN:
if (kfmt == KMF_FORMAT_PKCS12)
rv = pk_import_pk12_pk11(
- kmfhandle,
- &pk12cred,
- &tokencred,
- certlabel,
- token_spec,
- filename);
+ kmfhandle, &pk12cred,
+ &tokencred, label,
+ token_spec, filename);
else if (oclass == PK_CERT_OBJ)
rv = pk_import_cert(
- kmfhandle,
- kstype,
- certlabel,
- token_spec,
- filename,
- NULL, NULL, NULL);
+ kmfhandle, kstype,
+ label, token_spec,
+ filename,
+ NULL, NULL, NULL);
else if (oclass == PK_CRL_OBJ)
rv = pk_import_file_crl(
- kmfhandle,
- filename,
- crlfile,
- dir,
- okfmt);
+ kmfhandle, filename,
+ crlfile, dir, okfmt);
+ else if (kfmt == KMF_FORMAT_RAWKEY &&
+ oclass == PK_SYMKEY_OBJ) {
+ rv = pk_import_rawkey(kmfhandle,
+ kstype, token_spec, &tokencred,
+ filename, label,
+ keyAlg, senstr, extstr);
+ } else if (kfmt == KMF_FORMAT_PEM ||
+ kfmt == KMF_FORMAT_PEM_KEYPAIR) {
+ rv = pk_import_keys(kmfhandle,
+ kstype, token_spec, &tokencred,
+ filename, label, senstr, extstr);
+ } else {
+ rv = PK_ERR_USAGE;
+ }
break;
case KMF_KEYSTORE_NSS:
if (dir == NULL)
dir = PK_DEFAULT_DIRECTORY;
if (kfmt == KMF_FORMAT_PKCS12)
rv = pk_import_pk12_nss(
- kmfhandle, &pk12cred,
- &tokencred,
- token_spec, dir, prefix,
- certlabel, trustflags, filename);
+ kmfhandle, &pk12cred,
+ &tokencred,
+ token_spec, dir, prefix,
+ label, trustflags, filename);
else if (oclass == PK_CERT_OBJ) {
rv = pk_import_cert(
- kmfhandle, kstype,
- certlabel, token_spec,
- filename, dir, prefix, trustflags);
+ kmfhandle, kstype,
+ label, token_spec,
+ filename, dir, prefix, trustflags);
} else if (oclass == PK_CRL_OBJ) {
rv = pk_import_nss_crl(
- kmfhandle,
- verify_crl_flag,
- filename,
- dir,
- prefix);
+ kmfhandle, verify_crl_flag,
+ filename, dir, prefix);
}
break;
case KMF_KEYSTORE_OPENSSL:
if (kfmt == KMF_FORMAT_PKCS12)
rv = pk_import_pk12_files(
- kmfhandle, &pk12cred,
- filename, certfile, keyfile,
- dir, keydir, okfmt);
+ kmfhandle, &pk12cred,
+ filename, certfile, keyfile,
+ dir, keydir, okfmt);
else if (oclass == PK_CRL_OBJ) {
rv = pk_import_file_crl(
- kmfhandle,
- filename,
- crlfile,
- dir,
- okfmt);
+ kmfhandle, filename,
+ crlfile, dir, okfmt);
} else
/*
* It doesn't make sense to import anything
@@ -694,7 +1096,7 @@ pk_import(int argc, char *argv[])
end:
if (rv != KMF_OK)
display_error(kmfhandle, rv,
- gettext("Error importing objects"));
+ gettext("Error importing objects"));
if (tokencred.cred != NULL)
free(tokencred.cred);
@@ -702,7 +1104,7 @@ end:
if (pk12cred.cred != NULL)
free(pk12cred.cred);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
if (rv != KMF_OK)
return (PK_ERR_USAGE);
diff --git a/usr/src/cmd/cmd-crypto/pktool/list.c b/usr/src/cmd/cmd-crypto/pktool/list.c
index 0317da28b7..01dc537c8b 100644
--- a/usr/src/cmd/cmd-crypto/pktool/list.c
+++ b/usr/src/cmd/cmd-crypto/pktool/list.c
@@ -46,6 +46,7 @@ pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
{
int i;
char *subject, *issuer, *serial, *id, *altname;
+ char *start, *end, *keyusage, *extkeyusage;
for (i = 0; i < num_certs; i++) {
subject = NULL;
@@ -53,42 +54,66 @@ pk_show_certs(KMF_HANDLE_T kmfhandle, KMF_X509_DER_CERT *certs, int num_certs)
serial = NULL;
id = NULL;
altname = NULL;
+ start = end = NULL;
+ keyusage = extkeyusage = NULL;
(void) fprintf(stdout,
- gettext("%d. (X.509 certificate)\n"), i + 1);
+ gettext("%d. (X.509 certificate)\n"), i + 1);
if (certs[i].kmf_private.label != NULL)
(void) fprintf(stdout, gettext("\t%s: %s\n"),
- (certs[i].kmf_private.keystore_type ==
- KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"),
- certs[i].kmf_private.label);
- if (KMF_GetCertIDString(&certs[i].certificate,
- &id) == KMF_OK)
+ (certs[i].kmf_private.keystore_type ==
+ KMF_KEYSTORE_OPENSSL ? "Filename" : "Label"),
+ certs[i].kmf_private.label);
+ if (kmf_get_cert_id_str(&certs[i].certificate,
+ &id) == KMF_OK)
(void) fprintf(stdout, gettext("\tID: %s\n"), id);
- if (KMF_GetCertSubjectNameString(kmfhandle,
- &certs[i].certificate, &subject) == KMF_OK)
+ if (kmf_get_cert_subject_str(kmfhandle,
+ &certs[i].certificate, &subject) == KMF_OK)
(void) fprintf(stdout, gettext("\tSubject: %s\n"),
- subject);
- if (KMF_GetCertIssuerNameString(kmfhandle,
- &certs[i].certificate, &issuer) == KMF_OK)
+ subject);
+ if (kmf_get_cert_issuer_str(kmfhandle,
+ &certs[i].certificate, &issuer) == KMF_OK)
(void) fprintf(stdout, gettext("\tIssuer: %s\n"),
- issuer);
- if (KMF_GetCertSerialNumberString(kmfhandle,
- &certs[i].certificate, &serial) == KMF_OK)
+ issuer);
+ if (kmf_get_cert_start_date_str(kmfhandle,
+ &certs[i].certificate, &start) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tNot Before: %s\n"),
+ start);
+ if (kmf_get_cert_end_date_str(kmfhandle,
+ &certs[i].certificate, &end) == KMF_OK)
+ (void) fprintf(stdout, gettext("\tNot After: %s\n"),
+ end);
+ if (kmf_get_cert_serial_str(kmfhandle,
+ &certs[i].certificate, &serial) == KMF_OK)
(void) fprintf(stdout, gettext("\tSerial: %s\n"),
- serial);
-
- if (KMF_GetCertExtensionString(kmfhandle,
- &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
- &altname) == KMF_OK) {
+ serial);
+ if (kmf_get_cert_extn_str(kmfhandle,
+ &certs[i].certificate, KMF_X509_EXT_SUBJ_ALTNAME,
+ &altname) == KMF_OK) {
(void) fprintf(stdout, gettext("\t%s\n"),
- altname);
+ altname);
}
-
- KMF_FreeString(subject);
- KMF_FreeString(issuer);
- KMF_FreeString(serial);
- KMF_FreeString(id);
- KMF_FreeString(altname);
+ if (kmf_get_cert_extn_str(kmfhandle,
+ &certs[i].certificate, KMF_X509_EXT_KEY_USAGE,
+ &keyusage) == KMF_OK) {
+ (void) fprintf(stdout, gettext("\t%s\n"),
+ keyusage);
+ }
+ if (kmf_get_cert_extn_str(kmfhandle,
+ &certs[i].certificate, KMF_X509_EXT_EXT_KEY_USAGE,
+ &extkeyusage) == KMF_OK) {
+ (void) fprintf(stdout, gettext("\t%s\n"),
+ extkeyusage);
+ }
+ kmf_free_str(subject);
+ kmf_free_str(issuer);
+ kmf_free_str(serial);
+ kmf_free_str(id);
+ kmf_free_str(altname);
+ kmf_free_str(keyusage);
+ kmf_free_str(extkeyusage);
+ kmf_free_str(start);
+ kmf_free_str(end);
(void) fprintf(stdout, "\n");
}
}
@@ -140,20 +165,36 @@ pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
for (i = 0; i < numkeys; i++) {
(void) fprintf(stdout, gettext("Key #%d - %s: %s"),
- i+1, describeKey(&keys[i]),
- keys[i].keylabel ? keys[i].keylabel :
- gettext("No label"));
+ i+1, describeKey(&keys[i]),
+ keys[i].keylabel ? keys[i].keylabel :
+ gettext("No label"));
if (keys[i].keyclass == KMF_SYMMETRIC) {
KMF_RETURN rv;
KMF_RAW_SYM_KEY rkey;
- rv = KMF_GetSymKeyValue(handle, &keys[i],
- &rkey);
+ (void) memset(&rkey, 0, sizeof (rkey));
+ rv = kmf_get_sym_key_value(handle, &keys[i],
+ &rkey);
if (rv == KMF_OK) {
(void) fprintf(stdout, " (%d bits)",
- rkey.keydata.len * 8);
- KMF_FreeRawSymKey(&rkey);
+ rkey.keydata.len * 8);
+ kmf_free_bigint(&rkey.keydata);
+ } else if (keys[i].kstype == KMF_KEYSTORE_PK11TOKEN) {
+ if (rv == KMF_ERR_SENSITIVE_KEY) {
+ (void) fprintf(stdout, " (sensitive)");
+ } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
+ (void) fprintf(stdout,
+ " (non-extractable)");
+ } else {
+ char *err = NULL;
+ if (kmf_get_kmf_error_str(rv, &err) ==
+ KMF_OK)
+ (void) fprintf(stdout,
+ " (error: %s)", err);
+ if (err != NULL)
+ free(err);
+ }
}
}
(void) fprintf(stdout, "\n");
@@ -165,69 +206,97 @@ pk_show_keys(void *handle, KMF_KEY_HANDLE *keys, int numkeys)
* all matching certificates.
*/
static KMF_RETURN
-pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_FINDCERT_PARAMS *params)
+pk_find_certs(KMF_HANDLE_T kmfhandle, KMF_ATTRIBUTE *attrlist, int numattr)
{
KMF_RETURN rv = KMF_OK;
KMF_X509_DER_CERT *certlist = NULL;
uint32_t numcerts = 0;
+ KMF_KEYSTORE_TYPE kstype;
+
+ rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (rv != KMF_OK)
+ return (rv);
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &numcerts, sizeof (uint32_t));
+ numattr++;
- numcerts = 0;
- rv = KMF_FindCert(kmfhandle, params, NULL, &numcerts);
+ rv = kmf_find_cert(kmfhandle, numattr, attrlist);
if (rv == KMF_OK && numcerts > 0) {
(void) printf(gettext("Found %d certificates.\n"),
- numcerts);
+ numcerts);
certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
- sizeof (KMF_X509_DER_CERT));
+ sizeof (KMF_X509_DER_CERT));
if (certlist == NULL)
return (KMF_ERR_MEMORY);
(void) memset(certlist, 0, numcerts *
- sizeof (KMF_X509_DER_CERT));
+ sizeof (KMF_X509_DER_CERT));
- rv = KMF_FindCert(kmfhandle, params, certlist, &numcerts);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_X509_DER_CERT_ATTR, certlist,
+ sizeof (KMF_X509_DER_CERT));
+ numattr++;
+
+ rv = kmf_find_cert(kmfhandle, numattr, attrlist);
if (rv == KMF_OK) {
int i;
(void) pk_show_certs(kmfhandle, certlist,
- numcerts);
+ numcerts);
for (i = 0; i < numcerts; i++)
- KMF_FreeKMFCert(kmfhandle, &certlist[i]);
+ kmf_free_kmf_cert(kmfhandle, &certlist[i]);
}
free(certlist);
}
if (rv == KMF_ERR_CERT_NOT_FOUND &&
- params->kstype != KMF_KEYSTORE_OPENSSL)
+ kstype != KMF_KEYSTORE_OPENSSL)
rv = KMF_OK;
return (rv);
}
static KMF_RETURN
-pk_list_keys(void *handle, KMF_FINDKEY_PARAMS *parms)
+pk_list_keys(void *handle, KMF_ATTRIBUTE *attrlist, int numattr)
{
KMF_RETURN rv;
KMF_KEY_HANDLE *keys;
uint32_t numkeys = 0;
+ KMF_KEYSTORE_TYPE kstype;
+
+ rv = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (rv != KMF_OK)
+ return (rv);
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &numkeys, sizeof (uint32_t));
+ numattr++;
- numkeys = 0;
- rv = KMF_FindKey(handle, parms, NULL, &numkeys);
+ rv = kmf_find_key(handle, numattr, attrlist);
if (rv == KMF_OK && numkeys > 0) {
int i;
(void) printf(gettext("Found %d keys.\n"), numkeys);
keys = (KMF_KEY_HANDLE *)malloc(numkeys *
- sizeof (KMF_KEY_HANDLE));
+ sizeof (KMF_KEY_HANDLE));
if (keys == NULL)
return (KMF_ERR_MEMORY);
(void) memset(keys, 0, numkeys *
- sizeof (KMF_KEY_HANDLE));
+ sizeof (KMF_KEY_HANDLE));
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_HANDLE_ATTR,
+ keys, sizeof (KMF_KEY_HANDLE));
+ numattr++;
- rv = KMF_FindKey(handle, parms, keys, &numkeys);
+ rv = kmf_find_key(handle, numattr, attrlist);
if (rv == KMF_OK)
pk_show_keys(handle, keys, numkeys);
for (i = 0; i < numkeys; i++)
- KMF_FreeKMFKey(handle, &keys[i]);
+ kmf_free_kmf_key(handle, &keys[i]);
free(keys);
}
if (rv == KMF_ERR_KEY_NOT_FOUND &&
- parms->kstype != KMF_KEYSTORE_OPENSSL)
+ kstype != KMF_KEYSTORE_OPENSSL)
rv = KMF_OK;
return (rv);
}
@@ -239,7 +308,13 @@ list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
KMF_CERT_VALIDITY find_criteria_flag)
{
KMF_RETURN rv;
- KMF_LISTCRL_PARAMS lcrlargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ boolean_t token_bool = B_TRUE;
+ boolean_t private = B_FALSE;
+ KMF_KEY_CLASS keyclass;
+ KMF_ENCODE_FORMAT format;
/*
* Symmetric keys and RSA/DSA private keys are always
@@ -250,85 +325,176 @@ list_pk11_objects(KMF_HANDLE_T kmfhandle, char *token, int oclass,
oclass |= PK_PRIVATE_OBJ;
rv = select_token(kmfhandle, token,
- !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
+ !(oclass & (PK_PRIVATE_OBJ | PK_PRIKEY_OBJ)));
if (rv != KMF_OK) {
return (rv);
}
if (oclass & (PK_KEY_OBJ | PK_PRIVATE_OBJ)) {
- KMF_FINDKEY_PARAMS parms;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, objlabel,
+ strlen(objlabel));
+ numattr++;
+ }
+
+ private = ((oclass & PK_PRIVATE_OBJ) > 0);
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PRIVATE_BOOL_ATTR, &private,
+ sizeof (private));
+ numattr++;
- (void) memset(&parms, 0, sizeof (parms));
- parms.kstype = KMF_KEYSTORE_PK11TOKEN;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_BOOL_ATTR, &token_bool,
+ sizeof (token_bool));
+ numattr++;
if (oclass & PK_PRIKEY_OBJ) {
- parms.keyclass = KMF_ASYM_PRI;
- parms.findLabel = objlabel;
- parms.cred = *tokencred;
- parms.pkcs11parms.private =
- ((oclass & PK_PRIVATE_OBJ) > 0);
- parms.pkcs11parms.token = 1;
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ if (tokencred != NULL &&
+ tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ num++;
+ }
/* list asymmetric private keys */
- rv = pk_list_keys(kmfhandle, &parms);
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- parms.keyclass = KMF_SYMMETRIC;
- parms.findLabel = objlabel;
- parms.cred = *tokencred;
- parms.format = KMF_FORMAT_RAWKEY;
- parms.pkcs11parms.private =
- ((oclass & PK_PRIVATE_OBJ) > 0);
- parms.pkcs11parms.token = 1;
+ int num = numattr;
+
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ if (tokencred != NULL &&
+ tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ num++;
+ }
+
+ format = KMF_FORMAT_RAWKEY;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_ENCODE_FORMAT_ATTR, &format,
+ sizeof (format));
+ num++;
/* list symmetric keys */
- rv = pk_list_keys(kmfhandle, &parms);
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
- parms.keyclass = KMF_ASYM_PUB;
- parms.findLabel = objlabel;
- parms.pkcs11parms.private =
- ((oclass & PK_PRIVATE_OBJ) > 0);
- parms.pkcs11parms.token = 1;
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PUB;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
/* list asymmetric public keys (if any) */
- rv = pk_list_keys(kmfhandle, &parms);
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
if (rv != KMF_OK)
return (rv);
}
+ numattr = 0;
if (oclass & (PK_CERT_OBJ | PK_PUBLIC_OBJ)) {
- KMF_FINDCERT_PARAMS parms;
-
- (void) memset(&parms, 0, sizeof (parms));
- parms.kstype = KMF_KEYSTORE_PK11TOKEN;
- parms.certLabel = objlabel;
- parms.issuer = issuer;
- parms.subject = subject;
- parms.serial = serial;
- parms.pkcs11parms.private = FALSE;
- parms.find_cert_validity = find_criteria_flag;
-
- rv = pk_find_certs(kmfhandle, &parms);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (objlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, objlabel,
+ strlen(objlabel));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_PRIVATE_BOOL_ATTR, &private,
+ sizeof (private));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
+ sizeof (KMF_CERT_VALIDITY));
+ numattr++;
+
+ rv = pk_find_certs(kmfhandle, attrlist, numattr);
if (rv != KMF_OK)
return (rv);
}
+ numattr = 0;
+ kstype = KMF_KEYSTORE_OPENSSL; /* CRL is file-based */
if (oclass & PK_CRL_OBJ) {
- char *crldata;
+ char *crldata = NULL;
- (void) memset(&lcrlargs, 0, sizeof (lcrlargs));
- lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
- lcrlargs.sslparms.dirpath = dir;
- lcrlargs.sslparms.crlfile = filename;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
- if (rv == KMF_OK) {
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ numattr++;
+ }
+ if (filename != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
+ &crldata, sizeof (char *));
+ numattr++;
+
+ rv = kmf_list_crl(kmfhandle, numattr, attrlist);
+ if (rv == KMF_OK && crldata != NULL) {
(void) printf("%s\n", crldata);
free(crldata);
}
@@ -344,28 +510,67 @@ list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
KMF_CERT_VALIDITY find_criteria_flag)
{
int rv;
- KMF_FINDCERT_PARAMS fcargs;
- KMF_FINDKEY_PARAMS fkargs;
- KMF_LISTCRL_PARAMS lcrlargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_CLASS keyclass;
+ KMF_ENCODE_FORMAT format;
+ char *defaultdir = ".";
if (oclass & PK_KEY_OBJ) {
- (void) memset(&fkargs, 0, sizeof (fkargs));
- fkargs.kstype = KMF_KEYSTORE_OPENSSL;
- fkargs.sslparms.dirpath = dir;
- fkargs.sslparms.keyfile = filename;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (dir == NULL && filename == NULL)
+ dir = defaultdir;
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir,
+ strlen(dir));
+ numattr++;
+ }
+
+ if (filename != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEY_FILENAME_ATTR, filename,
+ strlen(filename));
+ numattr++;
+ }
+
if (oclass & PK_PRIKEY_OBJ) {
- fkargs.keyclass = KMF_ASYM_PRI;
+ int num = numattr;
- rv = pk_list_keys(kmfhandle, &fkargs);
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ /* list asymmetric private keys */
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
if (rv == KMF_ERR_KEY_NOT_FOUND)
rv = KMF_OK;
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- fkargs.keyclass = KMF_SYMMETRIC;
- fkargs.format = KMF_FORMAT_RAWKEY;
+ int num = numattr;
- rv = pk_list_keys(kmfhandle, &fkargs);
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ format = KMF_FORMAT_RAWKEY;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_ENCODE_FORMAT_ATTR, &format,
+ sizeof (format));
+ num++;
+
+ /* list symmetric keys */
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
if (rv == KMF_ERR_KEY_NOT_FOUND)
rv = KMF_OK;
@@ -373,32 +578,83 @@ list_file_objects(KMF_HANDLE_T kmfhandle, int oclass,
return (rv);
}
+ numattr = 0;
if (oclass & PK_CERT_OBJ) {
- (void) memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_OPENSSL;
- fcargs.certLabel = NULL;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serial;
- fcargs.sslparms.dirpath = dir;
- fcargs.sslparms.certfile = filename;
- fcargs.find_cert_validity = find_criteria_flag;
-
- rv = pk_find_certs(kmfhandle, &fcargs);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ if (filename != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR, filename,
+ strlen(filename));
+ numattr++;
+ }
+
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir,
+ strlen(dir));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
+ sizeof (KMF_CERT_VALIDITY));
+ numattr++;
+
+ rv = pk_find_certs(kmfhandle, attrlist, numattr);
if (rv != KMF_OK)
return (rv);
}
+ numattr = 0;
if (oclass & PK_CRL_OBJ) {
- char *crldata;
+ char *crldata = NULL;
- (void) memset(&lcrlargs, 0, sizeof (lcrlargs));
- lcrlargs.kstype = KMF_KEYSTORE_OPENSSL;
- lcrlargs.sslparms.dirpath = dir;
- lcrlargs.sslparms.crlfile = filename;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- rv = KMF_ListCRL(kmfhandle, &lcrlargs, &crldata);
- if (rv == KMF_OK) {
+ if (dir != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ numattr++;
+ }
+ if (filename != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_FILENAME_ATTR,
+ filename, strlen(filename));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_DATA_ATTR,
+ &crldata, sizeof (char *));
+ numattr++;
+
+ rv = kmf_list_crl(kmfhandle, numattr, attrlist);
+ if (rv == KMF_OK && crldata != NULL) {
(void) printf("%s\n", crldata);
free(crldata);
}
@@ -415,64 +671,163 @@ list_nss_objects(KMF_HANDLE_T kmfhandle,
KMF_CERT_VALIDITY find_criteria_flag)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDKEY_PARAMS fkargs;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEY_CLASS keyclass;
+ KMF_ENCODE_FORMAT format;
rv = configure_nss(kmfhandle, dir, prefix);
if (rv != KMF_OK)
return (rv);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
if (oclass & PK_KEY_OBJ) {
- (void) memset(&fkargs, 0, sizeof (fkargs));
- fkargs.kstype = KMF_KEYSTORE_NSS;
- fkargs.findLabel = nickname;
- fkargs.cred = *tokencred;
- fkargs.nssparms.slotlabel = token_spec;
+ if (tokencred != NULL && tokencred->credlen > 0) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CREDENTIAL_ATTR, tokencred,
+ sizeof (KMF_CREDENTIAL));
+ numattr++;
+ }
+
+ if (token_spec && strlen(token_spec)) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token_spec,
+ strlen(token_spec));
+ numattr++;
+ }
+
+ if (nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYLABEL_ATTR, nickname,
+ strlen(nickname));
+ numattr++;
+ }
}
if (oclass & PK_PRIKEY_OBJ) {
- fkargs.keyclass = KMF_ASYM_PRI;
- rv = pk_list_keys(kmfhandle, &fkargs);
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ /* list asymmetric private keys */
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
+
if (rv == KMF_OK && (oclass & PK_SYMKEY_OBJ)) {
- fkargs.keyclass = KMF_SYMMETRIC;
- fkargs.format = KMF_FORMAT_RAWKEY;
- rv = pk_list_keys(kmfhandle, &fkargs);
+ int num = numattr;
+
+ keyclass = KMF_SYMMETRIC;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ format = KMF_FORMAT_RAWKEY;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_ENCODE_FORMAT_ATTR, &format,
+ sizeof (format));
+ num++;
+
+ /* list symmetric keys */
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
+
if (rv == KMF_OK && (oclass & PK_PUBKEY_OBJ)) {
- fkargs.keyclass = KMF_ASYM_PUB;
- rv = pk_list_keys(kmfhandle, &fkargs);
+ int num = numattr;
+
+ keyclass = KMF_ASYM_PUB;
+ kmf_set_attr_at_index(attrlist, num,
+ KMF_KEYCLASS_ATTR, &keyclass,
+ sizeof (keyclass));
+ num++;
+
+ /* list asymmetric public keys */
+ rv = pk_list_keys(kmfhandle, attrlist, num);
}
/* If searching for public objects or certificates, find certs now */
+ numattr = 0;
if (rv == KMF_OK && (oclass & PK_CERT_OBJ)) {
- KMF_FINDCERT_PARAMS fcargs;
-
- (void) memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = KMF_KEYSTORE_NSS;
- fcargs.certLabel = nickname;
- fcargs.issuer = issuer;
- fcargs.subject = subject;
- fcargs.serial = serial;
- fcargs.nssparms.slotlabel = token_spec;
- fcargs.find_cert_validity = find_criteria_flag;
-
- rv = pk_find_certs(kmfhandle, &fcargs);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype,
+ sizeof (kstype));
+ numattr++;
+
+ if (nickname != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_LABEL_ATTR, nickname,
+ strlen(nickname));
+ numattr++;
+ }
+
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_NAME_ATTR, issuer,
+ strlen(issuer));
+ numattr++;
+ }
+
+ if (subject != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SUBJECT_NAME_ATTR, subject,
+ strlen(subject));
+ numattr++;
+ }
+
+ if (serial != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_BIGINT_ATTR, serial,
+ sizeof (KMF_BIGINT));
+ numattr++;
+ }
+
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR, token_spec,
+ strlen(token_spec));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_VALIDITY_ATTR, &find_criteria_flag,
+ sizeof (KMF_CERT_VALIDITY));
+ numattr++;
+
+ rv = pk_find_certs(kmfhandle, attrlist, numattr);
}
+ numattr = 0;
if (rv == KMF_OK && (oclass & PK_CRL_OBJ)) {
int numcrls;
- KMF_FINDCRL_PARAMS fcrlargs;
- (void) memset(&fcrlargs, 0, sizeof (fcrlargs));
- fcrlargs.kstype = KMF_KEYSTORE_NSS;
- fcrlargs.nssparms.slotlabel = token_spec;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- rv = KMF_FindCRL(kmfhandle, &fcrlargs, NULL, &numcrls);
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR,
+ token_spec, strlen(token_spec));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CRL_COUNT_ATTR,
+ &numcrls, sizeof (int));
+ numattr++;
+
+ rv = kmf_find_crl(kmfhandle, numattr, attrlist);
if (rv == KMF_OK) {
char **p;
if (numcrls == 0) {
(void) printf(gettext("No CRLs found in "
- "NSS keystore.\n"));
+ "NSS keystore.\n"));
return (KMF_OK);
}
@@ -481,13 +836,16 @@ list_nss_objects(KMF_HANDLE_T kmfhandle,
return (KMF_ERR_MEMORY);
}
(void) memset(p, 0, numcrls * sizeof (char *));
- rv = KMF_FindCRL(kmfhandle, &fcrlargs,
- p, &numcrls);
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_NAMELIST_ATTR, p, sizeof (char *));
+ numattr++;
+ rv = kmf_find_crl(kmfhandle, numattr, attrlist);
if (rv == KMF_OK) {
int i;
for (i = 0; i < numcrls; i++) {
(void) printf("%d. Name = %s\n",
- i + 1, p[i]);
+ i + 1, p[i]);
free(p[i]);
}
}
@@ -526,10 +884,10 @@ pk_list(int argc, char *argv[])
/* Parse command line options. Do NOT i18n/l10n. */
while ((opt = getopt_av(argc, argv,
- "k:(keystore)t:(objtype)T:(token)d:(dir)"
- "p:(prefix)n:(nickname)S:(serial)s:(subject)"
- "c:(criteria)"
- "i:(issuer)l:(label)f:(infile)")) != EOF) {
+ "k:(keystore)t:(objtype)T:(token)d:(dir)"
+ "p:(prefix)n:(nickname)S:(serial)s:(subject)"
+ "c:(criteria)"
+ "i:(issuer)l:(label)f:(infile)")) != EOF) {
if (EMPTYSTRING(optarg_av))
return (PK_ERR_USAGE);
switch (opt) {
@@ -608,7 +966,7 @@ pk_list(int argc, char *argv[])
if (argc)
return (PK_ERR_USAGE);
- if ((rv = KMF_Initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
+ if ((rv = kmf_initialize(&kmfhandle, NULL, NULL)) != KMF_OK) {
/* Error message ? */
return (rv);
}
@@ -619,10 +977,10 @@ pk_list(int argc, char *argv[])
/* if PUBLIC or PRIVATE obj was given, the old syntax was used. */
if ((oclass & (PK_PUBLIC_OBJ | PK_PRIVATE_OBJ)) &&
- kstype != KMF_KEYSTORE_PK11TOKEN) {
+ kstype != KMF_KEYSTORE_PK11TOKEN) {
(void) fprintf(stderr, gettext("The objtype parameter "
- "is only relevant if keystore=pkcs11\n"));
+ "is only relevant if keystore=pkcs11\n"));
return (PK_ERR_USAGE);
}
@@ -640,11 +998,11 @@ pk_list(int argc, char *argv[])
uchar_t *bytes = NULL;
size_t bytelen;
- rv = KMF_HexString2Bytes((uchar_t *)serstr, &bytes, &bytelen);
+ rv = kmf_hexstr_to_bytes((uchar_t *)serstr, &bytes, &bytelen);
if (rv != KMF_OK || bytes == NULL) {
(void) fprintf(stderr, gettext("serial number "
- "must be specified as a hex number "
- "(ex: 0x0102030405ffeeddee)\n"));
+ "must be specified as a hex number "
+ "(ex: 0x0102030405ffeeddee)\n"));
return (PK_ERR_USAGE);
}
serial.val = bytes;
@@ -652,36 +1010,36 @@ pk_list(int argc, char *argv[])
}
if ((kstype == KMF_KEYSTORE_PK11TOKEN ||
- kstype == KMF_KEYSTORE_NSS) &&
- (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
+ kstype == KMF_KEYSTORE_NSS) &&
+ (oclass & (PK_PRIKEY_OBJ | PK_PRIVATE_OBJ))) {
(void) get_token_password(kstype, token_spec,
- &tokencred);
+ &tokencred);
}
if (kstype == KMF_KEYSTORE_PK11TOKEN) {
rv = list_pk11_objects(kmfhandle, token_spec,
- oclass, list_label, &serial,
- issuer, subject, dir, filename,
- &tokencred, find_criteria_flag);
+ oclass, list_label, &serial,
+ issuer, subject, dir, filename,
+ &tokencred, find_criteria_flag);
} else if (kstype == KMF_KEYSTORE_NSS) {
if (dir == NULL)
dir = PK_DEFAULT_DIRECTORY;
rv = list_nss_objects(kmfhandle,
- oclass, token_spec, dir, prefix,
- list_label, &serial, issuer, subject,
- &tokencred, find_criteria_flag);
+ oclass, token_spec, dir, prefix,
+ list_label, &serial, issuer, subject,
+ &tokencred, find_criteria_flag);
} else if (kstype == KMF_KEYSTORE_OPENSSL) {
rv = list_file_objects(kmfhandle,
- oclass, dir, filename,
- &serial, issuer, subject, find_criteria_flag);
+ oclass, dir, filename,
+ &serial, issuer, subject, find_criteria_flag);
}
if (rv != KMF_OK) {
display_error(kmfhandle, rv,
- gettext("Error listing objects"));
+ gettext("Error listing objects"));
}
if (serial.val != NULL)
@@ -690,6 +1048,6 @@ pk_list(int argc, char *argv[])
if (tokencred.cred != NULL)
free(tokencred.cred);
- (void) KMF_Finalize(kmfhandle);
+ (void) kmf_finalize(kmfhandle);
return (rv);
}
diff --git a/usr/src/cmd/cmd-crypto/pktool/pktool.c b/usr/src/cmd/cmd-crypto/pktool/pktool.c
index 33e7441bf2..3ca028cd28 100644
--- a/usr/src/cmd/cmd-crypto/pktool/pktool.c
+++ b/usr/src/cmd/cmd-crypto/pktool/pktool.c
@@ -94,7 +94,7 @@ static verbcmd cmds[] = {
"[ subject=subject-DN ]\n\t\t"
"[ keystore=pkcs11 ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
"[ label=cert-label ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ criteria=valid|expired|both ]\n\t"
@@ -112,7 +112,7 @@ static verbcmd cmds[] = {
"list keystore=nss objtype=cert\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
"[ nickname=cert-nickname ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ dir=directory-path ]\n\t\t"
@@ -128,7 +128,7 @@ static verbcmd cmds[] = {
"list keystore=file objtype=cert\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
"[ infile=cert-fn ]\n\t\t"
"[ dir=directory-path ]\n\t\t"
"[ criteria=valid|expired|both ]\n\t"
@@ -152,8 +152,8 @@ static verbcmd cmds[] = {
"delete keystore=nss objtype=cert\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
- "[ nickname=cert-nickname ]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
+ "[ label=cert-label ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ dir=directory-path ]\n\t\t"
"[ prefix=DBprefix ]\n\t\t"
@@ -175,7 +175,7 @@ static verbcmd cmds[] = {
"delete keystore=pkcs11 objtype=cert[:[public | private | both]]\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
"[ label=cert-label ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ criteria=valid|expired|both ]\n\t"
@@ -192,7 +192,7 @@ static verbcmd cmds[] = {
"delete keystore=file objtype=cert\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
"[ infile=cert-fn ]\n\t\t"
"[ dir=directory-path ]\n\t\t"
"[ criteria=valid|expired|both ]\n\t"
@@ -228,7 +228,11 @@ static verbcmd cmds[] = {
"import keystore=pkcs11\n\t\t"
"infile=input-fn\n\t\t"
- "label=cert-label\n\t\t"
+ "label=label\n\t\t"
+ "[ objtype=cert|key ]\n\t\t"
+ "[ keytype=aes|arcfour|des|3des|generic ]\n\t\t"
+ "[ sensitive=y|n ]\n\t\t"
+ "[ extractable=y|n ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t"
"import keystore=pkcs11 objtype=crl\n\t\t"
@@ -263,8 +267,8 @@ static verbcmd cmds[] = {
"[ objtype=cert|key ]\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
- "[ nickname=cert-nickname]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
+ "[ nickname=cert-nickname ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ dir=directory-path ]\n\t\t"
"[ prefix=DBPrefix ]\n\t\t"
@@ -272,11 +276,12 @@ static verbcmd cmds[] = {
"export keystore=pkcs11\n\t\t"
"outfile=output-fn\n\t\t"
- "[ label=cert-label]\n\t\t"
+ "[ objtype=cert|key ]\n\t\t"
+ "[ label=label ]\n\t\t"
"[ subject=subject-DN ]\n\t\t"
"[ issuer=issuer-DN ]\n\t\t"
- "[ serial=serial number]\n\t\t"
- "[ outformat=pem|der|pkcs12]\n\t\t"
+ "[ serial=serial number ]\n\t\t"
+ "[ outformat=pem|der|pkcs12|raw ]\n\t\t"
"[ token=token[:manuf[:serial]]]\n\t"
"export keystore=file\n\t\t"
@@ -341,7 +346,7 @@ static verbcmd cmds[] = {
"[ prefix=DBprefix ]\n\t\t"
"[ keytype=rsa|dsa ]\n\t\t"
"[ keylen=key-size ]\n\t\t"
- "[ format=pem|der]\n\t"
+ "[ format=pem|der ]\n\t"
"gencsr [-i] [ keystore=pkcs11 ]\n\t\t"
"label=key-label\n\t\t"
"outcsr=csr-fn\n\t\t"
@@ -351,7 +356,7 @@ static verbcmd cmds[] = {
"[ token=token[:manuf[:serial]]]\n\t\t"
"[ keytype=rsa|dsa ]\n\t\t"
"[ keylen=key-size ]\n\t\t"
- "[ format=pem|der]\n\t"
+ "[ format=pem|der ]]\n\t"
"gencsr [-i] keystore=file\n\t\t"
"outcsr=csr-fn\n\t\t"
"outkey=key-fn\n\t\t"
@@ -361,7 +366,7 @@ static verbcmd cmds[] = {
"[ keytype=rsa|dsa ]\n\t\t"
"[ keylen=key-size ]\n\t\t"
"[ dir=directory-path ]\n\t\t"
- "[ format=pem|der]\n\t"
+ "[ format=pem|der ]\n\t"
},
{ "download", pk_download, 0,
@@ -486,7 +491,8 @@ process_arg_file(char *argfile, char ***argv, int *argc)
if (!strlen(argline))
continue;
- (*argv) = realloc((*argv), (nargs + 1) * sizeof (char *));
+ (*argv) = realloc((*argv),
+ (nargs + 1) * sizeof (char *));
if ((*argv) == NULL) {
perror("memory error");
(void) fclose(fp);
diff --git a/usr/src/cmd/cmd-crypto/pktool/setpin.c b/usr/src/cmd/cmd-crypto/pktool/setpin.c
index 62416e8c7d..d7538566bd 100644
--- a/usr/src/cmd/cmd-crypto/pktool/setpin.c
+++ b/usr/src/cmd/cmd-crypto/pktool/setpin.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -45,23 +45,30 @@ setpin_nss(KMF_HANDLE_T handle,
char *token_spec, char *dir, char *prefix)
{
int rv = 0;
- KMF_SETPIN_PARAMS params;
- KMF_CREDENTIAL newpincred = { NULL, 0 };
+ KMF_CREDENTIAL oldcred = {NULL, 0};
+ KMF_CREDENTIAL newpincred = {NULL, 0};
CK_UTF8CHAR_PTR old_pin = NULL, new_pin = NULL;
CK_ULONG old_pinlen = 0, new_pinlen = 0;
+ KMF_ATTRIBUTE setpinattrs[6];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_NSS;
+ int numattrs = 0;
rv = configure_nss(handle, dir, prefix);
if (rv != KMF_OK)
return (rv);
- (void) memset(&params, 0, sizeof (params));
- params.kstype = KMF_KEYSTORE_NSS;
- params.tokenname = token_spec;
- params.nssparms.slotlabel = token_spec;
+ kmf_set_attr_at_index(setpinattrs, numattrs, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattrs++;
+ if (token_spec != NULL) {
+ kmf_set_attr_at_index(setpinattrs, numattrs,
+ KMF_TOKEN_LABEL_ATTR,
+ token_spec, strlen(token_spec));
+ numattrs++;
+ }
if ((rv = get_pin(gettext("Enter current token passphrase "
- "(<CR> if not set):"), NULL, &old_pin, &old_pinlen)) !=
- CKR_OK) {
+ "(<CR> if not set):"), NULL, &old_pin, &old_pinlen)) != CKR_OK) {
cryptoerror(LOG_STDERR,
gettext("Unable to get token passphrase."));
return (PK_ERR_NSS);
@@ -80,13 +87,20 @@ setpin_nss(KMF_HANDLE_T handle,
return (PK_ERR_NSS);
}
- params.cred.cred = (char *)old_pin;
- params.cred.credlen = old_pinlen;
+ oldcred.cred = (char *)old_pin;
+ oldcred.credlen = old_pinlen;
+
+ kmf_set_attr_at_index(setpinattrs, numattrs, KMF_CREDENTIAL_ATTR,
+ &oldcred, sizeof (oldcred));
+ numattrs++;
newpincred.cred = (char *)new_pin;
newpincred.credlen = new_pinlen;
+ kmf_set_attr_at_index(setpinattrs, numattrs, KMF_NEWPIN_ATTR,
+ &newpincred, sizeof (newpincred));
+ numattrs++;
- rv = KMF_SetTokenPin(handle, &params, &newpincred);
+ rv = kmf_set_token_pin(handle, numattrs, setpinattrs);
if (new_pin)
free(new_pin);
@@ -105,9 +119,12 @@ setpin_pkcs11(KMF_HANDLE_T handle, char *token_spec)
CK_ULONG old_pinlen = 0, new_pinlen = 0;
CK_RV rv = CKR_OK;
char *token_name = NULL;
- KMF_SETPIN_PARAMS params;
CK_TOKEN_INFO token_info;
- KMF_CREDENTIAL newpincred = { NULL, 0 };
+ KMF_CREDENTIAL newpincred = {NULL, 0};
+ KMF_CREDENTIAL oldcred = {NULL, 0};
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ KMF_ATTRIBUTE attrlist[6];
+ int numattr = 0;
/* If nothing is specified, default is to use softtoken. */
if (token_spec == NULL) {
@@ -115,7 +132,7 @@ setpin_pkcs11(KMF_HANDLE_T handle, char *token_spec)
token_name = SOFT_TOKEN_LABEL;
}
- rv = KMF_PK11TokenLookup(NULL, token_spec, &slot_id);
+ rv = kmf_pk11_token_lookup(NULL, token_spec, &slot_id);
if (rv == KMF_OK) {
/* find the pin state for the selected token */
if (C_GetTokenInfo(slot_id, &token_info) != CKR_OK)
@@ -167,17 +184,31 @@ setpin_pkcs11(KMF_HANDLE_T handle, char *token_spec)
return (PK_ERR_PK11);
}
- (void) memset(&params, 0, sizeof (params));
- params.kstype = KMF_KEYSTORE_PK11TOKEN;
- params.tokenname = (char *)token_info.label;
- params.cred.cred = (char *)old_pin;
- params.cred.credlen = old_pinlen;
- params.pkcs11parms.slot = slot_id;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+ if (token_name != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_LABEL_ATTR,
+ token_name, strlen(token_name));
+ numattr++;
+ }
+ oldcred.cred = (char *)old_pin;
+ oldcred.credlen = old_pinlen;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ &oldcred, sizeof (oldcred));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SLOT_ID_ATTR,
+ &slot_id, sizeof (slot_id));
+ numattr++;
newpincred.cred = (char *)new_pin;
newpincred.credlen = new_pinlen;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_NEWPIN_ATTR,
+ &newpincred, sizeof (newpincred));
+ numattr++;
- rv = KMF_SetTokenPin(handle, &params, &newpincred);
+ rv = kmf_set_token_pin(handle, numattr, attrlist);
/* Clean up. */
if (old_pin != NULL)
@@ -250,7 +281,7 @@ pk_setpin(int argc, char *argv[])
token_spec = DEFAULT_NSS_TOKEN;
}
- if ((rv = KMF_Initialize(&handle, NULL, NULL)) != KMF_OK)
+ if ((rv = kmf_initialize(&handle, NULL, NULL)) != KMF_OK)
return (rv);
switch (kstype) {
@@ -262,11 +293,11 @@ pk_setpin(int argc, char *argv[])
break;
default:
cryptoerror(LOG_STDERR,
- gettext("incorrect keystore."));
+ gettext("incorrect keystore."));
return (PK_ERR_USAGE);
}
- (void) KMF_Finalize(handle);
+ (void) kmf_finalize(handle);
if (rv == KMF_ERR_AUTH_FAILED) {
cryptoerror(LOG_STDERR,
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c
index bc1b2181ed..670fea791c 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/kssladm_create.c
@@ -52,25 +52,25 @@ usage_create(boolean_t do_print)
if (do_print)
(void) fprintf(stderr, "Usage:\n");
(void) fprintf(stderr, "kssladm create"
- " -f pkcs11 [-d softtoken_directory] -T <token_label>"
- " -C <certificate_label> -x <proxy_port>"
- " [-h <ca_certchain_file>]"
- " [options] [<server_address>] [<server_port>]\n");
+ " -f pkcs11 [-d softtoken_directory] -T <token_label>"
+ " -C <certificate_label> -x <proxy_port>"
+ " [-h <ca_certchain_file>]"
+ " [options] [<server_address>] [<server_port>]\n");
(void) fprintf(stderr, "kssladm create"
- " -f pkcs12 -i <cert_and_key_pk12file> -x <proxy_port>"
- " [options] [<server_address>] [<server_port>]\n");
+ " -f pkcs12 -i <cert_and_key_pk12file> -x <proxy_port>"
+ " [options] [<server_address>] [<server_port>]\n");
(void) fprintf(stderr, "kssladm create"
- " -f pem -i <cert_and_key_pemfile> -x <proxy_port>"
- " [options] [<server_address>] [<server_port>]\n");
+ " -f pem -i <cert_and_key_pemfile> -x <proxy_port>"
+ " [options] [<server_address>] [<server_port>]\n");
(void) fprintf(stderr, "options are:\n"
- "\t[-c <ciphersuites>]\n"
- "\t[-p <password_file>]\n"
- "\t[-t <ssl_session_cache_timeout>]\n"
- "\t[-z <ssl_session_cache_size>]\n"
- "\t[-v]\n");
+ "\t[-c <ciphersuites>]\n"
+ "\t[-p <password_file>]\n"
+ "\t[-t <ssl_session_cache_timeout>]\n"
+ "\t[-z <ssl_session_cache_size>]\n"
+ "\t[-v]\n");
}
/*
@@ -135,7 +135,7 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
if (!nxkey) {
bzero(priv_key_bignums, sizeof (KMF_BIGINT) *
- MAX_ATTR_CNT);
+ MAX_ATTR_CNT);
/* and the key attributes */
priv_key_bignums[0] = rsa->rawdata.rsa.mod;
priv_key_bignums[1] = rsa->rawdata.rsa.pubexp;
@@ -147,9 +147,9 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
priv_key_bignums[7] = rsa->rawdata.rsa.coef;
if (rsa->rawdata.rsa.mod.val == NULL ||
- rsa->rawdata.rsa.priexp.val == NULL) {
+ rsa->rawdata.rsa.priexp.val == NULL) {
(void) fprintf(stderr,
- "missing required attributes in private key.\n");
+ "missing required attributes in private key.\n");
return (NULL);
}
@@ -158,9 +158,9 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
if (priv_key_bignums[i].val == NULL)
continue;
kssl_attrs[attr_cnt].ka_type =
- kssl_tmpl_attrs[i].ka_type;
+ kssl_tmpl_attrs[i].ka_type;
kssl_attrs[attr_cnt].ka_value_len =
- priv_key_bignums[i].len;
+ priv_key_bignums[i].len;
bufsize += sizeof (crypto_object_attribute_t) +
kssl_attrs[attr_cnt].ka_value_len;
attr_cnt++;
@@ -173,7 +173,7 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
*/
for (attr_cnt = 0; attr_cnt < 5; attr_cnt++) {
bufsize += sizeof (crypto_object_attribute_t) +
- exkey_attrs[attr_cnt].ulValueLen;
+ exkey_attrs[attr_cnt].ulValueLen;
}
if (creds)
bufsize += creds->credlen;
@@ -209,7 +209,7 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
if (priv_key_bignums[i].val == NULL)
continue;
(void) memcpy(buf, priv_key_bignums[i].val,
- priv_key_bignums[i].len);
+ priv_key_bignums[i].len);
kssl_attrs[attr_cnt].ka_value_offset =
buf - (char *)kssl_params;
buf += kssl_attrs[attr_cnt].ka_value_len;
@@ -227,10 +227,10 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
*/
kssl_params->kssl_is_nxkey = 1;
bcopy(tlabel, kssl_params->kssl_token.toklabel,
- CRYPTO_EXT_SIZE_LABEL);
+ CRYPTO_EXT_SIZE_LABEL);
kssl_params->kssl_token.pinlen = creds->credlen;
kssl_params->kssl_token.tokpin_offset =
- buf - (char *)kssl_params;
+ buf - (char *)kssl_params;
kssl_params->kssl_token.ck_rv = 0;
bcopy(creds->cred, buf, creds->credlen);
buf += creds->credlen;
@@ -248,11 +248,11 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
buf += attr_cnt * sizeof (kssl_object_attribute_t);
for (i = 0; i < attr_cnt; i++) {
bcopy(exkey_attrs[i].pValue, buf,
- exkey_attrs[i].ulValueLen);
+ exkey_attrs[i].ulValueLen);
kssl_attrs[i].ka_type = exkey_attrs[i].type;
kssl_attrs[i].ka_value_offset =
- buf - (char *)kssl_params;
+ buf - (char *)kssl_params;
kssl_attrs[i].ka_value_len = exkey_attrs[i].ulValueLen;
buf += exkey_attrs[i].ulValueLen;
@@ -260,7 +260,7 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
}
/* Copy the key attributes array here */
bcopy(kssl_attrs, ((char *)kssl_params) + key->ks_attrs_offset,
- attr_cnt * sizeof (kssl_object_attribute_t));
+ attr_cnt * sizeof (kssl_object_attribute_t));
buf = (char *)P2ROUNDUP((uintptr_t)buf, sizeof (uint32_t));
@@ -301,8 +301,9 @@ kmf_to_kssl(int nxkey, KMF_RAW_KEY_DATA *rsa, int ncerts,
* KMF_RAW_KEY format which is then passed along to KSSL by the caller.
*/
static KMF_RETURN
-get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
- KMF_KEY_HANDLE *key, KMF_KEY_HANDLE *rawkey)
+get_sensitive_key_data(KMF_HANDLE_T kmfh,
+ KMF_CREDENTIAL *creds, char *keylabel,
+ char *idstr, KMF_KEY_HANDLE *key, KMF_KEY_HANDLE *rawkey)
{
KMF_RETURN rv = KMF_OK;
static CK_BYTE aes_param[16];
@@ -310,6 +311,8 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
static CK_KEY_TYPE privkey_type = CKK_RSA;
static CK_BBOOL true = TRUE;
static CK_BBOOL false = FALSE;
+ boolean_t kmftrue = B_TRUE;
+ boolean_t kmffalse = B_FALSE;
char *err = NULL;
char wrapkey_label[BUFSIZ];
int fd;
@@ -317,6 +320,12 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
CK_RV ckrv;
CK_SESSION_HANDLE pk11session;
CK_BYTE aes_key_val[16];
+ int numattr = 0;
+ int idx;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_KEY_CLASS kclass;
+ KMF_ENCODE_FORMAT format;
CK_MECHANISM aes_cbc_pad_mech = {CKM_AES_CBC_PAD, aes_param,
sizeof (aes_param)};
@@ -344,25 +353,24 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
return (KMF_ERR_INTERNAL);
}
if (read(fd, aes_key_val, sizeof (aes_key_val)) !=
- sizeof (aes_key_val)) {
+ sizeof (aes_key_val)) {
perror("Error reading from /dev/urandom");
(void) close(fd);
return (KMF_ERR_INTERNAL);
}
(void) close(fd);
- pk11session = KMF_GetPK11Handle(kmfh);
+ pk11session = kmf_get_pk11_handle(kmfh);
/*
* Login to create the wrap key stuff.
*/
ckrv = C_Login(pk11session, CKU_USER,
- (CK_UTF8CHAR_PTR)fkparams->cred.cred,
- fkparams->cred.credlen);
+ (CK_UTF8CHAR_PTR)creds->cred, creds->credlen);
if (ckrv != CKR_OK && ckrv != CKR_USER_ALREADY_LOGGED_IN) {
(void) fprintf(stderr,
- "Cannot login to the token. error = %s\n",
- pkcs11_strerror(ckrv));
+ "Cannot login to the token. error = %s\n",
+ pkcs11_strerror(ckrv));
return (KMF_ERR_INTERNAL);
}
@@ -370,18 +378,64 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* Turn the random key into a PKCS#11 session object.
*/
ckrv = SUNW_C_KeyToObject(pk11session, CKM_AES_CBC_PAD, aes_key_val,
- sizeof (aes_key_val), &aes_key_obj);
+ sizeof (aes_key_val), &aes_key_obj);
if (ckrv != CKR_OK) {
(void) fprintf(stderr,
- "Cannot create wrapping key. error = %s\n",
- pkcs11_strerror(ckrv));
+ "Cannot create wrapping key. error = %s\n",
+ pkcs11_strerror(ckrv));
return (KMF_ERR_INTERNAL);
}
/*
* Find the original private key that we are going to wrap.
*/
- rv = KMF_FindKey(kmfh, fkparams, key, &nkeys);
+ kstype = KMF_KEYSTORE_PK11TOKEN;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ kclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYCLASS_ATTR,
+ &kclass, sizeof (kclass));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ creds, sizeof (KMF_CREDENTIAL));
+ numattr++;
+
+ if (keylabel) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ keylabel, strlen(keylabel));
+ numattr++;
+ }
+ if (idstr) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_IDSTR_ATTR,
+ idstr, strlen(idstr));
+ numattr++;
+ }
+ format = KMF_FORMAT_NATIVE;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &format, sizeof (format));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
+ &kmftrue, sizeof (kmftrue));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
+ &kmftrue, sizeof (kmftrue));
+ numattr++;
+
+ nkeys = 1;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &nkeys, sizeof (nkeys));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ key, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ rv = kmf_find_key(kmfh, numattr, attrlist);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error finding private key", err);
goto out;
@@ -392,8 +446,8 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
*/
bzero(aes_param, sizeof (aes_param));
ckrv = C_WrapKey(pk11session, &aes_cbc_pad_mech,
- aes_key_obj, (CK_OBJECT_HANDLE)key->keyp,
- NULL, &wrapped_privkey_len);
+ aes_key_obj, (CK_OBJECT_HANDLE)key->keyp,
+ NULL, &wrapped_privkey_len);
if (ckrv != CKR_OK) {
/*
* Most common error here is that the token doesn't
@@ -402,8 +456,8 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* the caller deal with it gracefully.
*/
(void) fprintf(stderr,
- "Cannot get wrap key size. error = %s\n",
- pkcs11_strerror(ckrv));
+ "Cannot get wrap key size. error = %s\n",
+ pkcs11_strerror(ckrv));
rv = KMF_ERR_INTERNAL;
goto out;
}
@@ -416,12 +470,12 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* Now get the actual wrapped key data.
*/
ckrv = C_WrapKey(pk11session, &aes_cbc_pad_mech,
- aes_key_obj, (CK_OBJECT_HANDLE)key->keyp,
- wrapped_privkey, &wrapped_privkey_len);
+ aes_key_obj, (CK_OBJECT_HANDLE)key->keyp,
+ wrapped_privkey, &wrapped_privkey_len);
if (ckrv != CKR_OK) {
(void) fprintf(stderr,
- "Cannot wrap private key. error = %s\n",
- pkcs11_strerror(ckrv));
+ "Cannot wrap private key. error = %s\n",
+ pkcs11_strerror(ckrv));
rv = KMF_ERR_INTERNAL;
goto out;
}
@@ -430,7 +484,7 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* it easier later.
*/
snprintf(wrapkey_label, sizeof (wrapkey_label), "ksslprikey_%d",
- getpid());
+ getpid());
unwrap_tmpl[5].pValue = wrapkey_label;
unwrap_tmpl[5].ulValueLen = strlen(wrapkey_label);
@@ -440,12 +494,12 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* session private key.
*/
ckrv = C_UnwrapKey(pk11session, &aes_cbc_pad_mech, aes_key_obj,
- wrapped_privkey, wrapped_privkey_len,
- unwrap_tmpl, 6, &sess_privkey_obj);
+ wrapped_privkey, wrapped_privkey_len,
+ unwrap_tmpl, 6, &sess_privkey_obj);
if (ckrv != CKR_OK) {
(void) fprintf(stderr,
- "Cannot unwrap private key. error = %s\n",
- pkcs11_strerror(ckrv));
+ "Cannot unwrap private key. error = %s\n",
+ pkcs11_strerror(ckrv));
rv = KMF_ERR_INTERNAL;
goto out;
}
@@ -454,15 +508,51 @@ get_sensitive_key_data(KMF_HANDLE_T kmfh, KMF_FINDKEY_PARAMS *fkparams,
* Use KMF to find the session key and return it as RAW data
* so we can pass it along to KSSL.
*/
- fkparams->kstype = KMF_KEYSTORE_PK11TOKEN;
- fkparams->keyclass = KMF_ASYM_PRI;
- fkparams->format = KMF_FORMAT_RAWKEY;
- fkparams->findLabel = wrapkey_label;
- fkparams->pkcs11parms.sensitive = FALSE;
- fkparams->pkcs11parms.private = FALSE;
- fkparams->pkcs11parms.token = FALSE; /* <-- very important! */
-
- rv = KMF_FindKey(kmfh, fkparams, rawkey, &nkeys);
+ kclass = KMF_ASYM_PRI;
+ if ((idx = kmf_find_attr(KMF_KEYCLASS_ATTR, attrlist, numattr)) != -1) {
+ attrlist[idx].pValue = &kclass;
+ }
+
+ format = KMF_FORMAT_RAWKEY;
+ if ((idx = kmf_find_attr(KMF_ENCODE_FORMAT_ATTR, attrlist,
+ numattr)) != -1) {
+ attrlist[idx].pValue = &format;
+ }
+ if (wrapkey_label != NULL &&
+ (idx = kmf_find_attr(KMF_KEYLABEL_ATTR, attrlist, numattr)) != -1) {
+ attrlist[idx].pValue = wrapkey_label;
+ attrlist[idx].valueLen = strlen(wrapkey_label);
+ }
+
+ if ((idx = kmf_find_attr(KMF_PRIVATE_BOOL_ATTR, attrlist,
+ numattr)) != -1) {
+ attrlist[idx].pValue = &kmffalse;
+ }
+ if ((idx = kmf_find_attr(KMF_TOKEN_BOOL_ATTR, attrlist,
+ numattr)) != -1) {
+ attrlist[idx].pValue = &kmffalse;
+ }
+
+ if ((idx = kmf_find_attr(KMF_KEY_HANDLE_ATTR, attrlist,
+ numattr)) != -1) {
+ attrlist[idx].pValue = rawkey;
+ }
+ /*
+ * Clear the IDSTR attribute since it is not part of the
+ * wrapped session key.
+ */
+ if ((idx = kmf_find_attr(KMF_IDSTR_ATTR, attrlist,
+ numattr)) != -1) {
+ attrlist[idx].pValue = NULL;
+ attrlist[idx].valueLen = 0;
+ }
+
+ /* The wrapped key should not be sensitive. */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SENSITIVE_BOOL_ATTR,
+ &false, sizeof (false));
+ numattr++;
+
+ rv = kmf_find_key(kmfh, numattr, attrlist);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error finding raw private key", err);
goto out;
@@ -489,38 +579,53 @@ load_from_pkcs11(const char *token_label, const char *password_file,
KMF_X509_DER_CERT cert;
KMF_KEY_HANDLE key, rawkey;
KMF_CREDENTIAL creds;
- KMF_FINDCERT_PARAMS fcparams;
- KMF_FINDKEY_PARAMS fkparams;
- KMF_CONFIG_PARAMS cfgparams;
KMF_DATA iddata = { NULL, 0 };
kssl_params_t *kssl_params = NULL;
uint32_t ncerts, nkeys;
char *err, *idstr = NULL;
char password_buf[1024];
int nxkey = 0;
-
- rv = KMF_Initialize(&kmfh, NULL, NULL);
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_KEY_CLASS kclass;
+ KMF_ENCODE_FORMAT format;
+ boolean_t false = B_FALSE;
+ boolean_t true = B_TRUE;
+
+ rv = kmf_initialize(&kmfh, NULL, NULL);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error initializing KMF", err);
return (0);
}
if (get_passphrase(password_file, password_buf,
- sizeof (password_buf)) <= 0) {
+ sizeof (password_buf)) <= 0) {
perror("Unable to read passphrase");
goto done;
}
creds.cred = password_buf;
creds.credlen = strlen(password_buf);
- bzero(&cfgparams, sizeof (cfgparams));
- bzero(&fcparams, sizeof (fcparams));
- bzero(&fkparams, sizeof (fkparams));
+ (void) memset(&key, 0, sizeof (KMF_KEY_HANDLE));
+ (void) memset(&rawkey, 0, sizeof (KMF_KEY_HANDLE));
- cfgparams.kstype = KMF_KEYSTORE_PK11TOKEN;
- cfgparams.pkcs11config.label = (char *)token_label;
- cfgparams.pkcs11config.readonly = B_FALSE;
+ kstype = KMF_KEYSTORE_PK11TOKEN;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- rv = KMF_ConfigureKeystore(kmfh, &cfgparams);
+ if (token_label && strlen(token_label)) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_TOKEN_LABEL_ATTR,
+ (void *)token_label, strlen(token_label));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_READONLY_ATTR,
+ &false, sizeof (false));
+ numattr++;
+
+ rv = kmf_configure_keystore(kmfh, numattr, attrlist);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error configuring KMF keystore", err);
goto done;
@@ -529,9 +634,28 @@ load_from_pkcs11(const char *token_label, const char *password_file,
/*
* Find the certificate matching the given label.
*/
- fcparams.kstype = KMF_KEYSTORE_PK11TOKEN;
- fcparams.certLabel = (char *)certname;
- rv = KMF_FindCert(kmfh, &fcparams, &cert, &ncerts);
+ numattr = 0;
+ kstype = KMF_KEYSTORE_PK11TOKEN;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
+
+ if (certname) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_LABEL_ATTR,
+ (void *)certname, strlen(certname));
+ numattr++;
+ }
+ ncerts = 1;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &ncerts, sizeof (ncerts));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_X509_DER_CERT_ATTR,
+ &cert, sizeof (cert));
+ numattr++;
+
+ rv = kmf_find_cert(kmfh, numattr, attrlist);
if (rv != KMF_OK || ncerts == 0)
goto done;
@@ -539,64 +663,100 @@ load_from_pkcs11(const char *token_label, const char *password_file,
* Find the associated private key for this cert by
* keying off of the label and the ASCII ID string.
*/
- rv = KMF_GetCertIDString(&cert.certificate, &idstr);
+ rv = kmf_get_cert_id_str(&cert.certificate, &idstr);
if (rv != KMF_OK)
goto done;
- fkparams.kstype = KMF_KEYSTORE_PK11TOKEN;
- fkparams.keyclass = KMF_ASYM_PRI;
- fkparams.cred = creds;
- fkparams.format = KMF_FORMAT_RAWKEY;
- fkparams.findLabel = (char *)certname;
- fkparams.idstr = idstr;
- fkparams.pkcs11parms.private = TRUE;
- fkparams.pkcs11parms.token = TRUE;
+ numattr = 1; /* attrlist[0] is already set to kstype */
+
+ kclass = KMF_ASYM_PRI;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYCLASS_ATTR,
+ &kclass, sizeof (kclass));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CREDENTIAL_ATTR,
+ &creds, sizeof (KMF_CREDENTIAL));
+ numattr++;
- rv = KMF_FindKey(kmfh, &fkparams, &key, &nkeys);
+ format = KMF_FORMAT_RAWKEY;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ENCODE_FORMAT_ATTR,
+ &format, sizeof (format));
+ numattr++;
+
+ if (certname) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYLABEL_ATTR,
+ (void *)certname, strlen(certname));
+ numattr++;
+ }
+ if (idstr) {
+ kmf_set_attr_at_index(attrlist, numattr, KMF_IDSTR_ATTR,
+ (void *)idstr, strlen(idstr));
+ numattr++;
+ }
+ kmf_set_attr_at_index(attrlist, numattr, KMF_TOKEN_BOOL_ATTR,
+ &true, sizeof (true));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_PRIVATE_BOOL_ATTR,
+ &true, sizeof (true));
+ numattr++;
+
+ /* We only expect to find 1 key at most */
+ nkeys = 1;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &nkeys, sizeof (nkeys));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEY_HANDLE_ATTR,
+ &key, sizeof (KMF_KEY_HANDLE));
+ numattr++;
+
+ rv = kmf_find_key(kmfh, numattr, attrlist);
if (rv == KMF_ERR_SENSITIVE_KEY) {
- KMF_FreeKMFKey(kmfh, &key);
+ kmf_free_kmf_key(kmfh, &key);
/*
* Get a normal key handle and then do a wrap/unwrap
* in order to get the necessary raw data fields needed
* to send to KSSL.
*/
- fkparams.format = KMF_FORMAT_NATIVE;
- rv = get_sensitive_key_data(kmfh, &fkparams, &key, &rawkey);
+ format = KMF_FORMAT_NATIVE;
+ rv = get_sensitive_key_data(kmfh, &creds,
+ (char *)certname, idstr, &key, &rawkey);
if (rv == KMF_OK) {
/* Swap "key" for "rawkey" */
- KMF_FreeKMFKey(kmfh, &key);
+ kmf_free_kmf_key(kmfh, &key);
key = rawkey;
} else {
- KMF_FreeKMFKey(kmfh, &key);
+ kmf_free_kmf_key(kmfh, &key);
/* Let kssl try to find the key. */
nxkey = 1;
- rv = KMF_GetCertIDData(&cert.certificate, &iddata);
+ rv = kmf_get_cert_id_data(&cert.certificate, &iddata);
}
} else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
- KMF_FreeKMFKey(kmfh, &key);
+ kmf_free_kmf_key(kmfh, &key);
- /* Let kssl try to find the key. */
- nxkey = 1;
- rv = KMF_GetCertIDData(&cert.certificate, &iddata);
+ /* Let kssl try to find the key. */
+ nxkey = 1;
+ rv = kmf_get_cert_id_data(&cert.certificate, &iddata);
} else if (rv != KMF_OK || nkeys == 0)
goto done;
if (rv == KMF_OK)
kssl_params = kmf_to_kssl(nxkey, (KMF_RAW_KEY_DATA *)key.keyp,
- 1, &cert.certificate, bufsize,
- (char *)token_label, &iddata, &creds);
+ 1, &cert.certificate, bufsize,
+ (char *)token_label, &iddata, &creds);
done:
if (ncerts != 0)
- KMF_FreeKMFCert(kmfh, &cert);
+ kmf_free_kmf_cert(kmfh, &cert);
if (nkeys != 0)
- KMF_FreeKMFKey(kmfh, &key);
+ kmf_free_kmf_key(kmfh, &key);
if (idstr)
free(idstr);
if (kmfh != NULL)
- (void) KMF_Finalize(kmfh);
+ (void) kmf_finalize(kmfh);
return (kssl_params);
}
@@ -614,37 +774,55 @@ add_cacerts(kssl_params_t *old_params, const char *cacert_chain_file)
char *buf;
KMF_RETURN rv;
KMF_X509_DER_CERT *certs = NULL;
- KMF_FINDCERT_PARAMS fcparms;
kssl_params_t *kssl_params;
KMF_HANDLE_T kmfh;
char *err = NULL;
+ int numattr = 0;
+ KMF_ATTRIBUTE attrlist[16];
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
- bzero(&fcparms, sizeof (fcparms));
- fcparms.kstype = KMF_KEYSTORE_OPENSSL;
- fcparms.sslparms.certfile = (char *)cacert_chain_file;
+ kstype = KMF_KEYSTORE_OPENSSL;
- rv = KMF_Initialize(&kmfh, NULL, NULL);
+ rv = kmf_initialize(&kmfh, NULL, NULL);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error initializing KMF", err);
return (0);
}
- rv = KMF_FindCert(kmfh, &fcparms, NULL, &ncerts);
+ ncerts = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (KMF_KEYSTORE_TYPE));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_CERT_FILENAME_ATTR,
+ (void *)cacert_chain_file, strlen(cacert_chain_file));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_COUNT_ATTR,
+ &ncerts, sizeof (ncerts));
+ numattr++;
+
+ rv = kmf_find_cert(kmfh, numattr, attrlist);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error finding CA certificates", err);
(void) KMF_Finalize(kmfh);
return (0);
}
certs = (KMF_X509_DER_CERT *)malloc(ncerts *
- sizeof (KMF_X509_DER_CERT));
+ sizeof (KMF_X509_DER_CERT));
if (certs == NULL) {
(void) fprintf(stderr, "memory allocation error.\n");
(void) KMF_Finalize(kmfh);
return (NULL);
}
bzero(certs, ncerts * sizeof (KMF_X509_DER_CERT));
- rv = KMF_FindCert(kmfh, &fcparms, certs, &ncerts);
- (void) KMF_Finalize(kmfh);
+ /* add new attribute for the cert list to be returned */
+ kmf_set_attr_at_index(attrlist, numattr, KMF_X509_DER_CERT_ATTR,
+ certs, (ncerts * sizeof (KMF_X509_DER_CERT)));
+ numattr++;
+ rv = kmf_find_cert(kmfh, numattr, attrlist);
+
+ (void) kmf_finalize(kmfh);
if (rv != KMF_OK || ncerts == 0) {
bzero(old_params, old_params->kssl_params_size);
@@ -688,12 +866,12 @@ add_cacerts(kssl_params_t *old_params, const char *cacert_chain_file)
/* now the certs values */
for (i = 0; i < ncerts; i++) {
bcopy(certs[i].certificate.Data, buf,
- certs[i].certificate.Length);
+ certs[i].certificate.Length);
buf += certs[i].certificate.Length;
}
for (i = 0; i < ncerts; i++)
- KMF_FreeKMFCert(kmfh, &certs[i]);
+ kmf_free_kmf_cert(kmfh, &certs[i]);
free(certs);
return (kssl_params);
@@ -711,7 +889,7 @@ load_from_pem(const char *filename, const char *password_file, int *paramsize)
KMF_DATA *certs = NULL;
ncerts = PEM_get_rsa_key_certs(filename, (char *)password_file,
- &rsa, &certs);
+ &rsa, &certs);
if (rsa == NULL || certs == NULL || ncerts == 0) {
return (NULL);
}
@@ -720,12 +898,12 @@ load_from_pem(const char *filename, const char *password_file, int *paramsize)
(void) printf("%d certificates read successfully\n", ncerts);
kssl_params = kmf_to_kssl(0, rsa, ncerts, certs, paramsize, NULL,
- NULL, NULL);
+ NULL, NULL);
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
free(certs);
- KMF_FreeRawKey(rsa);
+ kmf_free_raw_key(rsa);
return (kssl_params);
}
@@ -743,7 +921,7 @@ load_from_pkcs12(const char *filename, const char *password_file,
int ncerts = 0, i;
ncerts = PKCS12_get_rsa_key_certs(filename,
- password_file, &rsa, &certs);
+ password_file, &rsa, &certs);
if (certs == NULL || ncerts == 0) {
(void) fprintf(stderr,
@@ -755,13 +933,13 @@ load_from_pkcs12(const char *filename, const char *password_file,
(void) printf("%d certificates read successfully\n", ncerts);
kssl_params = kmf_to_kssl(0, rsa, ncerts, certs, paramsize, NULL,
- NULL, NULL);
+ NULL, NULL);
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
free(certs);
- KMF_FreeRawKey(rsa);
+ kmf_free_raw_key(rsa);
return (kssl_params);
}
diff --git a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/ksslutil.c b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/ksslutil.c
index 30f9d5f581..42fca362e3 100644
--- a/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/ksslutil.c
+++ b/usr/src/cmd/cmd-inet/usr.sbin/kssl/kssladm/ksslutil.c
@@ -51,7 +51,7 @@ PKCS12_get_rsa_key_certs(const char *filename, const char *password_file,
int ncerts, nkeys;
char *err = NULL;
- rv = KMF_Initialize(&kmfh, NULL, NULL);
+ rv = kmf_initialize(&kmfh, NULL, NULL);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error initializing KMF", err);
return (0);
@@ -63,15 +63,15 @@ PKCS12_get_rsa_key_certs(const char *filename, const char *password_file,
nkeys = 0;
if (get_passphrase(password_file, password_buf,
- sizeof (password_buf)) <= 0) {
+ sizeof (password_buf)) <= 0) {
perror("Unable to read passphrase");
goto done;
}
pk12cred.cred = password_buf;
pk12cred.credlen = strlen(password_buf);
- rv = KMF_ImportPK12(kmfh, (char *)filename, &pk12cred, &tcerts, &ncerts,
- &keys, &nkeys);
+ rv = kmf_import_objects(kmfh, (char *)filename, &pk12cred, &tcerts,
+ &ncerts, &keys, &nkeys);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error importing PKCS12 data", err);
}
@@ -81,14 +81,14 @@ done:
int i;
if (tcerts != NULL) {
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&tcerts[i]);
+ kmf_free_data(&tcerts[i]);
free(tcerts);
}
tcerts = NULL;
ncerts = 0;
if (keys != NULL) {
for (i = 0; i < nkeys; i++)
- KMF_FreeRawKey(&keys[i]);
+ kmf_free_raw_key(&keys[i]);
free(keys);
}
keys = NULL;
@@ -96,7 +96,7 @@ done:
*certs = tcerts;
*rsa = keys;
- (void) KMF_Finalize(kmfh);
+ (void) kmf_finalize(kmfh);
return (ncerts);
}
@@ -119,7 +119,7 @@ PEM_get_rsa_key_certs(const char *filename, char *password_file,
char *err = NULL;
char password_buf[1024];
- rv = KMF_Initialize(&kmfh, NULL, NULL);
+ rv = kmf_initialize(&kmfh, NULL, NULL);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error initializing KMF", err);
return (0);
@@ -131,15 +131,15 @@ PEM_get_rsa_key_certs(const char *filename, char *password_file,
nkeys = 0;
if (get_passphrase(password_file, password_buf,
- sizeof (password_buf)) <= 0) {
+ sizeof (password_buf)) <= 0) {
perror("Unable to read passphrase");
goto done;
}
creds.cred = password_buf;
creds.credlen = strlen(password_buf);
- rv = KMF_ImportKeypair(kmfh, (char *)filename, &creds, &tcerts, &ncerts,
- &keys, &nkeys);
+ rv = kmf_import_objects(kmfh, (char *)filename, &creds, &tcerts,
+ &ncerts, &keys, &nkeys);
if (rv != KMF_OK) {
REPORT_KMF_ERROR(rv, "Error importing key data", err);
}
@@ -149,14 +149,14 @@ done:
int i;
if (tcerts != NULL) {
for (i = 0; i < ncerts; i++)
- KMF_FreeData(&tcerts[i]);
+ kmf_free_data(&tcerts[i]);
free(tcerts);
}
tcerts = NULL;
ncerts = 0;
if (keys != NULL) {
for (i = 0; i < nkeys; i++)
- KMF_FreeRawKey(&keys[i]);
+ kmf_free_raw_key(&keys[i]);
free(keys);
}
keys = NULL;
@@ -166,7 +166,7 @@ done:
if (rsa != NULL)
*rsa = keys;
- (void) KMF_Finalize(kmfh);
+ (void) kmf_finalize(kmfh);
return (ncerts);
}
diff --git a/usr/src/lib/libkmf/include/algorithm.h b/usr/src/lib/libkmf/include/algorithm.h
index c52ee81028..00e2eabddf 100644
--- a/usr/src/lib/libkmf/include/algorithm.h
+++ b/usr/src/lib/libkmf/include/algorithm.h
@@ -37,7 +37,7 @@ typedef struct pkcs_algorithm_map
} PKCS_ALGORITHM_MAP;
extern KMF_SIGNATURE_MODE PKCS_GetDefaultSignatureMode(KMF_ALGORITHM_INDEX);
-extern PKCS_ALGORITHM_MAP* PKCS_GetAlgorithmMap(KMF_ALGCLASS, uint32_t,
+extern PKCS_ALGORITHM_MAP* pkcs_get_alg_map(KMF_ALGCLASS, uint32_t,
uint32_t);
#ifdef __cplusplus
diff --git a/usr/src/lib/libkmf/include/kmfapi.h b/usr/src/lib/libkmf/include/kmfapi.h
index fd29b0733c..4826248ddb 100644
--- a/usr/src/lib/libkmf/include/kmfapi.h
+++ b/usr/src/lib/libkmf/include/kmfapi.h
@@ -42,309 +42,334 @@ extern "C" {
/*
* Setup operations.
*/
-extern KMF_RETURN KMF_Initialize(KMF_HANDLE_T *, char *, char *);
-extern KMF_RETURN KMF_ConfigureKeystore(KMF_HANDLE_T, KMF_CONFIG_PARAMS *);
-extern KMF_RETURN KMF_Finalize(KMF_HANDLE_T);
+extern KMF_RETURN kmf_initialize(KMF_HANDLE_T *, char *, char *);
+extern KMF_RETURN kmf_configure_keystore(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_finalize(KMF_HANDLE_T);
/*
* Key operations.
*/
-extern KMF_RETURN KMF_SignDataWithKey(KMF_HANDLE_T,
- KMF_KEY_HANDLE *, KMF_OID *,
- KMF_DATA *, KMF_DATA *);
-
-extern KMF_RETURN KMF_VerifyDataWithKey(KMF_HANDLE_T,
- KMF_KEY_HANDLE *, KMF_ALGORITHM_INDEX, KMF_DATA *, KMF_DATA *);
-
-extern KMF_RETURN KMF_CreateKeypair(KMF_HANDLE_T,
- KMF_CREATEKEYPAIR_PARAMS *, KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
+extern KMF_RETURN kmf_create_keypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_DeleteKeyFromKeystore(KMF_HANDLE_T,
- KMF_DELETEKEY_PARAMS *, KMF_KEY_HANDLE *);
+extern KMF_RETURN kmf_delete_key_from_keystore(KMF_HANDLE_T, int,
+ KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_SignCertRecord(KMF_HANDLE_T, KMF_KEY_HANDLE *,
- KMF_X509_CERTIFICATE *, KMF_DATA *);
+extern KMF_RETURN kmf_find_key(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
- KMF_KEY_HANDLE *, uint32_t *);
+extern KMF_RETURN kmf_find_prikey_by_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_StorePrivateKey(KMF_HANDLE_T, KMF_STOREKEY_PARAMS *,
- KMF_RAW_KEY_DATA *);
+extern KMF_RETURN kmf_store_key(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_CreateSymKey(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *,
- KMF_KEY_HANDLE *);
+extern KMF_RETURN kmf_create_sym_key(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *,
+extern KMF_RETURN kmf_get_sym_key_value(KMF_HANDLE_T, KMF_KEY_HANDLE *,
KMF_RAW_SYM_KEY *);
/*
* Certificate operations.
*/
-extern KMF_RETURN KMF_FindCert(KMF_HANDLE_T, KMF_FINDCERT_PARAMS *,
- KMF_X509_DER_CERT *, uint32_t *);
+extern KMF_RETURN kmf_find_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_EncodeCertRecord(KMF_X509_CERTIFICATE *,
- KMF_DATA *);
-extern KMF_RETURN KMF_DecodeCertData(KMF_DATA *, KMF_X509_CERTIFICATE **);
+extern KMF_RETURN kmf_encode_cert_record(KMF_X509_CERTIFICATE *, KMF_DATA *);
-extern KMF_RETURN KMF_SignCertWithKey(KMF_HANDLE_T, const KMF_DATA *,
- KMF_KEY_HANDLE *, KMF_DATA *);
-extern KMF_RETURN KMF_SignCertWithCert(KMF_HANDLE_T,
- KMF_CRYPTOWITHCERT_PARAMS *,
- const KMF_DATA *, KMF_DATA *, KMF_DATA *);
+extern KMF_RETURN kmf_import_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_SignDataWithCert(KMF_HANDLE_T,
- KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *, KMF_DATA *, KMF_DATA *);
+extern KMF_RETURN kmf_store_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_VerifyCertWithKey(KMF_HANDLE_T, KMF_KEY_HANDLE *,
- const KMF_DATA *);
-extern KMF_RETURN KMF_VerifyCertWithCert(KMF_HANDLE_T, const KMF_DATA *,
- const KMF_DATA *);
-extern KMF_RETURN KMF_VerifyDataWithCert(KMF_HANDLE_T,
- KMF_KEYSTORE_TYPE, KMF_ALGORITHM_INDEX, KMF_DATA *, KMF_DATA *,
- const KMF_DATA *);
-
-extern KMF_RETURN KMF_EncryptWithCert(KMF_HANDLE_T, KMF_DATA *,
- KMF_DATA *, KMF_DATA *);
+extern KMF_RETURN kmf_delete_cert_from_keystore(KMF_HANDLE_T, int,
+ KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_DecryptWithCert(KMF_HANDLE_T,
- KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *, KMF_DATA *, KMF_DATA *);
+extern KMF_RETURN kmf_validate_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_StoreCert(KMF_HANDLE_T,
- KMF_STORECERT_PARAMS *, KMF_DATA *);
-extern KMF_RETURN KMF_ImportCert(KMF_HANDLE_T, KMF_IMPORTCERT_PARAMS *);
-extern KMF_RETURN KMF_DeleteCertFromKeystore(KMF_HANDLE_T,
- KMF_DELETECERT_PARAMS *);
+extern KMF_RETURN kmf_create_cert_file(const KMF_DATA *, KMF_ENCODE_FORMAT,
+ char *);
-extern KMF_RETURN KMF_ValidateCert(KMF_HANDLE_T,
- KMF_VALIDATECERT_PARAMS *, int *);
+extern KMF_RETURN kmf_download_cert(KMF_HANDLE_T, char *, char *, int,
+ unsigned int, char *, KMF_ENCODE_FORMAT *);
-extern KMF_RETURN KMF_CreateCertFile(KMF_DATA *, KMF_ENCODE_FORMAT, char *);
+extern KMF_RETURN kmf_is_cert_file(KMF_HANDLE_T, char *, KMF_ENCODE_FORMAT *);
-extern KMF_RETURN KMF_DownloadCert(KMF_HANDLE_T, char *, char *, int,
- unsigned int, char *, KMF_ENCODE_FORMAT *);
-extern KMF_RETURN KMF_IsCertFile(KMF_HANDLE_T, char *, KMF_ENCODE_FORMAT *);
+extern KMF_RETURN kmf_check_cert_date(KMF_HANDLE_T, const KMF_DATA *);
-extern KMF_RETURN KMF_CheckCertDate(KMF_HANDLE_T, KMF_DATA *);
+/*
+ * Crypto operations with key or cert.
+ */
+extern KMF_RETURN kmf_encrypt(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_decrypt(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_sign_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_sign_data(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_verify_cert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_verify_data(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
/*
* CRL operations.
*/
-extern KMF_RETURN KMF_ImportCRL(KMF_HANDLE_T, KMF_IMPORTCRL_PARAMS *);
-extern KMF_RETURN KMF_DeleteCRL(KMF_HANDLE_T, KMF_DELETECRL_PARAMS *);
-extern KMF_RETURN KMF_ListCRL(KMF_HANDLE_T, KMF_LISTCRL_PARAMS *, char **);
-extern KMF_RETURN KMF_FindCRL(KMF_HANDLE_T, KMF_FINDCRL_PARAMS *,
- char **, int *);
-
-extern KMF_RETURN KMF_FindCertInCRL(KMF_HANDLE_T,
- KMF_FINDCERTINCRL_PARAMS *);
-extern KMF_RETURN KMF_VerifyCRLFile(KMF_HANDLE_T,
- KMF_VERIFYCRL_PARAMS *);
-
-extern KMF_RETURN KMF_CheckCRLDate(KMF_HANDLE_T,
- KMF_CHECKCRLDATE_PARAMS *);
-extern KMF_RETURN KMF_DownloadCRL(KMF_HANDLE_T, char *, char *,
+extern KMF_RETURN kmf_import_crl(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_delete_crl(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_list_crl(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_find_crl(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_find_cert_in_crl(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern KMF_RETURN kmf_verify_crl_file(KMF_HANDLE_T, char *, KMF_DATA *);
+extern KMF_RETURN kmf_check_crl_date(KMF_HANDLE_T, char *);
+extern KMF_RETURN kmf_download_crl(KMF_HANDLE_T, char *, char *,
int, unsigned int, char *, KMF_ENCODE_FORMAT *);
-extern KMF_RETURN KMF_IsCRLFile(KMF_HANDLE_T, char *, KMF_ENCODE_FORMAT *);
+extern KMF_RETURN kmf_is_crl_file(KMF_HANDLE_T, char *, KMF_ENCODE_FORMAT *);
/*
* CSR operations.
*/
-extern KMF_RETURN KMF_SetCSRPubKey(KMF_HANDLE_T,
+extern KMF_RETURN kmf_create_csr_file(KMF_DATA *, KMF_ENCODE_FORMAT, char *);
+extern KMF_RETURN kmf_set_csr_pubkey(KMF_HANDLE_T,
KMF_KEY_HANDLE *, KMF_CSR_DATA *);
-extern KMF_RETURN KMF_SetCSRVersion(KMF_CSR_DATA *, uint32_t);
-extern KMF_RETURN KMF_SetCSRSubjectName(KMF_CSR_DATA *, KMF_X509_NAME *);
-extern KMF_RETURN KMF_CreateCSRFile(KMF_DATA *, KMF_ENCODE_FORMAT, char *);
-extern KMF_RETURN KMF_SetCSRExtension(KMF_CSR_DATA *, KMF_X509_EXTENSION *);
-extern KMF_RETURN KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *,
- KMF_ALGORITHM_INDEX);
-extern KMF_RETURN KMF_SetCSRSubjectAltName(KMF_CSR_DATA *, char *,
+extern KMF_RETURN kmf_set_csr_version(KMF_CSR_DATA *, uint32_t);
+extern KMF_RETURN kmf_set_csr_subject(KMF_CSR_DATA *, KMF_X509_NAME *);
+extern KMF_RETURN kmf_set_csr_extn(KMF_CSR_DATA *, KMF_X509_EXTENSION *);
+extern KMF_RETURN kmf_set_csr_sig_alg(KMF_CSR_DATA *, KMF_ALGORITHM_INDEX);
+extern KMF_RETURN kmf_set_csr_subject_altname(KMF_CSR_DATA *, char *,
int, KMF_GENERALNAMECHOICES);
-extern KMF_RETURN KMF_SetCSRKeyUsage(KMF_CSR_DATA *, int, uint16_t);
-extern KMF_RETURN KMF_SignCSR(KMF_HANDLE_T, const KMF_CSR_DATA *,
+extern KMF_RETURN kmf_set_csr_ku(KMF_CSR_DATA *, int, uint16_t);
+extern KMF_RETURN kmf_sign_csr(KMF_HANDLE_T, const KMF_CSR_DATA *,
KMF_KEY_HANDLE *, KMF_DATA *);
/*
* GetCert operations.
*/
-extern KMF_RETURN KMF_GetCertExtensionData(const KMF_DATA *, KMF_OID *,
+extern KMF_RETURN kmf_get_cert_extn(const KMF_DATA *, KMF_OID *,
KMF_X509_EXTENSION *);
-extern KMF_RETURN KMF_GetCertCriticalExtensions(const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_extns(const KMF_DATA *, KMF_FLAG_CERT_EXTN,
KMF_X509_EXTENSION **, int *);
-extern KMF_RETURN KMF_GetCertNonCriticalExtensions(const KMF_DATA *,
- KMF_X509_EXTENSION **, int *);
-
-extern KMF_RETURN KMF_GetCertKeyUsageExt(const KMF_DATA *,
- KMF_X509EXT_KEY_USAGE *);
+extern KMF_RETURN kmf_get_cert_ku(const KMF_DATA *, KMF_X509EXT_KEY_USAGE *);
-extern KMF_RETURN KMF_GetCertEKU(const KMF_DATA *, KMF_X509EXT_EKU *);
+extern KMF_RETURN kmf_get_cert_eku(const KMF_DATA *, KMF_X509EXT_EKU *);
-extern KMF_RETURN KMF_GetCertBasicConstraintExt(const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_basic_constraint(const KMF_DATA *,
KMF_BOOL *, KMF_X509EXT_BASICCONSTRAINTS *);
-extern KMF_RETURN KMF_GetCertPoliciesExt(const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_policies(const KMF_DATA *,
KMF_BOOL *, KMF_X509EXT_CERT_POLICIES *);
-extern KMF_RETURN KMF_GetCertAuthInfoAccessExt(const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_auth_info_access(const KMF_DATA *,
KMF_X509EXT_AUTHINFOACCESS *);
-extern KMF_RETURN KMF_GetCertCRLDistributionPointsExt(const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_crl_dist_pts(const KMF_DATA *,
KMF_X509EXT_CRLDISTPOINTS *);
-extern KMF_RETURN KMF_GetCertVersionString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_version_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertSubjectNameString(KMF_HANDLE_T, const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_subject_str(KMF_HANDLE_T, const KMF_DATA *,
char **);
-extern KMF_RETURN KMF_GetCertIssuerNameString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_issuer_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertSerialNumberString(KMF_HANDLE_T, const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_serial_str(KMF_HANDLE_T, const KMF_DATA *,
char **);
-extern KMF_RETURN KMF_GetCertStartDateString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_start_date_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertEndDateString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_end_date_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertPubKeyAlgString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_pubkey_alg_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertSignatureAlgString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_sig_alg_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertPubKeyDataString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_pubkey_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertEmailString(KMF_HANDLE_T,
- const KMF_DATA *, char **);
+extern KMF_RETURN kmf_get_cert_email_str(KMF_HANDLE_T, const KMF_DATA *,
+ char **);
-extern KMF_RETURN KMF_GetCertExtensionString(KMF_HANDLE_T, const KMF_DATA *,
+extern KMF_RETURN kmf_get_cert_extn_str(KMF_HANDLE_T, const KMF_DATA *,
KMF_PRINTABLE_ITEM, char **);
-extern KMF_RETURN KMF_GetCertIDData(const KMF_DATA *, KMF_DATA *);
-extern KMF_RETURN KMF_GetCertIDString(const KMF_DATA *, char **);
-extern KMF_RETURN KMF_GetCertValidity(const KMF_DATA *, time_t *, time_t *);
+extern KMF_RETURN kmf_get_cert_id_data(const KMF_DATA *, KMF_DATA *);
+
+extern KMF_RETURN kmf_get_cert_id_str(const KMF_DATA *, char **);
+
+extern KMF_RETURN kmf_get_cert_validity(const KMF_DATA *, time_t *, time_t *);
+
/*
* SetCert operations
*/
-extern KMF_RETURN KMF_SetCertPubKey(KMF_HANDLE_T, KMF_KEY_HANDLE *,
+extern KMF_RETURN kmf_set_cert_pubkey(KMF_HANDLE_T, KMF_KEY_HANDLE *,
KMF_X509_CERTIFICATE *);
-extern KMF_RETURN KMF_SetCertSubjectName(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_subject(KMF_X509_CERTIFICATE *,
KMF_X509_NAME *);
-extern KMF_RETURN KMF_SetCertKeyUsage(KMF_X509_CERTIFICATE *, int, uint16_t);
+extern KMF_RETURN kmf_set_cert_ku(KMF_X509_CERTIFICATE *, int, uint16_t);
-extern KMF_RETURN KMF_SetCertIssuerName(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_issuer(KMF_X509_CERTIFICATE *,
KMF_X509_NAME *);
-extern KMF_RETURN KMF_SetCertSignatureAlgorithm(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_sig_alg(KMF_X509_CERTIFICATE *,
KMF_ALGORITHM_INDEX);
-extern KMF_RETURN KMF_SetCertValidityTimes(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_validity(KMF_X509_CERTIFICATE *,
time_t, uint32_t);
-extern KMF_RETURN KMF_SetCertSerialNumber(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_serial(KMF_X509_CERTIFICATE *,
KMF_BIGINT *);
-extern KMF_RETURN KMF_SetCertVersion(KMF_X509_CERTIFICATE *, uint32_t);
+extern KMF_RETURN kmf_set_cert_version(KMF_X509_CERTIFICATE *, uint32_t);
-extern KMF_RETURN KMF_SetCertIssuerAltName(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_issuer_altname(KMF_X509_CERTIFICATE *,
int, KMF_GENERALNAMECHOICES, char *);
-extern KMF_RETURN KMF_SetCertSubjectAltName(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_subject_altname(KMF_X509_CERTIFICATE *,
int, KMF_GENERALNAMECHOICES, char *);
-extern KMF_RETURN KMF_AddCertEKU(KMF_X509_CERTIFICATE *, KMF_OID *, int);
+extern KMF_RETURN kmf_add_cert_eku(KMF_X509_CERTIFICATE *, KMF_OID *, int);
-extern KMF_RETURN KMF_SetCertExtension(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_extn(KMF_X509_CERTIFICATE *,
KMF_X509_EXTENSION *);
-extern KMF_RETURN KMF_SetCertBasicConstraintExt(KMF_X509_CERTIFICATE *,
+extern KMF_RETURN kmf_set_cert_basic_constraint(KMF_X509_CERTIFICATE *,
KMF_BOOL, KMF_X509EXT_BASICCONSTRAINTS *);
-extern KMF_RETURN KMF_ExportPK12(KMF_HANDLE_T, KMF_EXPORTP12_PARAMS *, char *);
-extern KMF_RETURN KMF_ImportPK12(KMF_HANDLE_T, char *, KMF_CREDENTIAL *,
- KMF_DATA **, int *, KMF_RAW_KEY_DATA **, int *);
-extern KMF_RETURN KMF_ImportKeypair(KMF_HANDLE_T, char *, KMF_CREDENTIAL *,
+
+/*
+ * PK12 operations
+ */
+extern KMF_RETURN kmf_export_pk12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+
+extern KMF_RETURN kmf_build_pk12(KMF_HANDLE_T, int, KMF_X509_DER_CERT *,
+ int, KMF_KEY_HANDLE *, KMF_CREDENTIAL *, char *);
+
+extern KMF_RETURN kmf_import_objects(KMF_HANDLE_T, char *, KMF_CREDENTIAL *,
KMF_DATA **, int *, KMF_RAW_KEY_DATA **, int *);
/*
- * Get OCSP response operation.
+ * OCSP operations
*/
-extern KMF_RETURN KMF_GetOCSPForCert(KMF_HANDLE_T, KMF_DATA *, KMF_DATA *,
+extern KMF_RETURN kmf_get_ocsp_for_cert(KMF_HANDLE_T, KMF_DATA *, KMF_DATA *,
KMF_DATA *);
-extern KMF_RETURN KMF_CreateOCSPRequest(KMF_HANDLE_T, KMF_OCSPREQUEST_PARAMS *,
- char *);
+extern KMF_RETURN kmf_create_ocsp_request(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
-extern KMF_RETURN KMF_GetEncodedOCSPResponse(KMF_HANDLE_T, char *, char *, int,
- char *, int, char *, unsigned int);
+extern KMF_RETURN kmf_get_encoded_ocsp_response(KMF_HANDLE_T, char *,
+ char *, int, char *, int, char *, unsigned int);
-extern KMF_RETURN KMF_GetOCSPStatusForCert(KMF_HANDLE_T,
- KMF_OCSPRESPONSE_PARAMS_INPUT *,
- KMF_OCSPRESPONSE_PARAMS_OUTPUT *);
+extern KMF_RETURN kmf_get_ocsp_status_for_cert(KMF_HANDLE_T, int,
+ KMF_ATTRIBUTE *);
/*
* Policy Operations
*/
-extern KMF_RETURN KMF_SetPolicy(KMF_HANDLE_T, char *, char *);
+extern KMF_RETURN kmf_set_policy(KMF_HANDLE_T, char *, char *);
/*
* Error handling.
*/
-extern KMF_RETURN KMF_GetPluginErrorString(KMF_HANDLE_T, char **);
-extern KMF_RETURN KMF_GetKMFErrorString(KMF_RETURN, char **);
+extern KMF_RETURN kmf_get_plugin_error_str(KMF_HANDLE_T, char **);
+extern KMF_RETURN kmf_get_kmf_error_str(KMF_RETURN, char **);
/*
* Miscellaneous
*/
-extern KMF_RETURN KMF_DNParser(char *, KMF_X509_NAME *);
-extern KMF_RETURN KMF_DN2Der(KMF_X509_NAME *, KMF_DATA *);
-extern KMF_RETURN KMF_ReadInputFile(KMF_HANDLE_T, char *, KMF_DATA *);
-extern KMF_RETURN KMF_Der2Pem(KMF_OBJECT_TYPE, unsigned char *,
+extern KMF_RETURN kmf_dn_parser(char *, KMF_X509_NAME *);
+extern KMF_RETURN kmf_read_input_file(KMF_HANDLE_T, char *, KMF_DATA *);
+extern KMF_RETURN kmf_der_to_pem(KMF_OBJECT_TYPE, unsigned char *,
int, unsigned char **, int *);
-extern KMF_RETURN KMF_Pem2Der(unsigned char *, int, unsigned char **, int *);
-extern char *KMF_OID2String(KMF_OID *);
-extern KMF_RETURN KMF_String2OID(char *, KMF_OID *);
-extern int KMF_CompareRDNs(KMF_X509_NAME *, KMF_X509_NAME *);
-extern KMF_RETURN KMF_GetFileFormat(char *, KMF_ENCODE_FORMAT *);
-extern uint16_t KMF_StringToKeyUsage(char *);
-extern KMF_RETURN KMF_SetTokenPin(KMF_HANDLE_T, KMF_SETPIN_PARAMS *,
- KMF_CREDENTIAL *);
-extern KMF_RETURN KMF_HexString2Bytes(unsigned char *, unsigned char **,
+extern KMF_RETURN kmf_pem_to_der(unsigned char *, int, unsigned char **, int *);
+extern char *kmf_oid_to_string(KMF_OID *);
+extern KMF_RETURN kmf_string_to_oid(char *, KMF_OID *);
+extern int kmf_compare_rdns(KMF_X509_NAME *, KMF_X509_NAME *);
+extern KMF_RETURN kmf_get_file_format(char *, KMF_ENCODE_FORMAT *);
+extern uint32_t kmf_string_to_ku(char *);
+extern char *kmf_ku_to_string(uint32_t);
+extern KMF_RETURN kmf_hexstr_to_bytes(unsigned char *, unsigned char **,
size_t *);
+#define KMF_CompareRDNs kmf_compare_rdns
+
/*
* Memory cleanup operations
*/
-extern void KMF_FreeDN(KMF_X509_NAME *);
-extern void KMF_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
-extern void KMF_FreeData(KMF_DATA *);
-extern void KMF_FreeAlgOID(KMF_X509_ALGORITHM_IDENTIFIER *);
-extern void KMF_FreeExtension(KMF_X509_EXTENSION *);
-extern void KMF_FreeTBSCSR(KMF_TBS_CSR *);
-extern void KMF_FreeSignedCSR(KMF_CSR_DATA *);
-extern void KMF_FreeTBSCert(KMF_X509_TBS_CERT *);
-extern void KMF_FreeSignedCert(KMF_X509_CERTIFICATE *);
-extern void KMF_FreeString(char *);
-extern void KMF_FreeEKU(KMF_X509EXT_EKU *);
-extern void KMF_FreeSPKI(KMF_X509_SPKI *);
-extern void KMF_FreeKMFKey(KMF_HANDLE_T, KMF_KEY_HANDLE *);
-extern void KMF_FreeBigint(KMF_BIGINT *);
-extern void KMF_FreeRawKey(KMF_RAW_KEY_DATA *);
-extern void KMF_FreeRawSymKey(KMF_RAW_SYM_KEY *);
-extern void KMF_FreeCRLDistributionPoints(KMF_X509EXT_CRLDISTPOINTS *);
+extern void kmf_free_dn(KMF_X509_NAME *);
+extern void kmf_free_kmf_cert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
+extern void kmf_free_data(KMF_DATA *);
+extern void kmf_free_algoid(KMF_X509_ALGORITHM_IDENTIFIER *);
+extern void kmf_free_extn(KMF_X509_EXTENSION *);
+extern void kmf_free_tbs_csr(KMF_TBS_CSR *);
+extern void kmf_free_signed_csr(KMF_CSR_DATA *);
+extern void kmf_free_tbs_cert(KMF_X509_TBS_CERT *);
+extern void kmf_free_signed_cert(KMF_X509_CERTIFICATE *);
+extern void kmf_free_str(char *);
+extern void kmf_free_eku(KMF_X509EXT_EKU *);
+extern void kmf_free_spki(KMF_X509_SPKI *);
+extern void kmf_free_kmf_key(KMF_HANDLE_T, KMF_KEY_HANDLE *);
+extern void kmf_free_bigint(KMF_BIGINT *);
+extern void kmf_free_raw_key(KMF_RAW_KEY_DATA *);
+extern void kmf_free_raw_sym_key(KMF_RAW_SYM_KEY *);
+extern void kmf_free_crl_dist_pts(KMF_X509EXT_CRLDISTPOINTS *);
/* APIs for PKCS#11 token */
-extern KMF_RETURN KMF_PK11TokenLookup(KMF_HANDLE_T, char *, CK_SLOT_ID *);
-extern CK_SESSION_HANDLE KMF_GetPK11Handle(KMF_HANDLE_T);
+extern KMF_RETURN kmf_pk11_token_lookup(KMF_HANDLE_T, char *, CK_SLOT_ID *);
+extern KMF_RETURN kmf_set_token_pin(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+extern CK_SESSION_HANDLE kmf_get_pk11_handle(KMF_HANDLE_T);
+
+/*
+ * Attribute management routines.
+ */
+int kmf_find_attr(KMF_ATTR_TYPE, KMF_ATTRIBUTE *, int);
+void *kmf_get_attr_ptr(KMF_ATTR_TYPE, KMF_ATTRIBUTE *, int);
+KMF_RETURN kmf_get_attr(KMF_ATTR_TYPE, KMF_ATTRIBUTE *, int, void *,
+ uint32_t *);
+KMF_RETURN kmf_get_string_attr(KMF_ATTR_TYPE, KMF_ATTRIBUTE *, int, char **);
+KMF_RETURN kmf_set_attr(KMF_ATTRIBUTE *, int, KMF_ATTR_TYPE, void *, uint32_t);
+void kmf_set_attr_at_index(KMF_ATTRIBUTE *, int, KMF_ATTR_TYPE,
+ void *, uint32_t);
+
+/*
+ * Legacy support only - do not use these APIs - they can be removed at any
+ * time.
+ */
+extern KMF_RETURN KMF_ConfigureKeystore(KMF_HANDLE_T, KMF_CONFIG_PARAMS *);
+extern KMF_RETURN KMF_CreateCSRFile(KMF_DATA *, KMF_ENCODE_FORMAT, char *);
+extern KMF_RETURN KMF_CreateKeypair(KMF_HANDLE_T,
+ KMF_CREATEKEYPAIR_PARAMS *, KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
+extern KMF_RETURN KMF_DNParser(char *, KMF_X509_NAME *);
+extern KMF_RETURN KMF_Finalize(KMF_HANDLE_T);
+extern KMF_RETURN KMF_FindCert(KMF_HANDLE_T, KMF_FINDCERT_PARAMS *,
+ KMF_X509_DER_CERT *, uint32_t *);
+extern KMF_RETURN KMF_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
+ KMF_KEY_HANDLE *, uint32_t *);
+extern void KMF_FreeData(KMF_DATA *);
+extern void KMF_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
+extern void KMF_FreeKMFKey(KMF_HANDLE_T, KMF_KEY_HANDLE *);
+extern void KMF_FreeSignedCSR(KMF_CSR_DATA *);
+extern KMF_RETURN KMF_GetCertIDString(const KMF_DATA *, char **);
+extern KMF_RETURN KMF_GetCertIssuerNameString(KMF_HANDLE_T,
+ const KMF_DATA *, char **);
+extern KMF_RETURN KMF_GetCertSubjectNameString(KMF_HANDLE_T,
+ const KMF_DATA *, char **);
+extern KMF_RETURN KMF_GetKMFErrorString(KMF_RETURN, char **);
+extern KMF_RETURN KMF_Initialize(KMF_HANDLE_T *, char *, char *);
+extern KMF_RETURN KMF_ReadInputFile(KMF_HANDLE_T, char *, KMF_DATA *);
+extern KMF_RETURN KMF_SetCSRPubKey(KMF_HANDLE_T, KMF_KEY_HANDLE *,
+ KMF_CSR_DATA *);
+extern KMF_RETURN KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *,
+ KMF_ALGORITHM_INDEX);
+extern KMF_RETURN KMF_SetCSRSubjectName(KMF_CSR_DATA *, KMF_X509_NAME *);
+extern KMF_RETURN KMF_SetCSRVersion(KMF_CSR_DATA *, uint32_t);
+extern KMF_RETURN KMF_SignCSR(KMF_HANDLE_T, const KMF_CSR_DATA *,
+ KMF_KEY_HANDLE *, KMF_DATA *);
+extern KMF_RETURN KMF_SignDataWithKey(KMF_HANDLE_T, KMF_KEY_HANDLE *,
+ KMF_OID *, KMF_DATA *, KMF_DATA *);
+extern KMF_RETURN KMF_VerifyCertWithCert(KMF_HANDLE_T, const KMF_DATA *,
+ const KMF_DATA *);
+extern KMF_RETURN KMF_VerifyDataWithCert(KMF_HANDLE_T,
+ KMF_KEYSTORE_TYPE, KMF_ALGORITHM_INDEX, KMF_DATA *, KMF_DATA *,
+ const KMF_DATA *);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/libkmf/include/kmfapiP.h b/usr/src/lib/libkmf/include/kmfapiP.h
index 715abfaf31..ac89acb565 100644
--- a/usr/src/lib/libkmf/include/kmfapiP.h
+++ b/usr/src/lib/libkmf/include/kmfapiP.h
@@ -39,13 +39,13 @@ typedef struct {
ushort_t version;
KMF_RETURN (*ConfigureKeystore) (
KMF_HANDLE_T,
- KMF_CONFIG_PARAMS *);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*FindCert) (
KMF_HANDLE_T,
- KMF_FINDCERT_PARAMS *,
- KMF_X509_DER_CERT *,
- uint32_t *);
+ int,
+ KMF_ATTRIBUTE *);
void (*FreeKMFCert) (
KMF_HANDLE_T,
@@ -53,36 +53,33 @@ typedef struct {
KMF_RETURN (*StoreCert) (
KMF_HANDLE_T,
- KMF_STORECERT_PARAMS *,
- KMF_DATA *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*ImportCert) (
KMF_HANDLE_T,
- KMF_IMPORTCERT_PARAMS *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*ImportCRL) (
KMF_HANDLE_T,
- KMF_IMPORTCRL_PARAMS *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*DeleteCert) (
KMF_HANDLE_T,
- KMF_DELETECERT_PARAMS *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*DeleteCRL) (
KMF_HANDLE_T,
- KMF_DELETECRL_PARAMS *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*CreateKeypair) (
KMF_HANDLE_T,
- KMF_CREATEKEYPAIR_PARAMS *,
- KMF_KEY_HANDLE *,
- KMF_KEY_HANDLE *);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*FindKey) (
KMF_HANDLE_T,
- KMF_FINDKEY_PARAMS *,
- KMF_KEY_HANDLE *,
- uint32_t *);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*EncodePubkeyData) (
KMF_HANDLE_T,
@@ -98,35 +95,29 @@ typedef struct {
KMF_RETURN (*DeleteKey) (
KMF_HANDLE_T,
- KMF_DELETEKEY_PARAMS *,
- KMF_KEY_HANDLE *,
- boolean_t);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*ListCRL) (
KMF_HANDLE_T,
- KMF_LISTCRL_PARAMS *,
- char **);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*FindCRL) (
KMF_HANDLE_T,
- KMF_FINDCRL_PARAMS *,
- char **,
- int *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*FindCertInCRL) (
KMF_HANDLE_T,
- KMF_FINDCERTINCRL_PARAMS *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*GetErrorString) (
KMF_HANDLE_T,
char **);
- KMF_RETURN (*GetPrikeyByCert) (
+ KMF_RETURN (*FindPrikeyByCert) (
KMF_HANDLE_T,
- KMF_CRYPTOWITHCERT_PARAMS *,
- KMF_DATA *,
- KMF_KEY_HANDLE *,
- KMF_KEY_ALG);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*DecryptData) (
KMF_HANDLE_T,
@@ -135,22 +126,15 @@ typedef struct {
KMF_DATA *,
KMF_DATA *);
- KMF_RETURN (*ExportP12)(
- KMF_HANDLE_T,
- KMF_EXPORTP12_PARAMS *,
- int, KMF_X509_DER_CERT *,
- int, KMF_KEY_HANDLE *,
- char *);
-
- KMF_RETURN (*StorePrivateKey)(
+ KMF_RETURN (*ExportPK12)(
KMF_HANDLE_T,
- KMF_STOREKEY_PARAMS *,
- KMF_RAW_KEY_DATA *);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*CreateSymKey) (
KMF_HANDLE_T,
- KMF_CREATESYMKEY_PARAMS *,
- KMF_KEY_HANDLE *);
+ int,
+ KMF_ATTRIBUTE *);
KMF_RETURN (*GetSymKeyValue) (
KMF_HANDLE_T,
@@ -159,8 +143,7 @@ typedef struct {
KMF_RETURN (*SetTokenPin) (
KMF_HANDLE_T,
- KMF_SETPIN_PARAMS *,
- KMF_CREDENTIAL *);
+ int, KMF_ATTRIBUTE *);
KMF_RETURN (*VerifyDataWithCert) (
KMF_HANDLE_T,
@@ -169,11 +152,23 @@ typedef struct {
KMF_DATA *,
KMF_DATA *);
+ KMF_RETURN (*StoreKey) (
+ KMF_HANDLE_T,
+ int,
+ KMF_ATTRIBUTE *);
+
void (*Finalize) ();
} KMF_PLUGIN_FUNCLIST;
typedef struct {
+ KMF_ATTR_TYPE type;
+ boolean_t null_value_ok; /* Is the pValue required */
+ uint32_t minlen;
+ uint32_t maxlen;
+} KMF_ATTRIBUTE_TESTER;
+
+typedef struct {
KMF_KEYSTORE_TYPE type;
char *applications;
char *path;
@@ -188,7 +183,7 @@ typedef struct _KMF_PLUGIN_LIST {
typedef struct _kmf_handle {
/*
- * session handle opened by KMF_SelectToken() to talk
+ * session handle opened by kmf_select_token() to talk
* to a specific slot in Crypto framework. It is used
* by pkcs11 plugin module.
*/
@@ -228,11 +223,7 @@ KMF_RETURN
VerifyDataWithKey(KMF_HANDLE_T, KMF_DATA *, KMF_ALGORITHM_INDEX, KMF_DATA *,
KMF_DATA *);
-KMF_RETURN
-SignCsr(KMF_HANDLE_T, const KMF_DATA *, KMF_KEY_HANDLE *,
- KMF_X509_ALGORITHM_IDENTIFIER *, KMF_DATA *);
-
-KMF_BOOL PKCS_ConvertAlgorithmId2PKCSKeyType(
+KMF_BOOL pkcs_algid_to_keytype(
KMF_ALGORITHM_INDEX, CK_KEY_TYPE *);
KMF_RETURN PKCS_VerifyData(
@@ -252,15 +243,19 @@ KMF_PLUGIN *FindPlugin(KMF_HANDLE_T, KMF_KEYSTORE_TYPE);
KMF_BOOL IsEqualOid(KMF_OID *, KMF_OID *);
-KMF_OID *X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX);
-KMF_ALGORITHM_INDEX X509_AlgorithmOidToAlgId(KMF_OID *);
+KMF_RETURN copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
+ KMF_X509_ALGORITHM_IDENTIFIER *srcid);
+
+KMF_OID *x509_algid_to_algoid(KMF_ALGORITHM_INDEX);
+KMF_ALGORITHM_INDEX x509_algoid_to_algid(KMF_OID *);
+
KMF_RETURN PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
const KMF_X509_SPKI *, CK_KEY_TYPE, CK_OBJECT_HANDLE *,
KMF_BOOL *);
KMF_RETURN GetIDFromSPKI(KMF_X509_SPKI *, KMF_DATA *);
-KMF_RETURN KMF_SetAltName(KMF_X509_EXTENSIONS *,
+KMF_RETURN kmf_set_altname(KMF_X509_EXTENSIONS *,
KMF_OID *, int, KMF_GENERALNAMECHOICES, char *);
KMF_RETURN GetSequenceContents(char *, size_t, char **, size_t *);
KMF_X509_EXTENSION *FindExtn(KMF_X509_EXTENSIONS *, KMF_OID *);
@@ -275,7 +270,10 @@ void free_dp(KMF_CRL_DIST_POINT *);
KMF_RETURN set_key_usage_extension(KMF_X509_EXTENSIONS *,
int, uint32_t);
KMF_RETURN init_pk11();
-KMF_RETURN KMF_SelectToken(KMF_HANDLE_T, char *, int);
+KMF_RETURN kmf_select_token(KMF_HANDLE_T, char *, int);
+
+KMF_RETURN test_attributes(int, KMF_ATTRIBUTE_TESTER *,
+ int, KMF_ATTRIBUTE_TESTER *, int, KMF_ATTRIBUTE *);
/* Indexes into the key parts array for RSA keys */
diff --git a/usr/src/lib/libkmf/include/kmfpolicy.h b/usr/src/lib/libkmf/include/kmfpolicy.h
index e00c55e620..e1cec2b56a 100644
--- a/usr/src/lib/libkmf/include/kmfpolicy.h
+++ b/usr/src/lib/libkmf/include/kmfpolicy.h
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
#ifndef _KMFPOLICY_H
@@ -175,21 +175,18 @@ typedef struct {
#define TMPFILE_TEMPLATE "policyXXXXXX"
-extern char *ku2str(uint32_t);
-extern uint32_t str2ku(char *);
extern int parsePolicyElement(xmlNodePtr, KMF_POLICY_RECORD *);
-extern char *KMF_OID2EKUString(KMF_OID *);
-extern KMF_OID *kmf_ekuname2oid(char *);
-extern KMF_OID *kmf_string2oid(char *);
+extern char *kmf_oid_to_eku_string(KMF_OID *);
+extern KMF_OID *kmf_ekuname_to_oid(char *);
-extern KMF_RETURN KMF_GetPolicy(char *, char *, KMF_POLICY_RECORD *);
-extern KMF_RETURN KMF_AddPolicyToDB(KMF_POLICY_RECORD *, char *, boolean_t);
-extern KMF_RETURN KMF_DeletePolicyFromDB(char *, char *);
-extern KMF_RETURN KMF_VerifyPolicy(KMF_POLICY_RECORD *);
+extern KMF_RETURN kmf_get_policy(char *, char *, KMF_POLICY_RECORD *);
+extern KMF_RETURN kmf_add_policy_to_db(KMF_POLICY_RECORD *, char *, boolean_t);
+extern KMF_RETURN kmf_delete_policy_from_db(char *, char *);
+extern KMF_RETURN kmf_verify_policy(KMF_POLICY_RECORD *);
-extern void KMF_FreePolicyRecord(KMF_POLICY_RECORD *);
-extern void KMF_FreeEKUPolicy(KMF_EKU_POLICY *);
+extern void kmf_free_policy_record(KMF_POLICY_RECORD *);
+extern void kmf_free_eku_policy(KMF_EKU_POLICY *);
#ifdef __cplusplus
}
diff --git a/usr/src/lib/libkmf/include/kmftypes.h b/usr/src/lib/libkmf/include/kmftypes.h
index c6bfa51f7b..e820b68b13 100644
--- a/usr/src/lib/libkmf/include/kmftypes.h
+++ b/usr/src/lib/libkmf/include/kmftypes.h
@@ -60,7 +60,7 @@ typedef struct kmf_x509_private {
char *label;
#define KMF_FLAG_CERT_VALID 1 /* contains valid certificate */
#define KMF_FLAG_CERT_SIGNED 2 /* this is a signed certificate */
-} KMF_X509_PRIVATE, KMF_X509_PRIVATE_PTR;
+} KMF_X509_PRIVATE;
/*
* KMF_X509_DER_CERT
@@ -92,6 +92,7 @@ typedef enum {
KMF_FORMAT_RAWKEY = 4, /* For FindKey operation */
KMF_FORMAT_PEM_KEYPAIR = 5
} KMF_ENCODE_FORMAT;
+
#define KMF_FORMAT_NATIVE KMF_FORMAT_UNDEF
typedef enum {
@@ -100,6 +101,14 @@ typedef enum {
KMF_EXPIRED_CERTS = 2
} KMF_CERT_VALIDITY;
+
+typedef enum {
+ KMF_ALL_EXTNS = 0,
+ KMF_CRITICAL_EXTNS = 1,
+ KMF_NONCRITICAL_EXTNS = 2
+} KMF_FLAG_CERT_EXTN;
+
+
typedef enum {
KMF_KU_SIGN_CERT = 0,
KMF_KU_SIGN_DATA = 1,
@@ -123,29 +132,6 @@ typedef enum {
KMF_ALGID_SHA1WithDSA
} KMF_ALGORITHM_INDEX;
-/* Keystore Configuration */
-typedef struct {
- char *configdir;
- char *certPrefix;
- char *keyPrefix;
- char *secModName;
-} KMF_NSS_CONFIG;
-
-typedef struct {
- char *label;
- boolean_t readonly;
-} KMF_PKCS11_CONFIG;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- union {
- KMF_NSS_CONFIG nss_conf;
- KMF_PKCS11_CONFIG pkcs11_conf;
- } ks_config_u;
-} KMF_CONFIG_PARAMS;
-
-#define nssconfig ks_config_u.nss_conf
-#define pkcs11config ks_config_u.pkcs11_conf
/*
* Generic credential structure used by other structures below
@@ -157,78 +143,6 @@ typedef struct {
uint32_t credlen;
} KMF_CREDENTIAL;
-typedef struct
-{
- char *trustflag;
- char *slotlabel; /* "internal" by default */
- int issuerId;
- int subjectId;
- char *crlfile; /* for ImportCRL */
- boolean_t crl_check; /* for ImportCRL */
-
- /*
- * The following 2 variables are for FindCertInCRL. The caller can
- * either specify certLabel or provide the entire certificate in
- * DER format as input.
- */
- char *certLabel; /* for FindCertInCRL */
- KMF_DATA *certificate; /* for FindCertInCRL */
-
- /*
- * crl_subjName and crl_issuerName are used as the CRL deletion
- * criteria. One should be non-NULL and the other one should be NULL.
- * If crl_subjName is not NULL, then delete CRL by the subject name.
- * Othewise, delete by the issuer name.
- */
- char *crl_subjName;
- char *crl_issuerName;
-} KMF_NSS_PARAMS;
-
-typedef struct {
- char *dirpath;
- char *certfile;
- char *crlfile;
- char *keyfile;
- char *outcrlfile;
- boolean_t crl_check; /* CRL import check; default is true */
- KMF_ENCODE_FORMAT format; /* output file format */
-} KMF_OPENSSL_PARAMS;
-
-typedef struct {
- boolean_t private; /* for finding CKA_PRIVATE objects */
- boolean_t sensitive;
- boolean_t not_extractable;
- boolean_t token; /* true == token object, false == session */
-} KMF_PKCS11_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- char *certLabel;
- char *issuer;
- char *subject;
- char *idstr;
- KMF_BIGINT *serial;
- KMF_CERT_VALIDITY find_cert_validity;
-
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- KMF_PKCS11_PARAMS pkcs11_opts;
- } ks_opt_u;
-} KMF_FINDCERT_PARAMS, KMF_DELETECERT_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_DATA *certificate;
- KMF_DATA *ocsp_response;
-
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- KMF_PKCS11_PARAMS pkcs11_opts;
- } ks_opt_u;
-} KMF_VALIDATECERT_PARAMS;
-
typedef enum {
KMF_KEYALG_NONE = 0,
KMF_RSA = 1,
@@ -247,59 +161,6 @@ typedef enum {
KMF_SYMMETRIC = 3 /* symmetric key */
}KMF_KEY_CLASS;
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_CREDENTIAL cred;
- KMF_KEY_CLASS keyclass;
- KMF_KEY_ALG keytype;
- KMF_ENCODE_FORMAT format; /* for key */
- char *findLabel;
- char *idstr;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- KMF_PKCS11_PARAMS pkcs11_opts;
- } ks_opt_u;
-} KMF_FINDKEY_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype; /* all */
- char *certLabel;
-
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_STORECERT_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_CREDENTIAL cred;
- KMF_DATA *certificate;
- char *label;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_STOREKEY_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_CREDENTIAL cred;
- union {
- KMF_NSS_PARAMS nss_opts;
- } ks_opt_u;
-} KMF_DELETEKEY_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- char *certfile;
- char *certLabel;
-
- union {
- KMF_NSS_PARAMS nss_opts;
- } ks_opt_u;
-} KMF_IMPORTCERT_PARAMS;
typedef enum {
KMF_CERT = 0,
@@ -307,93 +168,6 @@ typedef enum {
KMF_CRL = 2
}KMF_OBJECT_TYPE;
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_KEY_ALG keytype;
- uint32_t keylength;
- char *keylabel;
- KMF_CREDENTIAL cred;
- KMF_BIGINT rsa_exponent;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- }ks_opt_u;
-} KMF_CREATEKEYPAIR_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_IMPORTCRL_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_DELETECRL_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_LISTCRL_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- union {
- KMF_NSS_PARAMS nss_opts;
- } ks_opt_u;
-} KMF_FINDCRL_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
-
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- } ks_opt_u;
-} KMF_FINDCERTINCRL_PARAMS;
-
-typedef struct {
- char *crl_name;
- KMF_DATA *tacert;
-} KMF_VERIFYCRL_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_CREDENTIAL cred;
- KMF_ENCODE_FORMAT format; /* for key */
- char *certLabel;
- KMF_ALGORITHM_INDEX algid;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- }ks_opt_u;
-} KMF_CRYPTOWITHCERT_PARAMS;
-
-typedef struct {
- char *crl_name;
-} KMF_CHECKCRLDATE_PARAMS;
-
-typedef struct {
- CK_SLOT_ID slot;
-} pk11_setpin_opts;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- char *tokenname;
- KMF_CREDENTIAL cred; /* current token PIN */
- union {
- KMF_NSS_PARAMS nss_opts;
- pk11_setpin_opts pkcs11_opts;
- }ks_opt_u;
-} KMF_SETPIN_PARAMS;
typedef struct {
KMF_BIGINT mod;
@@ -411,6 +185,7 @@ typedef struct {
KMF_BIGINT subprime;
KMF_BIGINT base;
KMF_BIGINT value;
+ KMF_BIGINT pubvalue;
} KMF_RAW_DSA_KEY;
typedef struct {
@@ -418,7 +193,9 @@ typedef struct {
} KMF_RAW_SYM_KEY;
typedef struct {
- KMF_KEY_ALG keytype;
+ KMF_KEY_ALG keytype;
+ boolean_t sensitive;
+ boolean_t not_extractable;
union {
KMF_RAW_RSA_KEY rsa;
KMF_RAW_DSA_KEY dsa;
@@ -426,65 +203,6 @@ typedef struct {
}rawdata;
} KMF_RAW_KEY_DATA;
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- char *certLabel;
- char *issuer;
- char *subject;
- char *idstr;
- KMF_BIGINT *serial;
- KMF_CREDENTIAL cred; /* cred for accessing the token */
- KMF_CREDENTIAL p12cred; /* cred used for securing the file */
-
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- }ks_opt_u;
-} KMF_EXPORTP12_PARAMS;
-
-typedef struct {
- KMF_KEYSTORE_TYPE kstype;
- KMF_KEY_ALG keytype;
- uint32_t keylength;
- char *keylabel;
- KMF_CREDENTIAL cred;
- union {
- KMF_NSS_PARAMS nss_opts;
- KMF_OPENSSL_PARAMS openssl_opts;
- KMF_PKCS11_PARAMS pkcs11_opts;
- }ks_opt_u;
-} KMF_CREATESYMKEY_PARAMS;
-
-/* Data structures for OCSP support */
-typedef struct {
- KMF_DATA *issuer_cert;
- KMF_DATA *user_cert;
-} KMF_OCSPREQUEST_PARAMS;
-
-typedef struct {
- KMF_DATA *response;
- KMF_DATA *issuer_cert;
- KMF_DATA *user_cert;
- KMF_DATA *signer_cert; /* can be NULL */
- boolean_t ignore_response_sign; /* default is FALSE */
- uint32_t response_lifetime; /* in seconds */
-} KMF_OCSPRESPONSE_PARAMS_INPUT;
-
-typedef enum {
- OCSP_GOOD = 0,
- OCSP_REVOKED = 1,
- OCSP_UNKNOWN = 2
-} KMF_OCSP_CERT_STATUS;
-
-typedef struct {
- int response_status;
- int reason; /* if revoked */
- KMF_OCSP_CERT_STATUS cert_status;
-} KMF_OCSPRESPONSE_PARAMS_OUTPUT;
-
-#define nssparms ks_opt_u.nss_opts
-#define sslparms ks_opt_u.openssl_opts
-#define pkcs11parms ks_opt_u.pkcs11_opts
typedef struct {
KMF_KEYSTORE_TYPE kstype;
@@ -605,9 +323,17 @@ typedef enum {
KMF_KEYSTORE_ALREADY_INITIALIZED = 0x50,
KMF_ERR_SENSITIVE_KEY = 0x51,
KMF_ERR_UNEXTRACTABLE_KEY = 0x52,
- KMF_ERR_KEY_MISMATCH = 0x53
+ KMF_ERR_KEY_MISMATCH = 0x53,
+ KMF_ERR_ATTR_NOT_FOUND = 0x54
} KMF_RETURN;
+/* Data structures for OCSP support */
+typedef enum {
+ OCSP_GOOD = 0,
+ OCSP_REVOKED = 1,
+ OCSP_UNKNOWN = 2
+} KMF_OCSP_CERT_STATUS;
+
typedef enum {
OCSP_SUCCESS = 0,
OCSP_MALFORMED_REQUEST = 1,
@@ -984,6 +710,90 @@ typedef struct {
KMF_CRL_DIST_POINT *dplist;
} KMF_X509EXT_CRLDISTPOINTS;
+typedef enum {
+ KMF_DATA_ATTR,
+ KMF_OID_ATTR,
+ KMF_BIGINT_ATTR,
+ KMF_X509_DER_CERT_ATTR,
+ KMF_KEYSTORE_TYPE_ATTR,
+ KMF_ENCODE_FORMAT_ATTR,
+ KMF_CERT_VALIDITY_ATTR,
+ KMF_KU_PURPOSE_ATTR,
+ KMF_ALGORITHM_INDEX_ATTR,
+ KMF_TOKEN_LABEL_ATTR,
+ KMF_READONLY_ATTR,
+ KMF_DIRPATH_ATTR,
+ KMF_CERTPREFIX_ATTR,
+ KMF_KEYPREFIX_ATTR,
+ KMF_SECMODNAME_ATTR,
+ KMF_CREDENTIAL_ATTR,
+ KMF_TRUSTFLAG_ATTR,
+ KMF_CRL_FILENAME_ATTR,
+ KMF_CRL_CHECK_ATTR,
+ KMF_CRL_DATA_ATTR,
+ KMF_CRL_SUBJECT_ATTR,
+ KMF_CRL_ISSUER_ATTR,
+ KMF_CRL_NAMELIST_ATTR,
+ KMF_CRL_COUNT_ATTR,
+ KMF_CRL_OUTFILE_ATTR,
+ KMF_CERT_LABEL_ATTR,
+ KMF_SUBJECT_NAME_ATTR,
+ KMF_ISSUER_NAME_ATTR,
+ KMF_CERT_FILENAME_ATTR,
+ KMF_KEY_FILENAME_ATTR,
+ KMF_OUTPUT_FILENAME_ATTR,
+ KMF_IDSTR_ATTR,
+ KMF_CERT_DATA_ATTR,
+ KMF_OCSP_RESPONSE_DATA_ATTR,
+ KMF_OCSP_RESPONSE_STATUS_ATTR,
+ KMF_OCSP_RESPONSE_REASON_ATTR,
+ KMF_OCSP_RESPONSE_CERT_STATUS_ATTR,
+ KMF_OCSP_REQUEST_FILENAME_ATTR,
+ KMF_KEYALG_ATTR,
+ KMF_KEYCLASS_ATTR,
+ KMF_KEYLABEL_ATTR,
+ KMF_KEYLENGTH_ATTR,
+ KMF_RSAEXP_ATTR,
+ KMF_TACERT_DATA_ATTR,
+ KMF_SLOT_ID_ATTR,
+ KMF_PK12CRED_ATTR,
+ KMF_ISSUER_CERT_DATA_ATTR,
+ KMF_USER_CERT_DATA_ATTR,
+ KMF_SIGNER_CERT_DATA_ATTR,
+ KMF_IGNORE_RESPONSE_SIGN_ATTR,
+ KMF_RESPONSE_LIFETIME_ATTR,
+ KMF_KEY_HANDLE_ATTR,
+ KMF_PRIVKEY_HANDLE_ATTR,
+ KMF_PUBKEY_HANDLE_ATTR,
+ KMF_ERROR_ATTR,
+ KMF_X509_NAME_ATTR,
+ KMF_X509_SPKI_ATTR,
+ KMF_X509_CERTIFICATE_ATTR,
+ KMF_RAW_KEY_ATTR,
+ KMF_CSR_DATA_ATTR,
+ KMF_GENERALNAMECHOICES_ATTR,
+ KMF_STOREKEY_BOOL_ATTR,
+ KMF_SENSITIVE_BOOL_ATTR,
+ KMF_NON_EXTRACTABLE_BOOL_ATTR,
+ KMF_TOKEN_BOOL_ATTR,
+ KMF_PRIVATE_BOOL_ATTR,
+ KMF_NEWPIN_ATTR,
+ KMF_IN_SIGN_ATTR,
+ KMF_OUT_DATA_ATTR,
+ KMF_COUNT_ATTR,
+ KMF_DESTROY_BOOL_ATTR,
+ KMF_TBS_CERT_DATA_ATTR,
+ KMF_PLAINTEXT_DATA_ATTR,
+ KMF_CIPHERTEXT_DATA_ATTR,
+ KMF_VALIDATE_RESULT_ATTR,
+ KMF_KEY_DATA_ATTR
+} KMF_ATTR_TYPE;
+
+typedef struct {
+ KMF_ATTR_TYPE type;
+ void *pValue;
+ uint32_t valueLen;
+} KMF_ATTRIBUTE;
/*
* Definitions for common X.509v3 certificate attribute OIDs
@@ -1356,6 +1166,145 @@ KMFOID_X9CM_DSAWithSHA1;
#define KMF_EKU_OCSPSIGNING 0x20
+/*
+ * Legacy support only - do not use these data structures - they can be
+ * removed at any time.
+ */
+
+/* Keystore Configuration */
+typedef struct {
+ char *configdir;
+ char *certPrefix;
+ char *keyPrefix;
+ char *secModName;
+} KMF_NSS_CONFIG;
+
+typedef struct {
+ char *label;
+ boolean_t readonly;
+} KMF_PKCS11_CONFIG;
+
+typedef struct {
+ KMF_KEYSTORE_TYPE kstype;
+ union {
+ KMF_NSS_CONFIG nss_conf;
+ KMF_PKCS11_CONFIG pkcs11_conf;
+ } ks_config_u;
+} KMF_CONFIG_PARAMS;
+
+#define nssconfig ks_config_u.nss_conf
+#define pkcs11config ks_config_u.pkcs11_conf
+
+
+typedef struct
+{
+ char *trustflag;
+ char *slotlabel; /* "internal" by default */
+ int issuerId;
+ int subjectId;
+ char *crlfile; /* for ImportCRL */
+ boolean_t crl_check; /* for ImportCRL */
+
+ /*
+ * The following 2 variables are for FindCertInCRL. The caller can
+ * either specify certLabel or provide the entire certificate in
+ * DER format as input.
+ */
+ char *certLabel; /* for FindCertInCRL */
+ KMF_DATA *certificate; /* for FindCertInCRL */
+
+ /*
+ * crl_subjName and crl_issuerName are used as the CRL deletion
+ * criteria. One should be non-NULL and the other one should be NULL.
+ * If crl_subjName is not NULL, then delete CRL by the subject name.
+ * Othewise, delete by the issuer name.
+ */
+ char *crl_subjName;
+ char *crl_issuerName;
+} KMF_NSS_PARAMS;
+
+typedef struct {
+ char *dirpath;
+ char *certfile;
+ char *crlfile;
+ char *keyfile;
+ char *outcrlfile;
+ boolean_t crl_check; /* CRL import check; default is true */
+ KMF_ENCODE_FORMAT format; /* output file format */
+} KMF_OPENSSL_PARAMS;
+
+typedef struct {
+ boolean_t private; /* for finding CKA_PRIVATE objects */
+ boolean_t sensitive;
+ boolean_t not_extractable;
+ boolean_t token; /* true == token object, false == session */
+} KMF_PKCS11_PARAMS;
+
+typedef struct {
+ KMF_KEYSTORE_TYPE kstype;
+ char *certLabel;
+ char *issuer;
+ char *subject;
+ char *idstr;
+ KMF_BIGINT *serial;
+ KMF_CERT_VALIDITY find_cert_validity;
+
+ union {
+ KMF_NSS_PARAMS nss_opts;
+ KMF_OPENSSL_PARAMS openssl_opts;
+ KMF_PKCS11_PARAMS pkcs11_opts;
+ } ks_opt_u;
+} KMF_FINDCERT_PARAMS, KMF_DELETECERT_PARAMS;
+
+typedef struct {
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_CREDENTIAL cred;
+ KMF_KEY_CLASS keyclass;
+ KMF_KEY_ALG keytype;
+ KMF_ENCODE_FORMAT format; /* for key */
+ char *findLabel;
+ char *idstr;
+ union {
+ KMF_NSS_PARAMS nss_opts;
+ KMF_OPENSSL_PARAMS openssl_opts;
+ KMF_PKCS11_PARAMS pkcs11_opts;
+ } ks_opt_u;
+} KMF_FINDKEY_PARAMS;
+
+typedef struct {
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_KEY_ALG keytype;
+ uint32_t keylength;
+ char *keylabel;
+ KMF_CREDENTIAL cred;
+ KMF_BIGINT rsa_exponent;
+ union {
+ KMF_NSS_PARAMS nss_opts;
+ KMF_OPENSSL_PARAMS openssl_opts;
+ }ks_opt_u;
+} KMF_CREATEKEYPAIR_PARAMS;
+
+
+typedef struct {
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_CREDENTIAL cred;
+ KMF_ENCODE_FORMAT format; /* for key */
+ char *certLabel;
+ KMF_ALGORITHM_INDEX algid;
+ union {
+ KMF_NSS_PARAMS nss_opts;
+ KMF_OPENSSL_PARAMS openssl_opts;
+ }ks_opt_u;
+} KMF_CRYPTOWITHCERT_PARAMS;
+
+typedef struct {
+ char *crl_name;
+} KMF_CHECKCRLDATE_PARAMS;
+
+#define nssparms ks_opt_u.nss_opts
+#define sslparms ks_opt_u.openssl_opts
+#define pkcs11parms ks_opt_u.pkcs11_opts
+
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/lib/libkmf/include/rdn_parser.h b/usr/src/lib/libkmf/include/rdn_parser.h
index 80c7e61d93..22eecda324 100644
--- a/usr/src/lib/libkmf/include/rdn_parser.h
+++ b/usr/src/lib/libkmf/include/rdn_parser.h
@@ -98,8 +98,6 @@ struct NameToKind {
((c) == '?'))
-KMF_RETURN ParseDistinguishedName(char *, int, KMF_X509_NAME *);
-
#ifdef __cplusplus
}
#endif
diff --git a/usr/src/lib/libkmf/libkmf/common/algoid.c b/usr/src/lib/libkmf/libkmf/common/algoid.c
index d78541d1f0..f33634f007 100644
--- a/usr/src/lib/libkmf/libkmf/common/algoid.c
+++ b/usr/src/lib/libkmf/libkmf/common/algoid.c
@@ -36,7 +36,7 @@ static KMF_OID_ID ALGOID_ID_Table[] = {
#define NUM_ALGOIDS ((sizeof (ALGOID_ID_Table))/(sizeof (ALGOID_ID_Table[0])))
/*
- * Name: X509_AlgIdToAlgorithmOid
+ * Name: x509_algid_to_algoid
*
* Description:
* This function maps the specified AlgID to the corresponding
@@ -50,7 +50,7 @@ static KMF_OID_ID ALGOID_ID_Table[] = {
*
*/
KMF_OID *
-X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX alg_int)
+x509_algid_to_algoid(KMF_ALGORITHM_INDEX alg_int)
{
int i;
@@ -70,7 +70,7 @@ X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX alg_int)
}
/*
- * Name: X509_AlgorithmOidToAlgId
+ * Name: x509_algoid_to_algid
*
* Description:
* This function maps the specified Algorithm OID to the corresponding
@@ -83,13 +83,11 @@ X509_AlgIdToAlgorithmOid(KMF_ALGORITHM_INDEX alg_int)
* Algorithm ID and KMF_ALGID_NONE in case of failures.
*/
KMF_ALGORITHM_INDEX
-X509_AlgorithmOidToAlgId(KMF_OID * Oid)
+x509_algoid_to_algid(KMF_OID * Oid)
{
int i;
- if ((Oid == NULL) ||
- (Oid->Data == NULL) ||
- (Oid->Length == 0)) {
+ if ((Oid == NULL) || (Oid->Data == NULL) || (Oid->Length == 0)) {
return (KMF_ALGID_NONE);
}
diff --git a/usr/src/lib/libkmf/libkmf/common/algorithm.c b/usr/src/lib/libkmf/libkmf/common/algorithm.c
index 23c303d63b..d0ed3912a3 100644
--- a/usr/src/lib/libkmf/libkmf/common/algorithm.c
+++ b/usr/src/lib/libkmf/libkmf/common/algorithm.c
@@ -101,7 +101,7 @@ SUP(CKM_SHA_1, KMF_ALGID_SHA1, KMF_ALGCLASS_DIGEST, KMF_ALGMODE_NONE,
#define PKCS_ALGORITHM_NOT_FOUND ((uint32_t)(~0))
/*
- * Name: PKCS_GetAlgorithmMap
+ * Name: pkcs_get_alg_map
*
* Description:
* Searches the _PKCS2KMFMap table for a matching set of alg.
@@ -118,14 +118,14 @@ SUP(CKM_SHA_1, KMF_ALGID_SHA1, KMF_ALGCLASS_DIGEST, KMF_ALGMODE_NONE,
* Ptr->keylength will equal PKCS11CONVERT_NOT_FOUND if no match is found.
*/
PKCS_ALGORITHM_MAP *
-PKCS_GetAlgorithmMap(KMF_ALGCLASS algType, uint32_t algID, uint32_t mode)
+pkcs_get_alg_map(KMF_ALGCLASS algType, uint32_t algID, uint32_t mode)
{
uint32_t i = 0;
for (i = 0; i < _PKCS2KMFMapCount; i++) {
if ((_PKCS2KMFMap[i].context_type == algType) &&
- (_PKCS2KMFMap[i].algorithm == algID) &&
- (_PKCS2KMFMap[i].enc_mode == mode)) {
+ (_PKCS2KMFMap[i].algorithm == algID) &&
+ (_PKCS2KMFMap[i].enc_mode == mode)) {
return ((PKCS_ALGORITHM_MAP *)&(_PKCS2KMFMap[i]));
}
}
@@ -134,12 +134,12 @@ PKCS_GetAlgorithmMap(KMF_ALGCLASS algType, uint32_t algID, uint32_t mode)
}
KMF_BOOL
-PKCS_ConvertAlgorithmId2PKCSKeyType(KMF_ALGORITHM_INDEX AlgId,
+pkcs_algid_to_keytype(KMF_ALGORITHM_INDEX AlgId,
CK_KEY_TYPE *pckKeyType)
{
uint32_t uIndex;
- uint32_t uMapSize = sizeof (_PKCS2KMFKeyTypeMap) /
- sizeof (PKCS_KEY_TYPE_MAP);
+ uint32_t uMapSize =
+ sizeof (_PKCS2KMFKeyTypeMap) / sizeof (PKCS_KEY_TYPE_MAP);
for (uIndex = 0; uIndex < uMapSize; uIndex++) {
if (_PKCS2KMFKeyTypeMap[uIndex].kmfAlgorithmId == AlgId) {
diff --git a/usr/src/lib/libkmf/libkmf/common/certgetsetop.c b/usr/src/lib/libkmf/libkmf/common/certgetsetop.c
index d3ffb0dac7..35dad63b69 100644
--- a/usr/src/lib/libkmf/libkmf/common/certgetsetop.c
+++ b/usr/src/lib/libkmf/libkmf/common/certgetsetop.c
@@ -88,10 +88,10 @@ copy_extension_data(KMF_X509_EXTENSION *dstext,
goto cleanup;
}
(void) memset(dstext->value.tagAndValue, 0,
- sizeof (KMF_X509EXT_TAGandVALUE));
+ sizeof (KMF_X509EXT_TAGandVALUE));
ret = copy_data(&dstext->value.tagAndValue->value,
- &srcext->value.tagAndValue->value);
+ &srcext->value.tagAndValue->value);
if (ret != KMF_OK)
goto cleanup;
@@ -100,13 +100,13 @@ copy_extension_data(KMF_X509_EXTENSION *dstext,
cleanup:
if (ret != KMF_OK) {
if (dstext->extnId.Data != NULL)
- KMF_FreeData(&dstext->extnId);
+ kmf_free_data(&dstext->extnId);
if (dstext->BERvalue.Data != NULL)
- KMF_FreeData(&dstext->BERvalue);
+ kmf_free_data(&dstext->BERvalue);
if (dstext->value.tagAndValue->value.Data == NULL)
- KMF_FreeData(&dstext->value.tagAndValue->value);
+ kmf_free_data(&dstext->value.tagAndValue->value);
}
return (ret);
@@ -124,7 +124,7 @@ cleanup:
* parsing and memory allocation errors are also possible.
*/
KMF_RETURN
-KMF_GetCertExtensionData(const KMF_DATA *certdata,
+kmf_get_cert_extn(const KMF_DATA *certdata,
KMF_OID *extoid, KMF_X509_EXTENSION *extdata)
{
KMF_RETURN ret = KMF_OK;
@@ -156,7 +156,7 @@ KMF_GetCertExtensionData(const KMF_DATA *certdata,
ret = KMF_ERR_EXTENSION_NOT_FOUND;
if (cert != NULL) {
- KMF_FreeSignedCert(cert);
+ kmf_free_signed_cert(cert);
free(cert);
}
@@ -164,10 +164,9 @@ KMF_GetCertExtensionData(const KMF_DATA *certdata,
}
/*
- * Given a block of DER encoded X.509 certificate data,
- * search the extensions and return the OIDs for all
- * extensions marked "critical".
- *
+ * Given a block of DER encoded X.509 certificate data and
+ * a "crit/non-crit/all" flag, search the extensions and
+ * return the OIDs for critical, non-critical or all extensions.
*
* RETURNS:
* KMF_OK - if extension found and copied OK.
@@ -178,7 +177,7 @@ KMF_GetCertExtensionData(const KMF_DATA *certdata,
* NumOIDs - number of critical extensions found.
*/
KMF_RETURN
-KMF_GetCertCriticalExtensions(const KMF_DATA *certdata,
+kmf_get_cert_extns(const KMF_DATA *certdata, KMF_FLAG_CERT_EXTN flag,
KMF_X509_EXTENSION **extlist, int *nextns)
{
KMF_RETURN ret = KMF_OK;
@@ -189,71 +188,7 @@ KMF_GetCertCriticalExtensions(const KMF_DATA *certdata,
if (certdata == NULL || extlist == NULL || nextns == NULL)
return (KMF_ERR_BAD_PARAMETER);
- *nextns = 0;
- *extlist = elist = NULL;
- ret = DerDecodeSignedCertificate(certdata, &cert);
- if (ret != KMF_OK)
- return (ret);
-
- if (cert->certificate.extensions.numberOfExtensions == 0)
- return (KMF_ERR_EXTENSION_NOT_FOUND);
-
- for (i = 0; i < cert->certificate.extensions.numberOfExtensions;
- i++) {
- eptr = &cert->certificate.extensions.extensions[i];
- if (eptr->critical != 0) {
- (*nextns)++;
- elist = realloc(elist, sizeof (KMF_X509_EXTENSION) *
- (*nextns));
- if (elist == NULL) {
- ret = KMF_ERR_MEMORY;
- goto end;
- }
- ret = copy_extension_data(&elist[(*nextns) - 1],
- eptr);
- if (ret != KMF_OK)
- goto end;
- }
- }
-end:
- KMF_FreeSignedCert(cert);
- free(cert);
- if (ret != KMF_OK) {
- if (elist != NULL) {
- free(elist);
- elist = NULL;
- }
- *nextns = 0;
- }
- *extlist = elist;
-
- return (ret);
-}
-
-/*
- * Given a block of DER encoded X.509 certificate data,
- * search the extensions and return the OIDs for all
- * extensions NOT marked "critical".
- *
- *
- * RETURNS:
- * KMF_OK - if extension found and copied OK.
- * parsing and memory allocation errors are also possible.
- *
- * OIDlist - array of KMF_OID records, allocated
- * by this function.
- * NumOIDs - number of critical extensions found.
- */
-KMF_RETURN
-KMF_GetCertNonCriticalExtensions(const KMF_DATA *certdata,
- KMF_X509_EXTENSION **extlist, int *nextns)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_X509_CERTIFICATE *cert;
- KMF_X509_EXTENSION *eptr, *elist;
- int i;
-
- if (certdata == NULL || extlist == NULL || nextns == NULL)
+ if (flag < KMF_ALL_EXTNS || flag > KMF_NONCRITICAL_EXTNS)
return (KMF_ERR_BAD_PARAMETER);
*nextns = 0;
@@ -268,22 +203,27 @@ KMF_GetCertNonCriticalExtensions(const KMF_DATA *certdata,
for (i = 0; i < cert->certificate.extensions.numberOfExtensions;
i++) {
eptr = &cert->certificate.extensions.extensions[i];
- if (eptr->critical == 0) {
- (*nextns)++;
- elist = realloc(elist, sizeof (KMF_X509_EXTENSION) *
- (*nextns));
- if (elist == NULL) {
- ret = KMF_ERR_MEMORY;
- goto end;
- }
- ret = copy_extension_data(&elist[(*nextns) - 1],
- eptr);
- if (ret != KMF_OK)
- goto end;
+
+ if (flag == KMF_CRITICAL_EXTNS && eptr->critical == 0)
+ continue;
+ else if (flag == KMF_NONCRITICAL_EXTNS && eptr->critical != 0)
+ continue;
+
+ (*nextns)++;
+ elist = realloc(elist, sizeof (KMF_X509_EXTENSION) *
+ (*nextns));
+ if (elist == NULL) {
+ ret = KMF_ERR_MEMORY;
+ goto end;
}
+
+ ret = copy_extension_data(&elist[(*nextns) - 1], eptr);
+ if (ret != KMF_OK)
+ goto end;
}
+
end:
- KMF_FreeSignedCert(cert);
+ kmf_free_signed_cert(cert);
free(cert);
if (ret != KMF_OK) {
if (elist != NULL) {
@@ -292,8 +232,16 @@ end:
}
*nextns = 0;
}
- *extlist = elist;
+ /*
+ * If the flag is not all, then it is possible that we did not find
+ * any critical or non_critical extensions. When that happened,
+ * return KMF_ERR_EXTENSION_NOT_FOUND.
+ */
+ if (flag != KMF_ALL_EXTNS && ret == KMF_OK && *nextns == 0)
+ ret = KMF_ERR_EXTENSION_NOT_FOUND;
+
+ *extlist = elist;
return (ret);
}
@@ -309,7 +257,7 @@ end:
* KMF_ERR_EXTENSION_NOT_FOUND - extension not found.
*/
KMF_RETURN
-KMF_GetCertKeyUsageExt(const KMF_DATA *certdata,
+kmf_get_cert_ku(const KMF_DATA *certdata,
KMF_X509EXT_KEY_USAGE *keyusage)
{
KMF_RETURN ret = KMF_OK;
@@ -322,8 +270,7 @@ KMF_GetCertKeyUsageExt(const KMF_DATA *certdata,
/*
* Check standard KeyUsage bits
*/
- ret = KMF_GetCertExtensionData(certdata,
- (KMF_OID *)&KMFOID_KeyUsage, &extn);
+ ret = kmf_get_cert_extn(certdata, (KMF_OID *)&KMFOID_KeyUsage, &extn);
if (ret != KMF_OK) {
goto end;
@@ -331,13 +278,12 @@ KMF_GetCertKeyUsageExt(const KMF_DATA *certdata,
keyusage->critical = (extn.critical != 0);
if (extn.value.tagAndValue->value.Length > 1) {
keyusage->KeyUsageBits =
- extn.value.tagAndValue->value.Data[1] << 8;
+ extn.value.tagAndValue->value.Data[1] << 8;
} else {
- keyusage->KeyUsageBits =
- extn.value.tagAndValue->value.Data[0];
+ keyusage->KeyUsageBits = extn.value.tagAndValue->value.Data[0];
}
end:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
return (ret);
}
@@ -380,8 +326,7 @@ parse_eku_data(const KMF_DATA *asn1data, KMF_X509EXT_EKU *ekuptr)
/*
* certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
*/
- if (kmfber_first_element(asn1, &size, &end) !=
- BER_OBJECT_IDENTIFIER) {
+ if (kmfber_first_element(asn1, &size, &end) != BER_OBJECT_IDENTIFIER) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -391,7 +336,7 @@ parse_eku_data(const KMF_DATA *asn1data, KMF_X509EXT_EKU *ekuptr)
* the array.
*/
while (kmfber_next_element(asn1, &size, end) ==
- BER_OBJECT_IDENTIFIER) {
+ BER_OBJECT_IDENTIFIER) {
/* Skip over the CONSTRUCTED SET tag */
if (kmfber_scanf(asn1, "D", &oid) == KMFBER_DEFAULT) {
@@ -400,7 +345,7 @@ parse_eku_data(const KMF_DATA *asn1data, KMF_X509EXT_EKU *ekuptr)
}
ekuptr->nEKUs++;
ekuptr->keyPurposeIdList = realloc(ekuptr->keyPurposeIdList,
- ekuptr->nEKUs * sizeof (KMF_OID));
+ ekuptr->nEKUs * sizeof (KMF_OID));
if (ekuptr->keyPurposeIdList == NULL) {
ret = KMF_ERR_MEMORY;
goto end;
@@ -424,7 +369,7 @@ end:
}
KMF_RETURN
-KMF_GetCertEKU(const KMF_DATA *certdata,
+kmf_get_cert_eku(const KMF_DATA *certdata,
KMF_X509EXT_EKU *ekuptr)
{
KMF_RETURN ret = KMF_OK;
@@ -439,8 +384,8 @@ KMF_GetCertEKU(const KMF_DATA *certdata,
ekuptr->keyPurposeIdList = NULL;
ekuptr->critical = 0;
- ret = KMF_GetCertExtensionData(certdata,
- (KMF_OID *)&KMFOID_ExtendedKeyUsage, &extn);
+ ret = kmf_get_cert_extn(certdata,
+ (KMF_OID *)&KMFOID_ExtendedKeyUsage, &extn);
if (ret != KMF_OK) {
goto end;
@@ -449,7 +394,7 @@ KMF_GetCertEKU(const KMF_DATA *certdata,
ret = parse_eku_data(&extn.BERvalue, ekuptr);
end:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
return (ret);
}
@@ -466,7 +411,7 @@ end:
* KMF_ERR_EXTENSION_NOT_FOUND - extension not found.
*/
KMF_RETURN
-KMF_GetCertBasicConstraintExt(const KMF_DATA *certdata,
+kmf_get_cert_basic_constraint(const KMF_DATA *certdata,
KMF_BOOL *critical, KMF_X509EXT_BASICCONSTRAINTS *constraint)
{
KMF_RETURN ret = KMF_OK;
@@ -481,8 +426,8 @@ KMF_GetCertBasicConstraintExt(const KMF_DATA *certdata,
return (KMF_ERR_BAD_PARAMETER);
(void) memset(&extn, 0, sizeof (KMF_X509_EXTENSION));
- ret = KMF_GetCertExtensionData(certdata,
- (KMF_OID *)&KMFOID_BasicConstraints, &extn);
+ ret = kmf_get_cert_extn(certdata,
+ (KMF_OID *)&KMFOID_BasicConstraints, &extn);
if (ret != KMF_OK) {
goto end;
@@ -507,14 +452,14 @@ KMF_GetCertBasicConstraintExt(const KMF_DATA *certdata,
tag = kmfber_next_element(asn1, &size, end);
if (tag == BER_INTEGER) {
if (kmfber_scanf(asn1, "i",
- &constraint->pathLenConstraint) == KMFBER_DEFAULT) {
+ &constraint->pathLenConstraint) == KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
constraint->pathLenConstraintPresent = KMF_TRUE;
}
end:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
if (asn1 != NULL)
kmfber_free(asn1, 1);
@@ -554,13 +499,13 @@ get_pqinfo(BerElement *asn1)
* so the ber/der code knows when to stop looking.
*/
if ((tag = kmfber_first_element(asn1, &size, &end)) !=
- BER_CONSTRUCTED_SEQUENCE) {
+ BER_CONSTRUCTED_SEQUENCE) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
/* We found a sequence, loop until done */
while ((tag = kmfber_next_element(asn1, &size, end)) ==
- BER_CONSTRUCTED_SEQUENCE) {
+ BER_CONSTRUCTED_SEQUENCE) {
/* Skip over the CONSTRUCTED SET tag */
if (kmfber_scanf(asn1, "T", &tag) == KMFBER_DEFAULT) {
@@ -576,12 +521,12 @@ get_pqinfo(BerElement *asn1)
goto end;
}
(void) memset((void *)pqinfo, 0,
- sizeof (KMF_X509EXT_POLICYQUALIFIERINFO));
+ sizeof (KMF_X509EXT_POLICYQUALIFIERINFO));
/*
* Read the PolicyQualifier OID
*/
if (kmfber_scanf(asn1, "D",
- &pqinfo->policyQualifierId) == KMFBER_DEFAULT) {
+ &pqinfo->policyQualifierId) == KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -590,13 +535,13 @@ get_pqinfo(BerElement *asn1)
* sort of data comes next.
*/
if (IsEqualOid(&pqinfo->policyQualifierId,
- (KMF_OID *)&KMFOID_PKIX_PQ_CPSuri)) {
+ (KMF_OID *)&KMFOID_PKIX_PQ_CPSuri)) {
/*
* CPS uri must be an IA5STRING
*/
if (kmfber_scanf(asn1, "tl", &tag, &size) ==
- KMFBER_DEFAULT || tag != BER_IA5STRING ||
- size == 0) {
+ KMFBER_DEFAULT || tag != BER_IA5STRING ||
+ size == 0) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -605,15 +550,15 @@ get_pqinfo(BerElement *asn1)
goto end;
}
if (kmfber_scanf(asn1, "s", pqinfo->value.Data,
- &pqinfo->value.Length) == KMFBER_DEFAULT) {
+ &pqinfo->value.Length) == KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
} else if (IsEqualOid(&pqinfo->policyQualifierId,
- (KMF_OID *)&KMFOID_PKIX_PQ_Unotice)) {
+ (KMF_OID *)&KMFOID_PKIX_PQ_Unotice)) {
if (kmfber_scanf(asn1, "tl", &tag, &size) ==
- KMFBER_DEFAULT ||
- tag != BER_CONSTRUCTED_SEQUENCE) {
+ KMFBER_DEFAULT ||
+ tag != BER_CONSTRUCTED_SEQUENCE) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -627,7 +572,7 @@ get_pqinfo(BerElement *asn1)
goto end;
}
if (kmfber_scanf(asn1, "s", pqinfo->value.Data,
- &pqinfo->value.Length) == KMFBER_DEFAULT) {
+ &pqinfo->value.Length) == KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -639,8 +584,8 @@ get_pqinfo(BerElement *asn1)
end:
if (ret != KMF_OK) {
if (pqinfo != NULL) {
- KMF_FreeData(&pqinfo->value);
- KMF_FreeData(&pqinfo->policyQualifierId);
+ kmf_free_data(&pqinfo->value);
+ kmf_free_data(&pqinfo->policyQualifierId);
free(pqinfo);
pqinfo = NULL;
}
@@ -661,7 +606,7 @@ end:
* parsing and memory allocation errors are also possible.
*/
KMF_RETURN
-KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
+kmf_get_cert_policies(const KMF_DATA *certdata,
KMF_BOOL *critical, KMF_X509EXT_CERT_POLICIES *extptr)
{
KMF_RETURN ret = KMF_OK;
@@ -678,8 +623,8 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
return (KMF_ERR_BAD_PARAMETER);
(void) memset(&extn, 0, sizeof (extn));
- ret = KMF_GetCertExtensionData(certdata,
- (KMF_OID *)&KMFOID_CertificatePolicies, &extn);
+ ret = kmf_get_cert_extn(certdata,
+ (KMF_OID *)&KMFOID_CertificatePolicies, &extn);
if (ret != KMF_OK) {
goto end;
@@ -704,7 +649,7 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
* certificatePolicies ::= SEQUENCE SIZE (1..MAX) OF PolicyInformation
*/
if ((tag = kmfber_first_element(asn1, &size, &end)) !=
- BER_CONSTRUCTED_SEQUENCE) {
+ BER_CONSTRUCTED_SEQUENCE) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -721,7 +666,7 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
* Loop over the SEQUENCES of PolicyInfo
*/
while ((tag = kmfber_next_element(asn1, &size, end)) ==
- BER_CONSTRUCTED_SEQUENCE) {
+ BER_CONSTRUCTED_SEQUENCE) {
/* Skip over the CONSTRUCTED SET tag */
if (kmfber_scanf(asn1, "T", &tag) == KMFBER_DEFAULT) {
@@ -735,12 +680,12 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
goto end;
}
(void) memset((void *)pinfo, 0,
- sizeof (KMF_X509EXT_POLICYINFO));
+ sizeof (KMF_X509EXT_POLICYINFO));
/*
* Decode the PolicyInformation SEQUENCE
*/
if ((tag = kmfber_scanf(asn1, "D",
- &pinfo->policyIdentifier)) == KMFBER_DEFAULT) {
+ &pinfo->policyIdentifier)) == KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
@@ -753,23 +698,22 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
pinfo->policyQualifiers.numberOfPolicyQualifiers;
cnt++;
pinfo->policyQualifiers.policyQualifier = realloc(
- pinfo->policyQualifiers.policyQualifier,
- cnt * sizeof (KMF_X509EXT_POLICYQUALIFIERINFO));
+ pinfo->policyQualifiers.policyQualifier,
+ cnt * sizeof (KMF_X509EXT_POLICYQUALIFIERINFO));
if (pinfo->policyQualifiers.policyQualifier == NULL) {
ret = KMF_ERR_MEMORY;
goto end;
}
- pinfo->policyQualifiers.numberOfPolicyQualifiers =
- cnt;
+ pinfo->policyQualifiers.numberOfPolicyQualifiers = cnt;
pinfo->policyQualifiers.policyQualifier[cnt-1] =
- *pqinfo;
+ *pqinfo;
free(pqinfo);
}
extptr->numberOfPolicyInfo++;
extptr->policyInfo = realloc(extptr->policyInfo,
- extptr->numberOfPolicyInfo *
- sizeof (KMF_X509EXT_POLICYINFO));
+ extptr->numberOfPolicyInfo *
+ sizeof (KMF_X509EXT_POLICYINFO));
if (extptr->policyInfo == NULL) {
ret = KMF_ERR_MEMORY;
goto end;
@@ -780,7 +724,7 @@ KMF_GetCertPoliciesExt(const KMF_DATA *certdata,
end:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
if (asn1 != NULL)
kmfber_free(asn1, 1);
return (ret);
@@ -798,7 +742,7 @@ end:
* KMF_ERR_EXTENSION_NOT_FOUND - extension not found.
*/
KMF_RETURN
-KMF_GetCertAuthInfoAccessExt(const KMF_DATA *certdata,
+kmf_get_cert_auth_info_access(const KMF_DATA *certdata,
KMF_X509EXT_AUTHINFOACCESS *aia)
{
KMF_RETURN ret = KMF_OK;
@@ -815,7 +759,7 @@ KMF_GetCertAuthInfoAccessExt(const KMF_DATA *certdata,
}
(void) memset(&extn, 0, sizeof (KMF_X509_EXTENSION));
- ret = KMF_GetCertExtensionData(certdata,
+ ret = kmf_get_cert_extn(certdata,
(KMF_OID *)&KMFOID_AuthorityInfoAccess, &extn);
if (ret != KMF_OK) {
@@ -908,12 +852,12 @@ KMF_GetCertAuthInfoAccessExt(const KMF_DATA *certdata,
if (kmfber_scanf(asn1, "s",
access_info->AccessLocation.Data,
&access_info->AccessLocation.Length) ==
- KMFBER_DEFAULT) {
+ KMFBER_DEFAULT) {
ret = KMF_ERR_BAD_CERT_FORMAT;
goto end;
}
} else if (IsEqualOid(&access_info->AccessMethod,
- (KMF_OID *)&KMFOID_PkixAdCaIssuers)) {
+ (KMF_OID *)&KMFOID_PkixAdCaIssuers)) {
/* will be supported later with PKIX */
free(access_info);
access_info = NULL;
@@ -940,7 +884,7 @@ KMF_GetCertAuthInfoAccessExt(const KMF_DATA *certdata,
}
end:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
if (access_info != NULL)
free(access_info);
if (asn1 != NULL)
@@ -1040,11 +984,11 @@ parse_dp_name(char *dp_der_code, int dp_der_size, KMF_CRL_DIST_POINT *dp)
}
fullname->namelist[fullname->number - 1].choice =
- GENNAME_URI;
+ GENNAME_URI;
fullname->namelist[fullname->number - 1].name.Length =
- size;
+ size;
fullname->namelist[fullname->number - 1].name.Data =
- (unsigned char *)url;
+ (unsigned char *)url;
/* next */
tag = kmfber_next_element(asn1, &size, end);
@@ -1079,7 +1023,7 @@ out:
* extension data, and returns it in the KMF_X509EXT_CRLDISTPOINTS record.
*/
KMF_RETURN
-KMF_GetCertCRLDistributionPointsExt(const KMF_DATA *certdata,
+kmf_get_cert_crl_dist_pts(const KMF_DATA *certdata,
KMF_X509EXT_CRLDISTPOINTS *crl_dps)
{
KMF_RETURN ret = KMF_OK;
@@ -1098,7 +1042,7 @@ KMF_GetCertCRLDistributionPointsExt(const KMF_DATA *certdata,
/* Get the ASN.1 data for this extension. */
(void) memset(&extn, 0, sizeof (KMF_X509_EXTENSION));
- ret = KMF_GetCertExtensionData(certdata,
+ ret = kmf_get_cert_extn(certdata,
(KMF_OID *)&KMFOID_CrlDistributionPoints, &extn);
if (ret != KMF_OK) {
return (ret);
@@ -1277,7 +1221,7 @@ KMF_GetCertCRLDistributionPointsExt(const KMF_DATA *certdata,
}
out:
- KMF_FreeExtension(&extn);
+ kmf_free_extn(&extn);
if (asn1 != NULL)
kmfber_free(asn1, 1);
@@ -1301,15 +1245,14 @@ KMF_CertGetPrintable(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
{
KMF_PLUGIN *plugin;
KMF_RETURN (*getPrintableFn)(void *, const KMF_DATA *,
- KMF_PRINTABLE_ITEM, char *);
+ KMF_PRINTABLE_ITEM, char *);
KMF_RETURN ret;
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (SignedCert == NULL ||
- resultStr == NULL) {
+ if (SignedCert == NULL || resultStr == NULL) {
return (KMF_ERR_BAD_PARAMETER);
}
@@ -1332,7 +1275,7 @@ KMF_CertGetPrintable(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertVersionString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_version_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1350,7 +1293,7 @@ KMF_GetCertVersionString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_VERSION,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1362,8 +1305,9 @@ KMF_GetCertVersionString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
return (ret);
}
+
KMF_RETURN
-KMF_GetCertSubjectNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_subject_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1381,7 +1325,7 @@ KMF_GetCertSubjectNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_SUBJECT,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1395,7 +1339,7 @@ KMF_GetCertSubjectNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertIssuerNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_issuer_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1414,7 +1358,7 @@ KMF_GetCertIssuerNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_ISSUER,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1427,7 +1371,7 @@ KMF_GetCertIssuerNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertSerialNumberString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_serial_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1445,7 +1389,7 @@ KMF_GetCertSerialNumberString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_SERIALNUM,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1458,7 +1402,7 @@ KMF_GetCertSerialNumberString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertStartDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_start_date_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1476,7 +1420,7 @@ KMF_GetCertStartDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_NOTBEFORE,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1489,7 +1433,7 @@ KMF_GetCertStartDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertEndDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_end_date_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1507,7 +1451,7 @@ KMF_GetCertEndDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_NOTAFTER,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1520,7 +1464,7 @@ KMF_GetCertEndDateString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertPubKeyAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_pubkey_alg_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1538,7 +1482,7 @@ KMF_GetCertPubKeyAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_PUBKEY_ALG,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1551,7 +1495,7 @@ KMF_GetCertPubKeyAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertSignatureAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_sig_alg_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1569,7 +1513,7 @@ KMF_GetCertSignatureAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_SIGNATURE_ALG,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1582,7 +1526,7 @@ KMF_GetCertSignatureAlgString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertPubKeyDataString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_pubkey_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1600,7 +1544,7 @@ KMF_GetCertPubKeyDataString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_PUBKEY_DATA,
- tmpstr);
+ tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1613,7 +1557,7 @@ KMF_GetCertPubKeyDataString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
}
KMF_RETURN
-KMF_GetCertEmailString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+kmf_get_cert_email_str(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
char **result)
{
KMF_RETURN ret;
@@ -1630,8 +1574,7 @@ KMF_GetCertEmailString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
return (KMF_ERR_MEMORY);
(void) memset(tmpstr, 0, KMF_CERT_PRINTABLE_LEN);
- ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_EMAIL,
- tmpstr);
+ ret = KMF_CertGetPrintable(handle, SignedCert, KMF_CERT_EMAIL, tmpstr);
if (ret == KMF_OK) {
*result = tmpstr;
@@ -1654,7 +1597,7 @@ KMF_GetCertEmailString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
* must be freed by the caller.
*/
KMF_RETURN
-KMF_GetCertExtensionString(KMF_HANDLE_T handle, const KMF_DATA *cert,
+kmf_get_cert_extn_str(KMF_HANDLE_T handle, const KMF_DATA *cert,
KMF_PRINTABLE_ITEM extension, char **result)
{
KMF_RETURN ret;
@@ -1685,7 +1628,7 @@ KMF_GetCertExtensionString(KMF_HANDLE_T handle, const KMF_DATA *cert,
}
KMF_RETURN
-KMF_GetCertIDData(const KMF_DATA *SignedCert, KMF_DATA *ID)
+kmf_get_cert_id_data(const KMF_DATA *SignedCert, KMF_DATA *ID)
{
KMF_RETURN ret;
KMF_X509_CERTIFICATE *cert = NULL;
@@ -1699,14 +1642,13 @@ KMF_GetCertIDData(const KMF_DATA *SignedCert, KMF_DATA *ID)
ret = GetIDFromSPKI(&cert->certificate.subjectPublicKeyInfo, ID);
- KMF_FreeSignedCert(cert);
+ kmf_free_signed_cert(cert);
free(cert);
return (ret);
}
KMF_RETURN
-KMF_GetCertIDString(const KMF_DATA *SignedCert,
- char **idstr)
+kmf_get_cert_id_str(const KMF_DATA *SignedCert, char **idstr)
{
KMF_RETURN ret;
KMF_DATA ID = {NULL, 0};
@@ -1716,9 +1658,9 @@ KMF_GetCertIDString(const KMF_DATA *SignedCert,
if (SignedCert == NULL || idstr == NULL)
return (KMF_ERR_BAD_PARAMETER);
- ret = KMF_GetCertIDData(SignedCert, &ID);
+ ret = kmf_get_cert_id_data(SignedCert, &ID);
if (ret != KMF_OK) {
- KMF_FreeData(&ID);
+ kmf_free_data(&ID);
return (ret);
}
@@ -1726,7 +1668,7 @@ KMF_GetCertIDString(const KMF_DATA *SignedCert,
for (i = 0; i < ID.Length; i++) {
int len = strlen(tmpstr);
(void) snprintf(&tmpstr[len], sizeof (tmpstr) - len,
- "%02x", (uchar_t)ID.Data[i]);
+ "%02x", (uchar_t)ID.Data[i]);
if ((i+1) < ID.Length)
(void) strcat(tmpstr, ":");
}
@@ -1734,17 +1676,18 @@ KMF_GetCertIDString(const KMF_DATA *SignedCert,
if ((*idstr) == NULL)
ret = KMF_ERR_MEMORY;
- KMF_FreeData(&ID);
+ kmf_free_data(&ID);
return (ret);
}
+
/*
* This function gets the time_t values of the notbefore and notafter dates
* from a der-encoded certificate.
*/
KMF_RETURN
-KMF_GetCertValidity(const KMF_DATA *cert, time_t *not_before,
+kmf_get_cert_validity(const KMF_DATA *cert, time_t *not_before,
time_t *not_after)
{
KMF_RETURN rv = KMF_OK;
@@ -1796,7 +1739,7 @@ KMF_GetCertValidity(const KMF_DATA *cert, time_t *not_before,
out:
if (certData != NULL) {
- KMF_FreeSignedCert(certData);
+ kmf_free_signed_cert(certData);
free(certData);
}
@@ -1804,7 +1747,7 @@ out:
}
KMF_RETURN
-KMF_SetCertPubKey(KMF_HANDLE_T handle,
+kmf_set_cert_pubkey(KMF_HANDLE_T handle,
KMF_KEY_HANDLE *KMFKey,
KMF_X509_CERTIFICATE *Cert)
{
@@ -1825,7 +1768,7 @@ KMF_SetCertPubKey(KMF_HANDLE_T handle,
plugin = FindPlugin(handle, KMFKey->kstype);
if (plugin != NULL && plugin->funclist->EncodePubkeyData != NULL) {
ret = plugin->funclist->EncodePubkeyData(handle,
- KMFKey, &KeyData);
+ KMFKey, &KeyData);
} else {
return (KMF_ERR_PLUGIN_NOTFOUND);
}
@@ -1841,7 +1784,7 @@ KMF_SetCertPubKey(KMF_HANDLE_T handle,
}
KMF_RETURN
-KMF_SetCertSubjectName(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_subject(KMF_X509_CERTIFICATE *CertData,
KMF_X509_NAME *subject_name_ptr)
{
@@ -1880,7 +1823,9 @@ set_key_usage_extension(KMF_X509_EXTENSIONS *extns,
extn.critical = critical;
extn.format = KMF_X509_DATAFORMAT_ENCODED;
- for (i = 7; i <= 15 && !(kubits & (1 << i)); i++);
+ for (i = 7; i <= 15 && !(kubits & (1 << i)); i++)
+ /* empty body */
+ ;
bitlen = 16 - i;
@@ -1914,7 +1859,7 @@ out:
}
KMF_RETURN
-KMF_SetCertKeyUsage(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_ku(KMF_X509_CERTIFICATE *CertData,
int critical, uint16_t kubits)
{
KMF_RETURN ret = KMF_OK;
@@ -1922,15 +1867,14 @@ KMF_SetCertKeyUsage(KMF_X509_CERTIFICATE *CertData,
if (CertData == NULL)
return (KMF_ERR_BAD_PARAMETER);
- ret = set_key_usage_extension(
- &CertData->certificate.extensions,
- critical, kubits);
+ ret = set_key_usage_extension(&CertData->certificate.extensions,
+ critical, kubits);
return (ret);
}
KMF_RETURN
-KMF_SetCertIssuerName(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_issuer(KMF_X509_CERTIFICATE *CertData,
KMF_X509_NAME *issuer_name_ptr)
{
@@ -1950,7 +1894,7 @@ KMF_SetCertIssuerName(KMF_X509_CERTIFICATE *CertData,
}
KMF_RETURN
-KMF_SetCertSignatureAlgorithm(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_sig_alg(KMF_X509_CERTIFICATE *CertData,
KMF_ALGORITHM_INDEX sigAlg)
{
KMF_OID *alg;
@@ -1958,7 +1902,7 @@ KMF_SetCertSignatureAlgorithm(KMF_X509_CERTIFICATE *CertData,
if (CertData == NULL)
return (KMF_ERR_BAD_PARAMETER);
- alg = X509_AlgIdToAlgorithmOid(sigAlg);
+ alg = x509_algid_to_algoid(sigAlg);
if (alg != NULL) {
(void) copy_data((KMF_DATA *)
@@ -1982,7 +1926,7 @@ KMF_SetCertSignatureAlgorithm(KMF_X509_CERTIFICATE *CertData,
}
KMF_RETURN
-KMF_SetCertValidityTimes(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_validity(KMF_X509_CERTIFICATE *CertData,
time_t notBefore, uint32_t delta)
{
time_t clock;
@@ -2003,26 +1947,26 @@ KMF_SetCertValidityTimes(KMF_X509_CERTIFICATE *CertData,
/* Build the format in 2 parts so SCCS doesn't get confused */
(void) strftime(szNotBefore, sizeof (szNotBefore),
- "%y%m%d%H" "%M00Z", gmt);
+ "%y%m%d%H" "%M00Z", gmt);
CertData->certificate.validity.notBefore.timeType = BER_UTCTIME;
CertData->certificate.validity.notBefore.time.Length =
- strlen((char *)szNotBefore);
+ strlen((char *)szNotBefore);
CertData->certificate.validity.notBefore.time.Data =
- (uchar_t *)strdup(szNotBefore);
+ (uchar_t *)strdup(szNotBefore);
clock += delta;
gmt = gmtime(&clock);
/* Build the format in 2 parts so SCCS doesn't get confused */
(void) strftime(szNotAfter, sizeof (szNotAfter),
- "%y%m%d%H" "%M00Z", gmt);
+ "%y%m%d%H" "%M00Z", gmt);
CertData->certificate.validity.notAfter.timeType = BER_UTCTIME;
CertData->certificate.validity.notAfter.time.Length =
- strlen((char *)szNotAfter);
+ strlen((char *)szNotAfter);
CertData->certificate.validity.notAfter.time.Data =
- (uchar_t *)strdup(szNotAfter);
+ (uchar_t *)strdup(szNotAfter);
return (KMF_OK);
}
@@ -2069,7 +2013,7 @@ set_bigint(KMF_BIGINT *data, KMF_BIGINT *bigint)
}
KMF_RETURN
-KMF_SetCertSerialNumber(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_serial(KMF_X509_CERTIFICATE *CertData,
KMF_BIGINT *serno)
{
if (CertData == NULL || serno == NULL || serno->len == 0)
@@ -2078,7 +2022,7 @@ KMF_SetCertSerialNumber(KMF_X509_CERTIFICATE *CertData,
}
KMF_RETURN
-KMF_SetCertVersion(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_version(KMF_X509_CERTIFICATE *CertData,
uint32_t version)
{
if (CertData == NULL)
@@ -2090,11 +2034,11 @@ KMF_SetCertVersion(KMF_X509_CERTIFICATE *CertData,
if (version != 0 && version != 1 && version != 2)
return (KMF_ERR_BAD_PARAMETER);
return (set_integer(&CertData->certificate.version, (void *)&version,
- sizeof (uint32_t)));
+ sizeof (uint32_t)));
}
KMF_RETURN
-KMF_SetCertIssuerAltName(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_issuer_altname(KMF_X509_CERTIFICATE *CertData,
int critical,
KMF_GENERALNAMECHOICES nametype,
char *namedata)
@@ -2102,14 +2046,12 @@ KMF_SetCertIssuerAltName(KMF_X509_CERTIFICATE *CertData,
if (CertData == NULL || namedata == NULL)
return (KMF_ERR_BAD_PARAMETER);
- return (KMF_SetAltName(
- &CertData->certificate.extensions,
- (KMF_OID *)&KMFOID_IssuerAltName,
- critical, nametype, namedata));
+ return (kmf_set_altname(&CertData->certificate.extensions,
+ (KMF_OID *)&KMFOID_IssuerAltName, critical, nametype, namedata));
}
KMF_RETURN
-KMF_SetCertSubjectAltName(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_subject_altname(KMF_X509_CERTIFICATE *CertData,
int critical,
KMF_GENERALNAMECHOICES nametype,
char *namedata)
@@ -2117,13 +2059,12 @@ KMF_SetCertSubjectAltName(KMF_X509_CERTIFICATE *CertData,
if (CertData == NULL || namedata == NULL)
return (KMF_ERR_BAD_PARAMETER);
- return (KMF_SetAltName(&CertData->certificate.extensions,
- (KMF_OID *)&KMFOID_SubjectAltName,
- critical, nametype, namedata));
+ return (kmf_set_altname(&CertData->certificate.extensions,
+ (KMF_OID *)&KMFOID_SubjectAltName, critical, nametype, namedata));
}
KMF_RETURN
-KMF_AddCertEKU(KMF_X509_CERTIFICATE *CertData, KMF_OID *ekuOID,
+kmf_add_cert_eku(KMF_X509_CERTIFICATE *CertData, KMF_OID *ekuOID,
int critical)
{
KMF_RETURN ret = KMF_OK;
@@ -2142,12 +2083,10 @@ KMF_AddCertEKU(KMF_X509_CERTIFICATE *CertData, KMF_OID *ekuOID,
(void) memset(&newextn, 0, sizeof (newextn));
foundextn = FindExtn(&CertData->certificate.extensions,
- (KMF_OID *)&KMFOID_ExtendedKeyUsage);
+ (KMF_OID *)&KMFOID_ExtendedKeyUsage);
if (foundextn != NULL) {
- ret = GetSequenceContents(
- (char *)foundextn->BERvalue.Data,
- foundextn->BERvalue.Length,
- &olddata, &oldsize);
+ ret = GetSequenceContents((char *)foundextn->BERvalue.Data,
+ foundextn->BERvalue.Length, &olddata, &oldsize);
if (ret != KMF_OK)
goto out;
@@ -2199,20 +2138,20 @@ KMF_AddCertEKU(KMF_X509_CERTIFICATE *CertData, KMF_OID *ekuOID,
foundextn->BERvalue.Length = extdata->bv_len;
} else {
ret = copy_data(&newextn.extnId,
- (KMF_DATA *)&KMFOID_ExtendedKeyUsage);
+ (KMF_DATA *)&KMFOID_ExtendedKeyUsage);
if (ret != KMF_OK)
goto out;
newextn.critical = critical;
newextn.format = KMF_X509_DATAFORMAT_ENCODED;
newextn.BERvalue.Data = (uchar_t *)extdata->bv_val;
newextn.BERvalue.Length = extdata->bv_len;
- ret = KMF_SetCertExtension(CertData, &newextn);
+ ret = kmf_set_cert_extn(CertData, &newextn);
if (ret != KMF_OK)
free(newextn.BERvalue.Data);
}
out:
- KMF_FreeEKU(&ekudata);
+ kmf_free_eku(&ekudata);
if (extdata != NULL)
free(extdata);
@@ -2223,13 +2162,13 @@ out:
kmfber_free(asn1, 1);
if (ret != KMF_OK)
- KMF_FreeData(&newextn.extnId);
+ kmf_free_data(&newextn.extnId);
return (ret);
}
KMF_RETURN
-KMF_SetCertExtension(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_extn(KMF_X509_CERTIFICATE *CertData,
KMF_X509_EXTENSION *extn)
{
KMF_RETURN ret = KMF_OK;
@@ -2246,7 +2185,7 @@ KMF_SetCertExtension(KMF_X509_CERTIFICATE *CertData,
}
KMF_RETURN
-KMF_SetCertBasicConstraintExt(KMF_X509_CERTIFICATE *CertData,
+kmf_set_cert_basic_constraint(KMF_X509_CERTIFICATE *CertData,
KMF_BOOL critical, KMF_X509EXT_BASICCONSTRAINTS *constraint)
{
KMF_RETURN ret = KMF_OK;
@@ -2280,7 +2219,7 @@ KMF_SetCertBasicConstraintExt(KMF_X509_CERTIFICATE *CertData,
if (constraint->pathLenConstraintPresent) {
/* Write the pathLenConstraint value */
if (kmfber_printf(asn1, "i",
- constraint->pathLenConstraint) == -1) {
+ constraint->pathLenConstraint) == -1) {
ret = KMF_ERR_ENCODING;
goto out;
}
@@ -2300,7 +2239,7 @@ KMF_SetCertBasicConstraintExt(KMF_X509_CERTIFICATE *CertData,
extn.BERvalue.Length = extdata->bv_len;
free(extdata);
- ret = KMF_SetCertExtension(CertData, &extn);
+ ret = kmf_set_cert_extn(CertData, &extn);
if (ret != KMF_OK) {
free(extn.BERvalue.Data);
}
@@ -2311,3 +2250,27 @@ out:
return (ret);
}
+
+
+/*
+ * Phase 1 APIs still needed to maintain compat with elfsign.
+ */
+KMF_RETURN
+KMF_GetCertSubjectNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+ char **result)
+{
+ return (kmf_get_cert_subject_str(handle, SignedCert, result));
+}
+
+KMF_RETURN
+KMF_GetCertIssuerNameString(KMF_HANDLE_T handle, const KMF_DATA *SignedCert,
+ char **result)
+{
+ return (kmf_get_cert_issuer_str(handle, SignedCert, result));
+}
+
+KMF_RETURN
+KMF_GetCertIDString(const KMF_DATA *SignedCert, char **idstr)
+{
+ return (kmf_get_cert_id_str(SignedCert, idstr));
+}
diff --git a/usr/src/lib/libkmf/libkmf/common/certop.c b/usr/src/lib/libkmf/libkmf/common/certop.c
index 0757b5adcf..b01dfc6204 100644
--- a/usr/src/lib/libkmf/libkmf/common/certop.c
+++ b/usr/src/lib/libkmf/libkmf/common/certop.c
@@ -44,13 +44,14 @@
#define X509_FORMAT_VERSION 2
static KMF_RETURN
-SignCert(KMF_HANDLE_T, const KMF_DATA *, KMF_KEY_HANDLE *, KMF_DATA *);
+sign_cert(KMF_HANDLE_T, const KMF_DATA *, KMF_KEY_HANDLE *, KMF_DATA *);
static KMF_RETURN
-VerifyCertWithKey(KMF_HANDLE_T, KMF_DATA *, const KMF_DATA *);
+verify_cert_with_key(KMF_HANDLE_T, KMF_DATA *, const KMF_DATA *);
static KMF_RETURN
-VerifyCertWithCert(KMF_HANDLE_T, const KMF_DATA *, const KMF_DATA *);
+verify_cert_with_cert(KMF_HANDLE_T, const KMF_DATA *, const KMF_DATA *);
+
static KMF_RETURN
get_keyalg_from_cert(KMF_DATA *cert, KMF_KEY_ALG *keyalg)
@@ -65,7 +66,7 @@ get_keyalg_from_cert(KMF_DATA *cert, KMF_KEY_ALG *keyalg)
return (rv);
/* Get the algorithm info from the signer certificate */
- AlgorithmId = X509_AlgorithmOidToAlgId(
+ AlgorithmId = x509_algoid_to_algid(
&SignerCert->signature.algorithmIdentifier.algorithm);
switch (AlgorithmId) {
@@ -81,67 +82,81 @@ get_keyalg_from_cert(KMF_DATA *cert, KMF_KEY_ALG *keyalg)
rv = KMF_ERR_BAD_ALGORITHM;
}
- KMF_FreeSignedCert(SignerCert);
+ kmf_free_signed_cert(SignerCert);
free(SignerCert);
return (rv);
}
/*
- *
- * Name: find_private_key_by_cert
+ * Name: kmf_find_prikey_by_cert
*
* Description:
* This function finds the corresponding private key in keystore
- * for a certificate
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * params(input) - contains parameters used to find the private key
- * SignerCertData(input) - pointer to a KMF_DATA structure containing a
- * signer certificate
- * key(output) - contains the found private key handle
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
+ * for a certificate
*/
-static KMF_RETURN
-find_private_key_by_cert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *SignerCertData,
- KMF_KEY_HANDLE *key)
+KMF_RETURN
+kmf_find_prikey_by_cert(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
-
- KMF_RETURN ret;
- KMF_KEY_ALG keytype;
KMF_PLUGIN *plugin;
+ KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_KEY_ALG keyalg;
+ KMF_KEY_HANDLE *key = NULL;
+ KMF_DATA *cert = NULL;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)},
+ {KMF_KEY_HANDLE_ATTR, TRUE, sizeof (KMF_KEY_HANDLE),
+ sizeof (KMF_KEY_HANDLE)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
+ if (ret != KMF_OK)
+ return (ret);
- if (handle == NULL || params == NULL ||
- SignerCertData == NULL || key == NULL)
+ /*
+ * First, get the key algorithm info from the certificate and saves it
+ * in the returned key handle.
+ */
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- (void) memset(key, 0, sizeof (KMF_KEY_HANDLE));
- ret = get_keyalg_from_cert(SignerCertData, &keytype);
+ ret = get_keyalg_from_cert(cert, &keyalg);
if (ret != KMF_OK)
return (ret);
- /* Find the private key from the keystore */
- plugin = FindPlugin(handle, params->kstype);
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (key == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+ key->keyalg = keyalg;
- if (plugin != NULL && plugin->funclist->GetPrikeyByCert != NULL) {
- CLEAR_ERROR(handle, ret);
- return (plugin->funclist->GetPrikeyByCert(handle,
- params, SignerCertData, key, keytype));
- } else {
+ /* Call the plugin to do the work. */
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
+
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL || plugin->funclist->FindPrikeyByCert == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ return (plugin->funclist->FindPrikeyByCert(handle, numattr, attrlist));
}
-static KMF_RETURN
+
+KMF_RETURN
check_key_usage(void *handle,
const KMF_DATA *cert,
const KMF_KU_PURPOSE purpose)
@@ -157,7 +172,7 @@ check_key_usage(void *handle,
(void) memset(&constraint, 0, sizeof (KMF_X509EXT_BASICCONSTRAINTS));
(void) memset(&keyusage, 0, sizeof (KMF_X509EXT_KEY_USAGE));
- ret = KMF_GetCertKeyUsageExt(cert, &keyusage);
+ ret = kmf_get_cert_ku(cert, &keyusage);
if (ret != KMF_OK)
/*
* If absent or error, the cert is assumed to be invalid
@@ -180,7 +195,7 @@ check_key_usage(void *handle,
* contain public keys used to validate digital
* signatures on certificates.
*/
- ret = KMF_GetCertBasicConstraintExt(cert, &critical,
+ ret = kmf_get_cert_basic_constraint(cert, &critical,
&constraint);
if ((ret != KMF_ERR_EXTENSION_NOT_FOUND) && (ret != KMF_OK)) {
@@ -221,41 +236,47 @@ check_key_usage(void *handle,
}
KMF_RETURN
-KMF_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *target,
- KMF_X509_DER_CERT *kmf_cert,
- uint32_t *num_certs)
+kmf_find_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
- KMF_RETURN rv = KMF_OK;
-
-
- CLEAR_ERROR(handle, rv);
- if (rv != KMF_OK)
- return (rv);
+ KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_COUNT_ATTR, FALSE, sizeof (uint32_t), sizeof (uint32_t)}
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- if (target == NULL || num_certs == NULL)
- return (KMF_ERR_BAD_PARAMETER); /* ILLEGAL ARGS ERROR */
+ CLEAR_ERROR(handle, ret);
- if ((target->find_cert_validity < KMF_ALL_CERTS) ||
- (target->find_cert_validity > KMF_EXPIRED_CERTS))
- return (KMF_ERR_BAD_PARAMETER);
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
+ if (ret != KMF_OK)
+ return (ret);
- plugin = FindPlugin(handle, target->kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
- if (plugin != NULL && plugin->funclist->FindCert != NULL) {
- return (plugin->funclist->FindCert(handle, target,
- kmf_cert, num_certs));
- }
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL || plugin->funclist->FindCert == NULL)
+ return (KMF_ERR_PLUGIN_NOTFOUND);
- return (KMF_ERR_PLUGIN_NOTFOUND);
+ return (plugin->funclist->FindCert(handle, numattr, attrlist));
}
#define NODATA(d) (d.Data == NULL || d.Length == NULL)
KMF_RETURN
-KMF_EncodeCertRecord(KMF_X509_CERTIFICATE *CertData, KMF_DATA *encodedCert)
+kmf_encode_cert_record(KMF_X509_CERTIFICATE *CertData, KMF_DATA *encodedCert)
{
KMF_RETURN ret;
+ KMF_X509_TBS_CERT *tbs_cert;
if (CertData == NULL || encodedCert == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -263,13 +284,14 @@ KMF_EncodeCertRecord(KMF_X509_CERTIFICATE *CertData, KMF_DATA *encodedCert)
/*
* Validate that all required fields are present.
*/
- if (NODATA(CertData->certificate.version) ||
- NODATA(CertData->certificate.signature.algorithm) ||
- NODATA(CertData->certificate.subjectPublicKeyInfo.subjectPublicKey) ||
- CertData->certificate.serialNumber.val == NULL ||
- CertData->certificate.serialNumber.len == 0 ||
- CertData->certificate.subject.numberOfRDNs == 0 ||
- CertData->certificate.issuer.numberOfRDNs == 0) {
+ tbs_cert = &(CertData->certificate);
+ if (NODATA(tbs_cert->version) ||
+ NODATA(tbs_cert->signature.algorithm) ||
+ NODATA(tbs_cert->subjectPublicKeyInfo.subjectPublicKey) ||
+ tbs_cert->serialNumber.val == NULL ||
+ tbs_cert->serialNumber.len == 0 ||
+ tbs_cert->subject.numberOfRDNs == 0 ||
+ tbs_cert->issuer.numberOfRDNs == 0) {
return (KMF_ERR_INCOMPLETE_TBS_CERT);
}
@@ -282,346 +304,612 @@ KMF_EncodeCertRecord(KMF_X509_CERTIFICATE *CertData, KMF_DATA *encodedCert)
return (ret);
}
-KMF_RETURN
-KMF_DecodeCertData(KMF_DATA *rawcert, KMF_X509_CERTIFICATE **certrec)
-{
- KMF_RETURN ret = KMF_OK;
-
- if (rawcert == NULL || rawcert->Data == NULL ||
- rawcert->Length == 0 || certrec == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- ret = DerDecodeSignedCertificate(rawcert, certrec);
-
- return (ret);
-}
-
/*
+ * This function is used to setup the attribute list before calling
+ * kmf_find_prikey_by_cert(). This function is used by
+ * kmf_decrypt_with_cert
+ * kmf_sign_cert
+ * kmf_sign_data
*
- * Name: KMF_SignCertWithKey
- *
- * Description:
- * This function signs a certificate using the private key and
- * returns the result as a signed, encoded certificate in SignedCert
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * CertToBeSigned(input) - pointer to a KMF_DATA structure containing a
- * DER encoded certificate to be signed
- * Signkey(input) - pointer to private key handle needed for signing
- * SignedCert(output) - pointer to the KMF_DATA structure containing the
- * signed certificate
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
+ * The attribute list in these callers contain all the attributes
+ * needed by kmf_find_prikey_by_cert(), except the
+ * KMF_KEY_HANDLE attribute and the KMF_CERT_DATA_ATTR attribute.
+ * These 2 attributes need to be added or reset.
*
+ * The caller should free the new_attrlist after use it.
*/
-KMF_RETURN
-KMF_SignCertWithKey(KMF_HANDLE_T handle,
- const KMF_DATA *CertToBeSigned,
- KMF_KEY_HANDLE *Signkey,
- KMF_DATA *SignedCert)
+static KMF_RETURN
+setup_findprikey_attrlist(KMF_ATTRIBUTE *src_attrlist, int src_num,
+ KMF_ATTRIBUTE **new_attrlist, int *new_num, KMF_KEY_HANDLE *key,
+ KMF_DATA *cert)
{
- KMF_RETURN err;
-
- CLEAR_ERROR(handle, err);
- if (err != KMF_OK)
- return (err);
+ KMF_ATTRIBUTE *attrlist = NULL;
+ int cur_num = src_num;
+ int index;
+ int i;
- if (CertToBeSigned == NULL ||
- Signkey == NULL || SignedCert == NULL)
+ if (src_attrlist == NULL || new_num == NULL || key == NULL ||
+ cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- err = SignCert(handle, CertToBeSigned, Signkey, SignedCert);
+ /* Create a new attribute list with 2 more elements */
+ attrlist = (KMF_ATTRIBUTE *) malloc(
+ (src_num + 2) * sizeof (KMF_ATTRIBUTE));
+ if (attrlist == NULL)
+ return (KMF_ERR_MEMORY);
+
+ /* Copy the src_attrlist to the new list */
+ for (i = 0; i < src_num; i++) {
+ attrlist[i].type = src_attrlist[i].type;
+ attrlist[i].pValue = src_attrlist[i].pValue;
+ attrlist[i].valueLen = src_attrlist[i].valueLen;
+ }
- return (err);
+ /* Add or reset the key handle attribute */
+ index = kmf_find_attr(KMF_KEY_HANDLE_ATTR, attrlist, cur_num);
+ if (index == -1) {
+ /* not found; add it */
+ kmf_set_attr_at_index(attrlist, cur_num,
+ KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
+ cur_num++;
+ } else {
+ /* found; just reset it */
+ kmf_set_attr_at_index(attrlist, index,
+ KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
+ }
+
+ /* add or reset the cert data attribute */
+ index = kmf_find_attr(KMF_CERT_DATA_ATTR, attrlist, cur_num);
+ if (index == -1) {
+ /* not found; add it */
+ kmf_set_attr_at_index(attrlist, cur_num,
+ KMF_CERT_DATA_ATTR, cert, sizeof (KMF_DATA));
+ cur_num++;
+ } else {
+ /* found; just reset it */
+ kmf_set_attr_at_index(attrlist, index,
+ KMF_CERT_DATA_ATTR, cert, sizeof (KMF_DATA));
+ }
+
+ *new_attrlist = attrlist;
+ *new_num = cur_num;
+ return (KMF_OK);
}
+
/*
- *
- * Name: KMF_SignCertWithCert
+ * Name: kmf_sign_cert
*
* Description:
* This function signs a certificate using the signer cert and
- * returns the result as a signed, encoded certificate in SignedCert
+ * returns a signed and DER-encoded certificate.
*
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * params(input) - contains parameters to be used for signing
- * CertToBeSigned(input) - pointer to a KMF_DATA structure containing a
- * DER encoded certificate to be signed
- * SignerCert(input) - pointer to a KMF_DATA structure containing a
- * signer certificate
- * SignedCert(output) - pointer to the KMF_DATA structure containing the
- * DER encoded signed certificate
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
+ * The following types of certificate data can be submitted to be signed:
+ * KMF_TBS_CERT_DATA_ATTR - a KMF_DATA ptr is provided in the attrlist
+ * and is signed directly.
+ * KMF_X509_CERTIFICATE_ATTR - a KMF_X509_CERTIFICATE record is provided
+ * in the attribute list. This is converted to raw KMF_DATA
+ * prior to signing.
*
+ * The key for the signing operation can be provided as a KMF_KEY_HANDLE_ATTR
+ * or the caller may choose to provide a KMF_SIGNER_CERT_ATTR (KMF_DATA *).
+ * If the latter, this function will then attempt to find the private key
+ * associated with the certificate. The private key must be stored in
+ * the same keystore as the signer certificate.
*/
KMF_RETURN
-KMF_SignCertWithCert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- const KMF_DATA *CertToBeSigned,
- KMF_DATA *SignerCert,
- KMF_DATA *SignedCert)
+kmf_sign_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret;
- KMF_KEY_HANDLE Signkey;
+ int new_numattr = numattr + 1;
+ KMF_ATTRIBUTE *new_attrlist = NULL;
+ KMF_DATA *signer_cert = NULL;
+ KMF_DATA *tbs_cert = NULL; /* to be signed cert */
+ KMF_DATA *signed_cert = NULL;
+ KMF_DATA unsignedCert = {NULL, 0};
+ KMF_KEY_HANDLE sign_key, *sign_key_ptr;
+ int freethekey = 0;
+ KMF_X509_CERTIFICATE *x509cert;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)}
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (CertToBeSigned == NULL ||
- SignerCert == NULL || SignedCert == NULL)
+ /* Get the signer cert and check its keyUsage */
+ signer_cert = kmf_get_attr_ptr(KMF_SIGNER_CERT_DATA_ATTR, attrlist,
+ numattr);
+ sign_key_ptr = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist,
+ numattr);
+ if (signer_cert == NULL && sign_key_ptr == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /* check the keyUsage of signer's certificate */
- ret = check_key_usage(handle, SignerCert, KMF_KU_SIGN_CERT);
- if (ret != KMF_OK)
- return (ret);
+ if (signer_cert != NULL) {
+ ret = check_key_usage(handle, signer_cert, KMF_KU_SIGN_CERT);
+ if (ret != KMF_OK)
+ return (ret);
- /*
- * Retrieve the private key from the keystore for the
- * signer certificate.
- */
- ret = find_private_key_by_cert(handle, params, SignerCert, &Signkey);
- if (ret != KMF_OK)
- return (ret);
+ /*
+ * Find the private key from the signer certificate by calling
+ * kmf_find_prikey_by_cert().
+ */
+ ret = setup_findprikey_attrlist(attrlist, numattr,
+ &new_attrlist, &new_numattr, &sign_key, signer_cert);
+ if (ret != KMF_OK)
+ goto out;
+
+ ret = kmf_find_prikey_by_cert(handle, new_numattr,
+ new_attrlist);
+ if (ret != KMF_OK) {
+ goto out;
+ }
+ sign_key_ptr = &sign_key;
+ freethekey = 1;
+ }
- ret = SignCert(handle, CertToBeSigned, &Signkey, SignedCert);
+ /* Now we are ready to sign */
+ tbs_cert = kmf_get_attr_ptr(KMF_TBS_CERT_DATA_ATTR, attrlist,
+ numattr);
+ if (tbs_cert == NULL) {
+ x509cert = kmf_get_attr_ptr(KMF_X509_CERTIFICATE_ATTR, attrlist,
+ numattr);
+ if (x509cert == NULL) {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto out;
+ }
+ ret = kmf_encode_cert_record(x509cert, &unsignedCert);
+ if (ret == KMF_OK)
+ tbs_cert = &unsignedCert;
+ else
+ goto out;
+ }
- KMF_FreeKMFKey(handle, &Signkey);
+ signed_cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist,
+ numattr);
+ if (signed_cert == NULL) {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto out;
+ }
+
+ ret = sign_cert(handle, tbs_cert, sign_key_ptr, signed_cert);
+
+out:
+ if (new_attrlist)
+ (void) free(new_attrlist);
+
+ /* If we had to find the key, free it here. */
+ if (freethekey)
+ kmf_free_kmf_key(handle, &sign_key);
+ kmf_free_data(&unsignedCert);
return (ret);
}
/*
- *
- * Name: KMF_SignDataWithCert
+ * Name: kmf_sign_data
*
* Description:
* This function signs a block of data using the signer cert and
- * returns the the signature in output
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * params(input) - contains parameters to be used for signing
- * tobesigned(input) - pointer to a KMF_DATA structure containing a
- * the data to be signed
- * output(output) - pointer to the KMF_DATA structure containing the
- * signed data
- * SignerCertData(input) - pointer to a KMF_DATA structure containing a
- * signer certificate
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
+ * returns the the signature in output
*/
KMF_RETURN
-KMF_SignDataWithCert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *tobesigned,
- KMF_DATA *output,
- KMF_DATA *SignerCertData)
+kmf_sign_data(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
-
- KMF_RETURN ret;
- KMF_KEY_HANDLE Signkey;
- KMF_X509_CERTIFICATE *SignerCert = NULL;
KMF_PLUGIN *plugin;
+ KMF_RETURN ret = KMF_OK;
+ KMF_ATTRIBUTE *new_attrlist = NULL;
+ int new_numattr = numattr;
+ KMF_DATA *signer_cert = NULL;
+ KMF_DATA *tbs_data = NULL; /* to be signed data */
+ KMF_DATA *output = NULL;
+ KMF_KEY_HANDLE sign_key, *sign_key_ptr;
+ KMF_X509_CERTIFICATE *x509_cert = NULL;
KMF_ALGORITHM_INDEX AlgId;
KMF_DATA signature = {0, NULL};
+ KMF_OID *oid;
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)},
+ {KMF_OUT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)}
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- if (tobesigned == NULL ||
- SignerCertData == NULL || output == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /* check the keyUsage of signer's certificate */
- ret = check_key_usage(handle, SignerCertData, KMF_KU_SIGN_DATA);
+ CLEAR_ERROR(handle, ret);
- /* Signing generic data does not require the KeyUsage extension. */
- if (ret == KMF_ERR_EXTENSION_NOT_FOUND)
- ret = KMF_OK;
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
+ /* Get the signer cert and check its keyUsage. */
+ signer_cert = kmf_get_attr_ptr(KMF_SIGNER_CERT_DATA_ATTR, attrlist,
+ numattr);
+ sign_key_ptr = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist,
+ numattr);
+
+ if (signer_cert == NULL && sign_key_ptr == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
/*
- * Retrieve the private key from the keystore based on
- * the signer certificate.
+ * If a signer cert was given, use it to find the private key
+ * to use for signing the data.
*/
- ret = find_private_key_by_cert(handle, params, SignerCertData,
- &Signkey);
- if (ret != KMF_OK) {
- goto cleanup;
+ if (signer_cert != NULL) {
+ ret = check_key_usage(handle, signer_cert, KMF_KU_SIGN_DATA);
+
+ /*
+ * Signing generic data does not require the
+ * KeyUsage extension.
+ */
+ if (ret == KMF_ERR_EXTENSION_NOT_FOUND)
+ ret = KMF_OK;
+ if (ret != KMF_OK)
+ return (ret);
+
+ /*
+ * Find the private key from the signer certificate.
+ */
+ ret = setup_findprikey_attrlist(attrlist, numattr,
+ &new_attrlist, &new_numattr, &sign_key, signer_cert);
+ if (ret != KMF_OK) {
+ goto cleanup;
+ }
+
+ ret = kmf_find_prikey_by_cert(handle, new_numattr,
+ new_attrlist);
+ if (ret != KMF_OK) {
+ goto cleanup;
+ }
+ sign_key_ptr = &sign_key;
}
- ret = DerDecodeSignedCertificate(SignerCertData, &SignerCert);
- if (ret != KMF_OK)
+ /* Get the tbs_data and signed_data attributes now */
+ tbs_data = kmf_get_attr_ptr(KMF_DATA_ATTR, attrlist, numattr);
+ if (tbs_data == NULL) {
+ ret = KMF_ERR_BAD_PARAMETER;
goto cleanup;
+ }
- plugin = FindPlugin(handle, Signkey.kstype);
- if (plugin != NULL && plugin->funclist->SignData != NULL) {
- KMF_OID *oid;
-
- if (params->algid != KMF_ALGID_NONE)
- oid = X509_AlgIdToAlgorithmOid(params->algid);
- else
- oid = CERT_ALG_OID(SignerCert);
+ output = kmf_get_attr_ptr(KMF_OUT_DATA_ATTR, attrlist, numattr);
+ if (output == NULL) {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
+ }
- ret = plugin->funclist->SignData(handle, &Signkey,
- oid, tobesigned, output);
+ /*
+ * Get the algorithm index attribute and its oid. If this attribute
+ * is not provided, then we use the algorithm in the signer cert.
+ */
+ oid = kmf_get_attr_ptr(KMF_OID_ATTR, attrlist, numattr);
+ ret = kmf_get_attr(KMF_ALGORITHM_INDEX_ATTR, attrlist, numattr,
+ &AlgId, NULL);
+ /*
+ * We need to know the Algorithm ID, it can be found 3 ways:
+ * 1. caller supplied OID in the attribute list.
+ * 2. caller supplied Algorithm Index in the attribute list.
+ * 3. caller supplied neither, but did supply a certificate, find
+ * the ALG OID from the certificate.
+ */
+ /* If none of the above, return error. */
+ if (oid == NULL && ret != KMF_OK && signer_cert == NULL) {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
+ } else if (oid == NULL && ret != KMF_OK) {
+ /* if no OID and No AlgID, use the signer cert */
+ ret = DerDecodeSignedCertificate(signer_cert, &x509_cert);
if (ret != KMF_OK)
goto cleanup;
- AlgId = X509_AlgorithmOidToAlgId(CERT_ALG_OID(SignerCert));
-
- /*
- * For DSA, NSS returns an encoded signature. Decode the
- * signature as DSA signature should be 40-byte long.
- */
- if ((AlgId == KMF_ALGID_SHA1WithDSA) &&
- (plugin->type == KMF_KEYSTORE_NSS)) {
- ret = DerDecodeDSASignature(output, &signature);
- if (ret != KMF_OK) {
- goto cleanup;
- } else {
- output->Length = signature.Length;
- (void) memcpy(output->Data, signature.Data,
- signature.Length);
- }
- } else if (AlgId == KMF_ALGID_NONE) {
- ret = KMF_ERR_BAD_ALGORITHM;
+ oid = CERT_ALG_OID(x509_cert);
+ AlgId = x509_algoid_to_algid(oid);
+ if (AlgId == KMF_ALGID_NONE) {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
}
- } else {
+ } else if (oid == NULL && ret == KMF_OK) {
+ /* AlgID was given by caller, convert it to OID */
+ oid = x509_algid_to_algoid(AlgId);
+ } else { /* Else, the OID must have been given */
+ ret = KMF_OK;
+ }
+
+ /* Now call the plugin function to sign it */
+ plugin = FindPlugin(handle, sign_key_ptr->kstype);
+ if (plugin == NULL || plugin->funclist->SignData == NULL) {
ret = KMF_ERR_PLUGIN_NOTFOUND;
+ goto cleanup;
+ }
+
+ ret = plugin->funclist->SignData(handle, sign_key_ptr, oid, tbs_data,
+ output);
+ if (ret != KMF_OK)
+ goto cleanup;
+
+ /*
+ * For DSA, NSS returns an encoded signature. Decode the
+ * signature as DSA signature should be 40-byte long.
+ */
+ if (plugin->type == KMF_KEYSTORE_NSS &&
+ AlgId == KMF_ALGID_SHA1WithDSA) {
+ ret = DerDecodeDSASignature(output, &signature);
+ if (ret != KMF_OK)
+ goto cleanup;
+ output->Length = signature.Length;
+ (void) memcpy(output->Data, signature.Data, signature.Length);
}
cleanup:
+ if (new_attrlist != NULL)
+ free(new_attrlist);
+
if (signature.Data)
free(signature.Data);
- KMF_FreeKMFKey(handle, &Signkey);
- if (SignerCert != NULL) {
- KMF_FreeSignedCert(SignerCert);
- free(SignerCert);
+ if (signer_cert != NULL && sign_key_ptr != NULL)
+ kmf_free_kmf_key(handle, sign_key_ptr);
+
+ if (x509_cert != NULL) {
+ kmf_free_signed_cert(x509_cert);
+ free(x509_cert);
}
return (ret);
}
/*
+ * kmf_verify_data
*
- * Name: KMF_VerifyCertWithKey
- *
- * Description:
- * This function verifies that the CertToBeVerified was signed
- * using a specific private key and that the certificate has not
- * been altered since it was signed using that private key
+ * This routine will try to verify a block of data using
+ * either a public key or a certificate as the source
+ * of the verification (the key).
*
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * KMFKey(input) - holds public key information for verification
- * CertToBeVerified(input) - A signed certificate whose signature
- * is to be verified
+ * The caller may provider either a KMF_KEY_HANDLE_ATTR or
+ * a KMF_SIGNER_CERT_DATA_ATTR (with a KMF_DATA record) to
+ * use for the key to the verification step. If a certificate
+ * is used and that certificate has the KeyUsage extension,
+ * the SIGN-DATA bit must be set. Also, if a certificate
+ * is used, the verification will be done in a specific
+ * keystore mechanism.
*
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition. The value KMF_OK indicates success. All other
- * values represent an error condition.
+ * If a KMF_KEY_HANDLE is given in the attribute list, the
+ * verification will occur in the framework itself using
+ * PKCS#11 C_Verify functions.
*/
KMF_RETURN
-KMF_VerifyCertWithKey(KMF_HANDLE_T handle,
- KMF_KEY_HANDLE *KMFKey,
- const KMF_DATA *CertToBeVerified)
+kmf_verify_data(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN err;
+ KMF_RETURN ret = KMF_OK;
+ KMF_PLUGIN *plugin;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
KMF_DATA derkey = {0, NULL};
- KMF_PLUGIN *plugin;
+ KMF_KEY_HANDLE *KMFKey;
+ KMF_ALGORITHM_INDEX sigAlg;
+ KMF_DATA *indata;
+ KMF_DATA *insig;
+ KMF_DATA *signer_cert;
+ KMF_X509_SPKI spki;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_IN_SIGN_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)}
+ };
- CLEAR_ERROR(handle, err);
- if (err != KMF_OK)
- return (err);
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- if (KMFKey == NULL ||
- CertToBeVerified == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /* The keystore must extract the pubkey data */
- plugin = FindPlugin(handle, KMFKey->kstype);
- if (plugin != NULL && plugin->funclist->EncodePubkeyData != NULL) {
- err = plugin->funclist->EncodePubkeyData(handle,
- KMFKey, &derkey);
- } else {
- return (KMF_ERR_PLUGIN_NOTFOUND);
+ CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
+
+ if (ret != KMF_OK)
+ return (ret);
+
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
+
+ KMFKey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, num_args);
+ signer_cert = kmf_get_attr_ptr(KMF_SIGNER_CERT_DATA_ATTR, attrlist,
+ num_args);
+ if (KMFKey == NULL && signer_cert == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
}
- if (err == KMF_OK && derkey.Length > 0) {
- /* check the caller and do other setup for this SPI call */
- err = VerifyCertWithKey(handle, &derkey, CertToBeVerified);
+ len = sizeof (sigAlg);
+ ret = kmf_get_attr(KMF_ALGORITHM_INDEX_ATTR, attrlist, num_args,
+ &sigAlg, &len);
+ if (ret != KMF_OK)
+ return (ret);
+
+ indata = kmf_get_attr_ptr(KMF_DATA_ATTR, attrlist, num_args);
+ if (indata == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ insig = kmf_get_attr_ptr(KMF_IN_SIGN_ATTR, attrlist, num_args);
+ if (insig == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* If the caller passed a signer cert instead of a key use it. */
+ if (signer_cert != NULL) {
+ ret = check_key_usage(handle, signer_cert, KMF_KU_SIGN_DATA);
+ if (ret != KMF_OK)
+ return (ret);
+
+ if (kstype == KMF_KEYSTORE_NSS)
+ kstype = KMF_KEYSTORE_PK11TOKEN;
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL)
+ return (KMF_ERR_PLUGIN_NOTFOUND);
+ if (plugin->funclist->VerifyDataWithCert == NULL)
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
+
+ CLEAR_ERROR(handle, ret);
+ ret = plugin->funclist->VerifyDataWithCert(handle,
+ sigAlg, indata, insig, signer_cert);
+ } else {
+ /* Retrieve public key data from keystore */
+ plugin = FindPlugin(handle, kstype);
+ if (plugin != NULL &&
+ plugin->funclist->EncodePubkeyData != NULL) {
+ ret = plugin->funclist->EncodePubkeyData(handle,
+ KMFKey, &derkey);
+ } else {
+ return (KMF_ERR_PLUGIN_NOTFOUND);
+ }
+
+ ret = DerDecodeSPKI(&derkey, &spki);
+ if (ret == KMF_OK) {
+ ret = PKCS_VerifyData(handle, sigAlg, &spki,
+ indata, insig);
+ }
if (derkey.Data != NULL)
free(derkey.Data);
+
+ kmf_free_algoid(&spki.algorithm);
+ kmf_free_data(&spki.subjectPublicKey);
}
- return (err);
+ return (ret);
}
-
/*
- *
- * Name: KMF_VerifyCertWithCert
+ * Name: kmf_verify_cert
*
* Description:
- * Function to verify the signature of a signed certificate
+ * This function verifies that the a certificate was signed
+ * using a specific private key and that the certificate has not
+ * been altered since it was signed using that private key
+ * The public key used for verification may be given in the
+ * attribute list as a KMF_KEY_HANDLE or the caller may give
+ * just the signing certificate (as KMF_SIGNER_CERT_DATA_ATTR)
+ * from which the public key needed for verification can be
+ * derived.
*
* Parameters:
- * handle - pointer to KMF handle
- * CertToBeVerified(input) - pointer to the signed certificate
- * SignerCert(input) - pointer to certificate used in signing
+ * handle(input) - opaque handle for KMF session
+ * numattr - number of attributes in the list
+ * attrlist - KMF_ATTRIBUTES
*
* Returns:
- * A KMF_RETURN value.
- * The value KMF_OK indicates success.
- * All other values represent an error condition.
+ * A KMF_RETURN value indicating success or specifying a particular
+ * error condition. The value KMF_OK indicates success. All other
+ * values represent an error condition.
*/
KMF_RETURN
-KMF_VerifyCertWithCert(KMF_HANDLE_T handle,
- const KMF_DATA *CertToBeVerified,
- const KMF_DATA *SignerCert)
+kmf_verify_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN ret;
+ KMF_RETURN ret;
+ KMF_DATA derkey = {0, NULL};
+ KMF_PLUGIN *plugin;
+ KMF_KEY_HANDLE *KMFKey;
+ KMF_DATA *CertToBeVerified;
+ KMF_DATA *SignerCert;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (CertToBeVerified == NULL ||
- SignerCert == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- /* check the keyUsage of signer's certificate */
- ret = check_key_usage(handle, SignerCert, KMF_KU_SIGN_CERT);
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- ret = VerifyCertWithCert(handle, CertToBeVerified, SignerCert);
+ KMFKey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ SignerCert = kmf_get_attr_ptr(KMF_SIGNER_CERT_DATA_ATTR, attrlist,
+ numattr);
+
+ /*
+ * Caller must provide at least a key handle or a cert to use
+ * as the "key" for verification.
+ */
+ if (KMFKey == NULL && SignerCert == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ CertToBeVerified = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist,
+ numattr);
+ if (CertToBeVerified == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ if (SignerCert != NULL) {
+ ret = verify_cert_with_cert(handle, CertToBeVerified,
+ SignerCert);
+ } else {
+ /*
+ * The keystore must extract the pubkey data because
+ * the framework doesn't have access to the raw key bytes
+ * that are needed to construct the DER encoded public
+ * key information needed for the verify operation.
+ */
+ plugin = FindPlugin(handle, KMFKey->kstype);
+ if (plugin != NULL && plugin->funclist->EncodePubkeyData !=
+ NULL) {
+ ret = plugin->funclist->EncodePubkeyData(handle,
+ KMFKey, &derkey);
+ } else {
+ return (KMF_ERR_PLUGIN_NOTFOUND);
+ }
+
+ if (ret == KMF_OK && derkey.Length > 0) {
+ ret = verify_cert_with_key(handle, &derkey,
+ CertToBeVerified);
+
+ if (derkey.Data != NULL)
+ free(derkey.Data);
+ }
+ }
+
return (ret);
}
+/*
+ * Utility routine for verifying generic data using a
+ * certificate to derive the public key. This is
+ * done in a specific plugin because there are situations
+ * where we want to force this operation to happen in
+ * a specific keystore.
+ * For example:
+ * libelfsign verifies signatures on crypto libraries.
+ * We cannot use libpkcs11 functions to verify the pkcs11
+ * libraries because it results in a circular dependency.
+ * So, when libelfsign is verifying library sigs, it
+ * always forces the operation to happen in OpenSSL
+ * to avoid the circular dependency.
+ */
static KMF_RETURN
plugin_verify_data_with_cert(KMF_HANDLE_T handle,
KMF_KEYSTORE_TYPE kstype,
@@ -651,69 +939,13 @@ plugin_verify_data_with_cert(KMF_HANDLE_T handle,
CLEAR_ERROR(handle, ret);
ret = (plugin->funclist->VerifyDataWithCert(handle,
- algid, indata, insig, (KMF_DATA *)SignerCert));
+ algid, indata, insig, (KMF_DATA *)SignerCert));
return (ret);
}
/*
- *
- * Name: KMF_VerifyDataWithCert
- *
- * Description:
- * This function verifies the signature of a block of data using a signer
- * certificate.
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * indata(input) - pointer to the block of data whose signature
- * is to be verified
- * insig(input) - pointer to the signature to be verified
- * SignerCert(input) - pointer to signer cert for verification
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
- */
-KMF_RETURN
-KMF_VerifyDataWithCert(KMF_HANDLE_T handle,
- KMF_KEYSTORE_TYPE kstype,
- KMF_ALGORITHM_INDEX algid,
- KMF_DATA *indata,
- KMF_DATA *insig,
- const KMF_DATA *SignerCert)
-{
- KMF_RETURN ret;
-
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
-
- if (SignerCert == NULL ||
- indata == NULL || insig == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- /* check the keyUsage of signer's certificate */
- ret = check_key_usage(handle, SignerCert, KMF_KU_SIGN_DATA);
-
- /* For this operation, it is OK if KeyUsage is not present */
- if (ret == KMF_ERR_EXTENSION_NOT_FOUND)
- ret = KMF_OK;
-
- if (ret != KMF_OK)
- return (ret);
-
- ret = plugin_verify_data_with_cert(handle, kstype,
- algid, indata, insig, SignerCert);
-
- return (ret);
-}
-
-/*
- * Name: KMF_EncryptWithCert
+ * Name: kmf_encrypt
*
* Description:
* Uses the public key from the cert to encrypt the plaintext
@@ -735,23 +967,45 @@ KMF_VerifyDataWithCert(KMF_HANDLE_T handle,
*
*/
KMF_RETURN
-KMF_EncryptWithCert(KMF_HANDLE_T handle,
- KMF_DATA *cert,
- KMF_DATA *plaintext,
- KMF_DATA *ciphertext)
+kmf_encrypt(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret;
KMF_X509_CERTIFICATE *x509cert = NULL;
KMF_X509_SPKI *pubkey;
KMF_OID *alg;
KMF_ALGORITHM_INDEX algid;
+ KMF_DATA *cert;
+ KMF_DATA *plaintext;
+ KMF_DATA *ciphertext;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_PLAINTEXT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_CIPHERTEXT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (cert == NULL ||
- plaintext == NULL || ciphertext == NULL)
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
+ if (ret != KMF_OK)
+ return (ret);
+
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist,
+ numattr);
+ plaintext = kmf_get_attr_ptr(KMF_PLAINTEXT_DATA_ATTR, attrlist,
+ numattr);
+ ciphertext = kmf_get_attr_ptr(KMF_CIPHERTEXT_DATA_ATTR, attrlist,
+ numattr);
+
+ if (cert == NULL || plaintext == NULL || ciphertext == NULL)
return (KMF_ERR_BAD_PARAMETER);
/* check the keyUsage of the certificate */
@@ -771,68 +1025,72 @@ KMF_EncryptWithCert(KMF_HANDLE_T handle,
/* Use the algorithm in SPKI to encrypt data */
alg = &pubkey->algorithm.algorithm;
- algid = X509_AlgorithmOidToAlgId(alg);
+ algid = x509_algoid_to_algid(alg);
/* DSA does not support encrypt */
if (algid == KMF_ALGID_DSA || algid == KMF_ALGID_NONE) {
- KMF_FreeSignedCert(x509cert);
+ kmf_free_signed_cert(x509cert);
free(x509cert);
return (KMF_ERR_BAD_ALGORITHM);
}
+ /*
+ * Encrypt using the crypto framework (not the KMF plugin mechanism).
+ */
ret = PKCS_EncryptData(handle, algid, pubkey, plaintext, ciphertext);
- KMF_FreeSignedCert(x509cert);
+ kmf_free_signed_cert(x509cert);
free(x509cert);
return (ret);
}
/*
- * Name: KMF_DecryptWithCert
+ * Name: kmf_decrypt
*
* Description:
* Uses the private key associated with the cert to decrypt
* the ciphertext into the plaintext.
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * params(input) - contains parameters to be used to find the private
- * key for decryption
- * cert(input) - pointer to a DER encoded certificate for decryption
- * by using its private key
- * ciphertext(input) - pointer to the ciphertext contains to be
- * decrypted data
- * plaintext(output) - pointer to the plaintext after decryption
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
*/
KMF_RETURN
-KMF_DecryptWithCert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *cert,
- KMF_DATA *ciphertext,
- KMF_DATA *plaintext)
+kmf_decrypt(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret;
- KMF_KEY_HANDLE Signkey;
KMF_X509_CERTIFICATE *x509cert = NULL;
KMF_X509_SPKI *spki_ptr;
KMF_PLUGIN *plugin;
KMF_ALGORITHM_INDEX AlgorithmId;
-
-
+ KMF_ATTRIBUTE *new_attrlist = NULL;
+ int new_numattr;
+ KMF_DATA *cert = NULL;
+ KMF_DATA *ciphertext = NULL;
+ KMF_DATA *plaintext = NULL;
+ KMF_KEY_HANDLE prikey;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)},
+ {KMF_PLAINTEXT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_CIPHERTEXT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (cert == NULL ||
- plaintext == NULL || ciphertext == NULL)
+
+ /* Get the cert and check its keyUsage */
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist,
+ numattr);
+ if (cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
/* check the keyUsage of the certificate */
@@ -842,14 +1100,29 @@ KMF_DecryptWithCert(KMF_HANDLE_T handle,
if (ret != KMF_OK)
return (ret);
+ /* Get the ciphertext and plaintext attributes */
+ ciphertext = kmf_get_attr_ptr(KMF_CIPHERTEXT_DATA_ATTR, attrlist,
+ numattr);
+ if (ciphertext == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ plaintext = kmf_get_attr_ptr(KMF_PLAINTEXT_DATA_ATTR, attrlist,
+ numattr);
+ if (plaintext == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
/*
* Retrieve the private key from the keystore based on
* the certificate.
*/
- ret = find_private_key_by_cert(handle, params, cert, &Signkey);
- if (ret != KMF_OK) {
- return (ret);
- }
+ ret = setup_findprikey_attrlist(attrlist, numattr, &new_attrlist,
+ &new_numattr, &prikey, cert);
+ if (ret != KMF_OK)
+ goto cleanup;
+
+ ret = kmf_find_prikey_by_cert(handle, new_numattr, new_attrlist);
+ if (ret != KMF_OK)
+ goto cleanup;
/* Decode the cert so we can get the alogorithm */
ret = DerDecodeSignedCertificate(cert, &x509cert);
@@ -857,7 +1130,7 @@ KMF_DecryptWithCert(KMF_HANDLE_T handle,
goto cleanup;
spki_ptr = &x509cert->certificate.subjectPublicKeyInfo;
- AlgorithmId = X509_AlgorithmOidToAlgId((KMF_OID *)
+ AlgorithmId = x509_algoid_to_algid((KMF_OID *)
&spki_ptr->algorithm.algorithm);
/* DSA does not support decrypt */
@@ -866,93 +1139,137 @@ KMF_DecryptWithCert(KMF_HANDLE_T handle,
goto cleanup;
}
- plugin = FindPlugin(handle, Signkey.kstype);
+ plugin = FindPlugin(handle, prikey.kstype);
if (plugin != NULL && plugin->funclist->DecryptData != NULL) {
ret = plugin->funclist->DecryptData(handle,
- &Signkey, &spki_ptr->algorithm.algorithm,
+ &prikey, &spki_ptr->algorithm.algorithm,
ciphertext, plaintext);
} else {
ret = KMF_ERR_PLUGIN_NOTFOUND;
}
cleanup:
- KMF_FreeKMFKey(handle, &Signkey);
- KMF_FreeSignedCert(x509cert);
+ if (new_attrlist != NULL)
+ free(new_attrlist);
+
+ kmf_free_kmf_key(handle, &prikey);
+ kmf_free_signed_cert(x509cert);
free(x509cert);
return (ret);
}
KMF_RETURN
-KMF_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *target,
- KMF_DATA *pcert)
+kmf_store_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (target == NULL || pcert == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, target->kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
- if (plugin != NULL && plugin->funclist->StoreCert != NULL) {
- return (plugin->funclist->StoreCert(handle, target, pcert));
- } else {
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL || plugin->funclist->StoreCert == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+
+ return (plugin->funclist->StoreCert(handle, numattr, attrlist));
}
KMF_RETURN
-KMF_ImportCert(KMF_HANDLE_T handle, KMF_IMPORTCERT_PARAMS *target)
+kmf_import_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_FILENAME_ATTR, TRUE, 1, 0},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs, 0, NULL,
+ numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (target == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, target->kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
- if (plugin != NULL && plugin->funclist->ImportCert != NULL) {
- return (plugin->funclist->ImportCert(handle, target));
- } else {
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL || plugin->funclist->ImportCert == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+
+ return (plugin->funclist->ImportCert(handle, numattr, attrlist));
}
KMF_RETURN
-KMF_DeleteCertFromKeystore(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *target)
+kmf_delete_cert_from_keystore(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE kstype;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)}
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (target == NULL ||
- (target->find_cert_validity < KMF_ALL_CERTS) ||
- (target->find_cert_validity > KMF_EXPIRED_CERTS))
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, target->kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
- if (plugin != NULL && plugin->funclist->DeleteCert != NULL) {
- return (plugin->funclist->DeleteCert(handle, target));
- } else {
+ plugin = FindPlugin(handle, kstype);
+ if (plugin == NULL || plugin->funclist->DeleteCert == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+
+ return (plugin->funclist->DeleteCert(handle, numattr, attrlist));
}
+
/*
* This function gets the CRL URI entries from the certificate's Distribution
* points extension, and downloads the CRL file. The function also returns
@@ -995,7 +1312,7 @@ cert_get_crl(KMF_HANDLE_T handle, const KMF_DATA *cert, char *proxy,
* the process until a CRL file is sucessfully downloaded or we
* are running out the CRL URI's.
*/
- ret = KMF_GetCertCRLDistributionPointsExt((const KMF_DATA *)cert,
+ ret = kmf_get_cert_crl_dist_pts((const KMF_DATA *)cert,
&crl_dps);
if (ret != KMF_OK)
goto out;
@@ -1011,7 +1328,7 @@ cert_get_crl(KMF_HANDLE_T handle, const KMF_DATA *cert, char *proxy,
data = &(fullname->namelist[j].name);
(void) memcpy(uri, data->Data, data->Length);
uri[data->Length] = '\0';
- ret = KMF_DownloadCRL(handle, uri, proxyname,
+ ret = kmf_download_crl(handle, uri, proxyname,
proxy_port, 30, filename, format);
if (ret == KMF_OK) {
done = B_TRUE;
@@ -1028,25 +1345,21 @@ cert_get_crl(KMF_HANDLE_T handle, const KMF_DATA *cert, char *proxy,
}
out:
- KMF_FreeCRLDistributionPoints(&crl_dps);
+ kmf_free_crl_dist_pts(&crl_dps);
return (ret);
}
static KMF_RETURN
-cert_crl_check(KMF_HANDLE_T handle,
- KMF_VALIDATECERT_PARAMS *params,
- KMF_DATA *user_cert,
- KMF_DATA *issuer_cert)
+cert_crl_check(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE *kstype,
+ KMF_DATA *user_cert, KMF_DATA *issuer_cert)
{
KMF_POLICY_RECORD *policy;
KMF_RETURN ret = KMF_OK;
- KMF_IMPORTCRL_PARAMS icrl_params;
- KMF_FINDCERTINCRL_PARAMS fcrl_params;
- KMF_OPENSSL_PARAMS ssl_params;
- KMF_VERIFYCRL_PARAMS vcrl_params;
+ KMF_ATTRIBUTE attrlist[16];
+ int numattr = 0;
+ boolean_t crlchk;
char user_certfile[MAXPATHLEN];
char crlfile_tmp[MAXPATHLEN];
- KMF_CHECKCRLDATE_PARAMS ccrldate_params;
char *basefilename = NULL;
char *dir = NULL;
char *crlfilename = NULL;
@@ -1054,17 +1367,14 @@ cert_crl_check(KMF_HANDLE_T handle,
char *uri = NULL;
KMF_ENCODE_FORMAT format;
- if (handle == NULL || params == NULL ||
- user_cert == NULL || issuer_cert == NULL)
+ if (handle == NULL || kstype == NULL || user_cert == NULL ||
+ issuer_cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- policy = handle->policy;
+ if (!VALID_KEYSTORE_TYPE(*kstype))
+ return (KMF_ERR_BAD_PARAMETER);
- (void) memset(&icrl_params, 0, sizeof (icrl_params));
- (void) memset(&vcrl_params, 0, sizeof (vcrl_params));
- (void) memset(&ccrldate_params, 0, sizeof (ccrldate_params));
- (void) memset(&fcrl_params, 0, sizeof (fcrl_params));
- (void) memset(&ssl_params, 0, sizeof (ssl_params));
+ policy = handle->policy;
/*
* If the get-crl-uri policy is TRUE, then download the CRL
@@ -1104,16 +1414,27 @@ cert_crl_check(KMF_HANDLE_T handle,
}
/* Cache the CRL file. */
- if (params->kstype == KMF_KEYSTORE_NSS) {
+ if (*kstype == KMF_KEYSTORE_NSS) {
/*
* For NSS keystore, import this CRL file into th
* internal database.
*/
- icrl_params.kstype = KMF_KEYSTORE_NSS;
- icrl_params.nssparms.slotlabel = NULL;
- icrl_params.nssparms.crlfile = crlfile_tmp;
- icrl_params.nssparms.crl_check = B_FALSE;
- ret = KMF_ImportCRL(handle, &icrl_params);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_KEYSTORE_TYPE_ATTR, kstype, sizeof (kstype));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_FILENAME_ATTR, crlfile_tmp,
+ strlen(crlfile_tmp));
+ numattr++;
+
+ crlchk = B_FALSE;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_CHECK_ATTR, &crlchk, sizeof (boolean_t));
+ numattr++;
+
+ ret = kmf_import_crl(handle, numattr, attrlist);
(void) unlink(crlfile_tmp);
if (ret != KMF_OK)
goto cleanup;
@@ -1145,7 +1466,7 @@ cert_crl_check(KMF_HANDLE_T handle,
* If the get_crl_uri policy is FALSE, for File-based CRL
* plugins, get the input CRL file from the policy.
*/
- if (params->kstype != KMF_KEYSTORE_NSS) {
+ if (*kstype != KMF_KEYSTORE_NSS) {
if (basefilename == NULL) {
ret = KMF_ERR_BAD_PARAMETER;
goto cleanup;
@@ -1168,11 +1489,9 @@ cert_crl_check(KMF_HANDLE_T handle,
* NSS CRL is not file based, and its signature
* has been verified during CRL import.
*/
- if (params->kstype != KMF_KEYSTORE_NSS) {
- vcrl_params.crl_name = crlfilename;
- vcrl_params.tacert = issuer_cert;
-
- ret = KMF_VerifyCRLFile(handle, &vcrl_params);
+ if (*kstype != KMF_KEYSTORE_NSS) {
+ ret = kmf_verify_crl_file(handle, crlfilename,
+ issuer_cert);
if (ret != KMF_OK) {
goto cleanup;
}
@@ -1186,10 +1505,8 @@ cert_crl_check(KMF_HANDLE_T handle,
/*
* This is for file-based CRL, but not for NSS CRL.
*/
- if (params->kstype != KMF_KEYSTORE_NSS) {
- ccrldate_params.crl_name = crlfilename;
-
- ret = KMF_CheckCRLDate(handle, &ccrldate_params);
+ if (*kstype != KMF_KEYSTORE_NSS) {
+ ret = kmf_check_crl_date(handle, crlfilename);
if (ret != KMF_OK) {
goto cleanup;
}
@@ -1199,12 +1516,20 @@ cert_crl_check(KMF_HANDLE_T handle,
/*
* Check the CRL revocation for the certificate.
*/
- fcrl_params.kstype = params->kstype;
- switch (params->kstype) {
+ numattr = 0;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ kstype, sizeof (kstype));
+ numattr++;
+
+ switch (*kstype) {
case KMF_KEYSTORE_NSS:
- fcrl_params.nssparms.certificate = params->certificate;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_DATA_ATTR, user_cert, sizeof (KMF_DATA));
+ numattr++;
break;
case KMF_KEYSTORE_PK11TOKEN:
+ case KMF_KEYSTORE_OPENSSL:
/*
* Create temporary file to hold the user certificate.
*/
@@ -1215,27 +1540,28 @@ cert_crl_check(KMF_HANDLE_T handle,
goto cleanup;
}
- ret = KMF_CreateCertFile(user_cert, KMF_FORMAT_ASN1,
+ ret = kmf_create_cert_file(user_cert, KMF_FORMAT_ASN1,
user_certfile);
if (ret != KMF_OK) {
goto cleanup;
}
- ssl_params.certfile = user_certfile;
- ssl_params.crlfile = crlfilename;
- fcrl_params.sslparms = ssl_params;
- break;
- case KMF_KEYSTORE_OPENSSL:
- ssl_params.certfile = params->ks_opt_u.openssl_opts.certfile;
- ssl_params.crlfile = crlfilename;
- fcrl_params.sslparms = ssl_params;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CERT_FILENAME_ATTR,
+ user_certfile, strlen(user_certfile));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_CRL_FILENAME_ATTR,
+ crlfilename, strlen(crlfilename));
+ numattr++;
break;
default:
ret = KMF_ERR_PLUGIN_NOTFOUND;
goto cleanup;
}
- ret = KMF_FindCertInCRL(handle, &fcrl_params);
+ ret = kmf_find_cert_in_crl(handle, numattr, attrlist);
if (ret == KMF_ERR_NOT_REVOKED) {
ret = KMF_OK;
}
@@ -1253,24 +1579,24 @@ cleanup:
}
static KMF_RETURN
-cert_ocsp_check(KMF_HANDLE_T handle,
- KMF_VALIDATECERT_PARAMS *params,
- KMF_DATA *user_cert,
- KMF_DATA *issuer_cert,
- KMF_DATA *response)
+cert_ocsp_check(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE *kstype,
+ KMF_DATA *user_cert, KMF_DATA *issuer_cert, KMF_DATA *response,
+ char *slotlabel, char *dirpath)
{
KMF_RETURN ret = KMF_OK;
KMF_POLICY_RECORD *policy;
- KMF_FINDCERT_PARAMS fc_target;
- KMF_OCSPRESPONSE_PARAMS_INPUT resp_params_in;
- KMF_OCSPRESPONSE_PARAMS_OUTPUT resp_params_out;
KMF_DATA *new_response = NULL;
boolean_t ignore_response_sign = B_FALSE;
- uint32_t ltime;
+ uint32_t ltime = 0;
KMF_DATA *signer_cert = NULL;
KMF_BIGINT sernum = { NULL, 0 };
+ int response_status;
+ int reason;
+ int cert_status;
+ KMF_ATTRIBUTE attrlist[32];
+ int numattr;
- if (handle == NULL || params == NULL || user_cert == NULL ||
+ if (handle == NULL || kstype == NULL || user_cert == NULL ||
issuer_cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -1296,11 +1622,13 @@ cert_ocsp_check(KMF_HANDLE_T handle,
if (ignore_response_sign == B_FALSE &&
policy->VAL_OCSP.has_resp_cert == B_TRUE) {
char *signer_name;
- KMF_OPENSSL_PARAMS ssl_params;
KMF_X509_DER_CERT signer_retrcert;
uchar_t *bytes = NULL;
size_t bytelen;
uint32_t num = 0;
+ KMF_ATTRIBUTE fc_attrlist[16];
+ int fc_numattr = 0;
+ char *dir = "./";
if (policy->VAL_OCSP_RESP_CERT.name == NULL ||
policy->VAL_OCSP_RESP_CERT.serial == NULL)
@@ -1314,49 +1642,55 @@ cert_ocsp_check(KMF_HANDLE_T handle,
(void) memset(signer_cert, 0, sizeof (KMF_DATA));
signer_name = policy->VAL_OCSP_RESP_CERT.name;
- ret = KMF_HexString2Bytes(
+ ret = kmf_hexstr_to_bytes(
(uchar_t *)policy->VAL_OCSP_RESP_CERT.serial,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
ret = KMF_ERR_OCSP_POLICY;
goto out;
}
-
sernum.val = bytes;
sernum.len = bytelen;
- (void) memset(&fc_target, 0, sizeof (fc_target));
- (void) memset(&ssl_params, 0, sizeof (ssl_params));
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_KEYSTORE_TYPE_ATTR, kstype,
+ sizeof (KMF_KEYSTORE_TYPE));
+ fc_numattr++;
- fc_target.subject = signer_name;
- fc_target.serial = &sernum;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_SUBJECT_NAME_ATTR, signer_name, strlen(signer_name));
+ fc_numattr++;
- switch (params->kstype) {
- case KMF_KEYSTORE_NSS:
- fc_target.kstype = KMF_KEYSTORE_NSS;
- params->nssparms.slotlabel =
- params->nssparms.slotlabel;
- break;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_BIGINT_ATTR,
+ &sernum, sizeof (KMF_BIGINT));
+ fc_numattr++;
- case KMF_KEYSTORE_OPENSSL:
- fc_target.kstype = KMF_KEYSTORE_OPENSSL;
- ssl_params.dirpath =
- params->sslparms.dirpath == NULL ?
- "./" : params->sslparms.dirpath;
- fc_target.sslparms = ssl_params;
- break;
+ if (*kstype == KMF_KEYSTORE_NSS && slotlabel != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_TOKEN_LABEL_ATTR, slotlabel,
+ strlen(slotlabel));
+ fc_numattr++;
+ }
- case KMF_KEYSTORE_PK11TOKEN:
- fc_target.kstype = KMF_KEYSTORE_PK11TOKEN;
- break;
- default:
- ret = KMF_ERR_BAD_PARAMETER;
- goto out;
- break;
+ if (*kstype == KMF_KEYSTORE_OPENSSL) {
+ if (dirpath == NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ fc_numattr++;
+ } else {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dirpath,
+ strlen(dirpath));
+ fc_numattr++;
+ }
}
num = 0;
- ret = KMF_FindCert(handle, &fc_target, NULL, &num);
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_COUNT_ATTR, &num, sizeof (uint32_t));
+ fc_numattr++;
+
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
if (ret != KMF_OK || num != 1) {
if (num == 0)
ret = KMF_ERR_CERT_NOT_FOUND;
@@ -1366,7 +1700,12 @@ cert_ocsp_check(KMF_HANDLE_T handle,
}
(void) memset(&signer_retrcert, 0, sizeof (KMF_X509_DER_CERT));
- ret = KMF_FindCert(handle, &fc_target, &signer_retrcert, &num);
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_X509_DER_CERT_ATTR, &signer_retrcert,
+ sizeof (KMF_X509_DER_CERT));
+ fc_numattr++;
+
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
if (ret == KMF_OK) {
signer_cert->Length =
signer_retrcert.certificate.Length;
@@ -1390,7 +1729,7 @@ cert_ocsp_check(KMF_HANDLE_T handle,
new_response->Data = NULL;
new_response->Length = 0;
- ret = KMF_GetOCSPForCert(handle, user_cert, issuer_cert,
+ ret = kmf_get_ocsp_for_cert(handle, user_cert, issuer_cert,
new_response);
if (ret != KMF_OK)
goto out;
@@ -1399,18 +1738,49 @@ cert_ocsp_check(KMF_HANDLE_T handle,
/*
* Process the OCSP response and retrieve the certificate status.
*/
- resp_params_in.issuer_cert = issuer_cert;
- resp_params_in.user_cert = user_cert;
- resp_params_in.signer_cert = signer_cert;
- resp_params_in.response =
- response == NULL ? new_response : response;
- resp_params_in.response_lifetime = ltime;
- resp_params_in.ignore_response_sign = ignore_response_sign;
-
- ret = KMF_GetOCSPStatusForCert(handle, &resp_params_in,
- &resp_params_out);
+ numattr = 0;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ISSUER_CERT_DATA_ATTR,
+ issuer_cert, sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_USER_CERT_DATA_ATTR,
+ user_cert, sizeof (KMF_DATA));
+ numattr++;
+
+ if (signer_cert != NULL) {
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_SIGNER_CERT_DATA_ATTR, user_cert, sizeof (KMF_DATA));
+ numattr++;
+ }
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_OCSP_RESPONSE_DATA_ATTR,
+ response == NULL ? new_response : response, sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_RESPONSE_LIFETIME_ATTR,
+ &ltime, sizeof (uint32_t));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_IGNORE_RESPONSE_SIGN_ATTR, &ignore_response_sign,
+ sizeof (boolean_t));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OCSP_RESPONSE_STATUS_ATTR, &response_status, sizeof (int));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OCSP_RESPONSE_REASON_ATTR, &reason, sizeof (int));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OCSP_RESPONSE_CERT_STATUS_ATTR, &cert_status, sizeof (int));
+ numattr++;
+
+ ret = kmf_get_ocsp_status_for_cert(handle, numattr, attrlist);
if (ret == KMF_OK) {
- switch (resp_params_out.cert_status) {
+ switch (cert_status) {
case OCSP_GOOD:
break;
case OCSP_UNKNOWN:
@@ -1424,12 +1794,12 @@ cert_ocsp_check(KMF_HANDLE_T handle,
out:
if (new_response) {
- KMF_FreeData(new_response);
+ kmf_free_data(new_response);
free(new_response);
}
if (signer_cert) {
- KMF_FreeData(signer_cert);
+ kmf_free_data(signer_cert);
free(signer_cert);
}
@@ -1453,7 +1823,7 @@ cert_ku_check(KMF_HANDLE_T handle, KMF_DATA *cert)
policy = handle->policy;
(void) memset(&keyusage, 0, sizeof (keyusage));
- ret = KMF_GetCertKeyUsageExt(cert, &keyusage);
+ ret = kmf_get_cert_ku(cert, &keyusage);
if (ret == KMF_ERR_EXTENSION_NOT_FOUND) {
if (policy->ku_bits) {
@@ -1476,8 +1846,8 @@ cert_ku_check(KMF_HANDLE_T handle, KMF_DATA *cert)
*/
if ((keyusage.KeyUsageBits & KMF_keyCertSign)) {
(void) memset(&constraint, 0, sizeof (constraint));
- ret = KMF_GetCertBasicConstraintExt(cert,
- &critical, &constraint);
+ ret = kmf_get_cert_basic_constraint(cert,
+ &critical, &constraint);
if (ret != KMF_OK) {
/* real error */
@@ -1519,7 +1889,7 @@ cert_eku_check(KMF_HANDLE_T handle, KMF_DATA *cert)
if (policy->eku_set.eku_count == 0)
return (KMF_OK);
- ret = KMF_GetCertEKU(cert, &eku);
+ ret = kmf_get_cert_eku(cert, &eku);
if ((ret != KMF_ERR_EXTENSION_NOT_FOUND) && (ret != KMF_OK)) {
/* real error */
return (ret);
@@ -1596,58 +1966,61 @@ cert_eku_check(KMF_HANDLE_T handle, KMF_DATA *cert)
}
static KMF_RETURN
-kmf_find_issuer_cert(KMF_HANDLE_T handle,
- KMF_VALIDATECERT_PARAMS *params,
- char *user_issuer,
- KMF_DATA *issuer_cert)
+find_issuer_cert(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE *kstype,
+ char *user_issuer, KMF_DATA *issuer_cert,
+ char *slotlabel, char *dirpath)
{
-
KMF_RETURN ret = KMF_OK;
- KMF_FINDCERT_PARAMS fc_target;
- KMF_OPENSSL_PARAMS ssl_params;
KMF_X509_DER_CERT *certlist = NULL;
uint32_t i, num = 0;
time_t t_notbefore;
time_t t_notafter;
time_t latest;
KMF_DATA tmp_cert = {0, NULL};
+ KMF_ATTRIBUTE fc_attrlist[16];
+ int fc_numattr = 0;
+ char *dir = "./";
- if (handle == NULL || params == NULL ||
- user_issuer == NULL || issuer_cert == NULL)
+ if (handle == NULL || kstype == NULL || user_issuer == NULL ||
+ issuer_cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- (void) memset(&fc_target, 0, sizeof (fc_target));
- (void) memset(&ssl_params, 0, sizeof (ssl_params));
+ if (!VALID_KEYSTORE_TYPE(*kstype))
+ return (KMF_ERR_BAD_PARAMETER);
- fc_target.subject = user_issuer;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_KEYSTORE_TYPE_ATTR,
+ kstype, sizeof (KMF_KEYSTORE_TYPE));
+ fc_numattr++;
- switch (params->kstype) {
- case KMF_KEYSTORE_NSS:
- fc_target.kstype = KMF_KEYSTORE_NSS;
- fc_target.nssparms.slotlabel = params->nssparms.slotlabel;
- break;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_SUBJECT_NAME_ATTR,
+ user_issuer, strlen(user_issuer));
+ fc_numattr++;
- case KMF_KEYSTORE_OPENSSL:
- fc_target.kstype = KMF_KEYSTORE_OPENSSL;
- /* setup dirpath to search for TA in a directory */
- if (params->sslparms.dirpath == NULL) {
- ssl_params.dirpath = "./";
+ if (*kstype == KMF_KEYSTORE_NSS && slotlabel != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_TOKEN_LABEL_ATTR, slotlabel, strlen(slotlabel));
+ fc_numattr++;
+ }
+
+ if (*kstype == KMF_KEYSTORE_OPENSSL) {
+ if (dirpath == NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ fc_numattr++;
} else {
- ssl_params.dirpath = params->sslparms.dirpath;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dirpath, strlen(dirpath));
+ fc_numattr++;
}
- ssl_params.certfile = NULL;
- fc_target.sslparms = ssl_params;
- break;
-
- case KMF_KEYSTORE_PK11TOKEN:
- fc_target.kstype = KMF_KEYSTORE_PK11TOKEN;
- break;
- default:
- return (KMF_ERR_PLUGIN_NOTFOUND);
}
num = 0;
- ret = KMF_FindCert(handle, &fc_target, NULL, &num);
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_COUNT_ATTR, &num, sizeof (uint32_t));
+ fc_numattr++;
+
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
+
if (ret == KMF_OK && num > 0) {
certlist = (KMF_X509_DER_CERT *)malloc(num *
sizeof (KMF_X509_DER_CERT));
@@ -1657,10 +2030,12 @@ kmf_find_issuer_cert(KMF_HANDLE_T handle,
goto out;
}
- (void) memset(certlist, 0, num *
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_X509_DER_CERT_ATTR, certlist,
sizeof (KMF_X509_DER_CERT));
+ fc_numattr++;
- ret = KMF_FindCert(handle, &fc_target, certlist, &num);
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
if (ret != KMF_OK) {
free(certlist);
certlist = NULL;
@@ -1681,7 +2056,7 @@ kmf_find_issuer_cert(KMF_HANDLE_T handle,
*/
latest = 0;
for (i = 0; i < num; i++) {
- ret = KMF_GetCertValidity(&certlist[i].certificate,
+ ret = kmf_get_cert_validity(&certlist[i].certificate,
&t_notbefore, &t_notafter);
if (ret != KMF_OK) {
ret = KMF_ERR_VALIDITY_PERIOD;
@@ -1711,7 +2086,7 @@ kmf_find_issuer_cert(KMF_HANDLE_T handle,
out:
if (certlist != NULL) {
for (i = 0; i < num; i++)
- KMF_FreeKMFCert(handle, &certlist[i]);
+ kmf_free_kmf_cert(handle, &certlist[i]);
free(certlist);
}
@@ -1720,16 +2095,12 @@ out:
}
static KMF_RETURN
-kmf_find_ta_cert(KMF_HANDLE_T handle,
- KMF_VALIDATECERT_PARAMS *params,
- KMF_DATA *ta_cert,
- KMF_X509_NAME *user_issuerDN)
+find_ta_cert(KMF_HANDLE_T handle, KMF_KEYSTORE_TYPE *kstype,
+ KMF_DATA *ta_cert, KMF_X509_NAME *user_issuerDN,
+ char *slotlabel, char *dirpath)
{
-
KMF_POLICY_RECORD *policy;
KMF_RETURN ret = KMF_OK;
- KMF_FINDCERT_PARAMS fc_target;
- KMF_OPENSSL_PARAMS ssl_params;
uint32_t num = 0;
char *ta_name;
KMF_BIGINT serial = { NULL, 0 };
@@ -1738,57 +2109,66 @@ kmf_find_ta_cert(KMF_HANDLE_T handle,
KMF_X509_DER_CERT ta_retrCert;
char *ta_subject = NULL;
KMF_X509_NAME ta_subjectDN;
+ KMF_ATTRIBUTE fc_attrlist[16];
+ int fc_numattr = 0;
+ char *dir = "./";
+
+ if (handle == NULL || kstype == NULL || ta_cert == NULL ||
+ user_issuerDN == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- if (handle == NULL || params == NULL ||
- ta_cert == NULL || user_issuerDN == NULL)
+ if (!VALID_KEYSTORE_TYPE(*kstype))
return (KMF_ERR_BAD_PARAMETER);
+ /* Get the TA name and serial number from the policy */
policy = handle->policy;
ta_name = policy->ta_name;
-
- ret = KMF_HexString2Bytes((uchar_t *)policy->ta_serial,
+ ret = kmf_hexstr_to_bytes((uchar_t *)policy->ta_serial,
&bytes, &bytelen);
if (ret != KMF_OK || bytes == NULL) {
ret = KMF_ERR_TA_POLICY;
goto out;
}
-
- (void) memset(&fc_target, 0, sizeof (fc_target));
- (void) memset(&ssl_params, 0, sizeof (ssl_params));
-
serial.val = bytes;
serial.len = bytelen;
- fc_target.serial = &serial;
- fc_target.subject = ta_name;
- switch (params->kstype) {
- case KMF_KEYSTORE_NSS:
- fc_target.kstype = KMF_KEYSTORE_NSS;
- fc_target.nssparms.slotlabel = params->nssparms.slotlabel;
- break;
+ /* set up fc_attrlist for kmf_find_cert */
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_KEYSTORE_TYPE_ATTR,
+ kstype, sizeof (KMF_KEYSTORE_TYPE));
+ fc_numattr++;
- case KMF_KEYSTORE_OPENSSL:
- fc_target.kstype = KMF_KEYSTORE_OPENSSL;
- /* setup dirpath to search for TA in a directory */
- if (params->sslparms.dirpath == NULL) {
- ssl_params.dirpath = "./";
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_SUBJECT_NAME_ATTR,
+ ta_name, strlen(ta_name));
+ fc_numattr++;
+
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr, KMF_BIGINT_ATTR,
+ &serial, sizeof (KMF_BIGINT));
+ fc_numattr++;
+
+ if (*kstype == KMF_KEYSTORE_NSS && slotlabel != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_TOKEN_LABEL_ATTR, slotlabel, strlen(slotlabel));
+ fc_numattr++;
+ }
+
+ if (*kstype == KMF_KEYSTORE_OPENSSL) {
+ if (dirpath == NULL) {
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dir, strlen(dir));
+ fc_numattr++;
} else {
- ssl_params.dirpath = params->sslparms.dirpath;
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_DIRPATH_ATTR, dirpath, strlen(dirpath));
+ fc_numattr++;
}
- ssl_params.certfile = NULL;
- fc_target.sslparms = ssl_params;
- break;
-
- case KMF_KEYSTORE_PK11TOKEN:
- fc_target.kstype = KMF_KEYSTORE_PK11TOKEN;
- break;
- default:
- ret = KMF_ERR_PLUGIN_NOTFOUND;
- goto out;
}
num = 0;
- ret = KMF_FindCert(handle, &fc_target, NULL, &num);
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_COUNT_ATTR, &num, sizeof (uint32_t));
+ fc_numattr++;
+
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
if (ret != KMF_OK || num != 1) {
if (num == 0)
ret = KMF_ERR_CERT_NOT_FOUND;
@@ -1797,9 +2177,11 @@ kmf_find_ta_cert(KMF_HANDLE_T handle,
goto out;
}
- (void) memset(&ta_retrCert, 0, sizeof (KMF_X509_DER_CERT));
+ kmf_set_attr_at_index(fc_attrlist, fc_numattr,
+ KMF_X509_DER_CERT_ATTR, &ta_retrCert, sizeof (KMF_X509_DER_CERT));
+ fc_numattr++;
- ret = KMF_FindCert(handle, &fc_target, &ta_retrCert, &num);
+ ret = kmf_find_cert(handle, fc_numattr, fc_attrlist);
if (ret == KMF_OK) {
ta_cert->Length = ta_retrCert.certificate.Length;
ta_cert->Data = malloc(ta_retrCert.certificate.Length);
@@ -1819,25 +2201,25 @@ kmf_find_ta_cert(KMF_HANDLE_T handle,
*/
(void) memset(&ta_subjectDN, 0, sizeof (ta_subjectDN));
- ret = KMF_GetCertSubjectNameString(handle, ta_cert, &ta_subject);
+ ret = kmf_get_cert_subject_str(handle, ta_cert, &ta_subject);
if (ret != KMF_OK)
goto out;
- ret = KMF_DNParser(ta_subject, &ta_subjectDN);
+ ret = kmf_dn_parser(ta_subject, &ta_subjectDN);
if (ret != KMF_OK)
goto out;
- if (KMF_CompareRDNs(user_issuerDN, &ta_subjectDN) != 0)
+ if (kmf_compare_rdns(user_issuerDN, &ta_subjectDN) != 0)
ret = KMF_ERR_CERT_NOT_FOUND;
- KMF_FreeDN(&ta_subjectDN);
+ kmf_free_dn(&ta_subjectDN);
/* Make sure the TA cert has the correct extensions */
if (ret == KMF_OK)
ret = check_key_usage(handle, ta_cert, KMF_KU_SIGN_CERT);
out:
if (ta_retrCert.certificate.Data)
- KMF_FreeKMFCert(handle, &ta_retrCert);
+ kmf_free_kmf_cert(handle, &ta_retrCert);
if ((ret != KMF_OK) && (ta_cert->Data != NULL))
free(ta_cert->Data);
@@ -1852,12 +2234,15 @@ out:
}
KMF_RETURN
-KMF_ValidateCert(KMF_HANDLE_T handle,
- KMF_VALIDATECERT_PARAMS *params,
- int *result)
+kmf_validate_cert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
+ KMF_KEYSTORE_TYPE *kstype = NULL;
KMF_DATA *pcert = NULL;
+ int *result = NULL;
+ char *slotlabel = NULL;
+ char *dirpath = NULL;
+ KMF_DATA *ocsp_response = NULL;
KMF_DATA ta_cert = {0, NULL};
KMF_DATA issuer_cert = {0, NULL};
char *user_issuer = NULL, *user_subject = NULL;
@@ -1865,27 +2250,51 @@ KMF_ValidateCert(KMF_HANDLE_T handle,
boolean_t self_signed = B_FALSE;
KMF_POLICY_RECORD *policy;
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA), sizeof (KMF_DATA)},
+ {KMF_VALIDATE_RESULT_ATTR, FALSE, 1, sizeof (int)}
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (params == NULL || params->certificate == NULL || result == NULL)
+ policy = handle->policy;
+
+ /* Get the attribute values */
+ kstype = kmf_get_attr_ptr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr);
+ pcert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ result = kmf_get_attr_ptr(KMF_VALIDATE_RESULT_ATTR, attrlist, numattr);
+ if (kstype == NULL || pcert == NULL || result == NULL)
return (KMF_ERR_BAD_PARAMETER);
- policy = handle->policy;
+ slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, numattr);
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ ocsp_response = kmf_get_attr_ptr(KMF_OCSP_RESPONSE_DATA_ATTR, attrlist,
+ numattr);
+
+ /* Initialize the returned result */
*result = KMF_CERT_VALIDATE_OK;
- pcert = params->certificate;
/*
* Get the issuer information from the input certficate first.
*/
- if ((ret = KMF_GetCertIssuerNameString(handle, pcert,
+ if ((ret = kmf_get_cert_issuer_str(handle, pcert,
&user_issuer)) != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_USER;
goto out;
}
- if ((ret = KMF_DNParser(user_issuer, &user_issuerDN)) != KMF_OK) {
+ if ((ret = kmf_dn_parser(user_issuer, &user_issuerDN)) != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_USER;
goto out;
}
@@ -1893,27 +2302,27 @@ KMF_ValidateCert(KMF_HANDLE_T handle,
/*
* Check if the certificate is a self-signed cert.
*/
- if ((ret = KMF_GetCertSubjectNameString(handle, pcert,
+ if ((ret = kmf_get_cert_subject_str(handle, pcert,
&user_subject)) != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_USER;
- KMF_FreeDN(&user_issuerDN);
+ kmf_free_dn(&user_issuerDN);
goto out;
}
- if ((ret = KMF_DNParser(user_subject, &user_subjectDN)) != KMF_OK) {
+ if ((ret = kmf_dn_parser(user_subject, &user_subjectDN)) != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_USER;
- KMF_FreeDN(&user_issuerDN);
+ kmf_free_dn(&user_issuerDN);
goto out;
}
- if ((KMF_CompareRDNs(&user_issuerDN, &user_subjectDN)) == 0) {
+ if ((kmf_compare_rdns(&user_issuerDN, &user_subjectDN)) == 0) {
/*
* this is a self-signed cert
*/
self_signed = B_TRUE;
}
- KMF_FreeDN(&user_subjectDN);
+ kmf_free_dn(&user_subjectDN);
/*
* Check KeyUsage extension of the subscriber's certificate
@@ -1943,7 +2352,7 @@ KMF_ValidateCert(KMF_HANDLE_T handle,
/*
* Validate expiration date
*/
- ret = KMF_CheckCertDate(handle, pcert);
+ ret = kmf_check_cert_date(handle, pcert);
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_TIME;
goto out;
@@ -1969,16 +2378,20 @@ KMF_ValidateCert(KMF_HANDLE_T handle,
* TA certificate.
*/
if (self_signed) {
- ret = KMF_VerifyCertWithCert(handle, pcert, pcert);
+ ret = verify_cert_with_cert(handle, pcert, pcert);
} else {
- ret = kmf_find_ta_cert(handle, params, &ta_cert,
- &user_issuerDN);
+ ret = find_ta_cert(handle, kstype, &ta_cert,
+ &user_issuerDN, slotlabel, dirpath);
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_TA;
goto out;
}
- ret = KMF_VerifyCertWithCert(handle, pcert, &ta_cert);
+ ret = check_key_usage(handle, &ta_cert, KMF_KU_SIGN_CERT);
+ if (ret != KMF_OK)
+ goto out;
+
+ ret = verify_cert_with_cert(handle, pcert, &ta_cert);
}
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_SIGNATURE;
@@ -2006,16 +2419,15 @@ check_revocation:
goto out;
}
- ret = kmf_find_issuer_cert(handle, params, user_issuer,
- &issuer_cert);
+ ret = find_issuer_cert(handle, kstype, user_issuer, &issuer_cert,
+ slotlabel, dirpath);
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_ISSUER;
goto out;
}
if (policy->revocation & KMF_REVOCATION_METHOD_CRL) {
- ret = cert_crl_check(handle, params,
- pcert, &issuer_cert);
+ ret = cert_crl_check(handle, kstype, pcert, &issuer_cert);
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_CRL;
goto out;
@@ -2023,16 +2435,17 @@ check_revocation:
}
if (policy->revocation & KMF_REVOCATION_METHOD_OCSP) {
- ret = cert_ocsp_check(handle, params,
- pcert, &issuer_cert, params->ocsp_response);
+ ret = cert_ocsp_check(handle, kstype, pcert, &issuer_cert,
+ ocsp_response, slotlabel, dirpath);
if (ret != KMF_OK) {
*result |= KMF_CERT_VALIDATE_ERR_OCSP;
goto out;
}
}
+
out:
if (user_issuer) {
- KMF_FreeDN(&user_issuerDN);
+ kmf_free_dn(&user_issuerDN);
free(user_issuer);
}
@@ -2050,7 +2463,7 @@ out:
}
KMF_RETURN
-KMF_CreateCertFile(KMF_DATA *certdata, KMF_ENCODE_FORMAT format,
+kmf_create_cert_file(const KMF_DATA *certdata, KMF_ENCODE_FORMAT format,
char *certfile)
{
KMF_RETURN rv = KMF_OK;
@@ -2065,27 +2478,27 @@ KMF_CreateCertFile(KMF_DATA *certdata, KMF_ENCODE_FORMAT format,
if (format == KMF_FORMAT_PEM) {
int len;
- rv = KMF_Der2Pem(KMF_CERT,
- certdata->Data, certdata->Length,
- &pemdata.Data, &len);
+ rv = kmf_der_to_pem(KMF_CERT,
+ certdata->Data, certdata->Length,
+ &pemdata.Data, &len);
if (rv != KMF_OK)
goto cleanup;
pemdata.Length = (size_t)len;
}
- if ((fd = open(certfile, O_CREAT |O_RDWR, 0644)) == -1) {
+ if ((fd = open(certfile, O_CREAT | O_RDWR | O_TRUNC, 0644)) == -1) {
rv = KMF_ERR_OPEN_FILE;
goto cleanup;
}
if (format == KMF_FORMAT_PEM) {
if (write(fd, pemdata.Data, pemdata.Length) !=
- pemdata.Length) {
+ pemdata.Length) {
rv = KMF_ERR_WRITE_FILE;
}
} else {
if (write(fd, certdata->Data, certdata->Length) !=
- certdata->Length) {
+ certdata->Length) {
rv = KMF_ERR_WRITE_FILE;
}
}
@@ -2094,13 +2507,14 @@ cleanup:
if (fd != -1)
(void) close(fd);
- KMF_FreeData(&pemdata);
+ kmf_free_data(&pemdata);
return (rv);
}
KMF_RETURN
-KMF_IsCertFile(KMF_HANDLE_T handle, char *filename, KMF_ENCODE_FORMAT *pformat)
+kmf_is_cert_file(KMF_HANDLE_T handle, char *filename,
+ KMF_ENCODE_FORMAT *pformat)
{
KMF_PLUGIN *plugin;
KMF_RETURN (*IsCertFileFn)(void *, char *, KMF_ENCODE_FORMAT *);
@@ -2137,7 +2551,7 @@ KMF_IsCertFile(KMF_HANDLE_T handle, char *filename, KMF_ENCODE_FORMAT *pformat)
* This function checks the validity period of a der-encoded certificate.
*/
KMF_RETURN
-KMF_CheckCertDate(KMF_HANDLE_T handle, KMF_DATA *cert)
+kmf_check_cert_date(KMF_HANDLE_T handle, const KMF_DATA *cert)
{
KMF_RETURN rv;
struct tm *gmt;
@@ -2151,12 +2565,11 @@ KMF_CheckCertDate(KMF_HANDLE_T handle, KMF_DATA *cert)
if (rv != KMF_OK)
return (rv);
- if (cert == NULL || cert->Data == NULL ||
- cert->Length == 0)
+ if (cert == NULL || cert->Data == NULL || cert->Length == 0)
return (KMF_ERR_BAD_PARAMETER);
policy = handle->policy;
- rv = KMF_GetCertValidity(cert, &t_notbefore, &t_notafter);
+ rv = kmf_get_cert_validity(cert, &t_notbefore, &t_notafter);
if (rv != KMF_OK)
return (rv);
@@ -2191,187 +2604,96 @@ KMF_CheckCertDate(KMF_HANDLE_T handle, KMF_DATA *cert)
}
KMF_RETURN
-KMF_ExportPK12(KMF_HANDLE_T handle,
- KMF_EXPORTP12_PARAMS *params,
- char *filename)
+kmf_export_pk12(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN rv;
KMF_PLUGIN *plugin;
+ KMF_RETURN ret = KMF_OK;
KMF_KEYSTORE_TYPE kstype;
- KMF_X509_DER_CERT *certlist = NULL;
- KMF_KEY_HANDLE *keys = NULL;
- uint32_t numkeys;
- uint32_t numcerts;
- int i;
- CLEAR_ERROR(handle, rv);
- if (rv != KMF_OK)
- return (rv);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_OUTPUT_FILENAME_ATTR, TRUE, 1, 0},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- if (params == NULL || filename == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- kstype = params->kstype;
- if (kstype == KMF_KEYSTORE_PK11TOKEN) {
- KMF_FINDCERT_PARAMS fcargs;
- (void) memset(&fcargs, 0, sizeof (fcargs));
+ CLEAR_ERROR(handle, ret);
- fcargs.kstype = kstype;
- fcargs.certLabel = params->certLabel;
- fcargs.issuer = params->issuer;
- fcargs.subject = params->subject;
- fcargs.serial = params->serial;
- fcargs.idstr = params->idstr;
+ ret = test_attributes(num_req_attrs, required_attrs, 0, NULL,
+ numattr, attrlist);
+ if (ret != KMF_OK)
+ return (ret);
- /*
- * Special processing because PKCS11 doesn't have
- * a native PKCS12 operation.
- */
- rv = KMF_FindCert(handle, &fcargs, NULL, &numcerts);
- if (rv == KMF_OK && numcerts > 0) {
- certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
- sizeof (KMF_X509_DER_CERT));
- if (certlist == NULL)
- return (KMF_ERR_MEMORY);
- (void) memset(certlist, 0, numcerts *
- sizeof (KMF_X509_DER_CERT));
- rv = KMF_FindCert(handle, &fcargs,
- certlist, &numcerts);
- if (rv != KMF_OK) {
- free(certlist);
- return (rv);
- }
- } else {
- return (rv);
- }
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
- numkeys = 0;
- for (i = 0; i < numcerts; i++) {
- KMF_CRYPTOWITHCERT_PARAMS fkparms;
- KMF_KEY_HANDLE newkey;
-
- fkparms.kstype = kstype;
- fkparms.format = KMF_FORMAT_RAWKEY;
- fkparms.cred = params->cred;
- fkparms.certLabel = certlist[i].kmf_private.label;
-
- rv = find_private_key_by_cert(handle, &fkparms,
- &certlist[i].certificate, &newkey);
- if (rv == KMF_OK) {
- numkeys++;
- keys = realloc(keys,
- numkeys * sizeof (KMF_KEY_HANDLE));
- if (keys == NULL) {
- free(certlist);
- rv = KMF_ERR_MEMORY;
- goto out;
- }
- keys[numkeys - 1] = newkey;
- } else if (rv == KMF_ERR_KEY_NOT_FOUND) {
- /* it is OK if a key is not found */
- rv = KMF_OK;
- }
- }
- if (rv == KMF_OK) {
- /*
- * Switch the keystore type to use OpenSSL for
- * exporting the raw cert and key data as PKCS12.
- */
- kstype = KMF_KEYSTORE_OPENSSL;
- } else {
- rv = KMF_ERR_KEY_NOT_FOUND;
- goto out;
- }
- }
plugin = FindPlugin(handle, kstype);
- if (plugin != NULL && plugin->funclist->ExportP12 != NULL) {
- rv = plugin->funclist->ExportP12(handle,
- params, numcerts, certlist,
- numkeys, keys, filename);
- } else {
- rv = KMF_ERR_PLUGIN_NOTFOUND;
- }
-
-out:
- if (certlist != NULL) {
- for (i = 0; i < numcerts; i++)
- KMF_FreeKMFCert(handle, &certlist[i]);
- free(certlist);
- }
- if (keys != NULL) {
- for (i = 0; i < numkeys; i++)
- KMF_FreeKMFKey(handle, &keys[i]);
- free(keys);
- }
+ if (plugin == NULL || plugin->funclist->ExportPK12 == NULL)
+ return (KMF_ERR_PLUGIN_NOTFOUND);
- return (rv);
+ return (plugin->funclist->ExportPK12(handle, numattr, attrlist));
}
+
KMF_RETURN
-KMF_ImportPK12(KMF_HANDLE_T handle, char *filename,
- KMF_CREDENTIAL *cred,
- KMF_DATA **certs, int *ncerts,
- KMF_RAW_KEY_DATA **rawkeys, int *nkeys)
+kmf_build_pk12(KMF_HANDLE_T handle, int numcerts,
+ KMF_X509_DER_CERT *certlist, int numkeys, KMF_KEY_HANDLE *keylist,
+ KMF_CREDENTIAL *p12cred, char *filename)
{
KMF_RETURN rv;
KMF_PLUGIN *plugin;
- KMF_RETURN (*openpkcs12)(KMF_HANDLE *,
- char *, KMF_CREDENTIAL *,
- KMF_DATA **, int *,
- KMF_RAW_KEY_DATA **, int *);
+ KMF_RETURN (*buildpk12)(KMF_HANDLE *, int, KMF_X509_DER_CERT *,
+ int, KMF_KEY_HANDLE *, KMF_CREDENTIAL *, char *);
CLEAR_ERROR(handle, rv);
if (rv != KMF_OK)
return (rv);
- if (filename == NULL ||
- cred == NULL ||
- certs == NULL || ncerts == NULL ||
- rawkeys == NULL || nkeys == NULL)
+ if (filename == NULL || p12cred == NULL ||
+ (certlist == NULL && keylist == NULL))
return (KMF_ERR_BAD_PARAMETER);
- /*
- * Use the pkcs12 reader from the OpenSSL plugin.
- */
plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
if (plugin == NULL || plugin->dldesc == NULL) {
return (KMF_ERR_PLUGIN_NOTFOUND);
}
- openpkcs12 = (KMF_RETURN(*)())dlsym(plugin->dldesc,
- "openssl_read_pkcs12");
- if (openpkcs12 == NULL) {
+ buildpk12 = (KMF_RETURN(*)())dlsym(plugin->dldesc,
+ "openssl_build_pk12");
+ if (buildpk12 == NULL) {
return (KMF_ERR_FUNCTION_NOT_FOUND);
}
- /* Use OpenSSL interfaces to get raw key and cert data */
- rv = openpkcs12(handle, filename, cred, certs, ncerts,
- rawkeys, nkeys);
+ rv = buildpk12(handle, numcerts, certlist, numkeys, keylist, p12cred,
+ filename);
return (rv);
}
+
KMF_RETURN
-KMF_ImportKeypair(KMF_HANDLE_T handle, char *filename,
+kmf_import_objects(KMF_HANDLE_T handle, char *filename,
KMF_CREDENTIAL *cred,
KMF_DATA **certs, int *ncerts,
KMF_RAW_KEY_DATA **rawkeys, int *nkeys)
{
KMF_RETURN rv;
KMF_PLUGIN *plugin;
- KMF_RETURN (*import_keypair)(KMF_HANDLE *,
- char *, KMF_CREDENTIAL *,
- KMF_DATA **, int *,
- KMF_RAW_KEY_DATA **, int *);
+ KMF_RETURN (*import_objects)(KMF_HANDLE *, char *, KMF_CREDENTIAL *,
+ KMF_DATA **, int *, KMF_RAW_KEY_DATA **, int *);
CLEAR_ERROR(handle, rv);
if (rv != KMF_OK)
return (rv);
- if (filename == NULL ||
- cred == NULL ||
- certs == NULL || ncerts == NULL ||
- rawkeys == NULL || nkeys == NULL)
+ if (filename == NULL || cred == NULL || certs == NULL ||
+ ncerts == NULL ||rawkeys == NULL || nkeys == NULL)
return (KMF_ERR_BAD_PARAMETER);
/*
@@ -2382,15 +2704,15 @@ KMF_ImportKeypair(KMF_HANDLE_T handle, char *filename,
return (KMF_ERR_PLUGIN_NOTFOUND);
}
- import_keypair = (KMF_RETURN(*)())dlsym(plugin->dldesc,
- "openssl_import_keypair");
- if (import_keypair == NULL) {
+ import_objects = (KMF_RETURN(*)())dlsym(plugin->dldesc,
+ "openssl_import_objects");
+ if (import_objects == NULL) {
return (KMF_ERR_FUNCTION_NOT_FOUND);
}
/* Use OpenSSL interfaces to get raw key and cert data */
- rv = import_keypair(handle, filename, cred, certs, ncerts,
- rawkeys, nkeys);
+ rv = import_objects(handle, filename, cred, certs, ncerts,
+ rawkeys, nkeys);
return (rv);
}
@@ -2402,7 +2724,7 @@ IsEqualOid(KMF_OID *Oid1, KMF_OID *Oid2)
!memcmp(Oid1->Data, Oid2->Data, Oid1->Length));
}
-static KMF_RETURN
+KMF_RETURN
copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
KMF_X509_ALGORITHM_IDENTIFIER *srcid)
{
@@ -2416,7 +2738,7 @@ copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
return (KMF_ERR_MEMORY);
(void) memcpy(destid->algorithm.Data, srcid->algorithm.Data,
- destid->algorithm.Length);
+ destid->algorithm.Length);
destid->parameters.Length = srcid->parameters.Length;
if (destid->parameters.Length > 0) {
@@ -2425,7 +2747,7 @@ copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
return (KMF_ERR_MEMORY);
(void) memcpy(destid->parameters.Data, srcid->parameters.Data,
- destid->parameters.Length);
+ destid->parameters.Length);
} else {
destid->parameters.Data = NULL;
}
@@ -2433,7 +2755,7 @@ copy_algoid(KMF_X509_ALGORITHM_IDENTIFIER *destid,
}
static KMF_RETURN
-SignCert(KMF_HANDLE_T handle,
+sign_cert(KMF_HANDLE_T handle,
const KMF_DATA *SubjectCert,
KMF_KEY_HANDLE *Signkey,
KMF_DATA *SignedCert)
@@ -2443,6 +2765,9 @@ SignCert(KMF_HANDLE_T handle,
KMF_DATA signed_data = {0, NULL};
KMF_RETURN ret = KMF_OK;
KMF_ALGORITHM_INDEX algid;
+ int i = 0;
+ KMF_ATTRIBUTE attrlist[8];
+ KMF_OID *oid;
if (!SignedCert)
return (KMF_ERR_BAD_PARAMETER);
@@ -2451,7 +2776,7 @@ SignCert(KMF_HANDLE_T handle,
SignedCert->Data = NULL;
if (!SubjectCert)
- return (KMF_ERR_BAD_PARAMETER);
+ return (KMF_ERR_BAD_PARAMETER);
if (!SubjectCert->Data || !SubjectCert->Length)
return (KMF_ERR_BAD_PARAMETER);
@@ -2462,7 +2787,7 @@ SignCert(KMF_HANDLE_T handle,
* there is no need to re-encode it.
*/
ret = ExtractX509CertParts((KMF_DATA *)SubjectCert,
- &data_to_sign, NULL);
+ &data_to_sign, NULL);
if (ret != KMF_OK) {
goto cleanup;
}
@@ -2486,23 +2811,38 @@ SignCert(KMF_HANDLE_T handle,
/* We are re-signing this cert, so clear out old signature data */
if (subj_cert->signature.algorithmIdentifier.algorithm.Length == 0) {
- KMF_FreeAlgOID(&subj_cert->signature.algorithmIdentifier);
+ kmf_free_algoid(&subj_cert->signature.algorithmIdentifier);
ret = copy_algoid(&subj_cert->signature.algorithmIdentifier,
- &subj_cert->certificate.signature);
+ &subj_cert->certificate.signature);
}
if (ret)
goto cleanup;
+ kmf_set_attr_at_index(attrlist, i, KMF_KEYSTORE_TYPE_ATTR,
+ &Signkey->kstype, sizeof (KMF_KEYSTORE_TYPE));
+ i++;
+ kmf_set_attr_at_index(attrlist, i, KMF_KEY_HANDLE_ATTR,
+ Signkey, sizeof (KMF_KEY_HANDLE));
+ i++;
+ kmf_set_attr_at_index(attrlist, i, KMF_DATA_ATTR,
+ &data_to_sign, sizeof (KMF_DATA));
+ i++;
+ kmf_set_attr_at_index(attrlist, i, KMF_OUT_DATA_ATTR,
+ &signed_data, sizeof (KMF_DATA));
+ i++;
+ oid = CERT_ALG_OID(subj_cert);
+ kmf_set_attr_at_index(attrlist, i, KMF_OID_ATTR,
+ oid, sizeof (KMF_OID));
+ i++;
+
/* Sign the data */
- ret = KMF_SignDataWithKey(handle, Signkey,
- CERT_ALG_OID(subj_cert),
- &data_to_sign, &signed_data);
+ ret = kmf_sign_data(handle, i, attrlist);
if (ret != KMF_OK)
goto cleanup;
- algid = X509_AlgorithmOidToAlgId(CERT_SIG_OID(subj_cert));
+ algid = x509_algoid_to_algid(CERT_SIG_OID(subj_cert));
/*
* For DSA, KMF_SignDataWithKey() returns a 40-bytes decoded
@@ -2513,7 +2853,7 @@ SignCert(KMF_HANDLE_T handle,
KMF_DATA signature;
ret = DerEncodeDSASignature(&signed_data, &signature);
- KMF_FreeData(&signed_data);
+ kmf_free_data(&signed_data);
if (ret != KMF_OK)
goto cleanup;
@@ -2529,12 +2869,12 @@ SignCert(KMF_HANDLE_T handle,
cleanup:
/* Cleanup & return */
if (ret != KMF_OK)
- KMF_FreeData(SignedCert);
+ kmf_free_data(SignedCert);
- KMF_FreeData(&data_to_sign);
+ kmf_free_data(&data_to_sign);
if (subj_cert != NULL) {
- KMF_FreeSignedCert(subj_cert);
+ kmf_free_signed_cert(subj_cert);
free(subj_cert);
}
@@ -2542,7 +2882,7 @@ cleanup:
}
static KMF_RETURN
-VerifyCertWithKey(KMF_HANDLE_T handle,
+verify_cert_with_key(KMF_HANDLE_T handle,
KMF_DATA *derkey,
const KMF_DATA *CertToBeVerified)
{
@@ -2556,13 +2896,13 @@ VerifyCertWithKey(KMF_HANDLE_T handle,
/* check the caller and do other setup for this SPI call */
if (handle == NULL || CertToBeVerified == NULL ||
- derkey == NULL || derkey->Data == NULL)
+ derkey == NULL || derkey->Data == NULL)
return (KMF_ERR_BAD_PARAMETER);
(void) memset(&spki, 0, sizeof (KMF_X509_SPKI));
ret = ExtractX509CertParts((KMF_DATA *)CertToBeVerified,
- &data_to_verify, &signed_data);
+ &data_to_verify, &signed_data);
if (ret != KMF_OK)
goto cleanup;
@@ -2576,7 +2916,7 @@ VerifyCertWithKey(KMF_HANDLE_T handle,
if (ret != KMF_OK)
return (ret);
- algid = X509_AlgorithmOidToAlgId(CERT_SIG_OID(signed_cert));
+ algid = x509_algoid_to_algid(CERT_SIG_OID(signed_cert));
if (algid == KMF_ALGID_NONE)
return (KMF_ERR_BAD_ALGORITHM);
@@ -2591,7 +2931,7 @@ VerifyCertWithKey(KMF_HANDLE_T handle,
}
ret = PKCS_VerifyData(handle, algid, &spki,
- &data_to_verify, &signature);
+ &data_to_verify, &signature);
cleanup:
if (data_to_verify.Data != NULL)
@@ -2601,50 +2941,27 @@ cleanup:
free(signed_data.Data);
if (signed_cert) {
- KMF_FreeSignedCert(signed_cert);
+ kmf_free_signed_cert(signed_cert);
free(signed_cert);
}
if (algid == KMF_ALGID_SHA1WithDSA) {
free(signature.Data);
}
- KMF_FreeAlgOID(&spki.algorithm);
- KMF_FreeData(&spki.subjectPublicKey);
+ kmf_free_algoid(&spki.algorithm);
+ kmf_free_data(&spki.subjectPublicKey);
return (ret);
}
/*
- * The key must be an ASN.1/DER encoded PKCS#1 key.
+ * Use a signer cert to verify another certificate's signature.
+ * This code forces the use of the OPENSSL mechanism
+ * for the verify operation to avoid a circular dependency
+ * with libelfsign when it attempts to verify the PKCS#11 libraries.
*/
-KMF_RETURN
-VerifyDataWithKey(KMF_HANDLE_T handle,
- KMF_DATA *derkey,
- KMF_ALGORITHM_INDEX sigAlg,
- KMF_DATA *indata,
- KMF_DATA *insig)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_X509_SPKI spki;
-
- if (!indata || !insig || !derkey || !derkey->Data)
- return (KMF_ERR_BAD_PARAMETER);
-
- ret = DerDecodeSPKI(derkey, &spki);
- if (ret != KMF_OK)
- goto cleanup;
-
- ret = PKCS_VerifyData(handle, sigAlg, &spki, indata, insig);
-
-cleanup:
- KMF_FreeAlgOID(&spki.algorithm);
- KMF_FreeData(&spki.subjectPublicKey);
-
- return (ret);
-}
-
static KMF_RETURN
-VerifyCertWithCert(KMF_HANDLE_T handle,
+verify_cert_with_cert(KMF_HANDLE_T handle,
const KMF_DATA *CertToBeVerifiedData,
const KMF_DATA *SignerCertData)
{
@@ -2666,9 +2983,14 @@ VerifyCertWithCert(KMF_HANDLE_T handle,
!SignerCertData->Length)
return (KMF_ERR_BAD_PARAMETER);
+ /* Make sure the signer has proper key usage bits */
+ ret = check_key_usage(handle, SignerCertData, KMF_KU_SIGN_CERT);
+ if (ret != KMF_OK)
+ return (ret);
+
/* Decode the cert into parts for verification */
ret = ExtractX509CertParts((KMF_DATA *)CertToBeVerifiedData,
- &data_to_verify, &signed_data);
+ &data_to_verify, &signed_data);
if (ret != KMF_OK)
goto cleanup;
@@ -2679,7 +3001,7 @@ VerifyCertWithCert(KMF_HANDLE_T handle,
if (ret != KMF_OK)
goto cleanup;
- algid = X509_AlgorithmOidToAlgId(CERT_SIG_OID(ToBeVerifiedCert));
+ algid = x509_algoid_to_algid(CERT_SIG_OID(ToBeVerifiedCert));
if (algid == KMF_ALGID_SHA1WithDSA) {
ret = DerDecodeDSASignature(&signed_data, &signature);
@@ -2690,32 +3012,25 @@ VerifyCertWithCert(KMF_HANDLE_T handle,
signature.Length = signed_data.Length;
}
- /* Make sure the signer has proper key usage bits */
- ret = check_key_usage(handle, SignerCertData, KMF_KU_SIGN_CERT);
- if (ret != KMF_OK)
- return (ret);
-
/*
* To avoid recursion with kcfd consumer and libpkcs11,
- * do the data verification using the OpenSSL
+ * do the certificate verification using the OpenSSL
* plugin algorithms instead of the crypto framework.
*/
- ret = plugin_verify_data_with_cert(handle,
- KMF_KEYSTORE_OPENSSL,
- algid, &data_to_verify, &signature,
- SignerCertData);
+ ret = plugin_verify_data_with_cert(handle, KMF_KEYSTORE_OPENSSL,
+ algid, &data_to_verify, &signature, SignerCertData);
cleanup:
- KMF_FreeData(&data_to_verify);
- KMF_FreeData(&signed_data);
+ kmf_free_data(&data_to_verify);
+ kmf_free_data(&signed_data);
if (SignerCert) {
- KMF_FreeSignedCert(SignerCert);
+ kmf_free_signed_cert(SignerCert);
free(SignerCert);
}
if (ToBeVerifiedCert) {
- KMF_FreeSignedCert(ToBeVerifiedCert);
+ kmf_free_signed_cert(ToBeVerifiedCert);
free(ToBeVerifiedCert);
}
@@ -2726,78 +3041,158 @@ cleanup:
return (ret);
}
+/*
+ * Phase 1 APIs still needed to maintain compat with elfsign.
+ */
KMF_RETURN
-SignCsr(KMF_HANDLE_T handle,
- const KMF_DATA *SubjectCsr,
- KMF_KEY_HANDLE *Signkey,
- KMF_X509_ALGORITHM_IDENTIFIER *algo,
- KMF_DATA *SignedCsr)
+KMF_VerifyDataWithCert(KMF_HANDLE_T handle,
+ KMF_KEYSTORE_TYPE kstype,
+ KMF_ALGORITHM_INDEX algid,
+ KMF_DATA *indata,
+ KMF_DATA *insig,
+ const KMF_DATA *SignerCert)
{
+ KMF_ATTRIBUTE attrlist[8];
+ int numattr = 0;
- KMF_CSR_DATA subj_csr;
- KMF_TBS_CSR *tbs_csr = NULL;
- KMF_DATA signed_data = {0, NULL};
- KMF_RETURN ret = KMF_OK;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_KEYSTORE_TYPE_ATTR,
+ &kstype, sizeof (kstype));
+ numattr++;
- if (!SignedCsr)
- return (KMF_ERR_BAD_PARAMETER);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_DATA_ATTR,
+ indata, sizeof (KMF_DATA));
+ numattr++;
- SignedCsr->Length = 0;
- SignedCsr->Data = NULL;
+ kmf_set_attr_at_index(attrlist, numattr, KMF_IN_SIGN_ATTR,
+ insig, sizeof (KMF_DATA));
+ numattr++;
- if (!SubjectCsr)
- return (KMF_ERR_BAD_PARAMETER);
+ kmf_set_attr_at_index(attrlist, numattr, KMF_SIGNER_CERT_DATA_ATTR,
+ (KMF_DATA *)SignerCert, sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr, KMF_ALGORITHM_INDEX_ATTR,
+ &algid, sizeof (algid));
+ numattr++;
+
+ return (kmf_verify_data(handle, numattr, attrlist));
+}
- if (!SubjectCsr->Data || !SubjectCsr->Length)
+KMF_RETURN
+KMF_VerifyCertWithCert(KMF_HANDLE_T handle,
+ const KMF_DATA *CertToBeVerified,
+ const KMF_DATA *SignerCert)
+{
+ KMF_RETURN ret;
+ if (CertToBeVerified == NULL || SignerCert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- (void) memset(&subj_csr, 0, sizeof (subj_csr));
- /* Estimate the signed data length generously */
- signed_data.Length = SubjectCsr->Length*2;
- signed_data.Data = calloc(1, signed_data.Length);
- if (!signed_data.Data) {
- ret = KMF_ERR_MEMORY;
- goto cleanup;
- }
+ /* check the keyUsage of signer's certificate */
+ ret = check_key_usage(handle, SignerCert, KMF_KU_SIGN_CERT);
+ if (ret != KMF_OK)
+ return (ret);
- /* Sign the data */
- ret = KMF_SignDataWithKey(handle, Signkey, &algo->algorithm,
- (KMF_DATA *)SubjectCsr, &signed_data);
+ return (verify_cert_with_cert(handle, CertToBeVerified,
+ SignerCert));
+}
- if (KMF_OK != ret)
- goto cleanup;
+KMF_RETURN
+KMF_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *target,
+ KMF_X509_DER_CERT *kmf_cert,
+ uint32_t *num_certs)
+{
+ KMF_ATTRIBUTE attrlist[32];
+ int i = 0;
- /*
- * If we got here OK, decode into a structure and then re-encode
- * the complete CSR.
- */
- ret = DerDecodeTbsCsr(SubjectCsr, &tbs_csr);
- if (ret)
- goto cleanup;
+ if (target == NULL || num_certs == NULL)
+ return (KMF_ERR_BAD_PARAMETER); /* ILLEGAL ARGS ERROR */
- (void) memcpy(&subj_csr.csr, tbs_csr, sizeof (KMF_TBS_CSR));
+ if ((target->find_cert_validity < KMF_ALL_CERTS) ||
+ (target->find_cert_validity > KMF_EXPIRED_CERTS))
+ return (KMF_ERR_BAD_PARAMETER);
- ret = copy_algoid(&subj_csr.signature.algorithmIdentifier, algo);
- if (ret)
- goto cleanup;
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &target->kstype, sizeof (target->kstype));
+ i++;
- subj_csr.signature.encrypted = signed_data;
+ if (kmf_cert != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_X509_DER_CERT_ATTR, kmf_cert,
+ sizeof (KMF_X509_DER_CERT));
+ i++;
+ }
- /* Now, re-encode the CSR with the new signature */
- ret = DerEncodeSignedCsr(&subj_csr, SignedCsr);
- if (ret != KMF_OK) {
- KMF_FreeData(SignedCsr);
- goto cleanup;
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_COUNT_ATTR, num_certs, sizeof (uint32_t));
+ i++;
+
+ /* Set the optional searching attributes for all 3 plugins. */
+ if (target->issuer != NULL) {
+ kmf_set_attr_at_index(attrlist, i, KMF_ISSUER_NAME_ATTR,
+ target->issuer, strlen(target->issuer));
+ i++;
+ }
+ if (target->subject != NULL) {
+ kmf_set_attr_at_index(attrlist, i, KMF_SUBJECT_NAME_ATTR,
+ target->subject, strlen(target->subject));
+ i++;
+ }
+ if (target->serial != NULL) {
+ kmf_set_attr_at_index(attrlist, i, KMF_BIGINT_ATTR,
+ target->serial, sizeof (KMF_BIGINT));
+ i++;
}
- /* Cleanup & return */
-cleanup:
- free(tbs_csr);
+ kmf_set_attr_at_index(attrlist, i, KMF_CERT_VALIDITY_ATTR,
+ &target->find_cert_validity, sizeof (KMF_CERT_VALIDITY));
+ i++;
+
+ if (target->kstype == KMF_KEYSTORE_NSS) {
+ if (target->certLabel != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_CERT_LABEL_ATTR,
+ target->certLabel, strlen(target->certLabel));
+ i++;
+ }
- KMF_FreeTBSCSR(&subj_csr.csr);
+ if (target->nssparms.slotlabel != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_TOKEN_LABEL_ATTR,
+ target->nssparms.slotlabel,
+ strlen(target->nssparms.slotlabel));
+ i++;
+ }
- KMF_FreeAlgOID(&subj_csr.signature.algorithmIdentifier);
- KMF_FreeData(&signed_data);
+ } else if (target->kstype == KMF_KEYSTORE_OPENSSL) {
+ if (target->sslparms.certfile != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_CERT_FILENAME_ATTR,
+ target->sslparms.certfile,
+ strlen(target->sslparms.certfile));
+ i++;
+ }
- return (ret);
+ if (target->sslparms.dirpath != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_DIRPATH_ATTR,
+ target->sslparms.dirpath,
+ strlen(target->sslparms.dirpath));
+ i++;
+ }
+
+ } else if (target->kstype == KMF_KEYSTORE_PK11TOKEN) {
+ if (target->certLabel != NULL) {
+ kmf_set_attr_at_index(attrlist, i,
+ KMF_CERT_LABEL_ATTR,
+ target->certLabel, strlen(target->certLabel));
+ i++;
+ }
+
+ kmf_set_attr_at_index(attrlist, i, KMF_PRIVATE_BOOL_ATTR,
+ &target->pkcs11parms.private,
+ sizeof (target->pkcs11parms.private));
+ i++;
+ }
+
+ return (kmf_find_cert(handle, i, attrlist));
}
diff --git a/usr/src/lib/libkmf/libkmf/common/client.c b/usr/src/lib/libkmf/libkmf/common/client.c
index 15c158312e..d82381722c 100644
--- a/usr/src/lib/libkmf/libkmf/common/client.c
+++ b/usr/src/lib/libkmf/libkmf/common/client.c
@@ -19,7 +19,7 @@
* CDDL HEADER END
*/
/*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*
* File: CLIENT.C
@@ -72,7 +72,7 @@ static int init_socket(char *host, short port)
sin.sin_port = htons(port);
if ((sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE) {
if ((hp = gethostbyname_r(host, &hrec, hostbuf,
- sizeof (hostbuf), &herrno)) == NULL) {
+ sizeof (hostbuf), &herrno)) == NULL) {
return (-1);
}
(void) memcpy((char *)&sin.sin_addr, hp->h_addr,
@@ -478,7 +478,8 @@ out:
}
KMF_RETURN
-KMF_GetEncodedOCSPResponse(KMF_HANDLE_T handle, char *reqfile, char *hostname,
+kmf_get_encoded_ocsp_response(KMF_HANDLE_T handle,
+ char *reqfile, char *hostname,
int port, char *proxy, int proxy_port, char *respfile,
unsigned int maxsecs)
{
@@ -532,7 +533,7 @@ KMF_GetEncodedOCSPResponse(KMF_HANDLE_T handle, char *reqfile, char *hostname,
ret = KMF_ERR_OPEN_FILE;
} else {
ret = get_encoded_response(sock, KMF_RESPONSE_OCSP,
- respfd, maxsecs);
+ respfd, maxsecs);
(void) close(respfd);
}
@@ -622,7 +623,7 @@ download_file(char *uri, char *proxy, int proxy_port,
/* Connect to server */
if (proxy != NULL) {
final_proxy_port = (proxy_port == 0 || proxy_port == -1) ?
- 80 : proxy_port;
+ 80 : proxy_port;
is_proxy = B_TRUE;
sock = connect_to_server(proxy, final_proxy_port);
} else {
@@ -659,7 +660,7 @@ out:
KMF_RETURN
-KMF_DownloadCRL(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
+kmf_download_crl(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
unsigned int maxsecs, char *crlfile, KMF_ENCODE_FORMAT *pformat)
{
KMF_RETURN ret = KMF_OK;
@@ -707,7 +708,7 @@ KMF_DownloadCRL(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
}
/* Check if it is a CRL file and get its format */
- if (KMF_IsCRLFile(handle, tempfn, pformat) != KMF_OK) {
+ if (kmf_is_crl_file(handle, tempfn, pformat) != KMF_OK) {
ret = KMF_ERR_BAD_CRLFILE;
goto out;
}
@@ -733,7 +734,7 @@ out:
KMF_RETURN
-KMF_DownloadCert(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
+kmf_download_cert(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
unsigned int maxsecs, char *certfile, KMF_ENCODE_FORMAT *pformat)
{
KMF_RETURN ret = KMF_OK;
@@ -782,7 +783,7 @@ KMF_DownloadCert(KMF_HANDLE_T handle, char *uri, char *proxy, int proxy_port,
}
/* Check if it is a Cert file and get its format */
- if (KMF_IsCertFile(handle, tempfn, pformat) != KMF_OK) {
+ if (kmf_is_cert_file(handle, tempfn, pformat) != KMF_OK) {
ret = KMF_ERR_BAD_CERTFILE;
goto out;
}
@@ -807,14 +808,13 @@ out:
}
KMF_RETURN
-KMF_GetOCSPForCert(KMF_HANDLE_T handle,
+kmf_get_ocsp_for_cert(KMF_HANDLE_T handle,
KMF_DATA *user_cert,
KMF_DATA *ta_cert,
KMF_DATA *response)
{
KMF_POLICY_RECORD *policy;
KMF_RETURN ret = KMF_OK;
- KMF_OCSPREQUEST_PARAMS req_params;
char *hostname = NULL, *host_uri = NULL, *proxyname = NULL;
char *proxy_port_s = NULL;
int host_port = 0, proxy_port = 0;
@@ -825,20 +825,28 @@ KMF_GetOCSPForCert(KMF_HANDLE_T handle,
boolean_t found = B_FALSE;
KMF_X509EXT_ACCESSDESC *access_info;
xmlURIPtr uriptr = NULL;
+ KMF_ATTRIBUTE attrlist[10];
+ int numattr = 0;
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (user_cert == NULL ||
- ta_cert == NULL || response == NULL)
+ if (user_cert == NULL || ta_cert == NULL || response == NULL)
return (KMF_ERR_BAD_PARAMETER);
policy = handle->policy;
/* Create an OCSP request */
- req_params.issuer_cert = ta_cert;
- req_params.user_cert = user_cert;
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_ISSUER_CERT_DATA_ATTR, ta_cert,
+ sizeof (KMF_DATA));
+ numattr++;
+
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_USER_CERT_DATA_ATTR, user_cert,
+ sizeof (KMF_DATA));
+ numattr++;
/*
* Create temporary files to hold the OCSP request & response data.
@@ -855,7 +863,12 @@ KMF_GetOCSPForCert(KMF_HANDLE_T handle,
return (KMF_ERR_INTERNAL);
}
- ret = KMF_CreateOCSPRequest(handle, &req_params, ocsp_reqname);
+ kmf_set_attr_at_index(attrlist, numattr,
+ KMF_OCSP_REQUEST_FILENAME_ATTR, ocsp_respname,
+ strlen(ocsp_respname));
+ numattr++;
+
+ ret = kmf_create_ocsp_request(handle, numattr, attrlist);
if (ret != KMF_OK) {
goto out;
}
@@ -873,7 +886,7 @@ KMF_GetOCSPForCert(KMF_HANDLE_T handle,
* Authority Information Access
* thru OID_PKIX_AD_OCSP
*/
- ret = KMF_GetCertAuthInfoAccessExt(user_cert, &aia);
+ ret = kmf_get_cert_auth_info_access(user_cert, &aia);
if (ret != KMF_OK) {
goto out;
}
@@ -934,14 +947,14 @@ KMF_GetOCSPForCert(KMF_HANDLE_T handle,
* Send the request to an OCSP responder and receive an
* OCSP response.
*/
- ret = KMF_GetEncodedOCSPResponse(handle, ocsp_reqname,
+ ret = kmf_get_encoded_ocsp_response(handle, ocsp_reqname,
hostname, host_port, proxyname, proxy_port,
ocsp_respname, 30);
if (ret != KMF_OK) {
goto out;
}
- ret = KMF_ReadInputFile(handle, ocsp_respname, response);
+ ret = kmf_read_input_file(handle, ocsp_respname, response);
out:
(void) unlink(ocsp_reqname);
diff --git a/usr/src/lib/libkmf/libkmf/common/csrcrlop.c b/usr/src/lib/libkmf/libkmf/common/csrcrlop.c
index 1099f57c71..b0af23b27c 100644
--- a/usr/src/lib/libkmf/libkmf/common/csrcrlop.c
+++ b/usr/src/lib/libkmf/libkmf/common/csrcrlop.c
@@ -17,8 +17,7 @@
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
- */
-/*
+ *
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -41,10 +40,12 @@
#include <libgen.h>
#include <cryptoutil.h>
+static KMF_RETURN
+setup_crl_call(KMF_HANDLE_T, int, KMF_ATTRIBUTE *, KMF_PLUGIN **);
/*
*
- * Name: KMF_SetCSRPubKey
+ * Name: kmf_set_csr_pubkey
*
* Description:
* This function converts the specified plugin public key to SPKI form,
@@ -64,11 +65,11 @@
*
*/
KMF_RETURN
-KMF_SetCSRPubKey(KMF_HANDLE_T handle,
+kmf_set_csr_pubkey(KMF_HANDLE_T handle,
KMF_KEY_HANDLE *KMFKey,
KMF_CSR_DATA *Csr)
{
- KMF_RETURN ret = KMF_OK;
+ KMF_RETURN ret;
KMF_X509_SPKI *spki_ptr;
KMF_PLUGIN *plugin;
KMF_DATA KeyData = {NULL, 0};
@@ -94,13 +95,13 @@ KMF_SetCSRPubKey(KMF_HANDLE_T handle,
ret = DerDecodeSPKI(&KeyData, spki_ptr);
- KMF_FreeData(&KeyData);
+ kmf_free_data(&KeyData);
return (ret);
}
KMF_RETURN
-KMF_SetCSRVersion(KMF_CSR_DATA *CsrData, uint32_t version)
+kmf_set_csr_version(KMF_CSR_DATA *CsrData, uint32_t version)
{
if (CsrData == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -112,11 +113,11 @@ KMF_SetCSRVersion(KMF_CSR_DATA *CsrData, uint32_t version)
if (version != 0 && version != 1 && version != 2)
return (KMF_ERR_BAD_PARAMETER);
return (set_integer(&CsrData->csr.version, (void *)&version,
- sizeof (uint32_t)));
+ sizeof (uint32_t)));
}
KMF_RETURN
-KMF_SetCSRSubjectName(KMF_CSR_DATA *CsrData,
+kmf_set_csr_subject(KMF_CSR_DATA *CsrData,
KMF_X509_NAME *subject_name_ptr)
{
KMF_RETURN rv = KMF_OK;
@@ -132,9 +133,8 @@ KMF_SetCSRSubjectName(KMF_CSR_DATA *CsrData,
}
return (rv);
}
-
KMF_RETURN
-KMF_CreateCSRFile(KMF_DATA *csrdata, KMF_ENCODE_FORMAT format,
+kmf_create_csr_file(KMF_DATA *csrdata, KMF_ENCODE_FORMAT format,
char *csrfile)
{
KMF_RETURN rv = KMF_OK;
@@ -149,9 +149,9 @@ KMF_CreateCSRFile(KMF_DATA *csrdata, KMF_ENCODE_FORMAT format,
if (format == KMF_FORMAT_PEM) {
int len;
- rv = KMF_Der2Pem(KMF_CSR,
- csrdata->Data, csrdata->Length,
- &pemdata.Data, &len);
+ rv = kmf_der_to_pem(KMF_CSR,
+ csrdata->Data, csrdata->Length,
+ &pemdata.Data, &len);
if (rv != KMF_OK)
goto cleanup;
pemdata.Length = (size_t)len;
@@ -164,12 +164,12 @@ KMF_CreateCSRFile(KMF_DATA *csrdata, KMF_ENCODE_FORMAT format,
if (format == KMF_FORMAT_PEM) {
if (write(fd, pemdata.Data, pemdata.Length) !=
- pemdata.Length) {
+ pemdata.Length) {
rv = KMF_ERR_WRITE_FILE;
}
} else {
if (write(fd, csrdata->Data, csrdata->Length) !=
- csrdata->Length) {
+ csrdata->Length) {
rv = KMF_ERR_WRITE_FILE;
}
}
@@ -178,14 +178,13 @@ cleanup:
if (fd != -1)
(void) close(fd);
- KMF_FreeData(&pemdata);
+ kmf_free_data(&pemdata);
return (rv);
}
KMF_RETURN
-KMF_SetCSRExtension(KMF_CSR_DATA *Csr,
- KMF_X509_EXTENSION *extn)
+kmf_set_csr_extn(KMF_CSR_DATA *Csr, KMF_X509_EXTENSION *extn)
{
KMF_RETURN ret = KMF_OK;
KMF_X509_EXTENSIONS *exts;
@@ -201,7 +200,7 @@ KMF_SetCSRExtension(KMF_CSR_DATA *Csr,
}
KMF_RETURN
-KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *CsrData,
+kmf_set_csr_sig_alg(KMF_CSR_DATA *CsrData,
KMF_ALGORITHM_INDEX sigAlg)
{
KMF_OID *alg;
@@ -209,12 +208,12 @@ KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *CsrData,
if (CsrData == NULL)
return (KMF_ERR_BAD_PARAMETER);
- alg = X509_AlgIdToAlgorithmOid(sigAlg);
+ alg = x509_algid_to_algoid(sigAlg);
if (alg != NULL) {
(void) copy_data((KMF_DATA *)
- &CsrData->signature.algorithmIdentifier.algorithm,
- (KMF_DATA *)alg);
+ &CsrData->signature.algorithmIdentifier.algorithm,
+ (KMF_DATA *)alg);
(void) copy_data(
&CsrData->signature.algorithmIdentifier.parameters,
&CsrData->csr.subjectPublicKeyInfo.algorithm.parameters);
@@ -225,7 +224,7 @@ KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *CsrData,
}
KMF_RETURN
-KMF_SetCSRSubjectAltName(KMF_CSR_DATA *Csr,
+kmf_set_csr_subject_altname(KMF_CSR_DATA *Csr,
char *altname, int critical,
KMF_GENERALNAMECHOICES alttype)
{
@@ -234,15 +233,15 @@ KMF_SetCSRSubjectAltName(KMF_CSR_DATA *Csr,
if (Csr == NULL || altname == NULL)
return (KMF_ERR_BAD_PARAMETER);
- ret = KMF_SetAltName(&Csr->csr.extensions,
- (KMF_OID *)&KMFOID_SubjectAltName, critical, alttype,
- altname);
+ ret = kmf_set_altname(&Csr->csr.extensions,
+ (KMF_OID *)&KMFOID_SubjectAltName, critical, alttype,
+ altname);
return (ret);
}
KMF_RETURN
-KMF_SetCSRKeyUsage(KMF_CSR_DATA *CSRData,
+kmf_set_csr_ku(KMF_CSR_DATA *CSRData,
int critical, uint16_t kubits)
{
KMF_RETURN ret = KMF_OK;
@@ -251,15 +250,90 @@ KMF_SetCSRKeyUsage(KMF_CSR_DATA *CSRData,
return (KMF_ERR_BAD_PARAMETER);
ret = set_key_usage_extension(
- &CSRData->csr.extensions,
- critical, kubits);
+ &CSRData->csr.extensions, critical, kubits);
+
+ return (ret);
+}
+
+static KMF_RETURN
+SignCsr(KMF_HANDLE_T handle,
+ const KMF_DATA *SubjectCsr,
+ KMF_KEY_HANDLE *Signkey,
+ KMF_X509_ALGORITHM_IDENTIFIER *algo,
+ KMF_DATA *SignedCsr)
+{
+
+ KMF_CSR_DATA subj_csr;
+ KMF_TBS_CSR *tbs_csr = NULL;
+ KMF_DATA signed_data = {0, NULL};
+ KMF_RETURN ret = KMF_OK;
+
+ if (!SignedCsr)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ SignedCsr->Length = 0;
+ SignedCsr->Data = NULL;
+
+ if (!SubjectCsr)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ if (!SubjectCsr->Data || !SubjectCsr->Length)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ (void) memset(&subj_csr, 0, sizeof (subj_csr));
+ /* Estimate the signed data length generously */
+ signed_data.Length = SubjectCsr->Length*2;
+ signed_data.Data = calloc(1, signed_data.Length);
+ if (!signed_data.Data) {
+ ret = KMF_ERR_MEMORY;
+ goto cleanup;
+ }
+
+ /* Sign the data */
+ ret = KMF_SignDataWithKey(handle, Signkey, &algo->algorithm,
+ (KMF_DATA *)SubjectCsr, &signed_data);
+
+ if (KMF_OK != ret)
+ goto cleanup;
+
+ /*
+ * If we got here OK, decode into a structure and then re-encode
+ * the complete CSR.
+ */
+ ret = DerDecodeTbsCsr(SubjectCsr, &tbs_csr);
+ if (ret)
+ goto cleanup;
+
+ (void) memcpy(&subj_csr.csr, tbs_csr, sizeof (KMF_TBS_CSR));
+
+ ret = copy_algoid(&subj_csr.signature.algorithmIdentifier, algo);
+ if (ret)
+ goto cleanup;
+
+ subj_csr.signature.encrypted = signed_data;
+
+ /* Now, re-encode the CSR with the new signature */
+ ret = DerEncodeSignedCsr(&subj_csr, SignedCsr);
+ if (ret != KMF_OK) {
+ kmf_free_data(SignedCsr);
+ goto cleanup;
+ }
+
+ /* Cleanup & return */
+cleanup:
+ free(tbs_csr);
+
+ kmf_free_tbs_csr(&subj_csr.csr);
+
+ kmf_free_algoid(&subj_csr.signature.algorithmIdentifier);
+ kmf_free_data(&signed_data);
return (ret);
}
/*
*
- * Name: KMF_SignCSR
+ * Name: kmf_sign_csr
*
* Description:
* This function signs a CSR and returns the result as a
@@ -282,7 +356,7 @@ KMF_SetCSRKeyUsage(KMF_CSR_DATA *CSRData,
*
*/
KMF_RETURN
-KMF_SignCSR(KMF_HANDLE_T handle,
+kmf_sign_csr(KMF_HANDLE_T handle,
const KMF_CSR_DATA *tbsCsr,
KMF_KEY_HANDLE *Signkey,
KMF_DATA *SignedCsr)
@@ -294,8 +368,7 @@ KMF_SignCSR(KMF_HANDLE_T handle,
if (err != KMF_OK)
return (err);
- if (tbsCsr == NULL ||
- Signkey == NULL || SignedCsr == NULL)
+ if (tbsCsr == NULL || Signkey == NULL || SignedCsr == NULL)
return (KMF_ERR_BAD_PARAMETER);
SignedCsr->Data = NULL;
@@ -304,187 +377,199 @@ KMF_SignCSR(KMF_HANDLE_T handle,
err = DerEncodeTbsCsr((KMF_TBS_CSR *)&tbsCsr->csr, &csrdata);
if (err == KMF_OK) {
err = SignCsr(handle, &csrdata, Signkey,
- (KMF_X509_ALGORITHM_IDENTIFIER *)
- &tbsCsr->signature.algorithmIdentifier,
- SignedCsr);
+ (KMF_X509_ALGORITHM_IDENTIFIER *)
+ &tbsCsr->signature.algorithmIdentifier,
+ SignedCsr);
}
if (err != KMF_OK) {
- KMF_FreeData(SignedCsr);
+ kmf_free_data(SignedCsr);
}
- KMF_FreeData(&csrdata);
+ kmf_free_data(&csrdata);
return (err);
}
-KMF_RETURN
-KMF_ImportCRL(KMF_HANDLE_T handle, KMF_IMPORTCRL_PARAMS *params)
+static KMF_RETURN
+setup_crl_call(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist, KMF_PLUGIN **plugin)
{
- KMF_PLUGIN *plugin;
KMF_RETURN ret;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len = sizeof (kstype);
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL || plugin == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
- switch (params->kstype) {
+ switch (kstype) {
case KMF_KEYSTORE_NSS:
- plugin = FindPlugin(handle, params->kstype);
+ *plugin = FindPlugin(handle, kstype);
break;
case KMF_KEYSTORE_OPENSSL:
case KMF_KEYSTORE_PK11TOKEN: /* PKCS#11 CRL is file-based */
- plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
+ *plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
break;
default:
return (KMF_ERR_PLUGIN_NOTFOUND);
}
-
- if (plugin != NULL && plugin->funclist->ImportCRL != NULL) {
- return (plugin->funclist->ImportCRL(handle, params));
- }
- return (KMF_ERR_PLUGIN_NOTFOUND);
+ return (KMF_OK);
}
KMF_RETURN
-KMF_DeleteCRL(KMF_HANDLE_T handle, KMF_DELETECRL_PARAMS *params)
+kmf_import_crl(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- KMF_PLUGIN *plugin;
KMF_RETURN ret;
+ KMF_PLUGIN *plugin;
- CLEAR_ERROR(handle, ret);
+ ret = setup_crl_call(handle, numattr, attrlist, &plugin);
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- switch (params->kstype) {
- case KMF_KEYSTORE_NSS:
- plugin = FindPlugin(handle, params->kstype);
- break;
-
- case KMF_KEYSTORE_OPENSSL:
- case KMF_KEYSTORE_PK11TOKEN: /* PKCS#11 CRL is file-based */
- plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
- break;
- default:
+ if (plugin == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ else if (plugin->funclist->ImportCRL != NULL)
+ return (plugin->funclist->ImportCRL(handle, numattr, attrlist));
- if (plugin != NULL && plugin->funclist->DeleteCRL != NULL) {
- return (plugin->funclist->DeleteCRL(handle, params));
- } else {
- return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
}
KMF_RETURN
-KMF_ListCRL(KMF_HANDLE_T handle, KMF_LISTCRL_PARAMS *params, char **crldata)
+kmf_delete_crl(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- KMF_PLUGIN *plugin;
KMF_RETURN ret;
+ KMF_PLUGIN *plugin;
- CLEAR_ERROR(handle, ret);
+ ret = setup_crl_call(handle, numattr, attrlist, &plugin);
if (ret != KMF_OK)
return (ret);
- if (params == NULL || crldata == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- switch (params->kstype) {
- case KMF_KEYSTORE_NSS:
- plugin = FindPlugin(handle, params->kstype);
- break;
-
- case KMF_KEYSTORE_OPENSSL:
- case KMF_KEYSTORE_PK11TOKEN: /* PKCS#11 CRL is file-based */
- plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
- break;
- default:
+ if (plugin == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ else if (plugin->funclist->DeleteCRL != NULL)
+ return (plugin->funclist->DeleteCRL(handle, numattr, attrlist));
- if (plugin != NULL && plugin->funclist->ListCRL != NULL) {
- return (plugin->funclist->ListCRL(handle, params, crldata));
- } else {
- return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
}
KMF_RETURN
-KMF_FindCRL(KMF_HANDLE_T handle, KMF_FINDCRL_PARAMS *params,
- char **CRLNameList, int *CRLCount)
+kmf_list_crl(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
KMF_RETURN ret;
- CLEAR_ERROR(handle, ret);
+ ret = setup_crl_call(handle, numattr, attrlist, &plugin);
if (ret != KMF_OK)
return (ret);
- if (params == NULL ||
- CRLCount == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, params->kstype);
- if (plugin != NULL && plugin->funclist->FindCRL != NULL) {
- return (plugin->funclist->FindCRL(handle, params,
- CRLNameList, CRLCount));
- } else {
+ if (plugin == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ else if (plugin->funclist->ListCRL != NULL)
+ return (plugin->funclist->ListCRL(handle, numattr, attrlist));
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
}
KMF_RETURN
-KMF_FindCertInCRL(KMF_HANDLE_T handle, KMF_FINDCERTINCRL_PARAMS *params)
+kmf_find_crl(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_PLUGIN *plugin;
KMF_RETURN ret;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len = sizeof (kstype);
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1,
+ sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CRL_COUNT_ATTR, FALSE,
+ sizeof (char *), sizeof (char *)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
- switch (params->kstype) {
+ switch (kstype) {
case KMF_KEYSTORE_NSS:
- plugin = FindPlugin(handle, params->kstype);
+ plugin = FindPlugin(handle, kstype);
break;
-
case KMF_KEYSTORE_OPENSSL:
- case KMF_KEYSTORE_PK11TOKEN: /* PKCS#11 CRL is file-based */
- plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
- break;
+ case KMF_KEYSTORE_PK11TOKEN:
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
default:
+ /*
+ * FindCRL is only implemented for NSS. PKCS#11
+ * and file-based keystores just store in a file
+ * and don't need a "Find" function.
+ */
return (KMF_ERR_PLUGIN_NOTFOUND);
}
- if (plugin != NULL && plugin->funclist->FindCertInCRL != NULL) {
- return (plugin->funclist->FindCertInCRL(handle, params));
- } else {
+ if (plugin == NULL)
return (KMF_ERR_PLUGIN_NOTFOUND);
+ else if (plugin->funclist->FindCRL != NULL) {
+ return (plugin->funclist->FindCRL(handle, numattr,
+ attrlist));
}
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
}
KMF_RETURN
-KMF_VerifyCRLFile(KMF_HANDLE_T handle,
- KMF_VERIFYCRL_PARAMS *params)
+kmf_find_cert_in_crl(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- KMF_PLUGIN *plugin;
- KMF_RETURN (*verifyCRLFile)(KMF_HANDLE_T,
- KMF_VERIFYCRL_PARAMS *);
KMF_RETURN ret;
+ KMF_PLUGIN *plugin;
- CLEAR_ERROR(handle, ret);
+ ret = setup_crl_call(handle, numattr, attrlist, &plugin);
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
+ if (plugin == NULL)
+ return (KMF_ERR_PLUGIN_NOTFOUND);
+ else if (plugin->funclist->FindCertInCRL != NULL)
+ return (plugin->funclist->FindCertInCRL(handle, numattr,
+ attrlist));
+
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
+}
+
+KMF_RETURN
+kmf_verify_crl_file(KMF_HANDLE_T handle, char *crlfile, KMF_DATA *tacert)
+{
+ KMF_PLUGIN *plugin;
+ KMF_RETURN (*verifyCRLFile)(KMF_HANDLE_T, char *, KMF_DATA *);
+
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
@@ -499,24 +584,23 @@ KMF_VerifyCRLFile(KMF_HANDLE_T handle,
return (KMF_ERR_FUNCTION_NOT_FOUND);
}
- return (verifyCRLFile(handle, params));
+ return (verifyCRLFile(handle, crlfile, tacert));
}
KMF_RETURN
-KMF_CheckCRLDate(KMF_HANDLE_T handle, KMF_CHECKCRLDATE_PARAMS *params)
+kmf_check_crl_date(KMF_HANDLE_T handle, char *crlname)
{
KMF_PLUGIN *plugin;
- KMF_RETURN (*checkCRLDate)(void *,
- KMF_CHECKCRLDATE_PARAMS *params);
- KMF_RETURN ret;
+ KMF_RETURN (*checkCRLDate)(void *, char *);
+ KMF_RETURN ret = KMF_OK;
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
plugin = FindPlugin(handle, KMF_KEYSTORE_OPENSSL);
if (plugin == NULL || plugin->dldesc == NULL) {
return (KMF_ERR_PLUGIN_NOTFOUND);
@@ -529,16 +613,15 @@ KMF_CheckCRLDate(KMF_HANDLE_T handle, KMF_CHECKCRLDATE_PARAMS *params)
return (KMF_ERR_FUNCTION_NOT_FOUND);
}
- return (checkCRLDate(handle, params));
-
+ return (checkCRLDate(handle, crlname));
}
KMF_RETURN
-KMF_IsCRLFile(KMF_HANDLE_T handle, char *filename, KMF_ENCODE_FORMAT *pformat)
+kmf_is_crl_file(KMF_HANDLE_T handle, char *filename, KMF_ENCODE_FORMAT *pformat)
{
KMF_PLUGIN *plugin;
KMF_RETURN (*IsCRLFileFn)(void *, char *, KMF_ENCODE_FORMAT *);
- KMF_RETURN ret;
+ KMF_RETURN ret = KMF_OK;
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
@@ -565,3 +648,50 @@ KMF_IsCRLFile(KMF_HANDLE_T handle, char *filename, KMF_ENCODE_FORMAT *pformat)
return (IsCRLFileFn(handle, filename, pformat));
}
+
+/*
+ * Phase 1 APIs still needed to maintain compat with elfsign.
+ */
+KMF_RETURN
+KMF_CreateCSRFile(KMF_DATA *csrdata, KMF_ENCODE_FORMAT format,
+ char *csrfile)
+{
+ return (kmf_create_csr_file(csrdata, format, csrfile));
+}
+
+KMF_RETURN
+KMF_SetCSRPubKey(KMF_HANDLE_T handle,
+ KMF_KEY_HANDLE *KMFKey,
+ KMF_CSR_DATA *Csr)
+{
+ return (kmf_set_csr_pubkey(handle, KMFKey, Csr));
+}
+
+KMF_RETURN
+KMF_SetCSRVersion(KMF_CSR_DATA *CsrData, uint32_t version)
+{
+ return (kmf_set_csr_version(CsrData, version));
+}
+
+KMF_RETURN
+KMF_SetCSRSignatureAlgorithm(KMF_CSR_DATA *CsrData,
+ KMF_ALGORITHM_INDEX sigAlg)
+{
+ return (kmf_set_csr_sig_alg(CsrData, sigAlg));
+}
+
+KMF_RETURN
+KMF_SignCSR(KMF_HANDLE_T handle,
+ const KMF_CSR_DATA *tbsCsr,
+ KMF_KEY_HANDLE *Signkey,
+ KMF_DATA *SignedCsr)
+{
+ return (kmf_sign_csr(handle, tbsCsr, Signkey, SignedCsr));
+}
+
+KMF_RETURN
+KMF_SetCSRSubjectName(KMF_CSR_DATA *CsrData,
+ KMF_X509_NAME *subject_name_ptr)
+{
+ return (kmf_set_csr_subject(CsrData, subject_name_ptr));
+}
diff --git a/usr/src/lib/libkmf/libkmf/common/generalop.c b/usr/src/lib/libkmf/libkmf/common/generalop.c
index 73b6d75611..38a72a3df4 100644
--- a/usr/src/lib/libkmf/libkmf/common/generalop.c
+++ b/usr/src/lib/libkmf/libkmf/common/generalop.c
@@ -152,6 +152,8 @@ KMF_PLUGIN_ITEM plugin_list[] = {
{KMF_KEYSTORE_NSS, KMF_PLUGIN_PATH "kmf_nss.so.1", FALSE}
};
+
+
static void free_extensions(KMF_X509_EXTENSIONS *extns);
KMF_RETURN
@@ -222,7 +224,7 @@ InitializePlugin(KMF_KEYSTORE_TYPE kstype, char *path, KMF_PLUGIN **plugin)
}
sym = (KMF_PLUGIN_FUNCLIST *(*)())dlsym(p->dldesc,
- KMF_PLUGIN_INIT_SYMBOL);
+ KMF_PLUGIN_INIT_SYMBOL);
if (sym == NULL) {
(void) dlclose(p->dldesc);
free(p->path);
@@ -254,7 +256,7 @@ AddPlugin(KMF_HANDLE_T handle, KMF_PLUGIN *plugin)
/* If the head is NULL, create it */
if (handle->plugins == NULL) {
handle->plugins = (KMF_PLUGIN_LIST *)malloc(
- sizeof (KMF_PLUGIN_LIST));
+ sizeof (KMF_PLUGIN_LIST));
if (handle->plugins == NULL)
return (KMF_ERR_MEMORY);
handle->plugins->plugin = plugin;
@@ -298,7 +300,7 @@ Cleanup_KMF_Handle(KMF_HANDLE_T handle)
handle->plugins = next;
}
- KMF_FreePolicyRecord(handle->policy);
+ kmf_free_policy_record(handle->policy);
free(handle->policy);
}
free(handle);
@@ -317,7 +319,7 @@ Cleanup_PK11_Session(KMF_HANDLE_T handle)
}
KMF_RETURN
-KMF_Initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
+kmf_initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
{
KMF_RETURN ret = KMF_OK;
KMF_HANDLE *handle = NULL;
@@ -336,7 +338,7 @@ KMF_Initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
handle->plugins = NULL;
/* Initialize the handle with the policy */
- ret = KMF_SetPolicy((void *)handle,
+ ret = kmf_set_policy((void *)handle,
policyfile == NULL ? KMF_DEFAULT_POLICY_FILE : policyfile,
policyname == NULL ? KMF_DEFAULT_POLICY_NAME : policyname);
if (ret != KMF_OK)
@@ -345,7 +347,7 @@ KMF_Initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
numitems = sizeof (plugin_list)/sizeof (KMF_PLUGIN_ITEM);
for (i = 0; i < numitems; i++) {
ret = InitializePlugin(plugin_list[i].kstype,
- plugin_list[i].path, &pluginrec);
+ plugin_list[i].path, &pluginrec);
if (ret != KMF_OK) {
cryptoerror(
plugin_list[i].critical ? LOG_WARNING : LOG_DEBUG,
@@ -376,31 +378,51 @@ errout:
}
KMF_RETURN
-KMF_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
+kmf_configure_keystore(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
+
if (ret != KMF_OK)
return (ret);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, params->kstype);
- if (plugin == NULL)
- return (KMF_ERR_PLUGIN_NOTFOUND);
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
- if (plugin->funclist->ConfigureKeystore != NULL)
- return (plugin->funclist->ConfigureKeystore(handle, params));
- else
+ plugin = FindPlugin(handle, kstype);
+ if (plugin != NULL && plugin->funclist->ConfigureKeystore != NULL) {
+ return (plugin->funclist->ConfigureKeystore(handle, num_args,
+ attrlist));
+ } else {
/* return KMF_OK, if the plugin does not have an entry */
return (KMF_OK);
+ }
}
KMF_RETURN
-KMF_Finalize(KMF_HANDLE_T handle)
+kmf_finalize(KMF_HANDLE_T handle)
{
KMF_RETURN ret = KMF_OK;
@@ -417,7 +439,7 @@ KMF_Finalize(KMF_HANDLE_T handle)
}
KMF_RETURN
-KMF_GetKMFErrorString(KMF_RETURN errcode, char **errmsg)
+kmf_get_kmf_error_str(KMF_RETURN errcode, char **errmsg)
{
KMF_RETURN ret = KMF_OK;
int i, maxerr;
@@ -428,7 +450,9 @@ KMF_GetKMFErrorString(KMF_RETURN errcode, char **errmsg)
*errmsg = NULL;
maxerr = sizeof (kmf_errcodes) / sizeof (kmf_error_map);
- for (i = 0; i < maxerr && errcode != kmf_errcodes[i].code; i++);
+ for (i = 0; i < maxerr && errcode != kmf_errcodes[i].code; i++)
+ /* empty body */
+ ;
if (i == maxerr)
return (KMF_ERR_MISSING_ERRCODE);
@@ -441,7 +465,7 @@ KMF_GetKMFErrorString(KMF_RETURN errcode, char **errmsg)
}
KMF_RETURN
-KMF_GetPluginErrorString(KMF_HANDLE_T handle, char **msgstr)
+kmf_get_plugin_error_str(KMF_HANDLE_T handle, char **msgstr)
{
KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
@@ -478,29 +502,6 @@ KMF_GetPluginErrorString(KMF_HANDLE_T handle, char **msgstr)
return (ret);
}
-KMF_RETURN
-KMF_DNParser(char *string, KMF_X509_NAME *name)
-{
- KMF_RETURN err;
-
- if (string == NULL || name == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- err = ParseDistinguishedName(string, (int)strlen(string), name);
- return (err);
-}
-
-KMF_RETURN
-KMF_DN2Der(KMF_X509_NAME *dn, KMF_DATA *der)
-{
- KMF_RETURN rv;
-
- if (dn == NULL || der == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- rv = DerEncodeName(dn, der);
- return (rv);
-}
#define SET_SYS_ERROR(h, c) if (h) {\
h->lasterr.kstype = -1;\
@@ -508,7 +509,7 @@ KMF_DN2Der(KMF_X509_NAME *dn, KMF_DATA *der)
}
KMF_RETURN
-KMF_ReadInputFile(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
+kmf_read_input_file(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
{
struct stat s;
long nread, total = 0;
@@ -561,7 +562,7 @@ KMF_ReadInputFile(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
/*
*
- * Name: KMF_Der2Pem
+ * Name: kmf_der_to_pem
*
* Description:
* Function for converting DER encoded format to PEM encoded format
@@ -581,7 +582,7 @@ KMF_ReadInputFile(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
*
*/
KMF_RETURN
-KMF_Der2Pem(KMF_OBJECT_TYPE type, unsigned char *data,
+kmf_der_to_pem(KMF_OBJECT_TYPE type, unsigned char *data,
int len, unsigned char **out, int *outlen)
{
@@ -596,7 +597,7 @@ KMF_Der2Pem(KMF_OBJECT_TYPE type, unsigned char *data,
/*
*
- * Name: KMF_Pem2Der
+ * Name: kmf_pem_to_der
*
* Description:
* Function for converting PEM encoded format to DER encoded format
@@ -615,7 +616,7 @@ KMF_Der2Pem(KMF_OBJECT_TYPE type, unsigned char *data,
*
*/
KMF_RETURN
-KMF_Pem2Der(unsigned char *in, int inlen,
+kmf_pem_to_der(unsigned char *in, int inlen,
unsigned char **out, int *outlen)
{
KMF_RETURN err;
@@ -627,7 +628,7 @@ KMF_Pem2Der(unsigned char *in, int inlen,
}
char *
-KMF_OID2String(KMF_OID *oid)
+kmf_oid_to_string(KMF_OID *oid)
{
char numstr[128];
uint32_t number;
@@ -811,7 +812,7 @@ check_for_pkcs12(uchar_t *buf, int buf_len)
}
KMF_RETURN
-KMF_GetFileFormat(char *filename, KMF_ENCODE_FORMAT *fmt)
+kmf_get_file_format(char *filename, KMF_ENCODE_FORMAT *fmt)
{
KMF_RETURN ret = KMF_OK;
KMF_DATA filebuf = {NULL, 0};
@@ -821,7 +822,7 @@ KMF_GetFileFormat(char *filename, KMF_ENCODE_FORMAT *fmt)
return (KMF_ERR_BAD_PARAMETER);
*fmt = 0;
- ret = KMF_ReadInputFile(NULL, filename, &filebuf);
+ ret = kmf_read_input_file(NULL, filename, &filebuf);
if (ret != KMF_OK)
return (ret);
@@ -845,12 +846,12 @@ KMF_GetFileFormat(char *filename, KMF_ENCODE_FORMAT *fmt)
}
end:
- KMF_FreeData(&filebuf);
+ kmf_free_data(&filebuf);
return (ret);
}
KMF_RETURN
-KMF_HexString2Bytes(unsigned char *hexstr, unsigned char **bytes,
+kmf_hexstr_to_bytes(unsigned char *hexstr, unsigned char **bytes,
size_t *outlen)
{
KMF_RETURN ret = KMF_OK;
@@ -863,11 +864,12 @@ KMF_HexString2Bytes(unsigned char *hexstr, unsigned char **bytes,
return (KMF_ERR_BAD_PARAMETER);
}
- if (hexstr[0] == '0' &&
- ((hexstr[1] == 'x') || (hexstr[1] == 'X')))
+ if (hexstr[0] == '0' && ((hexstr[1] == 'x') || (hexstr[1] == 'X')))
hexstr += 2;
- for (i = 0; i < strlen((char *)hexstr) && isxdigit(hexstr[i]); i++);
+ for (i = 0; i < strlen((char *)hexstr) && isxdigit(hexstr[i]); i++)
+ /* empty body */
+ ;
/*
* If all the characters are not legitimate hex chars,
* return an error.
@@ -914,7 +916,7 @@ out:
}
void
-KMF_FreeDN(KMF_X509_NAME *name)
+kmf_free_dn(KMF_X509_NAME *name)
{
KMF_X509_RDN *newrdn = NULL;
KMF_X509_TYPE_VALUE_PAIR *av = NULL;
@@ -925,8 +927,8 @@ KMF_FreeDN(KMF_X509_NAME *name)
newrdn = &name->RelativeDistinguishedName[i];
for (j = 0; j < newrdn->numberOfPairs; j++) {
av = &newrdn->AttributeTypeAndValue[j];
- KMF_FreeData(&av->type);
- KMF_FreeData(&av->value);
+ kmf_free_data(&av->type);
+ kmf_free_data(&av->value);
}
free(newrdn->AttributeTypeAndValue);
newrdn->numberOfPairs = 0;
@@ -939,7 +941,7 @@ KMF_FreeDN(KMF_X509_NAME *name)
}
void
-KMF_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
+kmf_free_kmf_cert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
{
KMF_PLUGIN *plugin;
KMF_RETURN ret;
@@ -959,7 +961,7 @@ KMF_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
}
void
-KMF_FreeData(KMF_DATA *datablock)
+kmf_free_data(KMF_DATA *datablock)
{
if (datablock != NULL && datablock->Data != NULL) {
free(datablock->Data);
@@ -969,52 +971,52 @@ KMF_FreeData(KMF_DATA *datablock)
}
void
-KMF_FreeAlgOID(KMF_X509_ALGORITHM_IDENTIFIER *algoid)
+kmf_free_algoid(KMF_X509_ALGORITHM_IDENTIFIER *algoid)
{
if (algoid == NULL)
return;
- KMF_FreeData(&algoid->algorithm);
- KMF_FreeData(&algoid->parameters);
+ kmf_free_data(&algoid->algorithm);
+ kmf_free_data(&algoid->parameters);
}
void
-KMF_FreeExtension(KMF_X509_EXTENSION *exptr)
+kmf_free_extn(KMF_X509_EXTENSION *exptr)
{
if (exptr == NULL)
return;
- KMF_FreeData((KMF_DATA *)&exptr->extnId);
- KMF_FreeData(&exptr->BERvalue);
+ kmf_free_data((KMF_DATA *)&exptr->extnId);
+ kmf_free_data(&exptr->BERvalue);
if (exptr->value.tagAndValue) {
- KMF_FreeData(&exptr->value.tagAndValue->value);
+ kmf_free_data(&exptr->value.tagAndValue->value);
free(exptr->value.tagAndValue);
}
}
void
-KMF_FreeTBSCSR(KMF_TBS_CSR *tbscsr)
+kmf_free_tbs_csr(KMF_TBS_CSR *tbscsr)
{
if (tbscsr) {
- KMF_FreeData(&tbscsr->version);
+ kmf_free_data(&tbscsr->version);
- KMF_FreeDN(&tbscsr->subject);
+ kmf_free_dn(&tbscsr->subject);
- KMF_FreeAlgOID(&tbscsr->subjectPublicKeyInfo.algorithm);
- KMF_FreeData(&tbscsr->subjectPublicKeyInfo.subjectPublicKey);
+ kmf_free_algoid(&tbscsr->subjectPublicKeyInfo.algorithm);
+ kmf_free_data(&tbscsr->subjectPublicKeyInfo.subjectPublicKey);
free_extensions(&tbscsr->extensions);
}
}
void
-KMF_FreeSignedCSR(KMF_CSR_DATA *csr)
+kmf_free_signed_csr(KMF_CSR_DATA *csr)
{
if (csr) {
- KMF_FreeTBSCSR(&csr->csr);
+ kmf_free_tbs_csr(&csr->csr);
- KMF_FreeAlgOID(&csr->signature.algorithmIdentifier);
- KMF_FreeData(&csr->signature.encrypted);
+ kmf_free_algoid(&csr->signature.algorithmIdentifier);
+ kmf_free_data(&csr->signature.encrypted);
}
}
@@ -1023,8 +1025,8 @@ free_validity(KMF_X509_VALIDITY *validity)
{
if (validity == NULL)
return;
- KMF_FreeData(&validity->notBefore.time);
- KMF_FreeData(&validity->notAfter.time);
+ kmf_free_data(&validity->notBefore.time);
+ kmf_free_data(&validity->notAfter.time);
}
static void
@@ -1036,7 +1038,7 @@ free_extensions(KMF_X509_EXTENSIONS *extns)
if (extns && extns->numberOfExtensions > 0) {
for (i = 0; i < extns->numberOfExtensions; i++) {
exptr = &extns->extensions[i];
- KMF_FreeExtension(exptr);
+ kmf_free_extn(exptr);
}
free(extns->extensions);
extns->numberOfExtensions = 0;
@@ -1045,45 +1047,45 @@ free_extensions(KMF_X509_EXTENSIONS *extns)
}
void
-KMF_FreeTBSCert(KMF_X509_TBS_CERT *tbscert)
+kmf_free_tbs_cert(KMF_X509_TBS_CERT *tbscert)
{
if (tbscert) {
- KMF_FreeData(&tbscert->version);
- KMF_FreeBigint(&tbscert->serialNumber);
- KMF_FreeAlgOID(&tbscert->signature);
+ kmf_free_data(&tbscert->version);
+ kmf_free_bigint(&tbscert->serialNumber);
+ kmf_free_algoid(&tbscert->signature);
- KMF_FreeDN(&tbscert->issuer);
- KMF_FreeDN(&tbscert->subject);
+ kmf_free_dn(&tbscert->issuer);
+ kmf_free_dn(&tbscert->subject);
free_validity(&tbscert->validity);
- KMF_FreeData(&tbscert->issuerUniqueIdentifier);
- KMF_FreeData(&tbscert->subjectUniqueIdentifier);
+ kmf_free_data(&tbscert->issuerUniqueIdentifier);
+ kmf_free_data(&tbscert->subjectUniqueIdentifier);
- KMF_FreeAlgOID(&tbscert->subjectPublicKeyInfo.algorithm);
- KMF_FreeData(&tbscert->subjectPublicKeyInfo.subjectPublicKey);
+ kmf_free_algoid(&tbscert->subjectPublicKeyInfo.algorithm);
+ kmf_free_data(&tbscert->subjectPublicKeyInfo.subjectPublicKey);
free_extensions(&tbscert->extensions);
- KMF_FreeData(&tbscert->issuerUniqueIdentifier);
- KMF_FreeData(&tbscert->subjectUniqueIdentifier);
+ kmf_free_data(&tbscert->issuerUniqueIdentifier);
+ kmf_free_data(&tbscert->subjectUniqueIdentifier);
}
}
void
-KMF_FreeSignedCert(KMF_X509_CERTIFICATE *certptr)
+kmf_free_signed_cert(KMF_X509_CERTIFICATE *certptr)
{
if (!certptr)
return;
- KMF_FreeTBSCert(&certptr->certificate);
+ kmf_free_tbs_cert(&certptr->certificate);
- KMF_FreeAlgOID(&certptr->signature.algorithmIdentifier);
- KMF_FreeData(&certptr->signature.encrypted);
+ kmf_free_algoid(&certptr->signature.algorithmIdentifier);
+ kmf_free_data(&certptr->signature.encrypted);
}
void
-KMF_FreeString(char *pstr)
+kmf_free_str(char *pstr)
{
if (pstr != NULL)
free(pstr);
@@ -1094,54 +1096,61 @@ free_keyidlist(KMF_OID *oidlist, int len)
{
int i;
for (i = 0; i < len; i++) {
- KMF_FreeData((KMF_DATA *)&oidlist[i]);
+ kmf_free_data((KMF_DATA *)&oidlist[i]);
}
free(oidlist);
}
void
-KMF_FreeEKU(KMF_X509EXT_EKU *eptr)
+kmf_free_eku(KMF_X509EXT_EKU *eptr)
{
- if (eptr && eptr->nEKUs > 0 &&
- eptr->keyPurposeIdList != NULL)
+ if (eptr && eptr->nEKUs > 0 && eptr->keyPurposeIdList != NULL)
free_keyidlist(eptr->keyPurposeIdList, eptr->nEKUs);
}
void
-KMF_FreeSPKI(KMF_X509_SPKI *spki)
+kmf_free_spki(KMF_X509_SPKI *spki)
{
if (spki != NULL) {
- KMF_FreeAlgOID(&spki->algorithm);
- KMF_FreeData(&spki->subjectPublicKey);
+ kmf_free_algoid(&spki->algorithm);
+ kmf_free_data(&spki->subjectPublicKey);
}
}
void
-KMF_FreeKMFKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
+kmf_free_kmf_key(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
{
KMF_PLUGIN *plugin;
KMF_RETURN ret;
+ KMF_ATTRIBUTE attlist[2]; /* only 2 attributes for DeleteKey op */
+ int i = 0;
+ boolean_t token_destroy = B_FALSE;
+
+ if (key == NULL)
+ return;
CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return;
- if (key == NULL)
- return;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DESTROY_BOOL_ATTR, &token_destroy, sizeof (boolean_t));
+ i++;
plugin = FindPlugin(handle, key->kstype);
if (plugin != NULL && plugin->funclist->DeleteKey != NULL) {
- (void) plugin->funclist->DeleteKey(handle, NULL, key, FALSE);
+ (void) plugin->funclist->DeleteKey(handle, i, attlist);
}
- if (key == NULL)
- return;
-
if (key->keylabel)
free(key->keylabel);
if (key->israw) {
- KMF_FreeRawKey(key->keyp);
+ kmf_free_raw_key(key->keyp);
free(key->keyp);
}
@@ -1149,7 +1158,7 @@ KMF_FreeKMFKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
}
void
-KMF_FreeBigint(KMF_BIGINT *big)
+kmf_free_bigint(KMF_BIGINT *big)
{
if (big != NULL && big->val != NULL) {
/* Clear it out before returning it to the pool */
@@ -1165,14 +1174,14 @@ free_raw_rsa(KMF_RAW_RSA_KEY *key)
{
if (key == NULL)
return;
- KMF_FreeBigint(&key->mod);
- KMF_FreeBigint(&key->pubexp);
- KMF_FreeBigint(&key->priexp);
- KMF_FreeBigint(&key->prime1);
- KMF_FreeBigint(&key->prime2);
- KMF_FreeBigint(&key->exp1);
- KMF_FreeBigint(&key->exp2);
- KMF_FreeBigint(&key->coef);
+ kmf_free_bigint(&key->mod);
+ kmf_free_bigint(&key->pubexp);
+ kmf_free_bigint(&key->priexp);
+ kmf_free_bigint(&key->prime1);
+ kmf_free_bigint(&key->prime2);
+ kmf_free_bigint(&key->exp1);
+ kmf_free_bigint(&key->exp2);
+ kmf_free_bigint(&key->coef);
}
static void
@@ -1180,10 +1189,10 @@ free_raw_dsa(KMF_RAW_DSA_KEY *key)
{
if (key == NULL)
return;
- KMF_FreeBigint(&key->prime);
- KMF_FreeBigint(&key->subprime);
- KMF_FreeBigint(&key->base);
- KMF_FreeBigint(&key->value);
+ kmf_free_bigint(&key->prime);
+ kmf_free_bigint(&key->subprime);
+ kmf_free_bigint(&key->base);
+ kmf_free_bigint(&key->value);
}
static void
@@ -1191,11 +1200,11 @@ free_raw_sym(KMF_RAW_SYM_KEY *key)
{
if (key == NULL)
return;
- KMF_FreeBigint(&key->keydata);
+ kmf_free_bigint(&key->keydata);
}
void
-KMF_FreeRawKey(KMF_RAW_KEY_DATA *key)
+kmf_free_raw_key(KMF_RAW_KEY_DATA *key)
{
if (key == NULL)
return;
@@ -1217,11 +1226,11 @@ KMF_FreeRawKey(KMF_RAW_KEY_DATA *key)
}
void
-KMF_FreeRawSymKey(KMF_RAW_SYM_KEY *key)
+kmf_free_raw_sym_key(KMF_RAW_SYM_KEY *key)
{
if (key == NULL)
return;
- KMF_FreeBigint(&key->keydata);
+ kmf_free_bigint(&key->keydata);
free(key);
}
@@ -1246,7 +1255,7 @@ free_dp_name(KMF_CRL_DIST_POINT *dp)
for (i = 0; i < fullname->number; i++) {
urldata = &(fullname->namelist[fullname->number - 1].name);
- KMF_FreeData(urldata);
+ kmf_free_data(urldata);
}
free(fullname->namelist);
@@ -1262,7 +1271,7 @@ free_dp(KMF_CRL_DIST_POINT *dp)
return;
free_dp_name(dp);
- KMF_FreeData(&(dp->reasons));
+ kmf_free_data(&(dp->reasons));
/* Need not to free crl_issuer space at phase 1 */
}
@@ -1270,7 +1279,7 @@ free_dp(KMF_CRL_DIST_POINT *dp)
* This function frees space for a KMF_X509EXT_CRLDISTPOINTS internally.
*/
void
-KMF_FreeCRLDistributionPoints(KMF_X509EXT_CRLDISTPOINTS *crl_dps)
+kmf_free_crl_dist_pts(KMF_X509EXT_CRLDISTPOINTS *crl_dps)
{
int i;
@@ -1284,23 +1293,37 @@ KMF_FreeCRLDistributionPoints(KMF_X509EXT_CRLDISTPOINTS *crl_dps)
}
KMF_RETURN
-KMF_CreateOCSPRequest(KMF_HANDLE_T handle, KMF_OCSPREQUEST_PARAMS *params,
- char *reqfile)
+kmf_create_ocsp_request(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
- KMF_RETURN (*createReqFn)(void *, KMF_OCSPREQUEST_PARAMS *params,
- char *reqfile);
- KMF_RETURN ret;
+ KMF_RETURN (*createReqFn)(void *, int num_args,
+ KMF_ATTRIBUTE *attrlist);
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_OCSP_REQUEST_FILENAME_ATTR, FALSE, 1, 0},
+ {KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ };
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- if (params == NULL ||
- reqfile == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
+
+ if (ret != KMF_OK)
+ return (ret);
+
/*
* This framework function is actually implemented in the openssl
* plugin library, so we find the function address and call it.
@@ -1316,28 +1339,48 @@ KMF_CreateOCSPRequest(KMF_HANDLE_T handle, KMF_OCSPREQUEST_PARAMS *params,
return (KMF_ERR_FUNCTION_NOT_FOUND);
}
- return (createReqFn(handle, params, reqfile));
+ return (createReqFn(handle, num_args, attrlist));
+
}
KMF_RETURN
-KMF_GetOCSPStatusForCert(KMF_HANDLE_T handle,
- KMF_OCSPRESPONSE_PARAMS_INPUT *params_in,
- KMF_OCSPRESPONSE_PARAMS_OUTPUT *params_out)
+kmf_get_ocsp_status_for_cert(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
- KMF_RETURN (*getCertStatusFn)(void *,
- KMF_OCSPRESPONSE_PARAMS_INPUT *params_in,
- KMF_OCSPRESPONSE_PARAMS_OUTPUT *params_out);
- KMF_RETURN ret;
+ KMF_RETURN (*getCertStatusFn)(void *, int num_args,
+ KMF_ATTRIBUTE *attrlist);
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_USER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_ISSUER_CERT_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_OCSP_RESPONSE_DATA_ATTR, FALSE, sizeof (KMF_DATA),
+ sizeof (KMF_DATA)},
+ {KMF_OCSP_RESPONSE_STATUS_ATTR, FALSE, sizeof (int),
+ sizeof (uint32_t)},
+ {KMF_OCSP_RESPONSE_REASON_ATTR, FALSE, sizeof (int),
+ sizeof (uint32_t)},
+ {KMF_OCSP_RESPONSE_CERT_STATUS_ATTR, FALSE, sizeof (int),
+ sizeof (uint32_t)},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
- if (params_in == NULL ||
- params_out == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ if (ret != KMF_OK)
+ return (ret);
/*
* This framework function is actually implemented in the openssl
@@ -1354,11 +1397,12 @@ KMF_GetOCSPStatusForCert(KMF_HANDLE_T handle,
return (KMF_ERR_INTERNAL);
}
- return (getCertStatusFn(handle, params_in, params_out));
+ return (getCertStatusFn(handle, num_args, attrlist));
+
}
KMF_RETURN
-KMF_String2OID(char *oidstring, KMF_OID *oid)
+kmf_string_to_oid(char *oidstring, KMF_OID *oid)
{
KMF_RETURN rv = KMF_OK;
char *cp, *bp, *startp;
@@ -1469,7 +1513,7 @@ encode_rid(char *name, KMF_DATA *derdata)
if (name == NULL || derdata == NULL)
return (KMF_ERR_BAD_PARAMETER);
- rv = KMF_String2OID(name, (KMF_OID *)derdata);
+ rv = kmf_string_to_oid(name, (KMF_OID *)derdata);
return (rv);
}
@@ -1589,11 +1633,11 @@ encode_altname(char *namedata,
tagval = (0x80 | nametype);
break;
case GENNAME_DIRECTORYNAME:
- ret = KMF_DNParser(namedata, &dnname);
+ ret = kmf_dn_parser(namedata, &dnname);
if (ret == KMF_OK) {
- ret = KMF_DN2Der(&dnname, encodedname);
+ ret = DerEncodeName(&dnname, encodedname);
}
- (void) KMF_FreeDN(&dnname);
+ (void) kmf_free_dn(&dnname);
tagval = (0xA0 | nametype);
break;
default:
@@ -1602,19 +1646,18 @@ encode_altname(char *namedata,
}
if (ret != KMF_OK) {
- KMF_FreeData(encodedname);
+ kmf_free_data(encodedname);
return (ret);
}
if ((asn1 = kmfder_alloc()) == NULL)
return (KMF_ERR_MEMORY);
- if (kmfber_printf(asn1, "Tl",
- tagval, encodedname->Length) == -1)
+ if (kmfber_printf(asn1, "Tl", tagval, encodedname->Length) == -1)
goto cleanup;
if (kmfber_write(asn1, (char *)encodedname->Data,
- encodedname->Length, 0) == -1) {
+ encodedname->Length, 0) == -1) {
ret = KMF_ERR_ENCODING;
goto cleanup;
}
@@ -1623,7 +1666,7 @@ encode_altname(char *namedata,
goto cleanup;
}
- KMF_FreeData(encodedname);
+ kmf_free_data(encodedname);
encodedname->Data = (uchar_t *)extdata->bv_val;
encodedname->Length = extdata->bv_len;
@@ -1634,7 +1677,7 @@ cleanup:
kmfber_free(asn1, 1);
if (ret != KMF_OK)
- KMF_FreeData(encodedname);
+ kmf_free_data(encodedname);
return (ret);
}
@@ -1690,7 +1733,7 @@ GetSequenceContents(char *data, size_t len,
* then consume them ("{").
*/
if (kmfber_scanf(exasn1, "tl{", &tag, &oldsize) == KMFBER_DEFAULT ||
- oldsize == 0) {
+ oldsize == 0) {
ret = KMF_ERR_ENCODING;
goto out;
}
@@ -1735,7 +1778,7 @@ add_an_extension(KMF_X509_EXTENSIONS *exts, KMF_X509_EXTENSION *newextn)
return (KMF_ERR_BAD_PARAMETER);
extlist = malloc(sizeof (KMF_X509_EXTENSION) *
- (exts->numberOfExtensions + 1));
+ (exts->numberOfExtensions + 1));
if (extlist == NULL)
return (KMF_ERR_MEMORY);
@@ -1743,7 +1786,7 @@ add_an_extension(KMF_X509_EXTENSIONS *exts, KMF_X509_EXTENSION *newextn)
exts->numberOfExtensions * sizeof (KMF_X509_EXTENSION));
(void) memcpy(&extlist[exts->numberOfExtensions], newextn,
- sizeof (KMF_X509_EXTENSION));
+ sizeof (KMF_X509_EXTENSION));
free(exts->extensions);
exts->numberOfExtensions++;
@@ -1753,7 +1796,7 @@ add_an_extension(KMF_X509_EXTENSIONS *exts, KMF_X509_EXTENSION *newextn)
}
KMF_RETURN
-KMF_SetAltName(KMF_X509_EXTENSIONS *extensions,
+kmf_set_altname(KMF_X509_EXTENSIONS *extensions,
KMF_OID *oid,
int critical,
KMF_GENERALNAMECHOICES nametype,
@@ -1788,9 +1831,9 @@ KMF_SetAltName(KMF_X509_EXTENSIONS *extensions,
if (foundextn != NULL) {
ret = GetSequenceContents(
- (char *)foundextn->BERvalue.Data,
- foundextn->BERvalue.Length,
- &olddata, &oldsize);
+ (char *)foundextn->BERvalue.Data,
+ foundextn->BERvalue.Length,
+ &olddata, &oldsize);
if (ret != KMF_OK)
goto out;
}
@@ -1854,10 +1897,380 @@ out:
if (olddata != NULL)
free(olddata);
- KMF_FreeData(&dername);
+ kmf_free_data(&dername);
if (ret != KMF_OK)
- KMF_FreeData(&subjAltName.extnId);
+ kmf_free_data(&subjAltName.extnId);
if (asn1 != NULL)
kmfber_free(asn1, 1);
return (ret);
}
+
+/*
+ * Search a list of attributes for one that matches the given type.
+ * Return a pointer into the attribute list. This does not
+ * return a copy of the value, it returns a reference into the
+ * given list.
+ */
+int
+kmf_find_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist, int numattrs)
+{
+ int i;
+ for (i = 0; i < numattrs; i++) {
+ if (attlist[i].type == type)
+ return (i);
+ }
+ return (-1);
+}
+
+/*
+ * Verify that a given attribute is consistent with the
+ * "test" attribute.
+ */
+static KMF_RETURN
+verify_attribute(KMF_ATTRIBUTE *givenattr,
+ KMF_ATTRIBUTE_TESTER *testattr)
+{
+ /* A NULL pValue was found where one is required */
+ if (testattr->null_value_ok == FALSE &&
+ givenattr->pValue == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* If the given valueLen is too small, return error */
+ if (givenattr->pValue != NULL &&
+ testattr->minlen > 0 &&
+ (givenattr->valueLen < testattr->minlen))
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* If the given valueLen is too big, return error */
+ if (givenattr->pValue != NULL &&
+ testattr->maxlen > 0 &&
+ (givenattr->valueLen > testattr->maxlen))
+ return (KMF_ERR_BAD_PARAMETER);
+
+ return (KMF_OK);
+}
+
+/*
+ * Given a set of required attribute tests and optional
+ * attributes, make sure that the actual attributes
+ * being tested (attrlist below) are allowed and are
+ * properly specified.
+ */
+KMF_RETURN
+test_attributes(int reqnum, KMF_ATTRIBUTE_TESTER *reqattrs,
+ int optnum, KMF_ATTRIBUTE_TESTER *optattrs,
+ int numattrs, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ int i, idx;
+
+ /*
+ * If the caller didn't supply enough attributes,
+ * return an error.
+ */
+ if (numattrs < reqnum || attrlist == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /*
+ * Make sure all required attrs are present and
+ * correct.
+ */
+ for (i = 0; i < reqnum && ret == KMF_OK; i++) {
+ idx = kmf_find_attr(reqattrs[i].type, attrlist, numattrs);
+ /* If a required attr is not found, return error */
+ if (idx == -1) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = verify_attribute(&attrlist[idx], &reqattrs[i]);
+ }
+ /*
+ * Now test the optional parameters.
+ */
+ for (i = 0; i < optnum && ret == KMF_OK; i++) {
+ idx = kmf_find_attr(optattrs[i].type, attrlist, numattrs);
+ /* If a optional attr is not found, continue. */
+ if (idx == -1) {
+ continue;
+ }
+
+ ret = verify_attribute(&attrlist[idx], &optattrs[i]);
+ }
+
+ return (ret);
+}
+
+/*
+ * Given an already allocated attribute list, insert
+ * the given attribute information at a specific index
+ * in the list.
+ */
+void
+kmf_set_attr_at_index(KMF_ATTRIBUTE *attlist, int index,
+ KMF_ATTR_TYPE type, void *pValue, uint32_t len)
+{
+ if (attlist == NULL)
+ return;
+
+ attlist[index].type = type;
+ attlist[index].pValue = pValue;
+ attlist[index].valueLen = len;
+}
+
+/*
+ * Find an attribute matching a particular type and set
+ * the pValue and length fields to the given values.
+ */
+KMF_RETURN
+kmf_set_attr(KMF_ATTRIBUTE *attlist, int numattr,
+ KMF_ATTR_TYPE type, void *pValue, uint32_t len)
+{
+ int idx;
+ if (attlist == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ idx = kmf_find_attr(type, attlist, numattr);
+ if (idx == -1)
+ return (KMF_ERR_ATTR_NOT_FOUND);
+
+ attlist[idx].type = type;
+ /* Assumes the attribute pValue can hold the result */
+ if (attlist[idx].pValue != NULL) {
+ if (attlist[idx].valueLen >= len)
+ (void) memcpy(attlist[idx].pValue, pValue, len);
+ else
+ return (KMF_ERR_BUFFER_SIZE);
+ }
+ attlist[idx].valueLen = len;
+ return (KMF_OK);
+}
+
+/*
+ * Find a particular attribute in a list and return
+ * a pointer to its value.
+ */
+void *
+kmf_get_attr_ptr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
+ int numattrs)
+{
+ int i;
+
+ i = kmf_find_attr(type, attlist, numattrs);
+ if (i == -1)
+ return (NULL);
+
+ return (attlist[i].pValue);
+}
+
+/*
+ * Find a particular attribute in a list and return
+ * the value and length values. Value and length
+ * may be NULL if the caller doesn't want their values
+ * to be filled in.
+ */
+KMF_RETURN
+kmf_get_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attlist,
+ int numattrs, void *outValue, uint32_t *outlen)
+{
+ int i;
+ uint32_t len = 0;
+ uint32_t *lenptr = outlen;
+
+ if (lenptr == NULL)
+ lenptr = &len;
+
+ i = kmf_find_attr(type, attlist, numattrs);
+ if (i == -1)
+ return (KMF_ERR_ATTR_NOT_FOUND);
+
+ /* This assumes that the ptr passed in is pre-allocated space */
+ if (attlist[i].pValue != NULL && outValue != NULL) {
+ /*
+ * If the caller did not specify a length,
+ * assume "outValue" is big enough.
+ */
+ if (outlen != NULL) {
+ if (*outlen >= attlist[i].valueLen)
+ (void) memcpy(outValue, attlist[i].pValue,
+ attlist[i].valueLen);
+ else
+ return (KMF_ERR_BUFFER_SIZE);
+ } else {
+ (void) memcpy(outValue, attlist[i].pValue,
+ attlist[i].valueLen);
+ }
+ }
+
+ if (outlen != NULL)
+ *outlen = attlist[i].valueLen;
+ return (KMF_OK);
+}
+
+/*
+ * Utility routine to find a string type attribute, allocate it
+ * and return the value to the caller. This simplifies the
+ * operation by doing both "kmf_get_attr" calls and avoids
+ * duplicating this block of code in lots of places.
+ */
+KMF_RETURN
+kmf_get_string_attr(KMF_ATTR_TYPE type, KMF_ATTRIBUTE *attrlist,
+ int numattrs, char **outstr)
+{
+ KMF_RETURN rv;
+ uint32_t len;
+
+ if (outstr == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ if ((rv = kmf_get_attr(type, attrlist, numattrs, NULL, &len)) ==
+ KMF_OK) {
+ *outstr = malloc(len + 1);
+ if ((*outstr) == NULL)
+ return (KMF_ERR_MEMORY);
+ (void) memset((*outstr), 0, len + 1);
+ rv = kmf_get_attr(type, attrlist, numattrs, (*outstr), &len);
+ if (rv != KMF_OK) {
+ free(*outstr);
+ *outstr = NULL;
+ }
+ }
+
+ return (rv);
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+KMF_RETURN
+KMF_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
+{
+
+ KMF_ATTRIBUTE attlist[32];
+ int i = 0;
+
+ if (params == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
+ i++;
+
+ if (params->kstype == KMF_KEYSTORE_NSS) {
+ if (params->nssconfig.configdir != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DIRPATH_ATTR,
+ params->nssconfig.configdir,
+ strlen(params->nssconfig.configdir));
+ i++;
+ }
+ if (params->nssconfig.certPrefix != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CERTPREFIX_ATTR,
+ params->nssconfig.certPrefix,
+ strlen(params->nssconfig.certPrefix));
+ i++;
+ }
+ if (params->nssconfig.keyPrefix != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYPREFIX_ATTR,
+ params->nssconfig.keyPrefix,
+ strlen(params->nssconfig.keyPrefix));
+ i++;
+ }
+ if (params->nssconfig.secModName != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_SECMODNAME_ATTR,
+ params->nssconfig.secModName,
+ strlen(params->nssconfig.secModName));
+ i++;
+ }
+ } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
+ if (params->pkcs11config.label != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_LABEL_ATTR,
+ params->pkcs11config.label,
+ strlen(params->pkcs11config.label));
+ i++;
+ }
+ kmf_set_attr_at_index(attlist, i,
+ KMF_READONLY_ATTR,
+ &params->pkcs11config.readonly,
+ sizeof (params->pkcs11config.readonly));
+ i++;
+ }
+
+ return (kmf_configure_keystore(handle, i, attlist));
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+KMF_RETURN
+KMF_Initialize(KMF_HANDLE_T *outhandle, char *policyfile, char *policyname)
+{
+ return (kmf_initialize(outhandle, policyfile, policyname));
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+KMF_RETURN
+KMF_Finalize(KMF_HANDLE_T handle)
+{
+ return (kmf_finalize(handle));
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+KMF_RETURN
+KMF_GetKMFErrorString(KMF_RETURN errcode, char **errmsg)
+{
+ return (kmf_get_kmf_error_str(errcode, errmsg));
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+KMF_RETURN
+KMF_ReadInputFile(KMF_HANDLE_T handle, char *filename, KMF_DATA *pdata)
+{
+ return (kmf_read_input_file(handle, filename, pdata));
+}
+
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+void
+KMF_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
+{
+ kmf_free_kmf_cert(handle, kmf_cert);
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+void
+KMF_FreeData(KMF_DATA *datablock)
+{
+ kmf_free_data(datablock);
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+void
+KMF_FreeKMFKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key)
+{
+ kmf_free_kmf_key(handle, key);
+}
+
+/*
+ * This API is used by elfsign. We must keep it in old API form.
+ */
+void
+KMF_FreeSignedCSR(KMF_CSR_DATA *csr)
+{
+ kmf_free_signed_csr(csr);
+}
diff --git a/usr/src/lib/libkmf/libkmf/common/keyop.c b/usr/src/lib/libkmf/libkmf/common/keyop.c
index 42781ecf52..a6eca064f2 100644
--- a/usr/src/lib/libkmf/libkmf/common/keyop.c
+++ b/usr/src/lib/libkmf/libkmf/common/keyop.c
@@ -37,211 +37,112 @@
#include <libgen.h>
#include <cryptoutil.h>
-/*
- *
- * Name: KMF_SignDataWithKey
- *
- * Description:
- * This function signs a block of data using the private key
- * and returns the signature in output
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * key(input) - contains private key handle needed for signing
- * AlgOID(input) - contains algorithm to be used for signing
- * tobesigned(input) - pointer to a KMF_DATA structure containing
- * the data to be signed
- * output(output) - pointer to the KMF_DATA structure containing the
- * signed data
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
- */
KMF_RETURN
-KMF_SignDataWithKey(KMF_HANDLE_T handle,
- KMF_KEY_HANDLE *key,
- KMF_OID *AlgOID,
- KMF_DATA *tobesigned,
- KMF_DATA *output)
+kmf_create_keypair(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN ret;
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
- KMF_ALGORITHM_INDEX AlgId;
- KMF_DATA signature = {0, NULL};
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
-
- if (key == NULL || AlgOID == NULL ||
- tobesigned == NULL || output == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- /*
- * The plugin must be based on the key since private keys
- * cannot be extracted.
- */
- plugin = FindPlugin(handle, key->kstype);
- if (plugin != NULL && plugin->funclist->SignData != NULL) {
- ret = plugin->funclist->SignData(handle, key,
- AlgOID, tobesigned, output);
- if (ret != KMF_OK)
- goto cleanup;
-
- AlgId = X509_AlgorithmOidToAlgId(AlgOID);
-
- /*
- * For DSA, NSS returns an encoded signature. Decode the
- * signature as DSA signature should be 40-byte long.
- */
- if ((AlgId == KMF_ALGID_SHA1WithDSA) &&
- (plugin->type == KMF_KEYSTORE_NSS)) {
- ret = DerDecodeDSASignature(output, &signature);
- if (ret != KMF_OK) {
- goto cleanup;
- } else {
- output->Length = signature.Length;
- (void) memcpy(output->Data, signature.Data,
- signature.Length);
- }
- } else if (AlgId == KMF_ALGID_NONE) {
- ret = KMF_ERR_BAD_ALGORITHM;
- }
- } else {
- return (KMF_ERR_PLUGIN_NOTFOUND);
- }
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_PRIVKEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
+ sizeof (KMF_KEY_HANDLE)},
+ {KMF_PUBKEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
+ sizeof (KMF_KEY_HANDLE)},
+ };
-cleanup:
- if (signature.Data)
- free(signature.Data);
- return (ret);
-}
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
-/*
- *
- * Name: KMF_VerifyDataWithKey
- *
- * Description:
- * This function verifies the signature of a block of data
- * using the input public key
- *
- * Parameters:
- * handle(input) - opaque handle for KMF session
- * KMFKey(input) - holds public key information for verification
- * sigAlg(input) - algorithm to verify
- * indata(input) - pointer to the block of data whose signature
- * is to be verified
- * insig(input) - pointer to the signature to be verified
- *
- * Returns:
- * A KMF_RETURN value indicating success or specifying a particular
- * error condition.
- * The value KMF_OK indicates success. All other values represent
- * an error condition.
- *
- */
-KMF_RETURN
-KMF_VerifyDataWithKey(KMF_HANDLE_T handle,
- KMF_KEY_HANDLE *KMFKey,
- KMF_ALGORITHM_INDEX sigAlg,
- KMF_DATA *indata,
- KMF_DATA *insig)
-{
- KMF_RETURN err;
- KMF_DATA derkey = {0, NULL};
- KMF_PLUGIN *plugin;
-
- CLEAR_ERROR(handle, err);
- if (err != KMF_OK)
- return (err);
-
- if (KMFKey == NULL ||
- indata == NULL || insig == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- plugin = FindPlugin(handle, KMFKey->kstype);
-
- /* Retrieve public key data from keystore */
- if (plugin != NULL && plugin->funclist->EncodePubkeyData != NULL) {
- err = plugin->funclist->EncodePubkeyData(handle,
- KMFKey, &derkey);
- } else {
- return (KMF_ERR_PLUGIN_NOTFOUND);
- }
-
- err = VerifyDataWithKey(handle, &derkey, sigAlg, indata, insig);
-
- if (derkey.Data != NULL)
- free(derkey.Data);
-
- return (err);
-}
+ CLEAR_ERROR(handle, ret);
-KMF_RETURN
-KMF_CreateKeypair(KMF_HANDLE_T handle,
- KMF_CREATEKEYPAIR_PARAMS *params,
- KMF_KEY_HANDLE *privKey,
- KMF_KEY_HANDLE *pubKey)
-{
- KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
- CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (params == NULL ||
- privKey == NULL || pubKey == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- (void) memset(privKey, 0, sizeof (KMF_KEY_HANDLE));
- (void) memset(pubKey, 0, sizeof (KMF_KEY_HANDLE));
- plugin = FindPlugin(handle, params->kstype);
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
+ plugin = FindPlugin(handle, kstype);
if (plugin != NULL && plugin->funclist->CreateKeypair != NULL) {
- return (plugin->funclist->CreateKeypair(handle, params,
- privKey, pubKey));
+ return (plugin->funclist->CreateKeypair(handle, num_args,
+ attrlist));
} else {
return (KMF_ERR_PLUGIN_NOTFOUND);
}
}
KMF_RETURN
-KMF_DeleteKeyFromKeystore(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
- KMF_KEY_HANDLE *key)
+kmf_delete_key_from_keystore(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN rv = KMF_OK;
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
+ KMF_KEY_HANDLE *key;
+
- CLEAR_ERROR(handle, rv);
- if (rv != KMF_OK)
- return (rv);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_KEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
+ sizeof (KMF_KEY_HANDLE)},
+ };
- if (key == NULL || params == NULL)
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- plugin = FindPlugin(handle, params->kstype);
+ CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
+
+ if (ret != KMF_OK)
+ return (ret);
+
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
+
+ plugin = FindPlugin(handle, kstype);
if (plugin != NULL && plugin->funclist->DeleteKey != NULL) {
- rv = plugin->funclist->DeleteKey(handle, params, key, TRUE);
+ ret = plugin->funclist->DeleteKey(handle, num_args, attrlist);
} else {
- rv = KMF_ERR_PLUGIN_NOTFOUND;
+ ret = KMF_ERR_PLUGIN_NOTFOUND;
}
- if (rv == KMF_OK) {
+ if (ret == KMF_OK) {
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, num_args);
+ if (key == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
if (key->keylabel != NULL)
free(key->keylabel);
if (key->israw && key->keyp != NULL) {
if (key->keyclass == KMF_ASYM_PUB ||
key->keyclass == KMF_ASYM_PRI) {
- KMF_FreeRawKey(key->keyp);
+ kmf_free_raw_key(key->keyp);
free(key->keyp);
} else if (key->keyclass == KMF_SYMMETRIC) {
- KMF_FreeRawSymKey(key->keyp);
+ kmf_free_raw_sym_key(key->keyp);
}
/* Else we don't know how to free the memory. */
}
@@ -249,107 +150,101 @@ KMF_DeleteKeyFromKeystore(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
(void) memset(key, 0, sizeof (KMF_KEY_HANDLE));
}
- return (rv);
+ return (ret);
}
KMF_RETURN
-KMF_SignCertRecord(KMF_HANDLE_T handle, KMF_KEY_HANDLE *kmfprikey,
- KMF_X509_CERTIFICATE *CertData, KMF_DATA *signedCert)
+kmf_find_key(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN ret;
- KMF_DATA unsignedCert;
+ KMF_RETURN ret = KMF_OK;
+ KMF_PLUGIN *plugin;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_COUNT_ATTR, FALSE, sizeof (uint32_t),
+ sizeof (uint32_t)}
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- if (kmfprikey == NULL ||
- CertData == NULL || signedCert == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- ret = KMF_EncodeCertRecord(CertData, &unsignedCert);
- if (ret == KMF_OK)
- ret = KMF_SignCertWithKey(handle, &unsignedCert, kmfprikey,
- signedCert);
+ CLEAR_ERROR(handle, ret);
- KMF_FreeData(&unsignedCert);
- return (ret);
-}
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
-KMF_RETURN
-KMF_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
- KMF_KEY_HANDLE *keys, uint32_t *numkeys)
-{
- KMF_PLUGIN *plugin;
- KMF_RETURN ret;
-
- CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (parms == NULL || numkeys == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- plugin = FindPlugin(handle, parms->kstype);
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
+ plugin = FindPlugin(handle, kstype);
if (plugin != NULL && plugin->funclist->FindKey != NULL) {
- return (plugin->funclist->FindKey(handle, parms,
- keys, numkeys));
+ return (plugin->funclist->FindKey(handle, num_args, attrlist));
}
return (KMF_ERR_PLUGIN_NOTFOUND);
}
KMF_RETURN
-KMF_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
- KMF_RAW_KEY_DATA *rawkey)
+kmf_create_sym_key(KMF_HANDLE_T handle,
+ int num_args,
+ KMF_ATTRIBUTE *attrlist)
{
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ KMF_KEYSTORE_TYPE kstype;
+ uint32_t len;
- CLEAR_ERROR(handle, ret);
- if (ret != KMF_OK)
- return (ret);
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_KEY_HANDLE_ATTR, FALSE, sizeof (KMF_KEY_HANDLE),
+ sizeof (KMF_KEY_HANDLE)},
+ {KMF_KEYALG_ATTR, FALSE, 1, sizeof (KMF_KEY_ALG)},
+ };
- if (params == NULL || rawkey == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
- /* Find the private key from the keystore */
- plugin = FindPlugin(handle, params->kstype);
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- if (plugin != NULL && plugin->funclist->StorePrivateKey != NULL) {
- return (plugin->funclist->StorePrivateKey(handle,
- params, rawkey));
- }
- return (KMF_ERR_PLUGIN_NOTFOUND);
-}
+ CLEAR_ERROR(handle, ret);
-KMF_RETURN
-KMF_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
- KMF_KEY_HANDLE *symkey)
-{
- KMF_PLUGIN *plugin;
- KMF_RETURN ret;
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_args, attrlist);
- CLEAR_ERROR(handle, ret);
if (ret != KMF_OK)
return (ret);
- if (params == NULL ||
- symkey == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_args,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
- plugin = FindPlugin(handle, params->kstype);
+ plugin = FindPlugin(handle, kstype);
if (plugin != NULL && plugin->funclist->CreateSymKey != NULL) {
- return (plugin->funclist->CreateSymKey(handle, params,
- symkey));
+ return (plugin->funclist->CreateSymKey(handle, num_args,
+ attrlist));
} else {
return (KMF_ERR_PLUGIN_NOTFOUND);
}
}
KMF_RETURN
-KMF_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
+kmf_get_sym_key_value(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
KMF_RAW_SYM_KEY *rkey)
{
KMF_PLUGIN *plugin;
@@ -371,3 +266,294 @@ KMF_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
return (KMF_ERR_PLUGIN_NOTFOUND);
}
}
+
+KMF_RETURN
+kmf_store_key(KMF_HANDLE_T handle,
+ int numattr,
+ KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_PLUGIN *plugin;
+ KMF_KEYSTORE_TYPE kstype;
+
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ CLEAR_ERROR(handle, ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, numattr, attrlist);
+
+ if (ret != KMF_OK)
+ return (ret);
+
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, numattr,
+ &kstype, NULL);
+ if (ret != KMF_OK)
+ return (ret);
+
+ plugin = FindPlugin(handle, kstype);
+ if (plugin != NULL) {
+ if (plugin->funclist->StoreKey != NULL)
+ return (plugin->funclist->StoreKey(handle,
+ numattr, attrlist));
+ else
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
+ }
+ return (KMF_ERR_PLUGIN_NOTFOUND);
+}
+
+/*
+ * The following are Phase 1 APIs still needed to maintain compat with elfsign.
+ */
+
+/*
+ * Name: KMF_SignDataWithKey
+ *
+ * Description:
+ * This function signs a block of data using the private key
+ * and returns the signature in output
+ *
+ * Parameters:
+ * handle(input) - opaque handle for KMF session
+ * key(input) - contains private key handle needed for signing
+ * AlgOID(input) - contains algorithm to be used for signing
+ * tobesigned(input) - pointer to a KMF_DATA structure containing
+ * the data to be signed
+ * output(output) - pointer to the KMF_DATA structure containing the
+ * signed data
+ *
+ * Returns:
+ * A KMF_RETURN value indicating success or specifying a particular
+ * error condition.
+ * The value KMF_OK indicates success. All other values represent
+ * an error condition.
+ *
+ */
+KMF_RETURN
+KMF_SignDataWithKey(KMF_HANDLE_T handle,
+ KMF_KEY_HANDLE *key,
+ KMF_OID *AlgOID,
+ KMF_DATA *tobesigned,
+ KMF_DATA *output)
+{
+ KMF_ATTRIBUTE attlist[5]; /* only 5 attrs for SignData */
+ int i = 0;
+
+ if (key == NULL || AlgOID == NULL ||
+ tobesigned == NULL || output == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &key->kstype, sizeof (key->kstype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_OID_ATTR, AlgOID, sizeof (KMF_OID));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DATA_ATTR, tobesigned, sizeof (KMF_DATA));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_OUT_DATA_ATTR, output, sizeof (KMF_DATA));
+ i++;
+
+ return (kmf_sign_data(handle, i, attlist));
+}
+
+
+KMF_RETURN
+KMF_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
+ KMF_KEY_HANDLE *keys, uint32_t *numkeys)
+{
+ KMF_ATTRIBUTE attlist[16]; /* Max 16 attributes used here */
+ int i = 0;
+
+ if (params == NULL || numkeys == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
+ i++;
+
+ if (keys) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_HANDLE_ATTR, keys, sizeof (KMF_KEY_HANDLE));
+ i++;
+ }
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_COUNT_ATTR, numkeys, sizeof (uint32_t));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYALG_ATTR, &params->keytype, sizeof (params->keytype));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYCLASS_ATTR, &params->keyclass, sizeof (params->keyclass));
+ i++;
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_ENCODE_FORMAT_ATTR, &params->format, sizeof (params->format));
+ i++;
+
+ if (params->findLabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLABEL_ATTR, params->findLabel,
+ strlen(params->findLabel));
+ i++;
+ }
+
+ if (params->idstr != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_IDSTR_ATTR, params->idstr,
+ strlen(params->idstr));
+ i++;
+ }
+
+ if (params->cred.credlen > 0) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CREDENTIAL_ATTR, &params->cred,
+ sizeof (KMF_CREDENTIAL));
+ i++;
+ }
+
+ if (params->kstype == KMF_KEYSTORE_NSS) {
+ if (params->nssparms.slotlabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_LABEL_ATTR,
+ params->nssparms.slotlabel,
+ strlen(params->nssparms.slotlabel));
+ i++;
+ }
+ } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
+ if (params->sslparms.dirpath != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DIRPATH_ATTR,
+ params->sslparms.dirpath,
+ strlen(params->sslparms.dirpath));
+ i++;
+ }
+ if (params->sslparms.keyfile != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_FILENAME_ATTR,
+ params->sslparms.keyfile,
+ strlen(params->sslparms.keyfile));
+ i++;
+ }
+ kmf_set_attr_at_index(attlist, i,
+ KMF_ENCODE_FORMAT_ATTR,
+ &params->sslparms.format,
+ sizeof (params->sslparms.format));
+ i++;
+ } else if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_BOOL_ATTR,
+ &params->pkcs11parms.token,
+ sizeof (params->pkcs11parms.token));
+ i++;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_PRIVATE_BOOL_ATTR,
+ &params->pkcs11parms.private,
+ sizeof (params->pkcs11parms.private));
+ i++;
+ }
+ return (kmf_find_key(handle, i, attlist));
+}
+
+KMF_RETURN
+KMF_CreateKeypair(KMF_HANDLE_T handle,
+ KMF_CREATEKEYPAIR_PARAMS *params,
+ KMF_KEY_HANDLE *privKey,
+ KMF_KEY_HANDLE *pubKey)
+{
+ KMF_ATTRIBUTE attlist[12]; /* max 12 attrs used here */
+ int i = 0;
+
+ if (handle == NULL || params == NULL ||
+ privKey == NULL || pubKey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ (void) memset(privKey, 0, sizeof (KMF_KEY_HANDLE));
+ (void) memset(pubKey, 0, sizeof (KMF_KEY_HANDLE));
+
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &params->kstype, sizeof (params->kstype));
+ i++;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYALG_ATTR, &params->keytype, sizeof (params->keytype));
+ i++;
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLENGTH_ATTR, &params->keylength, sizeof (params->keylength));
+ i++;
+ if (params->keylabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEYLABEL_ATTR, params->keylabel,
+ strlen(params->keylabel));
+ i++;
+ }
+ if (params->cred.credlen > 0) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_CREDENTIAL_ATTR, &params->cred,
+ sizeof (KMF_CREDENTIAL));
+ i++;
+ }
+
+ if (params->rsa_exponent.len > 0) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_RSAEXP_ATTR, &params->cred,
+ sizeof (KMF_BIGINT));
+ i++;
+ }
+ kmf_set_attr_at_index(attlist, i, KMF_PRIVKEY_HANDLE_ATTR, privKey,
+ sizeof (KMF_KEY_HANDLE));
+ i++;
+ kmf_set_attr_at_index(attlist, i, KMF_PUBKEY_HANDLE_ATTR, pubKey,
+ sizeof (KMF_KEY_HANDLE));
+ i++;
+
+ if (params->kstype == KMF_KEYSTORE_NSS) {
+ if (params->nssparms.slotlabel != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_TOKEN_LABEL_ATTR,
+ params->nssparms.slotlabel,
+ strlen(params->nssparms.slotlabel));
+ i++;
+ }
+ } else if (params->kstype == KMF_KEYSTORE_OPENSSL) {
+ if (params->sslparms.dirpath != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_DIRPATH_ATTR,
+ params->sslparms.dirpath,
+ strlen(params->sslparms.dirpath));
+ i++;
+ }
+ if (params->sslparms.keyfile != NULL) {
+ kmf_set_attr_at_index(attlist, i,
+ KMF_KEY_FILENAME_ATTR,
+ params->sslparms.keyfile,
+ strlen(params->sslparms.keyfile));
+ i++;
+ }
+ kmf_set_attr_at_index(attlist, i,
+ KMF_ENCODE_FORMAT_ATTR,
+ &params->sslparms.format,
+ sizeof (params->sslparms.format));
+ i++;
+ }
+ return (kmf_create_keypair(handle, i, attlist));
+}
diff --git a/usr/src/lib/libkmf/libkmf/common/mapfile-vers b/usr/src/lib/libkmf/libkmf/common/mapfile-vers
index 85424328bd..31ef381e6d 100644
--- a/usr/src/lib/libkmf/libkmf/common/mapfile-vers
+++ b/usr/src/lib/libkmf/libkmf/common/mapfile-vers
@@ -24,143 +24,8 @@
# ident "%Z%%M% %I% %E% SMI"
#
-SUNWprivate_1.1 {
+SUNW_1.1 {
global:
- GetIDFromSPKI;
- KMF_AddCertEKU;
- KMF_AddPolicyToDB;
- KMF_CheckCRLDate;
- KMF_CheckCertDate;
- KMF_CompareRDNs;
- KMF_ConfigureKeystore;
- KMF_CreateCSRFile;
- KMF_CreateCertFile;
- KMF_CreateKeypair;
- KMF_CreateOCSPRequest;
- KMF_CreateSymKey;
- KMF_DN2Der;
- KMF_DNParser;
- KMF_DecodeCertData;
- KMF_DecryptWithCert;
- KMF_DeleteCRL;
- KMF_DeleteCertFromKeystore;
- KMF_DeleteKeyFromKeystore;
- KMF_DeletePolicyFromDB;
- KMF_Der2Pem;
- KMF_DownloadCRL;
- KMF_DownloadCert;
- KMF_EncodeCertRecord;
- KMF_EncryptWithCert;
- KMF_ExportPK12;
- KMF_Finalize;
- KMF_FindCRL;
- KMF_FindCert;
- KMF_FindCertInCRL;
- KMF_FindKey;
- KMF_FreeAlgOID;
- KMF_FreeBigint;
- KMF_FreeCRLDistributionPoints;
- KMF_FreeDN;
- KMF_FreeData;
- KMF_FreeEKU;
- KMF_FreeEKUPolicy;
- KMF_FreeExtension;
- KMF_FreeKMFCert;
- KMF_FreeKMFKey;
- KMF_FreePolicyRecord;
- KMF_FreeRawKey;
- KMF_FreeRawSymKey;
- KMF_FreeSPKI;
- KMF_FreeSignedCSR;
- KMF_FreeSignedCert;
- KMF_FreeString;
- KMF_FreeTBSCSR;
- KMF_FreeTBSCert;
- KMF_GetCertAuthInfoAccessExt;
- KMF_GetCertBasicConstraintExt;
- KMF_GetCertCriticalExtensions;
- KMF_GetCertCRLDistributionPointsExt;
- KMF_GetCertEKU;
- KMF_GetCertEmailString;
- KMF_GetCertEndDateString;
- KMF_GetCertExtensionData;
- KMF_GetCertExtensionString;
- KMF_GetCertIDData;
- KMF_GetCertIDString;
- KMF_GetCertIssuerNameString;
- KMF_GetCertKeyUsageExt;
- KMF_GetCertNonCriticalExtensions;
- KMF_GetCertPoliciesExt;
- KMF_GetCertPubKeyAlgString;
- KMF_GetCertPubKeyDataString;
- KMF_GetCertSerialNumberString;
- KMF_GetCertSignatureAlgString;
- KMF_GetCertStartDateString;
- KMF_GetCertSubjectNameString;
- KMF_GetCertValidity;
- KMF_GetCertVersionString;
- KMF_GetEncodedOCSPResponse;
- KMF_GetFileFormat;
- KMF_GetKMFErrorString;
- KMF_GetOCSPForCert;
- KMF_GetOCSPStatusForCert;
- KMF_GetPK11Handle;
- KMF_GetPluginErrorString;
- KMF_GetPolicy;
- KMF_GetSymKeyValue;
- KMF_HexString2Bytes;
- KMF_ImportCRL;
- KMF_ImportCert;
- KMF_ImportKeypair;
- KMF_ImportPK12;
- KMF_Initialize;
- KMF_IsCRLFile;
- KMF_IsCertFile;
- KMF_ListCRL;
- KMF_OID2EKUString;
- KMF_OID2String;
- KMF_PK11TokenLookup;
- KMF_Pem2Der;
- KMF_ReadInputFile;
- KMF_SelectToken;
- KMF_SetCSRExtension;
- KMF_SetCSRKeyUsage;
- KMF_SetCSRPubKey;
- KMF_SetCSRSignatureAlgorithm;
- KMF_SetCSRSubjectAltName;
- KMF_SetCSRSubjectName;
- KMF_SetCSRVersion;
- KMF_SetCertBasicConstraintExt;
- KMF_SetCertExtension;
- KMF_SetCertIssuerAltName;
- KMF_SetCertIssuerName;
- KMF_SetCertKeyUsage;
- KMF_SetCertPubKey;
- KMF_SetCertSerialNumber;
- KMF_SetCertSignatureAlgorithm;
- KMF_SetCertSubjectAltName;
- KMF_SetCertSubjectName;
- KMF_SetCertValidityTimes;
- KMF_SetCertVersion;
- KMF_SetPolicy;
- KMF_SetTokenPin;
- KMF_SignCSR;
- KMF_SignCertRecord;
- KMF_SignCertWithCert;
- KMF_SignCertWithKey;
- KMF_SignDataWithCert;
- KMF_SignDataWithKey;
- KMF_StoreCert;
- KMF_StorePrivateKey;
- KMF_String2OID;
- KMF_StringToKeyUsage;
- KMF_ValidateCert;
- KMF_VerifyCRLFile;
- KMF_VerifyCertWithCert;
- KMF_VerifyCertWithKey;
- KMF_VerifyDataWithCert;
- KMF_VerifyDataWithKey;
- KMF_VerifyPolicy;
KMFOID_AliasedEntryName;
KMFOID_AuthorityInfoAccess;
KMFOID_AuthorityKeyID;
@@ -194,6 +59,7 @@ SUNWprivate_1.1 {
KMFOID_CrlReason;
KMFOID_CrossCertificatePair;
KMFOID_DNQualifier;
+ KMFOID_DSA;
KMFOID_DeltaCrlIndicator;
KMFOID_Description;
KMFOID_DestinationIndicator;
@@ -217,10 +83,13 @@ SUNWprivate_1.1 {
KMFOID_KeyUsageRestriction;
KMFOID_KnowledgeInformation;
KMFOID_LocalityName;
+ KMFOID_MD2WithRSA;
+ KMFOID_MD5WithRSA;
KMFOID_Member;
KMFOID_MessageDigest;
KMFOID_Name;
KMFOID_NameConstraints;
+ KMFOID_OIW_DSAWithSHA1;
KMFOID_ObjectClass;
KMFOID_OrganizationName;
KMFOID_OrganizationalUnitName;
@@ -249,8 +118,12 @@ SUNWprivate_1.1 {
KMFOID_PrivateKeyUsagePeriod;
KMFOID_ProtocolInformation;
KMFOID_RFC822mailbox;
+ KMFOID_RSA;
KMFOID_RegisteredAddress;
KMFOID_RoleOccupant;
+ KMFOID_SHA1;
+ KMFOID_SHA1WithDSA;
+ KMFOID_SHA1WithRSA;
KMFOID_SearchGuide;
KMFOID_SeeAlso;
KMFOID_SerialNumber;
@@ -273,28 +146,184 @@ SUNWprivate_1.1 {
KMFOID_UserCertificate;
KMFOID_UserPassword;
KMFOID_VerisignCertificatePolicy;
+ KMFOID_X9CM_DSA;
+ KMFOID_X9CM_DSAWithSHA1;
KMFOID_X_121Address;
KMFOID_domainComponent;
KMFOID_userid;
- KMFOID_SHA1;
- KMFOID_RSA;
- KMFOID_DSA;
- KMFOID_MD5WithRSA;
- KMFOID_MD2WithRSA;
- KMFOID_SHA1WithRSA;
- KMFOID_SHA1WithDSA;
- KMFOID_OIW_DSAWithSHA1;
- KMFOID_X9CM_DSA;
- KMFOID_X9CM_DSAWithSHA1;
- PKCS_GetDefaultSignatureMode;
- PKCS_GetAlgorithmMap;
- PKCS_AcquirePublicKeyHandle;
- X509_AlgIdToAlgorithmOid;
- X509_AlgorithmOidToAlgId;
- kmf_ekuname2oid;
- kmf_string2oid;
- ku2str;
+ kmf_add_cert_eku;
+ kmf_add_policy_to_db;
+ kmf_build_pk12;
+ kmf_check_cert_date;
+ kmf_check_crl_date;
+ kmf_compare_rdns;
+ kmf_configure_keystore;
+ kmf_create_cert_file;
+ kmf_create_csr_file;
+ kmf_create_keypair;
+ kmf_create_ocsp_request;
+ kmf_create_sym_key;
+ kmf_decrypt;
+ kmf_delete_cert_from_keystore;
+ kmf_delete_crl;
+ kmf_delete_key_from_keystore;
+ kmf_delete_policy_from_db;
+ kmf_der_to_pem;
+ kmf_dn_parser;
+ kmf_download_cert;
+ kmf_download_crl;
+ kmf_ekuname_to_oid;
+ kmf_encode_cert_record;
+ kmf_encrypt;
+ kmf_export_pk12;
+ kmf_finalize;
+ kmf_find_attr;
+ kmf_find_cert;
+ kmf_find_cert_in_crl;
+ kmf_find_crl;
+ kmf_find_key;
+ kmf_free_algoid;
+ kmf_free_bigint;
+ kmf_free_crl_dist_pts;
+ kmf_free_data;
+ kmf_free_dn;
+ kmf_free_eku;
+ kmf_free_eku_policy;
+ kmf_free_extn;
+ kmf_free_kmf_cert;
+ kmf_free_kmf_key;
+ kmf_free_policy_record;
+ kmf_free_raw_key;
+ kmf_free_raw_sym_key;
+ kmf_free_signed_cert;
+ kmf_free_signed_csr;
+ kmf_free_spki;
+ kmf_free_str;
+ kmf_free_tbs_cert;
+ kmf_free_tbs_csr;
+ kmf_get_attr;
+ kmf_get_attr_ptr;
+ kmf_get_cert_auth_info_access;
+ kmf_get_cert_basic_constraint;
+ kmf_get_cert_crl_dist_pts;
+ kmf_get_cert_eku;
+ kmf_get_cert_email_str;
+ kmf_get_cert_end_date_str;
+ kmf_get_cert_extn;
+ kmf_get_cert_extn_str;
+ kmf_get_cert_extns;
+ kmf_get_cert_id_data;
+ kmf_get_cert_id_str;
+ kmf_get_cert_issuer_str;
+ kmf_get_cert_ku;
+ kmf_get_cert_policies;
+ kmf_get_cert_pubkey_alg_str;
+ kmf_get_cert_pubkey_str;
+ kmf_get_cert_serial_str;
+ kmf_get_cert_sig_alg_str;
+ kmf_get_cert_start_date_str;
+ kmf_get_cert_subject_str;
+ kmf_get_cert_validity;
+ kmf_get_cert_version_str;
+ kmf_get_encoded_ocsp_response;
+ kmf_get_file_format;
+ kmf_get_kmf_error_str;
+ kmf_get_ocsp_for_cert;
+ kmf_get_ocsp_status_for_cert;
+ kmf_get_pk11_handle;
+ kmf_get_plugin_error_str;
+ kmf_get_policy;
+ kmf_get_string_attr;
+ kmf_get_sym_key_value;
+ kmf_hexstr_to_bytes;
+ kmf_import_crl;
+ kmf_import_cert;
+ kmf_import_objects;
+ kmf_initialize;
+ kmf_is_cert_file;
+ kmf_is_crl_file;
+ kmf_ku_to_string;
+ kmf_list_crl;
+ kmf_oid_to_eku_string;
+ kmf_oid_to_string;
+ kmf_pem_to_der;
+ kmf_pk11_token_lookup;
+ kmf_read_input_file;
+ kmf_select_token;
+ kmf_set_attr;
+ kmf_set_attr_at_index;
+ kmf_set_cert_basic_constraint;
+ kmf_set_cert_extn;
+ kmf_set_cert_issuer;
+ kmf_set_cert_issuer_altname;
+ kmf_set_cert_ku;
+ kmf_set_cert_pubkey;
+ kmf_set_cert_serial;
+ kmf_set_cert_sig_alg;
+ kmf_set_cert_subject;
+ kmf_set_cert_subject_altname;
+ kmf_set_cert_validity;
+ kmf_set_cert_version;
+ kmf_set_csr_extn;
+ kmf_set_csr_ku;
+ kmf_set_csr_pubkey;
+ kmf_set_csr_sig_alg;
+ kmf_set_csr_subject;
+ kmf_set_csr_subject_altname;
+ kmf_set_csr_version;
+ kmf_set_policy;
+ kmf_set_token_pin;
+ kmf_sign_cert;
+ kmf_sign_csr;
+ kmf_sign_data;
+ kmf_store_cert;
+ kmf_store_key;
+ kmf_string_to_ku;
+ kmf_string_to_oid;
+ kmf_validate_cert;
+ kmf_verify_cert;
+ kmf_verify_crl_file;
+ kmf_verify_data;
+ kmf_verify_policy;
+ local:
+ *;
+};
+
+
+SUNWprivate_1.1 {
+ global:
+ GetIDFromSPKI;
+ KMF_ConfigureKeystore;
+ KMF_CreateCSRFile;
+ KMF_CreateKeypair;
+ KMF_DNParser;
+ KMF_Finalize;
+ KMF_FindCert;
+ KMF_FindKey;
+ KMF_FreeData;
+ KMF_FreeKMFCert;
+ KMF_FreeKMFKey;
+ KMF_FreeSignedCSR;
+ KMF_GetCertIDString;
+ KMF_GetCertIssuerNameString;
+ KMF_GetCertSubjectNameString;
+ KMF_GetKMFErrorString;
+ KMF_Initialize;
+ KMF_ReadInputFile;
+ KMF_SetCSRPubKey;
+ KMF_SetCSRSignatureAlgorithm;
+ KMF_SetCSRSubjectName;
+ KMF_SetCSRVersion;
+ KMF_SignCSR;
+ KMF_SignDataWithKey;
+ KMF_VerifyCertWithCert;
+ KMF_VerifyDataWithCert;
parsePolicyElement;
+ PKCS_AcquirePublicKeyHandle;
+ PKCS_GetDefaultSignatureMode;
+ pkcs_get_alg_map;
+ x509_algid_to_algoid;
+ x509_algoid_to_algid;
local:
*;
};
diff --git a/usr/src/lib/libkmf/libkmf/common/pk11keys.c b/usr/src/lib/libkmf/libkmf/common/pk11keys.c
index 66d328968b..5a6e945009 100644
--- a/usr/src/lib/libkmf/libkmf/common/pk11keys.c
+++ b/usr/src/lib/libkmf/libkmf/common/pk11keys.c
@@ -61,7 +61,7 @@ create_pk11_session(CK_SESSION_HANDLE *sessionp, CK_MECHANISM_TYPE wanted_mech,
}
if (i < pulCount) {
rv = C_OpenSession(pSlotList[i], CKF_SERIAL_SESSION,
- NULL, NULL, sessionp);
+ NULL, NULL, sessionp);
if (rv != CKR_OK) {
kmf_rv = KMF_ERR_UNINITIALIZED;
@@ -148,8 +148,10 @@ PKCS_CreatePublicKey(
/* Parse the keyblob */
(void) memset(KeyParts, 0, sizeof (KeyParts));
- AlgorithmId = X509_AlgorithmOidToAlgId((KMF_OID *)
- &pKey->algorithm.algorithm);
+ AlgorithmId = x509_algoid_to_algid(
+ (KMF_OID *)&pKey->algorithm.algorithm);
+ if (AlgorithmId == KMF_ALGID_NONE)
+ return (KMF_ERR_BAD_ALGORITHM);
mrReturn = ExtractSPKIData(pKey, AlgorithmId, KeyParts, &uNumKeyParts);
@@ -157,74 +159,46 @@ PKCS_CreatePublicKey(
return (mrReturn);
/* Fill in the common object attributes */
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_CLASS,
- (CK_BYTE *)&ckObjClass,
- sizeof (ckObjClass)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_TOKEN,
- (CK_BYTE *)&ckToken,
- sizeof (ckToken)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_PRIVATE,
- (CK_BYTE *)&ckPrivate,
- sizeof (ckPrivate))) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_CLASS, (CK_BYTE *)&ckObjClass,
+ sizeof (ckObjClass)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_TOKEN, (CK_BYTE *)&ckToken,
+ sizeof (ckToken)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_PRIVATE, (CK_BYTE *)&ckPrivate,
+ sizeof (ckPrivate))) {
mrReturn = KMF_ERR_INTERNAL;
goto cleanup;
}
/* Fill in the common key attributes */
- if (!PKCS_ConvertAlgorithmId2PKCSKeyType(AlgorithmId,
- &ckKeyType)) {
+ if (!pkcs_algid_to_keytype(AlgorithmId, &ckKeyType)) {
goto cleanup;
}
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_KEY_TYPE,
- (CK_BYTE *)&ckKeyType,
- sizeof (ckKeyType)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_DERIVE,
- (CK_BYTE *)&ckDerive,
- sizeof (ckDerive))) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_KEY_TYPE, (CK_BYTE *)&ckKeyType,
+ sizeof (ckKeyType)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_DERIVE, (CK_BYTE *)&ckDerive,
+ sizeof (ckDerive))) {
mrReturn = KMF_ERR_INTERNAL;
goto cleanup;
}
/* Add common public key attributes */
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_ENCRYPT,
- (CK_BYTE *)&ckEncrypt,
- sizeof (ckEncrypt)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_VERIFY,
- (CK_BYTE *)&ckVerify,
- sizeof (ckVerify)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_VERIFY_RECOVER,
- (CK_BYTE *)&ckVerifyRecover,
- sizeof (ckVerifyRecover)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_WRAP,
- (CK_BYTE *)&ckWrap,
- sizeof (ckWrap))) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_ENCRYPT, (CK_BYTE *)&ckEncrypt,
+ sizeof (ckEncrypt)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_VERIFY, (CK_BYTE *)&ckVerify,
+ sizeof (ckVerify)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_VERIFY_RECOVER,
+ (CK_BYTE *)&ckVerifyRecover, sizeof (ckVerifyRecover)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_WRAP, (CK_BYTE *)&ckWrap,
+ sizeof (ckWrap))) {
mrReturn = KMF_ERR_INTERNAL;
goto cleanup;
}
@@ -232,47 +206,35 @@ PKCS_CreatePublicKey(
/* Add algorithm specific attributes */
switch (ckKeyType) {
case CKK_RSA:
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_MODULUS,
- (CK_BYTE *)KeyParts[KMF_RSA_MODULUS].Data,
- (CK_ULONG)KeyParts[KMF_RSA_MODULUS].Length) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_PUBLIC_EXPONENT,
- (CK_BYTE *)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Data,
- (CK_ULONG)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Length)) {
- mrReturn = KMF_ERR_INTERNAL;
- goto cleanup;
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_MODULUS,
+ (CK_BYTE *)KeyParts[KMF_RSA_MODULUS].Data,
+ (CK_ULONG)KeyParts[KMF_RSA_MODULUS].Length) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_PUBLIC_EXPONENT,
+ (CK_BYTE *)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Data,
+ (CK_ULONG)KeyParts[KMF_RSA_PUBLIC_EXPONENT].Length)) {
+ mrReturn = KMF_ERR_INTERNAL;
+ goto cleanup;
}
break;
case CKK_DSA:
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_PRIME,
- (CK_BYTE *)KeyParts[KMF_DSA_PRIME].Data,
- (CK_ULONG)KeyParts[KMF_DSA_PRIME].Length) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_SUBPRIME,
- (CK_BYTE *)KeyParts[KMF_DSA_SUB_PRIME].Data,
- (CK_ULONG)KeyParts[KMF_DSA_SUB_PRIME].Length) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_BASE,
- (CK_BYTE *)KeyParts[KMF_DSA_BASE].Data,
- (CK_ULONG)KeyParts[KMF_DSA_BASE].Length) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- MAX_PUBLIC_KEY_TEMPLATES,
- CKA_VALUE,
- (CK_BYTE *)KeyParts[KMF_DSA_PUBLIC_VALUE].Data,
- (CK_ULONG)KeyParts[KMF_DSA_PUBLIC_VALUE].Length)) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_PRIME,
+ (CK_BYTE *)KeyParts[KMF_DSA_PRIME].Data,
+ (CK_ULONG)KeyParts[KMF_DSA_PRIME].Length) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_SUBPRIME,
+ (CK_BYTE *)KeyParts[KMF_DSA_SUB_PRIME].Data,
+ (CK_ULONG)KeyParts[KMF_DSA_SUB_PRIME].Length) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_BASE,
+ (CK_BYTE *)KeyParts[KMF_DSA_BASE].Data,
+ (CK_ULONG)KeyParts[KMF_DSA_BASE].Length) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ MAX_PUBLIC_KEY_TEMPLATES, CKA_VALUE,
+ (CK_BYTE *)KeyParts[KMF_DSA_PUBLIC_VALUE].Data,
+ (CK_ULONG)KeyParts[KMF_DSA_PUBLIC_VALUE].Length)) {
mrReturn = KMF_ERR_INTERNAL;
goto cleanup;
}
@@ -283,17 +245,15 @@ PKCS_CreatePublicKey(
if (mrReturn == KMF_OK) {
/* Instantiate the object */
- ckRv = C_CreateObject(ckSession,
- ckTemplate,
- ckNumTemplates,
- pckPublicKey);
+ ckRv = C_CreateObject(ckSession, ckTemplate,
+ ckNumTemplates, pckPublicKey);
if (ckRv != CKR_OK)
mrReturn = KMF_ERR_INTERNAL;
}
cleanup:
for (i = 0; i < uNumKeyParts; i++) {
- KMF_FreeData(&KeyParts[i]);
+ kmf_free_data(&KeyParts[i]);
}
return (mrReturn);
@@ -331,7 +291,7 @@ PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
CK_ATTRIBUTE ckTemplate[3];
CK_ULONG ckNumTemplates;
static const CK_ULONG ckMaxTemplates = (sizeof (ckTemplate) /
- sizeof (CK_ATTRIBUTE));
+ sizeof (CK_ATTRIBUTE));
CK_RV ckRv;
/* Extract the data from the SPKI into individual fields */
@@ -343,31 +303,23 @@ PKCS_AcquirePublicKeyHandle(CK_SESSION_HANDLE ckSession,
/* Fetch the key class and algorithm from the object */
ckNumTemplates = 0;
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- ckMaxTemplates,
- CKA_CLASS,
- (CK_BYTE *)&ckObjClass,
- sizeof (ckObjClass)) ||
- !PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- ckMaxTemplates,
- CKA_KEY_TYPE,
- (CK_BYTE *)&ckKeyType,
- sizeof (ckKeyType))) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ ckMaxTemplates, CKA_CLASS, (CK_BYTE *)&ckObjClass,
+ sizeof (ckObjClass)) ||
+ !PKCS_AddTemplate(ckTemplate, &ckNumTemplates,
+ ckMaxTemplates, CKA_KEY_TYPE, (CK_BYTE *)&ckKeyType,
+ sizeof (ckKeyType))) {
return (KMF_ERR_INTERNAL);
}
- ckRv = C_GetAttributeValue(ckSession,
- ckKeyHandle,
- ckTemplate,
- ckNumTemplates);
+ ckRv = C_GetAttributeValue(ckSession, ckKeyHandle,
+ ckTemplate, ckNumTemplates);
if (ckRv != CKR_OK) {
return (ckRv);
}
/* Make sure the results match the expected values */
if ((ckKeyType != ckRequestedKeyType) ||
- (ckObjClass != CKO_PUBLIC_KEY)) {
+ (ckObjClass != CKO_PUBLIC_KEY)) {
if (*pbTemporary == KMF_TRUE) {
(void) C_DestroyObject(ckSession, ckKeyHandle);
}
@@ -419,21 +371,21 @@ PKCS_VerifyData(KMF_HANDLE_T kmfh,
if (AlgorithmId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_ALGORITHM);
- pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE,
- AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId));
+ pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE,
+ AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId));
if (!pAlgMap)
return (KMF_ERR_BAD_ALGORITHM);
rv = create_pk11_session(&ckSession, pAlgMap->pkcs_mechanism,
- CKF_VERIFY);
+ CKF_VERIFY);
if (rv != KMF_OK)
return (rv);
/* Fetch the verifying key */
rv = PKCS_AcquirePublicKeyHandle(ckSession, keyp,
- pAlgMap->key_type, &ckKeyHandle, &bTempKey);
+ pAlgMap->key_type, &ckKeyHandle, &bTempKey);
if (rv != KMF_OK) {
(void) C_CloseSession(ckSession);
@@ -454,11 +406,10 @@ PKCS_VerifyData(KMF_HANDLE_T kmfh,
return (KMF_ERR_INTERNAL);
}
- ckRv = C_Verify(ckSession,
- (CK_BYTE *)data->Data,
- (CK_ULONG)data->Length,
- (CK_BYTE *)signed_data->Data,
- (CK_ULONG)signed_data->Length);
+ ckRv = C_Verify(ckSession, (CK_BYTE *)data->Data,
+ (CK_ULONG)data->Length,
+ (CK_BYTE *)signed_data->Data,
+ (CK_ULONG)signed_data->Length);
if (ckRv != CKR_OK) {
kmfh->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN;
@@ -493,16 +444,16 @@ PKCS_EncryptData(KMF_HANDLE_T kmfh,
CK_ATTRIBUTE ckTemplate[2];
CK_ULONG ckNumTemplates;
CK_ULONG ckMaxTemplates = (sizeof (ckTemplate) /
- sizeof (CK_ATTRIBUTE));
+ sizeof (CK_ATTRIBUTE));
- pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE,
+ pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE,
AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId));
if (!pAlgMap)
return (KMF_ERR_BAD_ALGORITHM);
rv = create_pk11_session(&ckSession, pAlgMap->pkcs_mechanism,
- CKF_ENCRYPT);
+ CKF_ENCRYPT);
if (rv != KMF_OK)
return (rv);
@@ -518,22 +469,16 @@ PKCS_EncryptData(KMF_HANDLE_T kmfh,
/* Get the modulus length */
ckNumTemplates = 0;
- if (!PKCS_AddTemplate(ckTemplate,
- &ckNumTemplates,
- ckMaxTemplates,
- CKA_MODULUS,
- (CK_BYTE *)NULL,
- sizeof (CK_ULONG))) {
+ if (!PKCS_AddTemplate(ckTemplate, &ckNumTemplates, ckMaxTemplates,
+ CKA_MODULUS, (CK_BYTE *)NULL, sizeof (CK_ULONG))) {
if (bTempKey)
(void) C_DestroyObject(ckSession, ckKeyHandle);
(void) C_CloseSession(ckSession);
return (KMF_ERR_INTERNAL);
}
- ckRv = C_GetAttributeValue(ckSession,
- ckKeyHandle,
- ckTemplate,
- ckNumTemplates);
+ ckRv = C_GetAttributeValue(ckSession, ckKeyHandle,
+ ckTemplate, ckNumTemplates);
if (ckRv != CKR_OK) {
if (bTempKey)
@@ -661,7 +606,9 @@ GetIDFromSPKI(KMF_X509_SPKI *spki, KMF_DATA *ID)
ID->Length = SHA1_HASH_LENGTH;
- algId = X509_AlgorithmOidToAlgId(&spki->algorithm.algorithm);
+ algId = x509_algoid_to_algid(&spki->algorithm.algorithm);
+ if (algId == KMF_ALGID_NONE)
+ return (KMF_ERR_BAD_ALGORITHM);
rv = ExtractSPKIData(spki, algId, KeyParts, &uNumKeyParts);
if (rv != KMF_OK)
@@ -677,7 +624,6 @@ GetIDFromSPKI(KMF_X509_SPKI *spki, KMF_DATA *ID)
rv = KMF_ERR_BAD_ALGORITHM;
}
-
for (i = 0; i < uNumKeyParts; i++) {
if (KeyParts[i].Data != NULL)
free(KeyParts[i].Data);
diff --git a/usr/src/lib/libkmf/libkmf/common/pk11tokens.c b/usr/src/lib/libkmf/libkmf/common/pk11tokens.c
index 80909114e2..2e37a31f78 100644
--- a/usr/src/lib/libkmf/libkmf/common/pk11tokens.c
+++ b/usr/src/lib/libkmf/libkmf/common/pk11tokens.c
@@ -105,6 +105,16 @@ kmf_get_token_slots(KMF_HANDLE *handle, CK_SLOT_ID_PTR *slot_list,
CK_SLOT_ID_PTR tmp_list = NULL_PTR, tmp2_list = NULL_PTR;
ck_rv = C_GetSlotList(1, NULL_PTR, &tmp_count);
+ if (ck_rv == CKR_CRYPTOKI_NOT_INITIALIZED) {
+ ck_rv = C_Initialize(NULL);
+ if ((ck_rv != CKR_OK) &&
+ (ck_rv != CKR_CRYPTOKI_ALREADY_INITIALIZED))
+ return (KMF_ERR_UNINITIALIZED);
+ if (ck_rv == CKR_CRYPTOKI_ALREADY_INITIALIZED)
+ ck_rv = CKR_OK;
+
+ ck_rv = C_GetSlotList(1, NULL_PTR, &tmp_count);
+ }
if (ck_rv != CKR_OK) {
if (handle != NULL) {
handle->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN;
@@ -281,7 +291,7 @@ parse_token_spec(char *token_spec, char **token_name, char **manuf_id,
* are delimited by the colon ':' character.
*/
KMF_RETURN
-KMF_PK11TokenLookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
+kmf_pk11_token_lookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
{
KMF_RETURN kmf_rv = KMF_OK;
CK_RV rv;
@@ -298,9 +308,9 @@ KMF_PK11TokenLookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
char *token_name = NULL;
char *manuf_id = NULL;
char *serial_no = NULL;
- boolean_t tok_match = B_FALSE,
- man_match = B_FALSE,
- ser_match = B_FALSE;
+ boolean_t tok_match = B_FALSE;
+ boolean_t man_match = B_FALSE;
+ boolean_t ser_match = B_FALSE;
if (slot_id == NULL || label == NULL || !strlen(label))
return (KMF_ERR_BAD_PARAMETER);
@@ -322,7 +332,7 @@ KMF_PK11TokenLookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
return (KMF_ERR_MEMORY);
if (parse_token_spec(tmplabel, &token_name, &manuf_id,
- &serial_no) < 0) {
+ &serial_no) < 0) {
free(tmplabel);
return (KMF_ERR_BAD_PARAMETER);
}
@@ -350,7 +360,7 @@ KMF_PK11TokenLookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
len = strlen(token_name);
max_sz = sizeof (token_info.label);
if (memcmp_pad_max(&(token_info.label), max_sz, token_name,
- len, max_sz) == 0)
+ len, max_sz) == 0)
tok_match = B_TRUE;
/*
* If manufacturer id was given, see if it actually matches.
@@ -424,43 +434,56 @@ KMF_PK11TokenLookup(KMF_HANDLE_T handle, char *label, CK_SLOT_ID *slot_id)
}
KMF_RETURN
-KMF_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
- KMF_CREDENTIAL *newpin)
+kmf_set_token_pin(KMF_HANDLE_T handle,
+ int num_attr,
+ KMF_ATTRIBUTE *attrlist)
{
- KMF_RETURN rv = KMF_OK;
+ KMF_RETURN ret = KMF_OK;
KMF_PLUGIN *plugin;
-
- CLEAR_ERROR(handle, rv);
- if (rv != KMF_OK)
- return (rv);
-
- if (params == NULL || newpin == NULL)
+ KMF_ATTRIBUTE_TESTER required_attrs[] = {
+ {KMF_KEYSTORE_TYPE_ATTR, FALSE, 1, sizeof (KMF_KEYSTORE_TYPE)},
+ {KMF_CREDENTIAL_ATTR, FALSE, sizeof (KMF_CREDENTIAL),
+ sizeof (KMF_CREDENTIAL)},
+ {KMF_NEWPIN_ATTR, FALSE, sizeof (KMF_CREDENTIAL),
+ sizeof (KMF_CREDENTIAL)},
+ };
+
+ int num_req_attrs = sizeof (required_attrs) /
+ sizeof (KMF_ATTRIBUTE_TESTER);
+ uint32_t len;
+ KMF_KEYSTORE_TYPE kstype;
+
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /*
- * If setting PKCS#11 token look for the slot.
- */
- if (params->kstype == KMF_KEYSTORE_PK11TOKEN) {
- rv = KMF_PK11TokenLookup(NULL, params->tokenname,
- &params->pkcs11parms.slot);
- if (rv != KMF_OK)
- return (rv);
+ CLEAR_ERROR(handle, ret);
+ if (ret != KMF_OK)
+ return (ret);
+
+ ret = test_attributes(num_req_attrs, required_attrs,
+ 0, NULL, num_attr, attrlist);
+ if (ret != KMF_OK)
+ return (ret);
+
+ len = sizeof (kstype);
+ ret = kmf_get_attr(KMF_KEYSTORE_TYPE_ATTR, attrlist, num_attr,
+ &kstype, &len);
+ if (ret != KMF_OK)
+ return (ret);
+
+ plugin = FindPlugin(handle, kstype);
+ if (plugin != NULL) {
+ if (plugin->funclist->SetTokenPin != NULL)
+ return (plugin->funclist->SetTokenPin(handle, num_attr,
+ attrlist));
+ else
+ return (KMF_ERR_FUNCTION_NOT_FOUND);
}
-
- plugin = FindPlugin(handle, params->kstype);
- if (plugin == NULL)
- return (KMF_ERR_PLUGIN_NOTFOUND);
- if (plugin->funclist->SetTokenPin == NULL)
- return (KMF_ERR_FUNCTION_NOT_FOUND);
-
- rv = plugin->funclist->SetTokenPin(handle, params, newpin);
-
- return (rv);
+ return (KMF_ERR_PLUGIN_NOTFOUND);
}
/*
- *
- * Name: KMF_SelectToken
+ * Name: kmf_select_token
*
* Description:
* This function enables the user of PKCS#11 plugin to select a
@@ -477,11 +500,9 @@ KMF_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
* error condition.
* The value KMF_OK indicates success. All other values represent
* an error condition.
- *
*/
KMF_RETURN
-KMF_SelectToken(KMF_HANDLE_T handle, char *label,
- int readonly)
+kmf_select_token(KMF_HANDLE_T handle, char *label, int readonly)
{
KMF_RETURN kmf_rv = KMF_OK;
CK_RV ck_rv = CKR_OK;
@@ -508,7 +529,7 @@ KMF_SelectToken(KMF_HANDLE_T handle, char *label,
}
/* Find the token with matching label */
- kmf_rv = KMF_PK11TokenLookup(handle, label, &slot_id);
+ kmf_rv = kmf_pk11_token_lookup(handle, label, &slot_id);
if (kmf_rv != KMF_OK) {
return (kmf_rv);
}
@@ -531,7 +552,7 @@ KMF_SelectToken(KMF_HANDLE_T handle, char *label,
}
CK_SESSION_HANDLE
-KMF_GetPK11Handle(KMF_HANDLE_T kmfh)
+kmf_get_pk11_handle(KMF_HANDLE_T kmfh)
{
return (kmfh->pk11handle);
}
diff --git a/usr/src/lib/libkmf/libkmf/common/policy.c b/usr/src/lib/libkmf/libkmf/common/policy.c
index 5e41f9f42a..d9c3b1b754 100644
--- a/usr/src/lib/libkmf/libkmf/common/policy.c
+++ b/usr/src/lib/libkmf/libkmf/common/policy.c
@@ -18,7 +18,7 @@
*
* CDDL HEADER END
*
- * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
@@ -77,7 +77,7 @@ parseOCSPValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo)
n = node->children;
while (n != NULL) {
if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_OCSP_BASIC_ELEMENT)) {
+ (const xmlChar *)KMF_OCSP_BASIC_ELEMENT)) {
vinfo->ocsp_info.basic.responderURI =
(char *)xmlGetProp(n,
@@ -111,8 +111,8 @@ parseOCSPValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo)
(char *)xmlGetProp(n,
(const xmlChar *)KMF_CERT_NAME_ATTR);
vinfo->ocsp_info.resp_cert.serial =
- (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CERT_SERIAL_ATTR);
+ (char *)xmlGetProp(n,
+ (const xmlChar *)KMF_CERT_SERIAL_ATTR);
vinfo->ocsp_info.has_resp_cert = 1;
}
@@ -133,23 +133,23 @@ parseValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo,
n = node->children;
while (n != NULL) {
if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_OCSP_ELEMENT)) {
+ (const xmlChar *)KMF_OCSP_ELEMENT)) {
parseOCSPValidation(n, &policy->validation_info);
policy->revocation |= KMF_REVOCATION_METHOD_OCSP;
} else if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_CRL_ELEMENT)) {
+ (const xmlChar *)KMF_CRL_ELEMENT)) {
vinfo->crl_info.basefilename = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CRL_BASENAME_ATTR);
+ (const xmlChar *)KMF_CRL_BASENAME_ATTR);
vinfo->crl_info.directory = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CRL_DIRECTORY_ATTR);
+ (const xmlChar *)KMF_CRL_DIRECTORY_ATTR);
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CRL_GET_URI_ATTR);
+ (const xmlChar *)KMF_CRL_GET_URI_ATTR);
if (c != NULL && !strcasecmp(c, "true")) {
vinfo->crl_info.get_crl_uri = 1;
} else {
@@ -161,7 +161,7 @@ parseValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo,
(const xmlChar *)KMF_CRL_PROXY_ATTR);
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CRL_IGNORE_SIGN_ATTR);
+ (const xmlChar *)KMF_CRL_IGNORE_SIGN_ATTR);
if (c != NULL && !strcasecmp(c, "true")) {
vinfo->crl_info.ignore_crl_sign = 1;
} else {
@@ -170,7 +170,7 @@ parseValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo,
xmlFree(c);
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_CRL_IGNORE_DATE_ATTR);
+ (const xmlChar *)KMF_CRL_IGNORE_DATE_ATTR);
if (c != NULL && !strcasecmp(c, "true")) {
vinfo->crl_info.ignore_crl_date = 1;
} else {
@@ -186,7 +186,7 @@ parseValidation(xmlNodePtr node, KMF_VALIDATION_POLICY *vinfo,
}
char *
-ku2str(uint32_t bitfield)
+kmf_ku_to_string(uint32_t bitfield)
{
if (bitfield & KMF_digitalSignature)
return ("digitalSignature");
@@ -218,8 +218,8 @@ ku2str(uint32_t bitfield)
return (NULL);
}
-uint16_t
-KMF_StringToKeyUsage(char *kustring)
+uint32_t
+kmf_string_to_ku(char *kustring)
{
if (kustring == NULL || !strlen(kustring))
return (0);
@@ -254,11 +254,11 @@ parseKeyUsageSet(xmlNodePtr node, uint32_t *kubits)
n = node->children;
while (n != NULL) {
if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_KEY_USAGE_ELEMENT)) {
+ (const xmlChar *)KMF_KEY_USAGE_ELEMENT)) {
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_KEY_USAGE_USE_ATTR);
+ (const xmlChar *)KMF_KEY_USAGE_USE_ATTR);
if (c) {
- *kubits |= KMF_StringToKeyUsage(c);
+ *kubits |= kmf_string_to_ku(c);
xmlFree(c);
}
}
@@ -288,7 +288,7 @@ dup_oid(KMF_OID *oldoid)
}
KMF_OID *
-kmf_ekuname2oid(char *ekuname)
+kmf_ekuname_to_oid(char *ekuname)
{
KMF_OID *oid;
int i;
@@ -307,131 +307,18 @@ kmf_ekuname2oid(char *ekuname)
}
char *
-KMF_OID2EKUString(KMF_OID *oid)
+kmf_oid_to_eku_string(KMF_OID *oid)
{
int i;
for (i = 0; i < num_ekus; i++) {
if (oid->Length == EKUList[i].oid->Length &&
- !memcmp(oid->Data, EKUList[i].oid->Data, oid->Length)) {
+ !memcmp(oid->Data, EKUList[i].oid->Data, oid->Length)) {
return (EKUList[i].ekuname);
}
}
return (NULL);
}
-/*
- * Convert a human-readable OID string of the form "1.2.3.4" or
- * "1 2 3 4" into a KMF_OID value.
- */
-KMF_OID *
-kmf_string2oid(char *oidstring)
-{
- KMF_OID *oid = NULL;
- char *cp, *bp, *startp;
- int numbuf;
- int onumbuf;
- int nbytes, index;
- int len;
- unsigned char *op;
-
- if (oidstring == NULL)
- return (NULL);
-
- len = strlen(oidstring);
-
- bp = oidstring;
- cp = bp;
- /* Skip over leading space */
- while ((bp < &cp[len]) && isspace(*bp))
- bp++;
-
- startp = bp;
- nbytes = 0;
-
- /*
- * The first two numbers are chewed up by the first octet.
- */
- if (sscanf(bp, "%d", &numbuf) != 1)
- return (NULL);
- while ((bp < &cp[len]) && isdigit(*bp))
- bp++;
- while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
- bp++;
- if (sscanf(bp, "%d", &numbuf) != 1)
- return (NULL);
- while ((bp < &cp[len]) && isdigit(*bp))
- bp++;
- while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
- bp++;
- nbytes++;
-
- while (isdigit(*bp)) {
- if (sscanf(bp, "%d", &numbuf) != 1)
- return (NULL);
- while (numbuf) {
- nbytes++;
- numbuf >>= 7;
- }
- while ((bp < &cp[len]) && isdigit(*bp))
- bp++;
- while ((bp < &cp[len]) && (isspace(*bp) || *bp == '.'))
- bp++;
- }
-
- oid = malloc(sizeof (KMF_OID));
- if (oid == NULL)
- return (NULL);
-
- oid->Length = nbytes;
- oid->Data = malloc(oid->Length);
- if (oid->Data == NULL) {
- free(oid);
- return (NULL);
- }
- (void) memset(oid->Data, 0, oid->Length);
-
- op = oid->Data;
-
- bp = startp;
- (void) sscanf(bp, "%d", &numbuf);
-
- while (isdigit(*bp)) bp++;
- while (isspace(*bp) || *bp == '.') bp++;
-
- onumbuf = 40 * numbuf;
- (void) sscanf(bp, "%d", &numbuf);
- onumbuf += numbuf;
- *op = (unsigned char) onumbuf;
- op++;
-
- while (isdigit(*bp)) bp++;
- while (isspace(*bp) || *bp == '.') bp++;
- while (isdigit(*bp)) {
- (void) sscanf(bp, "%d", &numbuf);
- nbytes = 0;
- /* Have to fill in the bytes msb-first */
- onumbuf = numbuf;
- while (numbuf) {
- nbytes++;
- numbuf >>= 7;
- }
- numbuf = onumbuf;
- op += nbytes;
- index = -1;
- while (numbuf) {
- op[index] = (unsigned char)numbuf & 0x7f;
- if (index != -1)
- op[index] |= 0x80;
- index--;
- numbuf >>= 7;
- }
- while (isdigit(*bp)) bp++;
- while (isspace(*bp) || *bp == '.') bp++;
- }
-
- return (oid);
-}
-
static KMF_RETURN
parseExtKeyUsage(xmlNodePtr node, KMF_EKU_POLICY *ekus)
{
@@ -442,23 +329,29 @@ parseExtKeyUsage(xmlNodePtr node, KMF_EKU_POLICY *ekus)
n = node->children;
while (n != NULL && ret == KMF_OK) {
- KMF_OID *newoid = NULL;
+ KMF_OID newoid, *oidptr;
+
+ oidptr = NULL;
+ newoid.Data = NULL;
+ newoid.Length = 0;
if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_EKU_NAME_ELEMENT)) {
+ (const xmlChar *)KMF_EKU_NAME_ELEMENT)) {
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_EKU_NAME_ATTR);
+ (const xmlChar *)KMF_EKU_NAME_ATTR);
if (c != NULL) {
- newoid = kmf_ekuname2oid(c);
+ oidptr = kmf_ekuname_to_oid(c);
xmlFree(c);
found = TRUE;
+ if (oidptr != NULL)
+ newoid = *oidptr;
}
} else if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_EKU_OID_ELEMENT)) {
+ (const xmlChar *)KMF_EKU_OID_ELEMENT)) {
c = (char *)xmlGetProp(n,
- (const xmlChar *)KMF_EKU_OID_ATTR);
+ (const xmlChar *)KMF_EKU_OID_ATTR);
if (c != NULL) {
- newoid = kmf_string2oid(c);
+ (void) kmf_string_to_oid(c, &newoid);
xmlFree(c);
found = TRUE;
}
@@ -469,29 +362,18 @@ parseExtKeyUsage(xmlNodePtr node, KMF_EKU_POLICY *ekus)
continue;
}
- if (newoid != NULL) {
+ if (newoid.Data != NULL) {
ekus->eku_count++;
ekus->ekulist = realloc(ekus->ekulist,
- ekus->eku_count * sizeof (KMF_OID));
+ ekus->eku_count * sizeof (KMF_OID));
if (ekus->ekulist != NULL) {
ekus->ekulist[ekus->eku_count-1].Length =
- newoid->Length;
+ newoid.Length;
ekus->ekulist[ekus->eku_count-1].Data =
- malloc(newoid->Length);
- if (ekus->ekulist[ekus->eku_count-1].Data ==
- NULL) {
- ret = KMF_ERR_MEMORY;
- } else {
- (void) memcpy(
- ekus->ekulist[ekus->eku_count-1].
- Data,
- newoid->Data, newoid->Length);
- }
+ newoid.Data;
} else {
ret = KMF_ERR_MEMORY;
}
- KMF_FreeData(newoid);
- free(newoid);
} else {
ret = KMF_ERR_POLICY_DB_FORMAT;
}
@@ -512,10 +394,10 @@ parsePolicyElement(xmlNodePtr node, KMF_POLICY_RECORD *policy)
if (node->type == XML_ELEMENT_NODE) {
if (node->properties != NULL) {
policy->name = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_NAME_ATTR);
+ (const xmlChar *)KMF_POLICY_NAME_ATTR);
c = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_OPTIONS_IGNORE_DATE_ATTR);
+ (const xmlChar *)KMF_OPTIONS_IGNORE_DATE_ATTR);
if (c && !strcasecmp(c, "true")) {
policy->ignore_date = 1;
xmlFree((xmlChar *)c);
@@ -544,20 +426,20 @@ parsePolicyElement(xmlNodePtr node, KMF_POLICY_RECORD *policy)
}
policy->ta_name = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_TA_NAME_ATTR);
+ (const xmlChar *)KMF_POLICY_TA_NAME_ATTR);
policy->ta_serial = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_TA_SERIAL_ATTR);
+ (const xmlChar *)KMF_POLICY_TA_SERIAL_ATTR);
}
n = node->children;
while (n != NULL) {
if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_VALIDATION_METHODS_ELEMENT))
+ (const xmlChar *)KMF_VALIDATION_METHODS_ELEMENT))
parseValidation(n, &policy->validation_info,
policy);
else if (!xmlStrcmp((const xmlChar *)n->name,
- (const xmlChar *)KMF_KEY_USAGE_SET_ELEMENT))
+ (const xmlChar *)KMF_KEY_USAGE_SET_ELEMENT))
parseKeyUsageSet(n, &policy->ku_bits);
else if (!xmlStrcmp((const xmlChar *)n->name,
(const xmlChar *)KMF_EKU_ELEMENT)) {
@@ -580,7 +462,7 @@ newprop(xmlNodePtr node, char *attrname, char *src)
if (src != NULL && strlen(src)) {
newattr = xmlNewProp(node, (const xmlChar *)attrname,
- (xmlChar *)src);
+ (xmlChar *)src);
if (newattr == NULL) {
xmlUnlinkNode(node);
xmlFreeNode(node);
@@ -660,7 +542,7 @@ AddOCSPNodes(xmlNodePtr parent, KMF_OCSP_POLICY *ocsp)
/* basic node */
n_ocsp = xmlNewChild(parent, NULL,
- (const xmlChar *)KMF_OCSP_ELEMENT, NULL);
+ (const xmlChar *)KMF_OCSP_ELEMENT, NULL);
if (n_ocsp == NULL)
return (-1);
addFormatting(n_ocsp, "\n\t\t\t");
@@ -680,7 +562,7 @@ AddOCSPNodes(xmlNodePtr parent, KMF_OCSP_POLICY *ocsp)
return (-1);
if (basic->response_lifetime &&
newprop(n_basic, KMF_OCSP_RESPONSE_LIFETIME_ATTR,
- basic->response_lifetime))
+ basic->response_lifetime))
return (-1);
if (basic->ignore_response_sign &&
newprop(n_basic, KMF_OCSP_IGNORE_SIGN_ATTR, "TRUE"))
@@ -721,7 +603,7 @@ AddValidationNodes(xmlNodePtr parent, KMF_POLICY_RECORD *policy)
addFormatting(parent, "\t");
mnode = xmlNewChild(parent, NULL,
- (const xmlChar *)KMF_VALIDATION_METHODS_ELEMENT, NULL);
+ (const xmlChar *)KMF_VALIDATION_METHODS_ELEMENT, NULL);
if (mnode == NULL)
return (-1);
@@ -768,17 +650,17 @@ AddKeyUsageNodes(xmlNodePtr parent, uint32_t kubits)
addFormatting(parent, "\n\t");
kuset = xmlNewChild(parent, NULL,
- (const xmlChar *)KMF_KEY_USAGE_SET_ELEMENT, NULL);
+ (const xmlChar *)KMF_KEY_USAGE_SET_ELEMENT, NULL);
if (kuset == NULL)
return (KMF_ERR_POLICY_ENGINE);
for (i = KULOWBIT; i <= KUHIGHBIT && ret == KMF_OK; i++) {
- char *s = ku2str((kubits & (1<<i)));
+ char *s = kmf_ku_to_string((kubits & (1<<i)));
if (s != NULL) {
addFormatting(kuset, "\n\t\t");
kunode = xmlNewChild(kuset, NULL,
- (const xmlChar *)KMF_KEY_USAGE_ELEMENT, NULL);
+ (const xmlChar *)KMF_KEY_USAGE_ELEMENT, NULL);
if (kunode == NULL)
ret = KMF_ERR_POLICY_ENGINE;
@@ -811,17 +693,17 @@ AddExtKeyUsageNodes(xmlNodePtr parent, KMF_EKU_POLICY *ekus)
if (ekus != NULL && ekus->eku_count > 0) {
addFormatting(parent, "\n\t");
n = xmlNewChild(parent, NULL,
- (const xmlChar *)KMF_EKU_ELEMENT, NULL);
+ (const xmlChar *)KMF_EKU_ELEMENT, NULL);
if (n == NULL)
return (KMF_ERR_POLICY_ENGINE);
for (i = 0; i < ekus->eku_count; i++) {
- char *s = KMF_OID2String(&ekus->ekulist[i]);
+ char *s = kmf_oid_to_string(&ekus->ekulist[i]);
if (s != NULL) {
addFormatting(n, "\n\t\t");
kunode = xmlNewChild(n, NULL,
- (const xmlChar *)KMF_EKU_OID_ELEMENT,
- NULL);
+ (const xmlChar *)KMF_EKU_OID_ELEMENT,
+ NULL);
if (kunode == NULL)
ret = KMF_ERR_POLICY_ENGINE;
@@ -844,12 +726,12 @@ AddExtKeyUsageNodes(xmlNodePtr parent, KMF_EKU_POLICY *ekus)
}
void
-KMF_FreeEKUPolicy(KMF_EKU_POLICY *ekus)
+kmf_free_eku_policy(KMF_EKU_POLICY *ekus)
{
if (ekus->eku_count > 0) {
int i;
for (i = 0; i < ekus->eku_count; i++) {
- KMF_FreeData(&ekus->ekulist[i]);
+ kmf_free_data(&ekus->ekulist[i]);
}
free(ekus->ekulist);
}
@@ -858,7 +740,7 @@ KMF_FreeEKUPolicy(KMF_EKU_POLICY *ekus)
#define FREE_POLICY_STR(s) if (s != NULL) free(s);
void
-KMF_FreePolicyRecord(KMF_POLICY_RECORD *policy)
+kmf_free_policy_record(KMF_POLICY_RECORD *policy)
{
if (policy == NULL)
return;
@@ -876,18 +758,18 @@ KMF_FreePolicyRecord(KMF_POLICY_RECORD *policy)
FREE_POLICY_STR(policy->ta_name)
FREE_POLICY_STR(policy->ta_serial)
- KMF_FreeEKUPolicy(&policy->eku_set);
+ kmf_free_eku_policy(&policy->eku_set);
(void) memset(policy, 0, sizeof (KMF_POLICY_RECORD));
}
/*
- * KMF_GetPolicy
+ * kmf_get_policy
*
* Find a policy record in the database.
*/
KMF_RETURN
-KMF_GetPolicy(char *filename, char *policy_name, KMF_POLICY_RECORD *plc)
+kmf_get_policy(char *filename, char *policy_name, KMF_POLICY_RECORD *plc)
{
KMF_RETURN ret = KMF_OK;
xmlParserCtxtPtr ctxt;
@@ -926,10 +808,10 @@ KMF_GetPolicy(char *filename, char *policy_name, KMF_POLICY_RECORD *plc)
* Search for the policy that matches the given name.
*/
if (!xmlStrcmp((const xmlChar *)node->name,
- (const xmlChar *)KMF_POLICY_ELEMENT)) {
+ (const xmlChar *)KMF_POLICY_ELEMENT)) {
/* Check the name attribute */
c = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_NAME_ATTR);
+ (const xmlChar *)KMF_POLICY_NAME_ATTR);
/* If a match, parse the rest of the data */
if (c != NULL) {
@@ -959,7 +841,7 @@ out:
}
/*
- * KMF_SetPolicy
+ * kmf_set_policy
*
* Set the policy record in the handle. This searches
* the policy DB for the named policy. If it is not found
@@ -967,7 +849,7 @@ out:
* is kept and an error code is returned.
*/
KMF_RETURN
-KMF_SetPolicy(KMF_HANDLE_T handle, char *policyfile, char *policyname)
+kmf_set_policy(KMF_HANDLE_T handle, char *policyfile, char *policyname)
{
KMF_RETURN ret = KMF_OK;
KMF_POLICY_RECORD *newpolicy = NULL;
@@ -981,20 +863,20 @@ KMF_SetPolicy(KMF_HANDLE_T handle, char *policyfile, char *policyname)
return (KMF_ERR_MEMORY);
(void) memset(newpolicy, 0, sizeof (KMF_POLICY_RECORD));
- ret = KMF_GetPolicy(
+ ret = kmf_get_policy(
policyfile == NULL ? KMF_DEFAULT_POLICY_FILE : policyfile,
policyname == NULL ? KMF_DEFAULT_POLICY_NAME : policyname,
newpolicy);
if (ret != KMF_OK)
goto out;
- ret = KMF_VerifyPolicy(newpolicy);
+ ret = kmf_verify_policy(newpolicy);
if (ret != KMF_OK)
goto out;
/* release the existing policy data (if any). */
if (handle->policy != NULL) {
- KMF_FreePolicyRecord(handle->policy);
+ kmf_free_policy_record(handle->policy);
free(handle->policy);
}
@@ -1003,7 +885,7 @@ KMF_SetPolicy(KMF_HANDLE_T handle, char *policyfile, char *policyname)
out:
/* Cleanup any data allocated before the error occurred */
if (ret != KMF_OK) {
- KMF_FreePolicyRecord(newpolicy);
+ kmf_free_policy_record(newpolicy);
free(newpolicy);
}
@@ -1024,10 +906,10 @@ deletePolicyNode(xmlNodePtr node, char *policy_name)
* Search for the policy that matches the given name.
*/
if (!xmlStrcmp((const xmlChar *)node->name,
- (const xmlChar *)KMF_POLICY_ELEMENT)) {
+ (const xmlChar *)KMF_POLICY_ELEMENT)) {
/* Check the name attribute */
c = (char *)xmlGetProp(node,
- (const xmlChar *)KMF_POLICY_NAME_ATTR);
+ (const xmlChar *)KMF_POLICY_NAME_ATTR);
/* If a match, parse the rest of the data */
if (c != NULL) {
@@ -1139,8 +1021,7 @@ update_policyfile(xmlDocPtr doc, char *filename)
(void) fclose(pfile);
- if (fchmod(tmpfd,
- S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
+ if (fchmod(tmpfd, S_IRUSR | S_IWUSR | S_IRGRP | S_IROTH) == -1) {
(void) close(tmpfd);
(void) unlink(tmpfilename);
return (KMF_ERR_POLICY_DB_FILE);
@@ -1164,13 +1045,13 @@ update_policyfile(xmlDocPtr doc, char *filename)
}
/*
- * DeletePolicyFromDB
+ * kmf_delete_policy_from_db
*
* Find a policy by name and remove it from the policy DB file.
* If the policy is not found, return an error.
*/
KMF_RETURN
-KMF_DeletePolicyFromDB(char *policy_name, char *dbfilename)
+kmf_delete_policy_from_db(char *policy_name, char *dbfilename)
{
KMF_RETURN ret;
xmlParserCtxtPtr ctxt = NULL;
@@ -1241,7 +1122,7 @@ addPolicyNode(xmlNodePtr pnode, KMF_POLICY_RECORD *policy)
}
if (policy->ignore_date) {
if (newprop(pnode, KMF_OPTIONS_IGNORE_DATE_ATTR,
- "TRUE")) {
+ "TRUE")) {
ret = KMF_ERR_POLICY_ENGINE;
goto out;
}
@@ -1249,7 +1130,7 @@ addPolicyNode(xmlNodePtr pnode, KMF_POLICY_RECORD *policy)
if (policy->ignore_unknown_ekus) {
if (newprop(pnode, KMF_OPTIONS_IGNORE_UNKNOWN_EKUS,
- "TRUE")) {
+ "TRUE")) {
ret = KMF_ERR_POLICY_ENGINE;
goto out;
}
@@ -1257,7 +1138,7 @@ addPolicyNode(xmlNodePtr pnode, KMF_POLICY_RECORD *policy)
if (policy->ignore_trust_anchor) {
if (newprop(pnode, KMF_OPTIONS_IGNORE_TRUST_ANCHOR,
- "TRUE")) {
+ "TRUE")) {
ret = KMF_ERR_POLICY_ENGINE;
goto out;
}
@@ -1265,7 +1146,7 @@ addPolicyNode(xmlNodePtr pnode, KMF_POLICY_RECORD *policy)
if (policy->validity_adjusttime) {
if (newprop(pnode, KMF_OPTIONS_VALIDITY_ADJUSTTIME,
- policy->validity_adjusttime)) {
+ policy->validity_adjusttime)) {
ret = KMF_ERR_POLICY_ENGINE;
goto out;
}
@@ -1311,7 +1192,7 @@ out:
KMF_RETURN
-KMF_VerifyPolicy(KMF_POLICY_RECORD *policy)
+kmf_verify_policy(KMF_POLICY_RECORD *policy)
{
KMF_RETURN ret = KMF_OK;
boolean_t has_ta;
@@ -1366,7 +1247,7 @@ KMF_VerifyPolicy(KMF_POLICY_RECORD *policy)
* is true, then we check the policy sanity also.
*/
KMF_RETURN
-KMF_AddPolicyToDB(KMF_POLICY_RECORD *policy, char *dbfilename,
+kmf_add_policy_to_db(KMF_POLICY_RECORD *policy, char *dbfilename,
boolean_t check_policy)
{
KMF_RETURN ret = KMF_OK;
@@ -1378,8 +1259,8 @@ KMF_AddPolicyToDB(KMF_POLICY_RECORD *policy, char *dbfilename,
return (KMF_ERR_BAD_PARAMETER);
if (check_policy == B_TRUE) {
- if (ret = KMF_VerifyPolicy(policy))
- return (ret);
+ if (ret = kmf_verify_policy(policy))
+ return (ret);
}
/* If the policyDB exists, load it into memory */
@@ -1423,11 +1304,11 @@ KMF_AddPolicyToDB(KMF_POLICY_RECORD *policy, char *dbfilename,
* DTD link is embedded
*/
doc->intSubset = xmlCreateIntSubset(doc,
- (const xmlChar *)KMF_POLICY_ROOT,
- NULL, (const xmlChar *)KMF_POLICY_DTD);
+ (const xmlChar *)KMF_POLICY_ROOT,
+ NULL, (const xmlChar *)KMF_POLICY_DTD);
root = xmlNewDocNode(doc, NULL,
- (const xmlChar *)KMF_POLICY_ROOT, NULL);
+ (const xmlChar *)KMF_POLICY_ROOT, NULL);
if (root != NULL) {
xmlDocSetRootElement(doc, root);
}
@@ -1438,7 +1319,7 @@ KMF_AddPolicyToDB(KMF_POLICY_RECORD *policy, char *dbfilename,
xmlNodePtr pnode;
pnode = xmlNewChild(root, NULL,
- (const xmlChar *)KMF_POLICY_ELEMENT, NULL);
+ (const xmlChar *)KMF_POLICY_ELEMENT, NULL);
ret = addPolicyNode(pnode, policy);
/* If that worked, update the DB file. */
diff --git a/usr/src/lib/libkmf/libkmf/common/rdn_parser.c b/usr/src/lib/libkmf/libkmf/common/rdn_parser.c
index 575ab85a31..8c8c1c644c 100644
--- a/usr/src/lib/libkmf/libkmf/common/rdn_parser.c
+++ b/usr/src/lib/libkmf/libkmf/common/rdn_parser.c
@@ -366,7 +366,7 @@ ParseRdnAttribute(char **pbp, char *endptr, boolean_t singleAVA,
return (KMF_ERR_RDN_ATTR);
}
} else if ((n2k->kind == OID_PKCS9_EMAIL_ADDRESS) ||
- (n2k->kind == OID_RFC1274_MAIL)) {
+ (n2k->kind == OID_RFC1274_MAIL)) {
vt = BER_IA5STRING;
} else {
/*
@@ -381,8 +381,7 @@ ParseRdnAttribute(char **pbp, char *endptr, boolean_t singleAVA,
vt = BER_T61STRING;
}
}
- rv = CreateAVA(n2k->OID,
- vt, (char *)valBuf, a);
+ rv = CreateAVA(n2k->OID, vt, (char *)valBuf, a);
return (rv);
}
}
@@ -412,8 +411,8 @@ rdnavcompare(const void *a, const void *b)
* the result.
*/
for (n2k = name2kinds, i = 0;
- n2k->name && (p1 == MAXINT || p2 == MAXINT);
- n2k++, i++) {
+ n2k->name && (p1 == MAXINT || p2 == MAXINT);
+ n2k++, i++) {
oidrec = n2k->OID;
if (oidrec != NULL) {
if (IsEqualOid(&av1->type, oidrec))
@@ -431,7 +430,7 @@ rdnavcompare(const void *a, const void *b)
return (1);
}
-KMF_RETURN
+static KMF_RETURN
ParseDistinguishedName(char *buf, int len, KMF_X509_NAME *name)
{
KMF_RETURN rv = KMF_OK;
@@ -458,15 +457,13 @@ ParseDistinguishedName(char *buf, int len, KMF_X509_NAME *name)
* order (most significant component last)."
*/
qsort((void *)name->RelativeDistinguishedName,
- name->numberOfRDNs,
- sizeof (KMF_X509_RDN),
- rdnavcompare);
+ name->numberOfRDNs, sizeof (KMF_X509_RDN), rdnavcompare);
/* return result */
return (rv);
loser:
- KMF_FreeDN(name);
+ kmf_free_dn(name);
return (rv);
}
@@ -486,7 +483,7 @@ IsEqualData(KMF_DATA *d1, KMF_DATA *d2)
* Return 0 if equal, 1 if not.
*/
int
-KMF_CompareRDNs(KMF_X509_NAME *name1, KMF_X509_NAME *name2)
+kmf_compare_rdns(KMF_X509_NAME *name1, KMF_X509_NAME *name2)
{
int i, j;
boolean_t avfound;
@@ -506,12 +503,12 @@ KMF_CompareRDNs(KMF_X509_NAME *name1, KMF_X509_NAME *name2)
avfound = FALSE;
for (j = 0; j < name2->numberOfRDNs && !avfound; j++) {
r2 = (KMF_X509_RDN *)
- &name2->RelativeDistinguishedName[j];
+ &name2->RelativeDistinguishedName[j];
av2 = (KMF_X509_TYPE_VALUE_PAIR *)
- r2->AttributeTypeAndValue;
+ r2->AttributeTypeAndValue;
avfound = (IsEqualOid(&av1->type, &av2->type) &&
- IsEqualData(&av1->value, &av2->value));
+ IsEqualData(&av1->value, &av2->value));
}
/*
* If the current AV from name1 was not found in name2,
@@ -524,3 +521,27 @@ KMF_CompareRDNs(KMF_X509_NAME *name1, KMF_X509_NAME *name2)
/* If we got this far, it must be a match */
return (0);
}
+
+/*
+ * kmf_dn_parser
+ *
+ * Public interface for parsing a Distinguished name in
+ * human-readable format into a binary KMF_X509_NAME.
+ */
+KMF_RETURN
+kmf_dn_parser(char *string, KMF_X509_NAME *name)
+{
+ KMF_RETURN err;
+
+ if (string == NULL || name == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ err = ParseDistinguishedName(string, (int)strlen(string), name);
+ return (err);
+}
+
+KMF_RETURN
+KMF_DNParser(char *string, KMF_X509_NAME *name)
+{
+ return (kmf_dn_parser(string, name));
+}
diff --git a/usr/src/lib/libkmf/libkmf/sparc/Makefile b/usr/src/lib/libkmf/libkmf/sparc/Makefile
index 6dd6b42169..24e67f949d 100644
--- a/usr/src/lib/libkmf/libkmf/sparc/Makefile
+++ b/usr/src/lib/libkmf/libkmf/sparc/Makefile
@@ -18,7 +18,7 @@
#
# CDDL HEADER END
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -26,4 +26,11 @@
include ../Makefile.com
+#
+# Because elfsign depends on libkmf, make sure that the
+# library being built & signed here uses the system's own
+# KMF library (/usr/lib/libkmf.so.1)
+#
+$(DYNLIB):= LD_LIBRARY_PATH=/usr/lib
+
install: all $(ROOTLIBS) $(ROOTLINKS)
diff --git a/usr/src/lib/libkmf/plugins/kmf_nss/common/mapfile-vers b/usr/src/lib/libkmf/plugins/kmf_nss/common/mapfile-vers
index ed84774842..86cd5655a4 100644
--- a/usr/src/lib/libkmf/plugins/kmf_nss/common/mapfile-vers
+++ b/usr/src/lib/libkmf/plugins/kmf_nss/common/mapfile-vers
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -28,29 +28,28 @@
SUNWprivate_1.1 {
global:
KMF_Plugin_Initialize;
- NSS_FindCert;
- NSS_FreeKMFCert;
- NSS_StoreCert;
- NSS_ImportCert;
- NSS_ImportCRL;
- NSS_DeleteCert;
- NSS_DeleteCRL;
- NSS_CreateKeypair;
- NSS_FindKey;
- NSS_EncodePubKeyData;
- NSS_SignData;
- NSS_DeleteKey;
- NSS_FindCRL;
- NSS_FindCertInCRL;
- NSS_GetErrorString;
- NSS_GetPrikeyByCert;
- NSS_DecryptData;
- NSS_ExportP12;
- NSS_StorePrivateKey;
- NSS_CreateSymKey;
- NSS_GetSymKeyValue;
- NSS_SetTokenPin;
-
+ NSS_CreateKeypair;
+ NSS_CreateSymKey;
+ NSS_DecryptData;
+ NSS_DeleteCRL;
+ NSS_DeleteCert;
+ NSS_DeleteKey;
+ NSS_EncodePubKeyData;
+ NSS_ExportPK12;
+ NSS_FindCRL;
+ NSS_FindCert;
+ NSS_FindCertInCRL;
+ NSS_FindKey;
+ NSS_FindPrikeyByCert;
+ NSS_FreeKMFCert;
+ NSS_GetErrorString;
+ NSS_GetSymKeyValue;
+ NSS_ImportCRL;
+ NSS_ImportCert;
+ NSS_SetTokenPin;
+ NSS_SignData;
+ NSS_StoreCert;
+ NSS_StoreKey;
local:
*;
};
diff --git a/usr/src/lib/libkmf/plugins/kmf_nss/common/nss_spi.c b/usr/src/lib/libkmf/plugins/kmf_nss/common/nss_spi.c
index 2ef9aa0fee..010bc547b9 100644
--- a/usr/src/lib/libkmf/plugins/kmf_nss/common/nss_spi.c
+++ b/usr/src/lib/libkmf/plugins/kmf_nss/common/nss_spi.c
@@ -58,30 +58,28 @@ mutex_t init_lock = DEFAULTMUTEX;
static int nss_initialized = 0;
KMF_RETURN
-NSS_ConfigureKeystore(KMF_HANDLE_T, KMF_CONFIG_PARAMS *);
+NSS_ConfigureKeystore(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_FindCert(KMF_HANDLE_T,
- KMF_FINDCERT_PARAMS *params,
- KMF_X509_DER_CERT *kmf_cert,
- uint32_t *num_certs);
+NSS_FindCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
void
NSS_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
KMF_RETURN
-NSS_StoreCert(KMF_HANDLE_T, KMF_STORECERT_PARAMS *params,
- KMF_DATA * pcert);
+NSS_StoreCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_ImportCert(KMF_HANDLE_T, KMF_IMPORTCERT_PARAMS *params);
+NSS_ImportCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_DeleteCert(KMF_HANDLE_T, KMF_DELETECERT_PARAMS *params);
+NSS_DeleteCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_CreateKeypair(KMF_HANDLE_T, KMF_CREATEKEYPAIR_PARAMS *,
- KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
+NSS_CreateKeypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+
+KMF_RETURN
+NSS_StoreKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
NSS_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
@@ -91,55 +89,44 @@ NSS_SignData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
KMF_DATA *, KMF_DATA *);
KMF_RETURN
-NSS_ImportCRL(KMF_HANDLE_T, KMF_IMPORTCRL_PARAMS *params);
+NSS_ImportCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_DeleteCRL(KMF_HANDLE_T, KMF_DELETECRL_PARAMS *params);
+NSS_DeleteCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_FindCRL(KMF_HANDLE_T, KMF_FINDCRL_PARAMS *params,
- char **CRLNameList, int *CRLCount);
+NSS_FindCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
- KMF_KEY_HANDLE *, uint32_t *);
+NSS_FindKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_FindCertInCRL(KMF_HANDLE_T, KMF_FINDCERTINCRL_PARAMS *params);
+NSS_FindCertInCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
NSS_GetErrorString(KMF_HANDLE_T, char **);
KMF_RETURN
-NSS_DeleteKey(KMF_HANDLE_T, KMF_DELETEKEY_PARAMS *,
- KMF_KEY_HANDLE *, boolean_t);
+NSS_DeleteKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_GetPrikeyByCert(KMF_HANDLE_T, KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *,
- KMF_KEY_HANDLE *, KMF_KEY_ALG);
+NSS_FindPrikeyByCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
NSS_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
KMF_DATA *, KMF_DATA *);
KMF_RETURN
-NSS_ExportP12(KMF_HANDLE_T,
- KMF_EXPORTP12_PARAMS *,
- int, KMF_X509_DER_CERT *,
- int, KMF_KEY_HANDLE *,
- char *);
-
-KMF_RETURN
-NSS_StorePrivateKey(KMF_HANDLE_T, KMF_STOREKEY_PARAMS *, KMF_RAW_KEY_DATA *);
+NSS_ExportPK12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-NSS_CreateSymKey(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *, KMF_KEY_HANDLE *);
+NSS_CreateSymKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
NSS_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
KMF_RETURN
-NSS_SetTokenPin(KMF_HANDLE_T, KMF_SETPIN_PARAMS *, KMF_CREDENTIAL *);
+NSS_SetTokenPin(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
static
KMF_PLUGIN_FUNCLIST nss_plugin_table =
@@ -162,14 +149,14 @@ KMF_PLUGIN_FUNCLIST nss_plugin_table =
NSS_FindCRL,
NSS_FindCertInCRL,
NSS_GetErrorString,
- NSS_GetPrikeyByCert,
+ NSS_FindPrikeyByCert,
NSS_DecryptData,
- NSS_ExportP12,
- NSS_StorePrivateKey,
+ NSS_ExportPK12,
NSS_CreateSymKey,
NSS_GetSymKeyValue,
NSS_SetTokenPin,
NULL, /* VerifyData */
+ NSS_StoreKey,
NULL /* Finalize */
};
@@ -220,7 +207,7 @@ nss_authenticate(KMF_HANDLE_T handle,
/* If a password was given, try to login to the slot */
if (cred == NULL || cred->cred == NULL || cred->credlen == 0 ||
- nss_slot == NULL) {
+ nss_slot == NULL) {
return (KMF_ERR_BAD_PARAMETER);
}
@@ -229,8 +216,7 @@ nss_authenticate(KMF_HANDLE_T handle,
}
PK11_SetPasswordFunc(nss_getpassword);
- nssrv = PK11_Authenticate(nss_slot, PR_TRUE,
- (void *)cred->cred);
+ nssrv = PK11_Authenticate(nss_slot, PR_TRUE, (void *)cred->cred);
if (nssrv != SECSuccess) {
SET_ERROR(kmfh, nssrv);
@@ -258,9 +244,8 @@ Init_NSS_DBs(const char *configdir,
}
rv = NSS_Initialize((configdir && strlen(configdir)) ?
- configdir : "./", certPrefix,
- keyPrefix, secmodName ? secmodName : "secmod.db",
- NSS_INIT_COOPERATE);
+ configdir : "./", certPrefix, keyPrefix,
+ secmodName ? secmodName : "secmod.db", NSS_INIT_COOPERATE);
if (rv != SECSuccess) {
goto end;
}
@@ -277,23 +262,28 @@ end:
* if it is called again.
*/
KMF_RETURN
-NSS_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
+NSS_ConfigureKeystore(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ char *configdir;
+ char *certPrefix;
+ char *keyPrefix;
+ char *secModName;
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ configdir = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ certPrefix = kmf_get_attr_ptr(KMF_CERTPREFIX_ATTR, attrlist, numattr);
+ keyPrefix = kmf_get_attr_ptr(KMF_KEYPREFIX_ATTR, attrlist, numattr);
+ secModName = kmf_get_attr_ptr(KMF_SECMODNAME_ATTR, attrlist, numattr);
(void) mutex_lock(&init_lock);
if (nss_initialized == 0) {
SECStatus err;
(void) mutex_unlock(&init_lock);
- err = Init_NSS_DBs(params->nssconfig.configdir,
- params->nssconfig.certPrefix,
- params->nssconfig.keyPrefix,
- params->nssconfig.secModName);
+ err = Init_NSS_DBs(configdir, certPrefix,
+ keyPrefix, secModName);
if (err != SECSuccess) {
SET_ERROR(kmfh, err);
return (KMF_ERR_INTERNAL);
@@ -306,7 +296,6 @@ NSS_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
return (rv);
}
-
/*
* This function sets up the slot to be used for other operations.
* This function is basically called by every NSS SPI function.
@@ -314,44 +303,49 @@ NSS_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
* boolean "internal_slot_only" argument needs to be TRUE.
* A slot pointer will be returned when this function is executed successfully.
*/
-static KMF_RETURN
-Do_NSS_Init(
- void *handle,
- KMF_NSS_PARAMS nss_opts,
+KMF_RETURN
+do_nss_init(void *handle, int numattr,
+ KMF_ATTRIBUTE *attrlist,
boolean_t internal_slot_only,
PK11SlotInfo **nss_slot)
{
+ KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ char *slotlabel = NULL;
if (!nss_initialized)
return (KMF_ERR_PLUGIN_INIT);
+ slotlabel = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, numattr);
/*
* NSS Is already initialized, but we need to find
* the right slot.
*/
- if (nss_opts.slotlabel == NULL ||
- strcmp(nss_opts.slotlabel, "internal") == 0) {
+ if (slotlabel == NULL ||
+ strcmp(slotlabel, "internal") == 0) {
*nss_slot = PK11_GetInternalKeySlot();
} else if (internal_slot_only == TRUE) {
- return (KMF_ERR_SLOTNAME);
+ rv = KMF_ERR_SLOTNAME;
+ goto end;
} else {
- *nss_slot = PK11_FindSlotByName(nss_opts.slotlabel);
+ *nss_slot = PK11_FindSlotByName(slotlabel);
}
if (*nss_slot == NULL) {
SET_ERROR(kmfh, PORT_GetError());
- return (KMF_ERR_SLOTNAME);
+ rv = KMF_ERR_SLOTNAME;
+ goto end;
}
/*
* If the token was not yet initialized, return an error.
*/
if (PK11_NeedUserInit(*nss_slot)) {
- return (KMF_ERR_UNINITIALIZED_TOKEN);
+ rv = KMF_ERR_UNINITIALIZED_TOKEN;
}
- return (KMF_OK);
+end:
+ return (rv);
}
static KMF_RETURN
@@ -363,15 +357,15 @@ nss2kmf_cert(CERTCertificate *nss_cert, KMF_X509_DER_CERT *kmf_cert)
kmf_cert->certificate.Length = nss_cert->derCert.len;
if ((kmf_cert->certificate.Data = malloc(nss_cert->derCert.len)) ==
- NULL) {
+ NULL) {
kmf_cert->certificate.Length = 0;
return (KMF_ERR_MEMORY);
}
(void) memcpy(kmf_cert->certificate.Data, nss_cert->derCert.data,
- nss_cert->derCert.len);
+ nss_cert->derCert.len);
if (nss_cert->nickname != NULL)
kmf_cert->kmf_private.label =
- (char *)strdup(nss_cert->nickname);
+ (char *)strdup(nss_cert->nickname);
return (KMF_OK);
}
@@ -399,7 +393,7 @@ nss_getcert_by_label(KMF_HANDLE *kmfh,
break;
case KMF_NONEXPIRED_CERTS:
validity = CERT_CheckCertValidTimes(nss_cert, PR_Now(),
- PR_FALSE);
+ PR_FALSE);
if (validity != secCertTimeValid) {
/* this is an invalid cert, reject it */
*num_certs = 0;
@@ -409,7 +403,7 @@ nss_getcert_by_label(KMF_HANDLE *kmfh,
break;
case KMF_EXPIRED_CERTS:
validity = CERT_CheckCertValidTimes(nss_cert, PR_Now(),
- PR_FALSE);
+ PR_FALSE);
if (validity == secCertTimeValid) {
/* this is a valid cert, reject it in this case. */
*num_certs = 0;
@@ -448,13 +442,13 @@ nss_find_matching_certs(PK11SlotInfo *slot,
boolean_t findSerial = FALSE;
if (issuer != NULL && strlen(issuer)) {
- rv = KMF_DNParser(issuer, &issuerDN);
+ rv = kmf_dn_parser(issuer, &issuerDN);
if (rv != KMF_OK)
return (rv);
findIssuer = TRUE;
}
if (subject != NULL && strlen(subject)) {
- rv = KMF_DNParser(subject, &subjectDN);
+ rv = kmf_dn_parser(subject, &subjectDN);
if (rv != KMF_OK)
return (rv);
findSubject = TRUE;
@@ -477,8 +471,8 @@ nss_find_matching_certs(PK11SlotInfo *slot,
rv = DerDecodeName(&der, &cmpDN);
if (rv == KMF_OK) {
match = !KMF_CompareRDNs(&issuerDN,
- &cmpDN);
- KMF_FreeDN(&cmpDN);
+ &cmpDN);
+ kmf_free_dn(&cmpDN);
if (!match)
goto delete_and_cont;
} else {
@@ -491,8 +485,8 @@ nss_find_matching_certs(PK11SlotInfo *slot,
rv = DerDecodeName(&der, &cmpDN);
if (rv == KMF_OK) {
match = !KMF_CompareRDNs(&subjectDN,
- &cmpDN);
- KMF_FreeDN(&cmpDN);
+ &cmpDN);
+ kmf_free_dn(&cmpDN);
if (!match)
goto delete_and_cont;
} else {
@@ -508,7 +502,7 @@ nss_find_matching_certs(PK11SlotInfo *slot,
goto delete_and_cont;
if (memcmp(sernum->data, serial->val,
- serial->len))
+ serial->len))
goto delete_and_cont;
}
@@ -559,12 +553,19 @@ convertCertList(void *kmfhandle,
CERTCertListNode *node;
uint32_t maxcerts = *numcerts;
+ maxcerts = *numcerts;
+ if (maxcerts == 0)
+ maxcerts = 0xFFFFFFFF;
+
*numcerts = 0;
+ /*
+ * Don't copy more certs than the caller wanted.
+ */
for (node = CERT_LIST_HEAD(nsscerts);
- !CERT_LIST_END(node, nsscerts) && rv == KMF_OK &&
- (*numcerts) < maxcerts;
- node = CERT_LIST_NEXT(node), (*numcerts)++) {
+ !CERT_LIST_END(node, nsscerts) && rv == KMF_OK &&
+ (*numcerts) < maxcerts;
+ node = CERT_LIST_NEXT(node), (*numcerts)++) {
if (kmfcerts != NULL)
rv = nss2kmf_cert(node->cert, &kmfcerts[*numcerts]);
}
@@ -575,47 +576,71 @@ convertCertList(void *kmfhandle,
if (rv != KMF_OK) {
int i;
for (i = 0; i < *numcerts; i++)
- KMF_FreeKMFCert(kmfhandle, &kmfcerts[i]);
+ kmf_free_kmf_cert(kmfhandle, &kmfcerts[i]);
+
*numcerts = 0;
}
return (rv);
}
KMF_RETURN
-NSS_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
- KMF_X509_DER_CERT *kmfcerts,
- uint32_t *num_certs)
+NSS_FindCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
PK11SlotInfo *nss_slot = NULL;
CERTCertList *certlist = NULL;
uint32_t maxcerts;
-
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, FALSE, &nss_slot);
- if (rv != KMF_OK) {
- return (rv);
+ uint32_t *num_certs;
+ KMF_X509_DER_CERT *kmfcerts = NULL;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
}
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK)
+ return (rv);
- if (*num_certs == 0)
- maxcerts = 0xFFFFFFFF;
- else
- maxcerts = *num_certs;
+ num_certs = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (num_certs == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+ maxcerts = *num_certs;
+ if (maxcerts == 0)
+ maxcerts = 0xFFFFFFFF;
*num_certs = 0;
- if (params->certLabel) {
+
+ /* Get the optional returned certificate list */
+ kmfcerts = kmf_get_attr_ptr(KMF_X509_DER_CERT_ATTR, attrlist, numattr);
+
+ /* Get optional search criteria attributes */
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
+ if (rv != KMF_OK) {
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
+ }
+
+ if (certlabel != NULL) {
/* This will only find 1 certificate */
- rv = nss_getcert_by_label(kmfh,
- params->certLabel,
- kmfcerts, num_certs, params->find_cert_validity);
+ rv = nss_getcert_by_label(kmfh, certlabel, kmfcerts, num_certs,
+ validity);
} else {
/*
* Build a list of matching certs.
*/
- rv = nss_find_matching_certs(nss_slot,
- params->issuer, params->subject, params->serial,
- &certlist, params->find_cert_validity);
+ rv = nss_find_matching_certs(nss_slot, issuer, subject, serial,
+ &certlist, validity);
/*
* If the caller supplied a pointer to storage for
@@ -623,8 +648,8 @@ NSS_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
* matching certs.
*/
if (rv == KMF_OK && certlist != NULL) {
- rv = convertCertList(handle,
- certlist, kmfcerts, &maxcerts);
+ rv = convertCertList(handle, certlist, kmfcerts,
+ &maxcerts);
CERT_DestroyCertList(certlist);
if (rv == KMF_OK)
*num_certs = maxcerts;
@@ -659,177 +684,49 @@ NSS_FreeKMFCert(KMF_HANDLE_T handle,
}
}
-KMF_RETURN
-NSS_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *params,
- KMF_DATA *pcert)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- SECStatus nss_rv;
- CERTCertificate *nss_cert = NULL;
- CERTCertTrust *nss_trust = NULL;
- PK11SlotInfo *nss_slot = NULL;
- CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
-
- if (pcert == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- /* NSS only support DER format */
- if (params == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, FALSE, &nss_slot);
- if (ret != KMF_OK) {
- return (ret);
- }
-
- nss_cert = CERT_DecodeCertFromPackage((char *)pcert->Data,
- pcert->Length);
- if (nss_cert == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- ret = KMF_ERR_BAD_CERT_FORMAT;
- goto out;
- }
-
- nss_rv = PK11_ImportCert(nss_slot, nss_cert, CK_INVALID_HANDLE,
- params->certLabel, 0);
- if (nss_rv) {
- SET_ERROR(kmfh, nss_rv);
- ret = KMF_ERR_BAD_CERT_FORMAT;
- goto out;
- }
-
- if (params->ks_opt_u.nss_opts.trustflag != NULL &&
- strlen(params->ks_opt_u.nss_opts.trustflag)) {
- nss_trust = (CERTCertTrust *) malloc(sizeof (CERTCertTrust));
- if (nss_trust == NULL) {
- ret = KMF_ERR_MEMORY;
- goto out;
- }
- nss_rv = CERT_DecodeTrustString(nss_trust,
- params->ks_opt_u.nss_opts.trustflag);
- if (nss_rv) {
- SET_ERROR(kmfh, nss_rv);
- ret = KMF_ERR_BAD_PARAMETER;
- goto out;
- }
-
- nss_rv = CERT_ChangeCertTrust(certHandle, nss_cert, nss_trust);
- if (nss_rv) {
- SET_ERROR(kmfh, nss_rv);
- ret = KMF_ERR_BAD_PARAMETER;
- }
- }
-
-out:
- if (nss_trust != NULL) {
- free(nss_trust);
- }
-
- if (nss_cert != NULL) {
- CERT_DestroyCertificate(nss_cert);
- }
-
- if (nss_slot != NULL) {
- PK11_FreeSlot(nss_slot);
- }
-
- return (ret);
-}
-
KMF_RETURN
-NSS_ImportCert(KMF_HANDLE_T handle, KMF_IMPORTCERT_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_STORECERT_PARAMS scparams;
- KMF_DATA cert = {NULL, 0};
- KMF_DATA cert_der = {NULL, 0};
- KMF_DATA *cptr = NULL;
- KMF_ENCODE_FORMAT format;
-
- if (params == NULL || params->certfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- /*
- * Check if the input cert file is a valid certificate and
- * auto-detect the file format of it.
- */
- ret = KMF_IsCertFile(handle, params->certfile, &format);
- if (ret != KMF_OK)
- return (ret);
-
- ret = KMF_ReadInputFile(handle, params->certfile, &cert);
- if (ret != KMF_OK) {
- return (ret);
- }
-
- /*
- * If the imported cert is in PEM format, convert it to
- * DER format in order to store it in NSS token.
- */
- if (format == KMF_FORMAT_PEM) {
- int derlen;
- ret = KMF_Pem2Der(cert.Data, cert.Length,
- &cert_der.Data, &derlen);
- if (ret != KMF_OK) {
- goto cleanup;
- }
- cert_der.Length = (size_t)derlen;
- cptr = &cert_der;
- } else {
- cptr = &cert;
- }
-
- (void) memset(&scparams, 0, sizeof (scparams));
- scparams.kstype = params->kstype;
- scparams.certLabel = params->certLabel;
- scparams.nssparms = params->nssparms;
-
- ret = NSS_StoreCert(handle, &scparams, cptr);
-
- if (format == KMF_FORMAT_PEM) {
- KMF_FreeData(&cert_der);
- }
-
-cleanup:
- KMF_FreeData(&cert);
-
- return (ret);
-}
-
-KMF_RETURN
-NSS_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
+NSS_DeleteCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
int nssrv;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
CERTCertificate *cert = NULL;
PK11SlotInfo *nss_slot = NULL;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
- /* check params */
- if (params == NULL) {
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
return (KMF_ERR_BAD_PARAMETER);
}
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK)
+ return (rv);
+
+ /* Get the search criteria attributes. They are all optional. */
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts,
- FALSE, &nss_slot);
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
if (rv != KMF_OK) {
- return (rv);
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
}
- if (params->certLabel) {
- cert = PK11_FindCertFromNickname(params->certLabel, NULL);
+ /* Start finding the matched certificates and delete them. */
+ if (certlabel != NULL) {
+ cert = PK11_FindCertFromNickname(certlabel, NULL);
if (cert == NULL) {
return (KMF_ERR_CERT_NOT_FOUND);
}
- switch (params->find_cert_validity) {
+ switch (validity) {
case KMF_ALL_CERTS:
break;
case KMF_NONEXPIRED_CERTS:
@@ -857,13 +754,12 @@ NSS_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
CERTCertListNode *node;
CERTCertList *certlist = NULL;
- rv = nss_find_matching_certs(nss_slot,
- params->issuer, params->subject, params->serial,
- &certlist, params->find_cert_validity);
+ rv = nss_find_matching_certs(nss_slot, issuer, subject, serial,
+ &certlist, validity);
for (node = CERT_LIST_HEAD(certlist);
- !CERT_LIST_END(node, certlist) && rv == KMF_OK;
- node = CERT_LIST_NEXT(node)) {
+ !CERT_LIST_END(node, certlist) && rv == KMF_OK;
+ node = CERT_LIST_NEXT(node)) {
nssrv = SEC_DeletePermCertificate(node->cert);
if (nssrv) {
@@ -911,63 +807,114 @@ InitRandom(char *filename)
KMF_RETURN
NSS_CreateKeypair(KMF_HANDLE_T handle,
- KMF_CREATEKEYPAIR_PARAMS *params,
- KMF_KEY_HANDLE *privkey,
- KMF_KEY_HANDLE *pubkey)
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- PK11RSAGenParams rsaparams;
- void *nssparams;
+ PK11RSAGenParams rsaparams;
+ void *nssparams;
CK_MECHANISM_TYPE mechanism;
ulong_t publicExponent = 0x010001;
PK11SlotInfo *nss_slot = NULL;
SECKEYPrivateKey *NSSprivkey = NULL;
SECKEYPublicKey *NSSpubkey = NULL;
PQGParams *pqgParams = NULL;
-
-
- if (params == NULL) {
+ KMF_CREDENTIAL cred;
+ boolean_t storekey = TRUE;
+ uint32_t keylen = 1024, len;
+ uint32_t keylen_size = sizeof (uint32_t);
+ KMF_KEY_ALG keytype = KMF_RSA;
+ KMF_KEY_HANDLE *pubkey = NULL;
+ KMF_KEY_HANDLE *privkey = NULL;
+ char *keylabel = NULL;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
return (KMF_ERR_BAD_PARAMETER);
}
-
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, FALSE, &nss_slot);
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
if (rv != KMF_OK) {
return (rv);
}
- rv = nss_authenticate(handle, nss_slot, &params->cred);
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (rv);
+
+ rv = nss_authenticate(handle, nss_slot, &cred);
if (rv != KMF_OK) {
return (rv);
}
+ /* "storekey" is optional. Default is TRUE */
+ (void) kmf_get_attr(KMF_STOREKEY_BOOL_ATTR, attrlist, numattr,
+ &storekey, NULL);
+
+ /* keytype is optional. KMF_RSA is default */
+ (void) kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
+
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
+ &keylen, &keylen_size);
+ if (rv == KMF_ERR_ATTR_NOT_FOUND)
+ /* Default keylen = 1024 */
+ rv = KMF_OK;
+ else if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attrlist, numattr);
+ privkey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attrlist, numattr);
+ if (pubkey == NULL || privkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ (void) memset(pubkey, 0, sizeof (KMF_KEY_HANDLE));
+ (void) memset(privkey, 0, sizeof (KMF_KEY_HANDLE));
+
+ rv = kmf_get_attr(KMF_KEYLABEL_ATTR, attrlist, numattr, NULL, &len);
+ if (rv == KMF_OK && len > 0) {
+ keylabel = malloc(len + 1);
+ if (keylabel == NULL)
+ return (KMF_ERR_MEMORY);
+ /* Now fill in the label value */
+ (void) memset(keylabel, 0, len + 1);
+ rv = kmf_get_attr(KMF_KEYLABEL_ATTR, attrlist, numattr,
+ keylabel, NULL);
+ if (rv != KMF_OK) {
+ free(keylabel);
+ goto cleanup;
+ }
+ }
+
/* Get some random bits */
InitRandom("/dev/urandom");
- if (params->keytype == KMF_RSA) {
- rsaparams.keySizeInBits = params->keylength;
+ if (keytype == KMF_RSA) {
+ KMF_BIGINT rsaexp;
+
+ rsaparams.keySizeInBits = keylen;
/*
* NSS only allows for a 4 byte exponent.
* Ignore the exponent parameter if it is too big.
*/
- if (params->rsa_exponent.len > 0 &&
- params->rsa_exponent.len <= sizeof (publicExponent) &&
- params->rsa_exponent.val != NULL) {
- (void) memcpy(&publicExponent,
- params->rsa_exponent.val,
- params->rsa_exponent.len);
+ if ((rv = kmf_get_attr(KMF_RSAEXP_ATTR, attrlist, numattr,
+ &rsaexp, NULL)) == KMF_OK) {
+ if (rsaexp.len > 0 &&
+ rsaexp.len <= sizeof (publicExponent) &&
+ rsaexp.val != NULL) {
+ (void) memcpy(&publicExponent, rsaexp.val,
+ rsaexp.len);
+ }
}
rsaparams.pe = publicExponent;
mechanism = CKM_RSA_PKCS_KEY_PAIR_GEN;
nssparams = &rsaparams;
- } else if (params->keytype == KMF_DSA) {
+ } else if (keytype == KMF_DSA) {
PQGVerify *pqgVerify = NULL;
int ks;
SECStatus nssrv, passed;
mechanism = CKM_DSA_KEY_PAIR_GEN;
- ks = PQG_PBITS_TO_INDEX(params->keylength);
+ ks = PQG_PBITS_TO_INDEX(keylen);
nssrv = PK11_PQG_ParamGen(ks, &pqgParams, &pqgVerify);
if (nssrv != SECSuccess) {
SET_ERROR(kmfh, rv);
@@ -995,40 +942,34 @@ NSS_CreateKeypair(KMF_HANDLE_T handle,
goto cleanup;
}
- NSSprivkey = PK11_GenerateKeyPair(nss_slot,
- mechanism, nssparams, &NSSpubkey,
- PR_TRUE, /* isPermanent */
- PR_TRUE, /* isSensitive */
- (void *)params->cred.cred);
+ NSSprivkey = PK11_GenerateKeyPair(nss_slot, mechanism, nssparams,
+ &NSSpubkey,
+ storekey, /* isPermanent */
+ PR_TRUE, /* isSensitive */
+ (void *)cred.cred);
if (NSSprivkey == NULL || NSSpubkey == NULL) {
SET_ERROR(kmfh, PORT_GetError());
rv = KMF_ERR_KEYGEN_FAILED;
} else {
- if (params->keylabel != NULL &&
- strlen(params->keylabel)) {
+ if (keylabel != NULL && strlen(keylabel)) {
(void) PK11_SetPrivateKeyNickname(NSSprivkey,
- params->keylabel);
- (void) PK11_SetPublicKeyNickname(NSSpubkey,
- params->keylabel);
+ keylabel);
+ (void) PK11_SetPublicKeyNickname(NSSpubkey, keylabel);
}
/* Now, convert it to a KMF_KEY object for the framework */
- if (privkey != NULL) {
- privkey->kstype = KMF_KEYSTORE_NSS;
- privkey->keyalg = params->keytype;
- privkey->keyclass = KMF_ASYM_PRI;
- privkey->keylabel =
- PK11_GetPrivateKeyNickname(NSSprivkey);
- privkey->keyp = (void *)NSSprivkey;
- }
- if (pubkey != NULL) {
- pubkey->kstype = KMF_KEYSTORE_NSS;
- pubkey->keyalg = params->keytype;
- pubkey->keyp = (void *)NSSpubkey;
- pubkey->keyclass = KMF_ASYM_PUB;
- pubkey->keylabel =
- PK11_GetPublicKeyNickname(NSSpubkey);
- }
+ privkey->kstype = KMF_KEYSTORE_NSS;
+ privkey->keyalg = keytype;
+ privkey->keyclass = KMF_ASYM_PRI;
+ privkey->keylabel = PK11_GetPrivateKeyNickname(NSSprivkey);
+ privkey->keyp = (void *)NSSprivkey;
+
+ pubkey->kstype = KMF_KEYSTORE_NSS;
+ pubkey->keyalg = keytype;
+ pubkey->keyp = (void *)NSSpubkey;
+ pubkey->keyclass = KMF_ASYM_PUB;
+ pubkey->keylabel = PK11_GetPublicKeyNickname(NSSpubkey);
+
rv = KMF_OK;
}
cleanup:
@@ -1042,10 +983,12 @@ cleanup:
pubkey->keyp = NULL;
}
+ if (keylabel)
+ free(keylabel);
+
if (pqgParams != NULL)
PK11_PQG_DestroyParams(pqgParams);
-
if (nss_slot != NULL)
PK11_FreeSlot(nss_slot);
@@ -1054,11 +997,11 @@ cleanup:
KMF_RETURN
NSS_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
- KMF_OID *AlgOID, KMF_DATA *tobesigned,
- KMF_DATA *output)
+ KMF_OID *AlgOID, KMF_DATA *tobesigned,
+ KMF_DATA *output)
{
KMF_RETURN ret = KMF_OK;
- KMF_ALGORITHM_INDEX AlgId;
+ KMF_ALGORITHM_INDEX AlgId;
SECOidTag signAlgTag;
SECKEYPrivateKey *NSSprivkey = NULL;
SECStatus rv;
@@ -1073,7 +1016,7 @@ NSS_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
return (KMF_ERR_BAD_PARAMETER);
/* Map the OID to a NSS algorithm */
- AlgId = X509_AlgorithmOidToAlgId(AlgOID);
+ AlgId = x509_algoid_to_algid(AlgOID);
if (AlgId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_PARAMETER);
@@ -1129,8 +1072,7 @@ NSS_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
}
rvitem = SEC_ASN1EncodeItem(NULL, NULL, spki,
- CERT_SubjectPublicKeyInfoTemplate);
-
+ CERT_SubjectPublicKeyInfoTemplate);
if (rvitem != NULL) {
encoded->Data = malloc(rvitem->len);
if (encoded->Data == NULL) {
@@ -1152,50 +1094,65 @@ NSS_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
}
KMF_RETURN
-NSS_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
- KMF_KEY_HANDLE *key, boolean_t delete_token)
+NSS_DeleteKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
PK11SlotInfo *nss_slot = NULL;
+ KMF_KEY_HANDLE *key;
+ KMF_CREDENTIAL cred;
+ boolean_t delete_token = B_TRUE;
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
/*
* "delete_token" means to clear it from the token storage as well
* as from memory.
*/
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
if (key == NULL || key->keyp == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ rv = kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
+ (void *)&delete_token, NULL);
+ if (rv != KMF_OK)
+ /* "delete_token" is optional. Default is TRUE */
+ rv = KMF_OK;
+
if (delete_token) {
SECStatus nssrv = SECSuccess;
if (key->keyclass != KMF_ASYM_PUB &&
- key->keyclass != KMF_ASYM_PRI &&
- key->keyclass != KMF_SYMMETRIC)
+ key->keyclass != KMF_ASYM_PRI &&
+ key->keyclass != KMF_SYMMETRIC)
return (KMF_ERR_BAD_KEY_CLASS);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, FALSE, &nss_slot);
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
if (rv != KMF_OK) {
return (rv);
}
- rv = nss_authenticate(handle, nss_slot, &params->cred);
+
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = nss_authenticate(handle, nss_slot, &cred);
if (rv != KMF_OK) {
return (rv);
}
if (key->keyclass == KMF_ASYM_PUB) {
nssrv = PK11_DeleteTokenPublicKey(
- (SECKEYPublicKey *)key->keyp);
+ (SECKEYPublicKey *)key->keyp);
} else if (key->keyclass == KMF_ASYM_PRI) {
nssrv = PK11_DeleteTokenPrivateKey(
- (SECKEYPrivateKey *)key->keyp, PR_TRUE);
+ (SECKEYPrivateKey *)key->keyp, PR_TRUE);
} else if (key->keyclass == KMF_SYMMETRIC) {
nssrv = PK11_DeleteTokenSymKey(
- (PK11SymKey *) key->keyp);
+ (PK11SymKey *) key->keyp);
if (nssrv == SECSuccess)
- PK11_FreeSymKey(
- (PK11SymKey *) key->keyp);
+ PK11_FreeSymKey((PK11SymKey *) key->keyp);
}
if (nssrv != SECSuccess) {
SET_ERROR(handle, PORT_GetError());
@@ -1218,460 +1175,6 @@ NSS_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
}
KMF_RETURN
-NSS_ImportCRL(KMF_HANDLE_T handle, KMF_IMPORTCRL_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- PK11SlotInfo *nss_slot = NULL;
- CERTSignedCrl *nss_crl = NULL;
- KMF_ENCODE_FORMAT format;
- int importOptions;
- SECItem crlDER;
- KMF_DATA crl1;
- KMF_DATA crl2;
-
- if (params == NULL || params->ks_opt_u.nss_opts.crlfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- /*
- * Check if the input CRL file is a valid CRL file and auto-detect
- * the encoded format of the file.
- */
- ret = KMF_IsCRLFile(handle, params->ks_opt_u.nss_opts.crlfile,
- &format);
- if (ret != KMF_OK)
- return (ret);
-
- ret = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, TRUE, &nss_slot);
- if (ret != KMF_OK) {
- return (ret);
- }
-
- /* set importOptions */
- if (params->ks_opt_u.nss_opts.crl_check == B_FALSE) {
- importOptions = CRL_IMPORT_DEFAULT_OPTIONS |
- CRL_IMPORT_BYPASS_CHECKS;
- } else {
- importOptions = CRL_IMPORT_DEFAULT_OPTIONS;
- }
-
-
- /* Read in the CRL file */
- crl1.Data = NULL;
- crl2.Data = NULL;
- ret = KMF_ReadInputFile(handle, params->ks_opt_u.nss_opts.crlfile,
- &crl1);
- if (ret != KMF_OK) {
- return (ret);
- }
-
- /* If the input CRL is in PEM format, convert it to DER first. */
- if (format == KMF_FORMAT_PEM) {
- int len;
- ret = KMF_Pem2Der(crl1.Data, crl1.Length,
- &crl2.Data, &len);
- if (ret != KMF_OK) {
- goto out;
- }
- crl2.Length = (size_t)len;
- }
-
- crlDER.data = format == KMF_FORMAT_ASN1 ? crl1.Data : crl2.Data;
- crlDER.len = format == KMF_FORMAT_ASN1 ? crl1.Length : crl2.Length;
-
- nss_crl = PK11_ImportCRL(nss_slot, &crlDER, NULL, SEC_CRL_TYPE,
- NULL, importOptions, NULL, CRL_DECODE_DEFAULT_OPTIONS);
-
- if (nss_crl == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- ret = KMF_ERR_BAD_CRLFILE;
- goto out;
- }
-
-out:
- if (nss_slot != NULL) {
- PK11_FreeSlot(nss_slot);
- }
-
- if (crl1.Data != NULL) {
- free(crl1.Data);
- }
-
- if (crl2.Data != NULL) {
- free(crl2.Data);
- }
-
- if (nss_crl != NULL) {
- SEC_DestroyCrl(nss_crl);
- }
-
- return (ret);
-}
-
-KMF_RETURN
-NSS_DeleteCRL(KMF_HANDLE_T handle, KMF_DELETECRL_PARAMS *params)
-{
- KMF_RETURN rv = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- CERTSignedCrl *crl = NULL;
- CERTCertificate *cert = NULL;
- PK11SlotInfo *nss_slot = NULL;
- CERTCrlHeadNode *crlList = NULL;
- CERTCrlNode *crlNode = NULL;
- PRArenaPool *arena = NULL;
- CERTName *name = NULL;
- CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
-
- /* check params */
- if (params == NULL ||
- (params->ks_opt_u.nss_opts.crl_issuerName == NULL &&
- params->ks_opt_u.nss_opts.crl_subjName == NULL) ||
- (params->ks_opt_u.nss_opts.crl_issuerName != NULL &&
- params->ks_opt_u.nss_opts.crl_subjName != NULL)) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, TRUE,
- &nss_slot);
- if (rv != KMF_OK) {
- return (rv);
- }
-
- /* Find the CRL based on the deletion criteria. */
- if (params->ks_opt_u.nss_opts.crl_issuerName != NULL) {
- /*
- * If the deletion is based on the issuer's certificate
- * nickname, we will get the issuer's cert first, then
- * get the CRL from the cert.
- */
- cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
- params->ks_opt_u.nss_opts.crl_issuerName);
- if (!cert) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CERT_NOT_FOUND;
- goto out;
- }
-
- crl = SEC_FindCrlByName(certHandle, &cert->derSubject,
- SEC_CRL_TYPE);
- if (crl == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- goto out;
- }
- } else {
- /*
- * If the deletion is based on the CRL's subject name, we will
- * get all the CRLs from the internal database and search
- * for the CRL with the same subject name.
- */
- boolean_t found = B_FALSE;
- int nssrv;
-
- nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
- if (nssrv) {
- SET_ERROR(kmfh, nssrv);
- rv = KMF_ERR_CRL_NOT_FOUND;
- goto out;
- }
-
- if (crlList == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- goto out;
- }
-
- /* Allocate space for name */
- arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
- if (arena == NULL) {
- rv = KMF_ERR_MEMORY;
- goto out;
- }
-
- name = PORT_ArenaZAlloc(arena, sizeof (*name));
- if (name == NULL) {
- rv = KMF_ERR_MEMORY;
- goto out;
- }
- name->arena = arena;
-
- crlNode = crlList->first;
- while (crlNode && !found) {
- char *asciiname = NULL;
- SECItem* issuer;
-
- name = &crlNode->crl->crl.name;
- if (!name) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- break;
- }
-
- asciiname = CERT_NameToAscii(name);
- if (asciiname == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- break;
- }
-
- if (strcmp(params->ks_opt_u.nss_opts.crl_subjName,
- asciiname) == 0) {
- found = B_TRUE;
- issuer = &crlNode->crl->crl.derName;
- crl = SEC_FindCrlByName(certHandle, issuer,
- SEC_CRL_TYPE);
- if (crl == NULL) {
- /* We found a cert but no CRL */
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- }
- }
- PORT_Free(asciiname);
- crlNode = crlNode->next;
- }
-
- if (rv) {
- goto out;
- }
- }
-
- if (crl) {
- (void) SEC_DeletePermCRL(crl);
- }
-
-out:
- if (nss_slot != NULL) {
- PK11_FreeSlot(nss_slot);
- }
-
- if (crlList != NULL) {
- PORT_FreeArena(crlList->arena, PR_FALSE);
- }
-
- if (arena != NULL) {
- PORT_FreeArena(arena, PR_FALSE);
- }
-
- if (cert != NULL) {
- CERT_DestroyCertificate(cert);
- }
-
- if (crl != NULL) {
- SEC_DestroyCrl(crl);
- }
-
- return (rv);
-}
-
-
-KMF_RETURN
-NSS_FindCRL(KMF_HANDLE_T handle, KMF_FINDCRL_PARAMS *params,
- char **CRLNameList, int *CRLCount)
-{
- KMF_RETURN rv = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- PK11SlotInfo *nss_slot = NULL;
- CERTCrlHeadNode *crlList = NULL;
- CERTCrlNode *crlNode = NULL;
- PRArenaPool *arena = NULL;
- CERTName *name = NULL;
- SECStatus nssrv;
- char *asciiname = NULL;
- int crl_num;
- int i;
- CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
-
- if (CRLCount == NULL || params == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- *CRLCount = 0;
-
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, TRUE, &nss_slot);
- if (rv != KMF_OK) {
- return (rv);
- }
-
- /* Look up Crls */
- nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
- if (nssrv) {
- SET_ERROR(kmfh, rv);
- rv = KMF_ERR_CRL_NOT_FOUND;
- goto out;
- }
-
- /* Allocate space for name first */
- arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
- if (arena == NULL) {
- rv = KMF_ERR_MEMORY;
- goto out;
- }
-
- name = PORT_ArenaZAlloc(arena, sizeof (*name));
- if (name == NULL) {
- rv = KMF_ERR_MEMORY;
- goto out;
- }
- name->arena = arena;
-
- /*
- * Loop thru the crlList and create a crl list with CRL's subject name.
- */
- crlNode = crlList->first;
- crl_num = 0;
- while (crlNode) {
- char *subj_name;
-
- /* Get the CRL subject name */
- name = &crlNode->crl->crl.name;
- if (!name) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- break;
- }
-
-
- if (CRLNameList != NULL) {
- asciiname = CERT_NameToAscii(name);
- if (asciiname == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- break;
- }
- subj_name = strdup(asciiname);
- PORT_Free(asciiname);
- if (subj_name == NULL) {
- rv = KMF_ERR_MEMORY;
- break;
- }
- CRLNameList[crl_num] = subj_name;
- }
-
- crl_num++;
- crlNode = crlNode->next;
- }
-
- if (rv == KMF_OK) {
- /* success */
- *CRLCount = crl_num;
- }
-
-out:
- if (nss_slot != NULL) {
- PK11_FreeSlot(nss_slot);
- }
-
- if (crlList != NULL) {
- PORT_FreeArena(crlList->arena, PR_FALSE);
- }
-
- if (arena != NULL) {
- PORT_FreeArena(arena, PR_FALSE);
- }
-
- /* If failed, free memory allocated for the returning rlist */
- if (rv && (CRLNameList != NULL)) {
- for (i = 0; i < crl_num; i++) {
- free(CRLNameList[i]);
- }
- }
-
- return (rv);
-}
-
-
-KMF_RETURN
-NSS_FindCertInCRL(KMF_HANDLE_T handle, KMF_FINDCERTINCRL_PARAMS *params)
-{
- KMF_RETURN rv = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- PK11SlotInfo *nss_slot = NULL;
- CERTCertificate *cert = NULL;
- CERTSignedCrl *crl = NULL;
- CERTCrlEntry *entry;
- boolean_t match = B_FALSE;
- int i;
- CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
-
- /* check params */
- if (params == NULL ||
- (params->ks_opt_u.nss_opts.certLabel == NULL &&
- params->ks_opt_u.nss_opts.certificate == NULL)) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, TRUE, &nss_slot);
- if (rv != KMF_OK) {
- return (rv);
- }
-
- /* Find the certificate first */
- if (params->ks_opt_u.nss_opts.certLabel != NULL) {
- cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
- params->ks_opt_u.nss_opts.certLabel);
- } else {
- SECItem derCert = { NULL, 0};
-
- derCert.data = params->ks_opt_u.nss_opts.certificate->Data;
- derCert.len = params->ks_opt_u.nss_opts.certificate->Length;
- cert = CERT_FindCertByDERCert(certHandle, &derCert);
- }
-
- if (!cert) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CERT_NOT_FOUND;
- goto out;
- }
-
- /* Find the CRL with the same issuer as the given certificate. */
- crl = SEC_FindCrlByName(certHandle, &cert->derIssuer, SEC_CRL_TYPE);
- if (crl == NULL) {
- /*
- * Could not find the CRL issued by the same issuer. This
- * usually means that the CRL is not installed in the DB.
- */
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_CRL_NOT_FOUND;
- goto out;
-
- }
-
- /* Check if the certificate's serialNumber is revoked in the CRL */
- i = 0;
- while ((entry = (crl->crl).entries[i++]) != NULL) {
- if (SECITEM_CompareItem(&(cert->serialNumber),
- &(entry->serialNumber)) == SECEqual) {
- match = B_TRUE;
- break;
- }
- }
-
- if (!match) {
- rv = KMF_ERR_NOT_REVOKED;
- }
-
-out:
- if (nss_slot != NULL) {
- PK11_FreeSlot(nss_slot);
- }
-
- if (cert != NULL) {
- CERT_DestroyCertificate(cert);
- }
-
- if (crl != NULL) {
- SEC_DestroyCrl(crl);
- }
-
- return (rv);
-}
-
-KMF_RETURN
NSS_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
{
KMF_RETURN ret = KMF_OK;
@@ -1693,30 +1196,46 @@ NSS_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
}
KMF_RETURN
-NSS_GetPrikeyByCert(KMF_HANDLE_T handle, KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *SignerCertData, KMF_KEY_HANDLE *key,
- KMF_KEY_ALG keytype)
+NSS_FindPrikeyByCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
- CERTCertificate *nss_cert = NULL;
- SECKEYPrivateKey* privkey = NULL;
- PK11SlotInfo *nss_slot = NULL;
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ PK11SlotInfo *nss_slot = NULL;
+ KMF_CREDENTIAL cred;
+ KMF_KEY_HANDLE *key = NULL;
+ KMF_DATA *cert = NULL;
+ CERTCertificate *nss_cert = NULL;
+ SECKEYPrivateKey* privkey = NULL;
- rv = Do_NSS_Init(handle,
- params->nssparms, FALSE, &nss_slot);
- if (rv != KMF_OK) {
- return (rv);
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
}
- rv = nss_authenticate(handle, nss_slot, &params->cred);
- if (rv != KMF_OK) {
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK)
return (rv);
- }
- nss_cert = CERT_DecodeCertFromPackage((char *)SignerCertData->Data,
- SignerCertData->Length);
+ /* Get the credential */
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+ rv = nss_authenticate(handle, nss_slot, &cred);
+ if (rv != KMF_OK)
+ return (rv);
+
+ /* Get the key handle */
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (key == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Get the cert data and decode it */
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL || cert->Data == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+ nss_cert = CERT_DecodeCertFromPackage((char *)cert->Data,
+ cert->Length);
if (nss_cert == NULL) {
SET_ERROR(kmfh, PORT_GetError());
return (KMF_ERR_BAD_CERT_FORMAT);
@@ -1730,16 +1249,15 @@ NSS_GetPrikeyByCert(KMF_HANDLE_T handle, KMF_CRYPTOWITHCERT_PARAMS *params,
key->kstype = KMF_KEYSTORE_NSS;
key->keyclass = KMF_ASYM_PRI;
- key->keyalg = keytype;
key->keyp = (void *)privkey;
key->keylabel = PK11_GetPrivateKeyNickname(privkey);
CERT_DestroyCertificate(nss_cert);
return (KMF_OK);
-
}
+
KMF_RETURN
NSS_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
KMF_OID *AlgOID, KMF_DATA *ciphertext,
@@ -1754,7 +1272,6 @@ NSS_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
uint8_t *in_data, *out_data;
int i, blocks;
-
if (key == NULL || AlgOID == NULL ||
ciphertext == NULL || output == NULL ||
ciphertext->Data == NULL ||
@@ -1812,8 +1329,8 @@ pk11keytype2kmf(CK_KEY_TYPE type)
}
KMF_RETURN
-NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
- KMF_KEY_HANDLE *keys, uint32_t *numkeys)
+NSS_FindKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv;
SECKEYPrivateKeyList *prilist;
@@ -1824,14 +1341,32 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
PK11SymKey *symlist = NULL;
int count;
uint32_t maxkeys;
+ KMF_KEY_HANDLE *keys;
+ uint32_t *numkeys;
+ KMF_CREDENTIAL cred;
+ KMF_KEY_CLASS keyclass;
+ char *findLabel;
+ KMF_KEY_ALG keytype = KMF_KEYALG_NONE;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (numkeys == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- rv = Do_NSS_Init(handle,
- parms->ks_opt_u.nss_opts, FALSE, &nss_slot);
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
if (rv != KMF_OK) {
return (rv);
}
- rv = nss_authenticate(handle, nss_slot, &parms->cred);
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = nss_authenticate(handle, nss_slot, &cred);
if (rv != KMF_OK) {
return (rv);
}
@@ -1839,24 +1374,29 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
maxkeys = *numkeys;
if (maxkeys == 0)
maxkeys = 0xFFFFFFFF;
-
*numkeys = 0;
- if (parms->keyclass == KMF_ASYM_PUB) {
- publist = PK11_ListPublicKeysInSlot(nss_slot, parms->findLabel);
+
+ rv = kmf_get_attr(KMF_KEYCLASS_ATTR, attrlist, numattr,
+ (void *)&keyclass, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ findLabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+
+ if (keyclass == KMF_ASYM_PUB) {
+ publist = PK11_ListPublicKeysInSlot(nss_slot, findLabel);
if (publist == NULL) {
rv = KMF_ERR_KEY_NOT_FOUND;
goto cleanup;
}
- } else if (parms->keyclass == KMF_ASYM_PRI) {
- prilist = PK11_ListPrivKeysInSlot(nss_slot,
- parms->findLabel, NULL);
+ } else if (keyclass == KMF_ASYM_PRI) {
+ prilist = PK11_ListPrivKeysInSlot(nss_slot, findLabel, NULL);
if (prilist == NULL) {
rv = KMF_ERR_KEY_NOT_FOUND;
goto cleanup;
}
- } else if (parms->keyclass == KMF_SYMMETRIC) {
- symlist = PK11_ListFixedKeysInSlot(nss_slot, parms->findLabel,
- NULL);
+ } else if (keyclass == KMF_SYMMETRIC) {
+ symlist = PK11_ListFixedKeysInSlot(nss_slot, findLabel, NULL);
if (symlist == NULL) {
rv = KMF_ERR_KEY_NOT_FOUND;
goto cleanup;
@@ -1866,18 +1406,19 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
goto cleanup;
}
- if (parms->keyclass == KMF_ASYM_PUB) {
+ keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ /* it is okay to have "keys" contains NULL */
+
+ if (keyclass == KMF_ASYM_PUB) {
for (count = 0, pubnode = PUBKEY_LIST_HEAD(publist);
- !PUBKEY_LIST_END(pubnode, publist) &&
- count < maxkeys;
- pubnode = PUBKEY_LIST_NEXT(pubnode), count++) {
+ !PUBKEY_LIST_END(pubnode, publist) && count < maxkeys;
+ pubnode = PUBKEY_LIST_NEXT(pubnode), count++) {
if (keys != NULL) {
keys[count].kstype = KMF_KEYSTORE_NSS;
keys[count].keyclass = KMF_ASYM_PUB;
keys[count].keyp = (void *)pubnode->key;
keys[count].keylabel =
- PK11_GetPublicKeyNickname(
- pubnode->key);
+ PK11_GetPublicKeyNickname(pubnode->key);
if (pubnode->key->keyType == rsaKey)
keys[count].keyalg = KMF_RSA;
@@ -1886,18 +1427,16 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
}
}
*numkeys = count;
- } else if (parms->keyclass == KMF_ASYM_PRI) {
+ } else if (keyclass == KMF_ASYM_PRI) {
for (count = 0, prinode = PRIVKEY_LIST_HEAD(prilist);
- !PRIVKEY_LIST_END(prinode, prilist) &&
- count < maxkeys;
- prinode = PRIVKEY_LIST_NEXT(prinode), count++) {
+ !PRIVKEY_LIST_END(prinode, prilist) && count < maxkeys;
+ prinode = PRIVKEY_LIST_NEXT(prinode), count++) {
if (keys != NULL) {
keys[count].kstype = KMF_KEYSTORE_NSS;
keys[count].keyclass = KMF_ASYM_PRI;
keys[count].keyp = (void *)prinode->key;
keys[count].keylabel =
- PK11_GetPrivateKeyNickname(
- prinode->key);
+ PK11_GetPrivateKeyNickname(prinode->key);
if (prinode->key->keyType == rsaKey)
keys[count].keyalg = KMF_RSA;
@@ -1906,8 +1445,12 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
}
}
*numkeys = count;
- } else if (parms->keyclass == KMF_SYMMETRIC) {
+ } else if (keyclass == KMF_SYMMETRIC) {
count = 0;
+ rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
+ if (rv != KMF_OK)
+ rv = KMF_OK;
while (symlist && count < maxkeys) {
PK11SymKey *symkey = symlist;
CK_KEY_TYPE type;
@@ -1916,15 +1459,15 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
type = PK11_GetSymKeyType(symkey);
keyalg = pk11keytype2kmf(type);
+ symlist = PK11_GetNextSymKey(symkey);
+
/*
* If keytype is specified in the searching parameter,
* check the keytype and skip the key if its keytype
* doesn't match.
*/
- symlist = PK11_GetNextSymKey(symkey);
- if (parms->keytype != KMF_KEYALG_NONE &&
- parms->keytype != keyalg) {
- /* free that key since we aren't using it */
+ if (keytype != KMF_KEYALG_NONE && keytype != keyalg) {
+ /* free that key since we arent using it */
PK11_FreeSymKey(symkey);
continue;
}
@@ -1946,12 +1489,13 @@ NSS_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
*/
while (symlist != NULL) {
PK11SymKey *symkey = symlist;
+
PK11_FreeSymKey(symkey);
symlist = PK11_GetNextSymKey(symkey);
}
+ *numkeys = count;
}
- *numkeys = count;
cleanup:
if (nss_slot != NULL) {
PK11_FreeSlot(nss_slot);
@@ -2005,7 +1549,7 @@ p12u_ucs2_ascii_conversion_function(
}
/* Perform the conversion. */
ret = PORT_UCS2_UTF8Conversion(toUnicode, dup->data, dup->len,
- outBuf, maxOutBufLen, outBufLen);
+ outBuf, maxOutBufLen, outBufLen);
if (dup)
SECITEM_ZfreeItem(dup, PR_TRUE);
@@ -2020,11 +1564,10 @@ p12u_OpenFile(p12uContext *p12ctx, PRBool fileRead)
}
if (fileRead) {
- p12ctx->file = PR_Open(p12ctx->filename,
- PR_RDONLY, 0400);
+ p12ctx->file = PR_Open(p12ctx->filename, PR_RDONLY, 0400);
} else {
p12ctx->file = PR_Open(p12ctx->filename,
- PR_CREATE_FILE | PR_RDWR | PR_TRUNCATE, 0600);
+ PR_CREATE_FILE | PR_RDWR | PR_TRUNCATE, 0600);
}
if (!p12ctx->file) {
@@ -2124,7 +1667,7 @@ add_cert_to_bag(SEC_PKCS12ExportContext *p12ecx,
certSafe = keySafe;
} else {
certSafe = SEC_PKCS12CreatePasswordPrivSafe(p12ecx, pwitem,
- SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_40_BIT_RC2_CBC);
+ SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_40_BIT_RC2_CBC);
}
if (!certSafe || !keySafe) {
@@ -2133,22 +1676,17 @@ add_cert_to_bag(SEC_PKCS12ExportContext *p12ecx,
}
if (SEC_PKCS12AddCertAndKey(p12ecx, certSafe, NULL, cert,
- CERT_GetDefaultCertDB(), keySafe, NULL, PR_TRUE, pwitem,
- SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_3KEY_TRIPLE_DES_CBC)
- != SECSuccess) {
+ CERT_GetDefaultCertDB(), keySafe, NULL, PR_TRUE, pwitem,
+ SEC_OID_PKCS12_V2_PBE_WITH_SHA1_AND_3KEY_TRIPLE_DES_CBC)
+ != SECSuccess) {
rv = KMF_ERR_INTERNAL;
}
out:
return (rv);
}
-/*ARGSUSED*/
KMF_RETURN
-NSS_ExportP12(KMF_HANDLE_T handle,
- KMF_EXPORTP12_PARAMS *params,
- int numcerts, KMF_X509_DER_CERT *certs,
- int numkeys, KMF_KEY_HANDLE *keylist,
- char *filename)
+NSS_ExportPK12(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -2159,33 +1697,56 @@ NSS_ExportP12(KMF_HANDLE_T handle,
CERTCertListNode* node = NULL;
PK11SlotInfo *slot = NULL;
SECItem pwitem = {NULL, 0};
+ KMF_CREDENTIAL *cred = NULL;
+ KMF_CREDENTIAL *p12cred = NULL;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ char *filename = NULL;
+
+ if (kmfh == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
- rv = Do_NSS_Init(handle,
- params->nssparms, FALSE, &slot);
- if (rv != KMF_OK) {
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &slot);
+ if (rv != KMF_OK)
return (rv);
- }
- rv = nss_authenticate(handle, slot, &params->cred);
- if (rv != KMF_OK) {
+ cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
+ if (cred == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = nss_authenticate(handle, slot, cred);
+ if (rv != KMF_OK)
return (rv);
- }
+
+ p12cred = kmf_get_attr_ptr(KMF_PK12CRED_ATTR, attrlist, numattr);
+ if (p12cred == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ filename = kmf_get_attr_ptr(KMF_OUTPUT_FILENAME_ATTR, attrlist,
+ numattr);
+ if (filename == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Get optional search criteria attributes */
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
/*
* Find the certificate(s) first.
*/
- if (params->certLabel) {
- nsscert = PK11_FindCertFromNickname(params->certLabel,
- NULL);
+ if (certlabel != NULL) {
+ nsscert = PK11_FindCertFromNickname(certlabel, NULL);
if (nsscert == NULL) {
HANDLE_NSS_ERROR(KMF_ERR_CERT_NOT_FOUND)
}
} else {
- rv = nss_find_matching_certs(slot,
- params->issuer,
- params->subject,
- params->serial,
- &certlist, 0);
+ rv = nss_find_matching_certs(slot, issuer, subject, serial,
+ &certlist, 0);
if (rv == KMF_OK && certlist == NULL) {
return (KMF_ERR_CERT_NOT_FOUND);
@@ -2198,8 +1759,8 @@ NSS_ExportP12(KMF_HANDLE_T handle,
* The KMF_CREDENTIAL holds the password to use for
* encrypting the PKCS12 key information.
*/
- pwitem.data = (uchar_t *)params->p12cred.cred;
- pwitem.len = params->p12cred.credlen;
+ pwitem.data = (uchar_t *)p12cred->cred;
+ pwitem.len = p12cred->credlen;
p12ctx = p12u_InitContext(PR_FALSE, filename);
if (!p12ctx) {
@@ -2207,16 +1768,15 @@ NSS_ExportP12(KMF_HANDLE_T handle,
}
PORT_SetUCS2_ASCIIConversionFunction(
- p12u_ucs2_ascii_conversion_function);
+ p12u_ucs2_ascii_conversion_function);
- p12ecx = SEC_PKCS12CreateExportContext(NULL, NULL,
- slot, NULL);
+ p12ecx = SEC_PKCS12CreateExportContext(NULL, NULL, slot, NULL);
if (!p12ecx) {
HANDLE_NSS_ERROR(KMF_ERR_OPEN_FILE)
}
if (SEC_PKCS12AddPasswordIntegrity(p12ecx, &pwitem, SEC_OID_SHA1)
- != SECSuccess) {
+ != SECSuccess) {
HANDLE_NSS_ERROR(KMF_ERR_INTERNAL)
}
@@ -2226,9 +1786,8 @@ NSS_ExportP12(KMF_HANDLE_T handle,
*/
if (certlist != NULL) {
for (node = CERT_LIST_HEAD(certlist);
- !CERT_LIST_END(node, certlist) && rv == KMF_OK;
- node = CERT_LIST_NEXT(node)) {
-
+ !CERT_LIST_END(node, certlist) && rv == KMF_OK;
+ node = CERT_LIST_NEXT(node)) {
rv = add_cert_to_bag(p12ecx, node->cert, &pwitem);
}
} else if (nsscert != NULL) {
@@ -2236,7 +1795,7 @@ NSS_ExportP12(KMF_HANDLE_T handle,
}
if (SEC_PKCS12Encode(p12ecx, p12u_WriteToExportFile, p12ctx)
- != SECSuccess) {
+ != SECSuccess) {
HANDLE_NSS_ERROR(KMF_ERR_ENCODING)
}
out:
@@ -2261,105 +1820,8 @@ out:
t[n].ulValueLen = (CK_ULONG)size;
KMF_RETURN
-NSS_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
- KMF_RAW_KEY_DATA *rawkey)
-{
- KMF_RETURN rv = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- SECStatus ckrv = SECSuccess;
- PK11SlotInfo *slot = NULL;
- CERTCertificate *nss_cert = NULL;
- SECKEYPrivateKeyInfo rpk;
- SECItem nickname;
- KMF_DATA derkey = { NULL, 0 };
- uchar_t ver = 0;
-
- if (!kmfh)
- return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
-
- if (params == NULL || params->certificate == NULL || rawkey == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- rv = Do_NSS_Init(handle,
- params->nssparms, FALSE, &slot);
-
- if (rv != KMF_OK)
- return (rv);
-
- rv = nss_authenticate(handle, slot, &params->cred);
- if (rv != KMF_OK) {
- return (rv);
- }
-
- /*
- * Decode the cert into an NSS CERT object so we can access the
- * SPKI and KeyUsage data later.
- */
- nss_cert = CERT_DecodeCertFromPackage((char *)params->certificate->Data,
- params->certificate->Length);
-
- if (nss_cert == NULL) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_BAD_CERT_FORMAT;
- goto cleanup;
- }
-
- (void) memset(&rpk, 0, sizeof (rpk));
-
- rpk.arena = NULL;
- rpk.version.type = siUnsignedInteger;
- rpk.version.data = &ver;
- rpk.version.len = 1;
- if (rawkey->keytype == KMF_RSA) {
-
- rv = DerEncodeRSAPrivateKey(&derkey, &rawkey->rawdata.rsa);
- if (rv != KMF_OK)
- goto cleanup;
-
- rpk.algorithm = nss_cert->subjectPublicKeyInfo.algorithm;
- rpk.privateKey.data = derkey.Data;
- rpk.privateKey.len = derkey.Length;
- rpk.attributes = NULL;
-
-
- } else if (rawkey->keytype == KMF_DSA) {
- rv = DerEncodeDSAPrivateKey(&derkey, &rawkey->rawdata.dsa);
- if (rv != KMF_OK)
- goto cleanup;
-
- rpk.algorithm = nss_cert->subjectPublicKeyInfo.algorithm;
- rpk.privateKey.data = derkey.Data;
- rpk.privateKey.len = derkey.Length;
- rpk.attributes = NULL;
-
- } else {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- nickname.data = (uchar_t *)params->label;
- nickname.len = (params->label ? strlen(params->label) : 0);
-
- ckrv = PK11_ImportPrivateKeyInfo(slot, &rpk,
- &nickname, &nss_cert->subjectPublicKeyInfo.subjectPublicKey,
- TRUE, TRUE, nss_cert->keyUsage, NULL);
-
- if (ckrv != CKR_OK) {
- SET_ERROR(kmfh, PORT_GetError());
- rv = KMF_ERR_INTERNAL;
- }
-
-cleanup:
- if (nss_cert != NULL) {
- CERT_DestroyCertificate(nss_cert);
- }
- KMF_FreeData(&derkey);
- return (rv);
-}
-
-KMF_RETURN
NSS_CreateSymKey(KMF_HANDLE_T handle,
- KMF_CREATESYMKEY_PARAMS *params,
- KMF_KEY_HANDLE *symkey)
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -2368,21 +1830,49 @@ NSS_CreateSymKey(KMF_HANDLE_T handle,
CK_MECHANISM_TYPE keyType;
SECStatus nssrv;
int keySize;
-
- if (params == NULL || symkey == NULL) {
+ KMF_KEY_HANDLE *symkey;
+ KMF_CREDENTIAL cred;
+ uint32_t keylen;
+ uint32_t keylen_size = sizeof (uint32_t);
+ KMF_KEY_ALG keytype;
+ char *keylabel = NULL;
+
+ if (kmfh == NULL || attrlist == NULL || numattr == 0) {
return (KMF_ERR_BAD_PARAMETER);
}
- switch (params->keytype) {
+ symkey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (symkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr, (void *)&keytype,
+ NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr, &keylen,
+ &keylen_size);
+ if (rv == KMF_ERR_ATTR_NOT_FOUND &&
+ (keytype == KMF_DES || keytype == KMF_DES3))
+ /* keylength is not required for DES and 3DES */
+ rv = KMF_OK;
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+ if (keylabel == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ switch (keytype) {
case KMF_AES:
keyType = CKM_AES_KEY_GEN;
- keySize = params->keylength;
+ keySize = keylen;
if (keySize == 0 || (keySize % 8) != 0)
return (KMF_ERR_BAD_KEY_SIZE);
break;
case KMF_RC4:
keyType = CKM_RC4_KEY_GEN;
- keySize = params->keylength;
+ keySize = keylen;
if (keySize == 0 || (keySize % 8) != 0)
return (KMF_ERR_BAD_KEY_SIZE);
break;
@@ -2396,7 +1886,7 @@ NSS_CreateSymKey(KMF_HANDLE_T handle,
break;
case KMF_GENERIC_SECRET:
keyType = CKM_GENERIC_SECRET_KEY_GEN;
- keySize = params->keylength;
+ keySize = keylen;
if (keySize == 0 || (keySize % 8) != 0)
return (KMF_ERR_BAD_KEY_SIZE);
break;
@@ -2405,26 +1895,30 @@ NSS_CreateSymKey(KMF_HANDLE_T handle,
goto out;
}
- rv = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts, FALSE, &nss_slot);
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
if (rv != KMF_OK) {
return (rv);
}
- rv = nss_authenticate(handle, nss_slot, &params->cred);
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = nss_authenticate(handle, nss_slot, &cred);
if (rv != KMF_OK) {
return (rv);
}
nsskey = PK11_TokenKeyGen(nss_slot, keyType, NULL, keySize, NULL,
- PR_TRUE, (void *)params->cred.cred);
+ PR_TRUE, (void *)cred.cred);
if (nsskey == NULL) {
SET_ERROR(kmfh, PORT_GetError());
rv = KMF_ERR_KEYGEN_FAILED;
goto out;
}
- nssrv = PK11_SetSymKeyNickname(nsskey, params->keylabel);
+ nssrv = PK11_SetSymKeyNickname(nsskey, keylabel);
if (nssrv != SECSuccess) {
SET_ERROR(kmfh, PORT_GetError());
rv = KMF_ERR_KEYGEN_FAILED;
@@ -2432,7 +1926,7 @@ NSS_CreateSymKey(KMF_HANDLE_T handle,
}
symkey->kstype = KMF_KEYSTORE_NSS;
- symkey->keyalg = params->keytype;
+ symkey->keyalg = keytype;
symkey->keyclass = KMF_SYMMETRIC;
symkey->israw = FALSE;
symkey->keyp = (void *)nsskey;
@@ -2478,7 +1972,7 @@ NSS_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
if ((rkey->keydata.val = malloc(rkey->keydata.len)) == NULL)
return (KMF_ERR_MEMORY);
(void) memcpy(rkey->keydata.val,
- rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
+ rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
} else {
nsskey = (PK11SymKey *)(symkey->keyp);
if (nsskey == NULL)
@@ -2519,24 +2013,30 @@ out:
}
KMF_RETURN
-NSS_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
- KMF_CREDENTIAL *newpin)
+NSS_SetTokenPin(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
int rv;
PK11SlotInfo *nss_slot = NULL;
+ KMF_CREDENTIAL oldcred, newcred;
- if (handle == NULL || params == NULL || newpin == NULL) {
+ if (handle == NULL || attrlist == NULL || numattr == 0)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ ret = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&oldcred, NULL);
+ if (ret != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+ ret = kmf_get_attr(KMF_NEWPIN_ATTR, attrlist, numattr,
+ (void *)&newcred, NULL);
+ if (ret != KMF_OK)
return (KMF_ERR_BAD_PARAMETER);
- }
- ret = Do_NSS_Init(handle,
- params->ks_opt_u.nss_opts,
- FALSE, &nss_slot);
+ ret = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
/* If it was uninitialized, set it */
if (ret == KMF_ERR_UNINITIALIZED_TOKEN) {
- rv = PK11_InitPin(nss_slot, NULL, newpin->cred);
+ rv = PK11_InitPin(nss_slot, NULL, newcred.cred);
if (rv != SECSuccess) {
SET_ERROR(kmfh, PORT_GetError());
ret = KMF_ERR_AUTH_FAILED;
@@ -2544,12 +2044,11 @@ NSS_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
ret = KMF_OK;
}
} else if (ret == KMF_OK) {
- ret = nss_authenticate(handle, nss_slot, &params->cred);
+ ret = nss_authenticate(handle, nss_slot, &oldcred);
if (ret != KMF_OK) {
return (ret);
}
- rv = PK11_ChangePW(nss_slot,
- params->cred.cred, newpin->cred);
+ rv = PK11_ChangePW(nss_slot, oldcred.cred, newcred.cred);
if (rv != SECSuccess) {
SET_ERROR(kmfh, PORT_GetError());
ret = KMF_ERR_AUTH_FAILED;
@@ -2558,3 +2057,795 @@ NSS_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
return (ret);
}
+
+KMF_RETURN
+NSS_StoreKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ PK11SlotInfo *nss_slot = NULL;
+ KMF_CREDENTIAL cred = {NULL, 0};
+ KMF_KEY_HANDLE *pubkey = NULL, *prikey = NULL;
+ KMF_RAW_KEY_DATA *rawkey = NULL;
+ char *keylabel = NULL;
+ SECStatus ckrv = SECSuccess;
+ SECItem nickname = {NULL, 0};
+ CERTCertificate *nss_cert = NULL;
+
+ if (kmfh == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = nss_authenticate(handle, nss_slot, &cred);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attrlist, numattr);
+ if (pubkey == NULL) {
+ /* look for private key */
+ prikey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attrlist,
+ numattr);
+ if (prikey == NULL)
+ /* look for raw key */
+ rawkey = kmf_get_attr_ptr(KMF_RAW_KEY_ATTR,
+ attrlist, numattr);
+ }
+
+ /* If no keys were found, return error */
+ if (pubkey == NULL && prikey == NULL && rawkey == NULL)
+ return (KMF_ERR_ATTR_NOT_FOUND);
+
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+ if (keylabel != NULL) {
+ nickname.data = (uchar_t *)keylabel;
+ nickname.len = strlen(keylabel);
+ }
+
+ if (rawkey != NULL) {
+ uchar_t ver = 0;
+ SECKEYPrivateKeyInfo rpk;
+ KMF_DATA derkey = {NULL, 0};
+ KMF_DATA *cert;
+
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL)
+ return (rv);
+ /*
+ * Decode the cert into an NSS CERT object so we can access the
+ * SPKI and KeyUsage data later.
+ */
+ nss_cert = CERT_DecodeCertFromPackage((char *)cert->Data,
+ cert->Length);
+
+ if (nss_cert == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_BAD_CERT_FORMAT;
+ goto cleanup;
+ }
+
+ (void) memset(&rpk, 0, sizeof (rpk));
+ rpk.arena = NULL;
+ rpk.version.type = siUnsignedInteger;
+ rpk.version.data = &ver;
+ rpk.version.len = 1;
+ if (rawkey->keytype == KMF_RSA) {
+ rv = DerEncodeRSAPrivateKey(&derkey,
+ &rawkey->rawdata.rsa);
+ if (rv != KMF_OK)
+ goto cleanup;
+
+ } else if (rawkey->keytype == KMF_DSA) {
+ rv = DerEncodeDSAPrivateKey(&derkey,
+ &rawkey->rawdata.dsa);
+ if (rv != KMF_OK)
+ goto cleanup;
+ }
+ rpk.algorithm = nss_cert->subjectPublicKeyInfo.algorithm;
+ rpk.privateKey.data = derkey.Data;
+ rpk.privateKey.len = derkey.Length;
+ rpk.attributes = NULL;
+
+ ckrv = PK11_ImportPrivateKeyInfo(nss_slot, &rpk, &nickname,
+ &nss_cert->subjectPublicKeyInfo.subjectPublicKey, TRUE,
+ TRUE, nss_cert->keyUsage, NULL);
+ if (ckrv != CKR_OK) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_INTERNAL;
+ }
+ kmf_free_data(&derkey);
+ } else if (pubkey != NULL && pubkey->kstype == KMF_KEYSTORE_NSS) {
+ CK_OBJECT_HANDLE pk;
+ SECKEYPublicKey *publicKey = (SECKEYPublicKey *) pubkey->keyp;
+
+ pk = PK11_ImportPublicKey(nss_slot, publicKey, PR_TRUE);
+ if (pk == CK_INVALID_HANDLE) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_INTERNAL;
+ }
+ } else if (prikey != NULL && prikey->kstype == KMF_KEYSTORE_NSS) {
+ SECKEYPrivateKey *pk;
+ SECKEYPrivateKey *privKey = (SECKEYPrivateKey *) prikey->keyp;
+
+ pk = PK11_LoadPrivKey(nss_slot, privKey, NULL, PR_TRUE,
+ PR_TRUE);
+ if (pk == CK_INVALID_HANDLE) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_INTERNAL;
+ }
+ /* We stored it, but don't need the handle anymore */
+ SECKEY_DestroyPrivateKey(pk);
+ }
+
+cleanup:
+ if (nss_cert != NULL)
+ CERT_DestroyCertificate(nss_cert);
+ PK11_FreeSlot(nss_slot);
+ return (rv);
+}
+
+/*
+ * This function is called by NSS_StoreCert() and NSS_ImportCert().
+ * The "label" and "trust_flag" arguments can be NULL.
+ */
+static KMF_RETURN
+store_cert(KMF_HANDLE_T handle, PK11SlotInfo *nss_slot, KMF_DATA *cert,
+ char *label, char *trust_flag)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ SECStatus nss_rv;
+ CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
+ CERTCertificate *nss_cert = NULL;
+ CERTCertTrust *nss_trust = NULL;
+
+ if (nss_slot == NULL || cert == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ nss_cert = CERT_DecodeCertFromPackage((char *)cert->Data,
+ cert->Length);
+ if (nss_cert == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ ret = KMF_ERR_BAD_CERT_FORMAT;
+ goto out;
+ }
+
+ /* Store the cert into the NSS database */
+ nss_rv = PK11_ImportCert(nss_slot, nss_cert, CK_INVALID_HANDLE,
+ label, 0);
+ if (nss_rv) {
+ SET_ERROR(kmfh, nss_rv);
+ ret = KMF_ERR_BAD_CERT_FORMAT;
+ goto out;
+ }
+
+ /* If trust_flag is NULL, then we are done */
+ if (trust_flag == NULL)
+ goto out;
+
+ nss_trust = (CERTCertTrust *) malloc(sizeof (CERTCertTrust));
+ if (nss_trust == NULL) {
+ ret = KMF_ERR_MEMORY;
+ goto out;
+ }
+
+ nss_rv = CERT_DecodeTrustString(nss_trust, trust_flag);
+ if (nss_rv) {
+ SET_ERROR(kmfh, nss_rv);
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto out;
+ }
+
+ nss_rv = CERT_ChangeCertTrust(certHandle, nss_cert, nss_trust);
+ if (nss_rv) {
+ SET_ERROR(kmfh, nss_rv);
+ ret = KMF_ERR_BAD_PARAMETER;
+ }
+
+out:
+ if (nss_cert != NULL) {
+ CERT_DestroyCertificate(nss_cert);
+ }
+
+ if (nss_trust != NULL) {
+ free(nss_trust);
+ }
+
+ return (ret);
+}
+
+
+KMF_RETURN
+NSS_StoreCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ PK11SlotInfo *nss_slot = NULL;
+ KMF_DATA *cert = NULL;
+ char *label = NULL;
+ char *trust_flag = NULL;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (ret != KMF_OK)
+ return (ret);
+
+ /* Get the cert data */
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL || cert->Data == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* The label attribute is optional */
+ label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+
+ /* The trustflag attriburte is optional */
+ trust_flag = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR, attrlist, numattr);
+
+ ret = store_cert(handle, nss_slot, cert, label, trust_flag);
+
+out:
+ if (nss_slot != NULL) {
+ PK11_FreeSlot(nss_slot);
+ }
+
+ return (ret);
+}
+
+
+KMF_RETURN
+NSS_ImportCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ PK11SlotInfo *nss_slot = NULL;
+ KMF_DATA cert = {NULL, 0};
+ KMF_DATA cert_der = {NULL, 0};
+ KMF_DATA *cptr = NULL;
+ KMF_ENCODE_FORMAT format;
+ char *label = NULL;
+ char *trust_flag = NULL;
+ char *certfile = NULL;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (ret != KMF_OK)
+ return (ret);
+
+ /* Get the input cert filename attribute */
+ certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
+ if (certfile == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Check the cert file and auto-detect the file format of it. */
+ ret = kmf_is_cert_file(handle, certfile, &format);
+ if (ret != KMF_OK)
+ return (ret);
+
+ ret = kmf_read_input_file(handle, certfile, &cert);
+ if (ret != KMF_OK) {
+ return (ret);
+ }
+
+ /*
+ * If the imported cert is in PEM format, convert it to
+ * DER format in order to store it in NSS token.
+ */
+ if (format == KMF_FORMAT_PEM) {
+ int derlen;
+ ret = kmf_pem_to_der(cert.Data, cert.Length,
+ &cert_der.Data, &derlen);
+ if (ret != KMF_OK) {
+ goto cleanup;
+ }
+ cert_der.Length = (size_t)derlen;
+ cptr = &cert_der;
+ } else {
+ cptr = &cert;
+ }
+
+ label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ trust_flag = kmf_get_attr_ptr(KMF_TRUSTFLAG_ATTR, attrlist, numattr);
+ ret = store_cert(handle, nss_slot, cptr, label, trust_flag);
+
+cleanup:
+ if (format == KMF_FORMAT_PEM) {
+ kmf_free_data(&cert_der);
+ }
+
+ kmf_free_data(&cert);
+
+ return (ret);
+}
+
+
+KMF_RETURN
+NSS_ImportCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ PK11SlotInfo *nss_slot = NULL;
+ CERTSignedCrl *nss_crl = NULL;
+ KMF_ENCODE_FORMAT format;
+ int importOptions;
+ SECItem crlDER;
+ KMF_DATA crl1;
+ KMF_DATA crl2;
+ char *crlfilename;
+ boolean_t crlcheck = FALSE;
+
+ if (attrlist == NULL || numattr == 0) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (ret != KMF_OK) {
+ return (ret);
+ }
+
+ crlfilename = kmf_get_attr_ptr(KMF_CRL_FILENAME_ATTR, attrlist,
+ numattr);
+ if (crlfilename == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ /*
+ * Check if the input CRL file is a valid CRL file and auto-detect
+ * the encoded format of the file.
+ */
+ ret = kmf_is_crl_file(handle, crlfilename, &format);
+ if (ret != KMF_OK)
+ return (ret);
+
+ ret = kmf_get_attr(KMF_CRL_CHECK_ATTR, attrlist, numattr,
+ &crlcheck, NULL);
+ if (ret != KMF_OK)
+ ret = KMF_OK; /* CRL_CHECK is optional */
+
+ /* set importOptions */
+ if (crlcheck == B_FALSE) {
+ importOptions = CRL_IMPORT_DEFAULT_OPTIONS |
+ CRL_IMPORT_BYPASS_CHECKS;
+ } else {
+ importOptions = CRL_IMPORT_DEFAULT_OPTIONS;
+ }
+
+
+ /* Read in the CRL file */
+ crl1.Data = NULL;
+ crl2.Data = NULL;
+ ret = kmf_read_input_file(handle, crlfilename, &crl1);
+ if (ret != KMF_OK) {
+ return (ret);
+ }
+
+ /* If the input CRL is in PEM format, convert it to DER first. */
+ if (format == KMF_FORMAT_PEM) {
+ int len;
+ ret = kmf_pem_to_der(crl1.Data, crl1.Length,
+ &crl2.Data, &len);
+ if (ret != KMF_OK) {
+ goto out;
+ }
+ crl2.Length = (size_t)len;
+ }
+
+ crlDER.data = format == KMF_FORMAT_ASN1 ? crl1.Data : crl2.Data;
+ crlDER.len = format == KMF_FORMAT_ASN1 ? crl1.Length : crl2.Length;
+
+ nss_crl = PK11_ImportCRL(nss_slot, &crlDER, NULL, SEC_CRL_TYPE,
+ NULL, importOptions, NULL, CRL_DECODE_DEFAULT_OPTIONS);
+
+ if (nss_crl == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto out;
+ }
+
+out:
+ if (nss_slot != NULL) {
+ PK11_FreeSlot(nss_slot);
+ }
+
+ if (crl1.Data != NULL) {
+ free(crl1.Data);
+ }
+
+ if (crl2.Data != NULL) {
+ free(crl2.Data);
+ }
+
+ if (nss_crl != NULL) {
+ SEC_DestroyCrl(nss_crl);
+ }
+
+ return (ret);
+}
+
+KMF_RETURN
+NSS_DeleteCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ CERTSignedCrl *crl = NULL;
+ CERTCertificate *cert = NULL;
+ PK11SlotInfo *nss_slot = NULL;
+ CERTCrlHeadNode *crlList = NULL;
+ CERTCrlNode *crlNode = NULL;
+ PRArenaPool *arena = NULL;
+ CERTName *name = NULL;
+ CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
+ char *issuername, *subjectname;
+
+ /* check params */
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ issuername = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist,
+ numattr);
+ subjectname = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist,
+ numattr);
+
+ /* Caller must specify issuer or subject but not both */
+ if ((issuername == NULL && subjectname == NULL) ||
+ (issuername != NULL && subjectname != NULL))
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Find the CRL based on the deletion criteria. */
+ if (issuername != NULL) {
+ /*
+ * If the deletion is based on the issuer's certificate
+ * nickname, we will get the issuer's cert first, then
+ * get the CRL from the cert.
+ */
+ cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
+ issuername);
+ if (!cert) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CERT_NOT_FOUND;
+ goto out;
+ }
+
+ crl = SEC_FindCrlByName(certHandle, &cert->derSubject,
+ SEC_CRL_TYPE);
+ if (crl == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ goto out;
+ }
+ } else {
+ /*
+ * If the deletion is based on the CRL's subject name, we will
+ * get all the CRLs from the internal database and search
+ * for the CRL with the same subject name.
+ */
+ boolean_t found = B_FALSE;
+ int nssrv;
+
+ nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
+ if (nssrv) {
+ SET_ERROR(kmfh, nssrv);
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ goto out;
+ }
+
+ if (crlList == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ goto out;
+ }
+
+ /* Allocate space for name */
+ arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
+ if (arena == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto out;
+ }
+
+ name = PORT_ArenaZAlloc(arena, sizeof (*name));
+ if (name == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto out;
+ }
+ name->arena = arena;
+
+ crlNode = crlList->first;
+ while (crlNode && !found) {
+ char *asciiname = NULL;
+ SECItem* issuer;
+
+ name = &crlNode->crl->crl.name;
+ if (!name) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ break;
+ }
+
+ asciiname = CERT_NameToAscii(name);
+ if (asciiname == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ break;
+ }
+
+ if (strcmp(subjectname, asciiname) == 0) {
+ found = B_TRUE;
+ issuer = &crlNode->crl->crl.derName;
+ crl = SEC_FindCrlByName(certHandle, issuer,
+ SEC_CRL_TYPE);
+ if (crl == NULL) {
+ /* We found a cert but no CRL */
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ }
+ }
+ PORT_Free(asciiname);
+ crlNode = crlNode->next;
+ }
+
+ if (rv) {
+ goto out;
+ }
+ }
+
+ if (crl) {
+ (void) SEC_DeletePermCRL(crl);
+ }
+
+out:
+ if (nss_slot != NULL) {
+ PK11_FreeSlot(nss_slot);
+ }
+
+ if (crlList != NULL) {
+ PORT_FreeArena(crlList->arena, PR_FALSE);
+ }
+
+ if (arena != NULL) {
+ PORT_FreeArena(arena, PR_FALSE);
+ }
+
+ if (cert != NULL) {
+ CERT_DestroyCertificate(cert);
+ }
+
+ if (crl != NULL) {
+ SEC_DestroyCrl(crl);
+ }
+
+ return (rv);
+}
+
+KMF_RETURN
+NSS_FindCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ PK11SlotInfo *nss_slot = NULL;
+ CERTCrlHeadNode *crlList = NULL;
+ CERTCrlNode *crlNode = NULL;
+ PRArenaPool *arena = NULL;
+ CERTName *name = NULL;
+ SECStatus nssrv;
+ char *asciiname = NULL;
+ int crl_num;
+ int i, *CRLCount;
+ CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
+ char **CRLNameList;
+
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ CRLCount = kmf_get_attr_ptr(KMF_CRL_COUNT_ATTR, attrlist, numattr);
+ if (CRLCount == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ CRLNameList = (char **)kmf_get_attr_ptr(KMF_CRL_NAMELIST_ATTR,
+ attrlist, numattr);
+
+ /* Look up Crls */
+ nssrv = SEC_LookupCrls(certHandle, &crlList, SEC_CRL_TYPE);
+ if (nssrv) {
+ SET_ERROR(kmfh, rv);
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ goto out;
+ }
+
+ /* Allocate space for name first */
+ arena = PORT_NewArena(SEC_ASN1_DEFAULT_ARENA_SIZE);
+ if (arena == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto out;
+ }
+
+ name = PORT_ArenaZAlloc(arena, sizeof (*name));
+ if (name == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto out;
+ }
+ name->arena = arena;
+
+ /*
+ * Loop thru the crlList and create a crl list with CRL's subject name.
+ */
+ crlNode = crlList->first;
+ crl_num = 0;
+ while (crlNode) {
+ char *subj_name;
+
+ /* Get the CRL subject name */
+ name = &crlNode->crl->crl.name;
+ if (!name) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ break;
+ }
+
+
+ if (CRLNameList != NULL) {
+ asciiname = CERT_NameToAscii(name);
+ if (asciiname == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ break;
+ }
+ subj_name = strdup(asciiname);
+ PORT_Free(asciiname);
+ if (subj_name == NULL) {
+ rv = KMF_ERR_MEMORY;
+ break;
+ }
+ CRLNameList[crl_num] = subj_name;
+ }
+
+ crl_num++;
+ crlNode = crlNode->next;
+ }
+
+ if (rv == KMF_OK) {
+ /* success */
+ *CRLCount = crl_num;
+ }
+
+out:
+ if (nss_slot != NULL) {
+ PK11_FreeSlot(nss_slot);
+ }
+
+ if (crlList != NULL) {
+ PORT_FreeArena(crlList->arena, PR_FALSE);
+ }
+
+ if (arena != NULL) {
+ PORT_FreeArena(arena, PR_FALSE);
+ }
+
+ /* If failed, free memory allocated for the returning rlist */
+ if (rv && (CRLNameList != NULL)) {
+ for (i = 0; i < crl_num; i++) {
+ free(CRLNameList[i]);
+ }
+ }
+
+ return (rv);
+}
+
+KMF_RETURN
+NSS_FindCertInCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ PK11SlotInfo *nss_slot = NULL;
+ CERTCertificate *cert = NULL;
+ CERTSignedCrl *crl = NULL;
+ CERTCrlEntry *entry;
+ boolean_t match = B_FALSE;
+ int i;
+ CERTCertDBHandle *certHandle = CERT_GetDefaultCertDB();
+ char *certlabel;
+ KMF_DATA *certdata;
+
+ /* check params */
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ rv = do_nss_init(handle, numattr, attrlist, FALSE, &nss_slot);
+ if (rv != KMF_OK) {
+ return (rv);
+ }
+
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+
+ /* Find the certificate first */
+ if (certlabel != NULL) {
+ cert = CERT_FindCertByNicknameOrEmailAddr(certHandle,
+ certlabel);
+ } else {
+ SECItem derCert = { NULL, 0};
+
+ certdata = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR,
+ attrlist, numattr);
+
+ if (certdata == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ derCert.data = certdata->Data;
+ derCert.len = certdata->Length;
+
+ cert = CERT_FindCertByDERCert(certHandle, &derCert);
+ }
+
+ if (cert == NULL) {
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CERT_NOT_FOUND;
+ goto out;
+ }
+
+ /* Find the CRL with the same issuer as the given certificate. */
+ crl = SEC_FindCrlByName(certHandle, &cert->derIssuer, SEC_CRL_TYPE);
+ if (crl == NULL) {
+ /*
+ * Could not find the CRL issued by the same issuer. This
+ * usually means that the CRL is not installed in the DB.
+ */
+ SET_ERROR(kmfh, PORT_GetError());
+ rv = KMF_ERR_CRL_NOT_FOUND;
+ goto out;
+
+ }
+
+ /* Check if the certificate's serialNumber is revoked in the CRL */
+ i = 0;
+ while ((entry = (crl->crl).entries[i++]) != NULL) {
+ if (SECITEM_CompareItem(&(cert->serialNumber),
+ &(entry->serialNumber)) == SECEqual) {
+ match = B_TRUE;
+ break;
+ }
+ }
+
+ if (!match) {
+ rv = KMF_ERR_NOT_REVOKED;
+ }
+
+out:
+ if (nss_slot != NULL) {
+ PK11_FreeSlot(nss_slot);
+ }
+
+ if (cert != NULL) {
+ CERT_DestroyCertificate(cert);
+ }
+
+ if (crl != NULL) {
+ SEC_DestroyCrl(crl);
+ }
+
+ return (rv);
+}
diff --git a/usr/src/lib/libkmf/plugins/kmf_openssl/common/mapfile-vers b/usr/src/lib/libkmf/plugins/kmf_openssl/common/mapfile-vers
index ae025ddd8f..08ad0b561f 100644
--- a/usr/src/lib/libkmf/plugins/kmf_openssl/common/mapfile-vers
+++ b/usr/src/lib/libkmf/plugins/kmf_openssl/common/mapfile-vers
@@ -37,14 +37,14 @@ SUNWprivate_1.1 {
OpenSSL_DeleteCert;
OpenSSL_DeleteKey;
OpenSSL_EncodePubKeyData;
- OpenSSL_ExportP12;
+ OpenSSL_ExportPK12;
OpenSSL_FindCert;
OpenSSL_FindCertInCRL;
OpenSSL_FindKey;
+ OpenSSL_FindPrikeyByCert;
OpenSSL_FreeKMFCert;
OpenSSL_GetErrorString;
OpenSSL_GetOCSPStatusForCert;
- OpenSSL_GetPrikeyByCert;
OpenSSL_GetSymKeyValue;
OpenSSL_ImportCRL;
OpenSSL_IsCRLFile;
@@ -52,10 +52,10 @@ SUNWprivate_1.1 {
OpenSSL_ListCRL;
OpenSSL_SignData;
OpenSSL_StoreCert;
- OpenSSL_StorePrivateKey;
+ OpenSSL_StoreKey;
OpenSSL_VerifyCRLFile;
- openssl_read_pkcs12;
- openssl_import_keypair;
+ openssl_import_objects;
+ openssl_build_pk12;
local:
*;
};
diff --git a/usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c b/usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c
index 2e88fee0ae..88ff83dbea 100644
--- a/usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c
+++ b/usr/src/lib/libkmf/plugins/kmf_openssl/common/openssl_spi.c
@@ -103,7 +103,6 @@
KMF_X509_EXT_SUBJ_KEY_ID |\
KMF_X509_EXT_POLICY_MAPPING)
-static BIO *bio_err = NULL;
static uchar_t P[] = { 0x00, 0x8d, 0xf2, 0xa4, 0x94, 0x49, 0x22, 0x76,
0xaa, 0x3d, 0x25, 0x75, 0x9b, 0xb0, 0x68, 0x69,
0xcb, 0xea, 0xc0, 0xd8, 0x3a, 0xfb, 0x8d, 0x0c,
@@ -135,13 +134,22 @@ static uchar_t G[] = { 0x00, 0x62, 0x6d, 0x02, 0x78, 0x39, 0xea, 0x0a,
mutex_t init_lock = DEFAULTMUTEX;
static int ssl_initialized = 0;
+static BIO *bio_err = NULL;
+
+static int
+test_for_file(char *, mode_t);
static KMF_RETURN
-extract_objects(KMF_HANDLE *, KMF_FINDCERT_PARAMS *, char *,
- CK_UTF8CHAR *, CK_ULONG, EVP_PKEY **, KMF_DATA **, int *);
+extract_pem(KMF_HANDLE *, char *, char *, KMF_BIGINT *, char *,
+ CK_UTF8CHAR *, CK_ULONG, EVP_PKEY **, KMF_DATA **, int *);
static KMF_RETURN
-kmf_load_cert(KMF_HANDLE *, KMF_FINDCERT_PARAMS *, char *, KMF_DATA *);
+kmf_load_cert(KMF_HANDLE *, char *, char *, KMF_BIGINT *, KMF_CERT_VALIDITY,
+ char *, KMF_DATA *);
+
+static KMF_RETURN
+load_certs(KMF_HANDLE *, char *, char *, KMF_BIGINT *, KMF_CERT_VALIDITY,
+ char *, KMF_DATA **, uint32_t *);
static KMF_RETURN
sslBN2KMFBN(BIGNUM *, KMF_BIGINT *);
@@ -149,24 +157,26 @@ sslBN2KMFBN(BIGNUM *, KMF_BIGINT *);
static EVP_PKEY *
ImportRawRSAKey(KMF_RAW_RSA_KEY *);
+static KMF_RETURN
+convertToRawKey(EVP_PKEY *, KMF_RAW_KEY_DATA *);
+
KMF_RETURN
-OpenSSL_FindCert(KMF_HANDLE_T,
- KMF_FINDCERT_PARAMS *,
- KMF_X509_DER_CERT *,
- uint32_t *);
+OpenSSL_FindCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
void
OpenSSL_FreeKMFCert(KMF_HANDLE_T, KMF_X509_DER_CERT *);
KMF_RETURN
-OpenSSL_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *, KMF_DATA *);
+OpenSSL_StoreCert(KMF_HANDLE_T handle, int, KMF_ATTRIBUTE *);
+
+KMF_RETURN
+OpenSSL_DeleteCert(KMF_HANDLE_T handle, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *);
+OpenSSL_CreateKeypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_CreateKeypair(KMF_HANDLE_T, KMF_CREATEKEYPAIR_PARAMS *,
- KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
+OpenSSL_StoreKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
OpenSSL_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
@@ -176,20 +186,19 @@ OpenSSL_SignData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
KMF_DATA *, KMF_DATA *);
KMF_RETURN
-OpenSSL_DeleteKey(KMF_HANDLE_T, KMF_DELETEKEY_PARAMS *,
- KMF_KEY_HANDLE *, boolean_t);
+OpenSSL_DeleteKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_ImportCRL(KMF_HANDLE_T, KMF_IMPORTCRL_PARAMS *);
+OpenSSL_ImportCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_DeleteCRL(KMF_HANDLE_T, KMF_DELETECRL_PARAMS *);
+OpenSSL_DeleteCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_ListCRL(KMF_HANDLE_T, KMF_LISTCRL_PARAMS *, char **);
+OpenSSL_ListCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_FindCertInCRL(KMF_HANDLE_T, KMF_FINDCERTINCRL_PARAMS *);
+OpenSSL_FindCertInCRL(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
OpenSSL_CertGetPrintable(KMF_HANDLE_T, const KMF_DATA *,
@@ -199,48 +208,35 @@ KMF_RETURN
OpenSSL_GetErrorString(KMF_HANDLE_T, char **);
KMF_RETURN
-OpenSSL_GetPrikeyByCert(KMF_HANDLE_T, KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *,
- KMF_KEY_HANDLE *, KMF_KEY_ALG);
+OpenSSL_FindPrikeyByCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
OpenSSL_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
KMF_DATA *, KMF_DATA *);
KMF_RETURN
-OpenSSL_CreateOCSPRequest(KMF_HANDLE_T, KMF_OCSPREQUEST_PARAMS *,
- char *reqfile);
+OpenSSL_CreateOCSPRequest(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T, KMF_OCSPRESPONSE_PARAMS_INPUT *,
- KMF_OCSPRESPONSE_PARAMS_OUTPUT *);
+OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
- KMF_KEY_HANDLE *, uint32_t *);
+OpenSSL_FindKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_ExportP12(KMF_HANDLE_T,
- KMF_EXPORTP12_PARAMS *,
- int, KMF_X509_DER_CERT *,
- int, KMF_KEY_HANDLE *,
- char *);
+OpenSSL_ExportPK12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-OpenSSL_StorePrivateKey(KMF_HANDLE_T, KMF_STOREKEY_PARAMS *,
- KMF_RAW_KEY_DATA *);
-
-KMF_RETURN
-OpenSSL_CreateSymKey(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *,
- KMF_KEY_HANDLE *);
+OpenSSL_CreateSymKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
OpenSSL_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
KMF_RETURN
-OpenSSL_VerifyCRLFile(KMF_HANDLE_T, KMF_VERIFYCRL_PARAMS *);
+OpenSSL_VerifyCRLFile(KMF_HANDLE_T, char *, KMF_DATA *);
KMF_RETURN
-OpenSSL_CheckCRLDate(KMF_HANDLE_T, KMF_CHECKCRLDATE_PARAMS *);
+OpenSSL_CheckCRLDate(KMF_HANDLE_T, char *);
KMF_RETURN
OpenSSL_VerifyDataWithCert(KMF_HANDLE_T, KMF_ALGORITHM_INDEX,
@@ -267,14 +263,14 @@ KMF_PLUGIN_FUNCLIST openssl_plugin_table =
NULL, /* FindCRL */
OpenSSL_FindCertInCRL,
OpenSSL_GetErrorString,
- OpenSSL_GetPrikeyByCert,
+ OpenSSL_FindPrikeyByCert,
OpenSSL_DecryptData,
- OpenSSL_ExportP12,
- OpenSSL_StorePrivateKey,
+ OpenSSL_ExportPK12,
OpenSSL_CreateSymKey,
OpenSSL_GetSymKeyValue,
NULL, /* SetTokenPin */
OpenSSL_VerifyDataWithCert,
+ OpenSSL_StoreKey,
NULL /* Finalize */
};
@@ -382,7 +378,7 @@ get_x509_dn(X509_NAME *sslDN, KMF_X509_NAME *kmfDN)
return (rv);
}
-static int
+int
isdir(char *path)
{
struct stat s;
@@ -390,7 +386,7 @@ isdir(char *path)
if (stat(path, &s) == -1)
return (0);
- return (s.st_mode & S_IFDIR);
+ return ((s.st_mode & S_IFMT) == S_IFDIR);
}
static KMF_RETURN
@@ -441,8 +437,10 @@ cleanup:
return (rv);
}
+
static KMF_RETURN
-check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
+check_cert(X509 *xcert, char *issuer, char *subject, KMF_BIGINT *serial,
+ boolean_t *match)
{
KMF_RETURN rv = KMF_OK;
boolean_t findIssuer = FALSE;
@@ -461,21 +459,21 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
(void) memset(&certIssuerDN, 0, sizeof (KMF_X509_NAME));
(void) memset(&certSubjectDN, 0, sizeof (KMF_X509_NAME));
- if (params->issuer != NULL && strlen(params->issuer)) {
- rv = KMF_DNParser(params->issuer, &issuerDN);
+ if (issuer != NULL && strlen(issuer)) {
+ rv = kmf_dn_parser(issuer, &issuerDN);
if (rv != KMF_OK)
return (KMF_ERR_BAD_PARAMETER);
rv = get_x509_dn(xcert->cert_info->issuer, &certIssuerDN);
if (rv != KMF_OK) {
- KMF_FreeDN(&issuerDN);
+ kmf_free_dn(&issuerDN);
return (KMF_ERR_BAD_PARAMETER);
}
findIssuer = TRUE;
}
- if (params->subject != NULL && strlen(params->subject)) {
- rv = KMF_DNParser(params->subject, &subjectDN);
+ if (subject != NULL && strlen(subject)) {
+ rv = kmf_dn_parser(subject, &subjectDN);
if (rv != KMF_OK) {
rv = KMF_ERR_BAD_PARAMETER;
goto cleanup;
@@ -488,7 +486,7 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
}
findSubject = TRUE;
}
- if (params->serial != NULL && params->serial->val != NULL)
+ if (serial != NULL && serial->val != NULL)
findSerial = TRUE;
if (findSerial) {
@@ -499,7 +497,7 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
if (bn != NULL) {
int bnlen = BN_num_bytes(bn);
- if (bnlen == params->serial->len) {
+ if (bnlen == serial->len) {
uchar_t *a = malloc(bnlen);
if (a == NULL) {
rv = KMF_ERR_MEMORY;
@@ -507,9 +505,8 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
goto cleanup;
}
bnlen = BN_bn2bin(bn, a);
- *match = !memcmp(a,
- params->serial->val,
- params->serial->len);
+ *match = (memcmp(a, serial->val, serial->len) ==
+ 0);
rv = KMF_OK;
free(a);
}
@@ -522,15 +519,17 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
}
}
if (findIssuer) {
- *match = !KMF_CompareRDNs(&issuerDN, &certIssuerDN);
- if (!(*match)) {
+ *match = (kmf_compare_rdns(&issuerDN, &certIssuerDN) == 0);
+ if ((*match) == B_FALSE) {
+ /* stop checking and bail */
rv = KMF_OK;
goto cleanup;
}
}
if (findSubject) {
- *match = !KMF_CompareRDNs(&subjectDN, &certSubjectDN);
- if (!(*match)) {
+ *match = (kmf_compare_rdns(&subjectDN, &certSubjectDN) == 0);
+ if ((*match) == B_FALSE) {
+ /* stop checking and bail */
rv = KMF_OK;
goto cleanup;
}
@@ -539,22 +538,27 @@ check_cert(X509 *xcert, KMF_FINDCERT_PARAMS *params, boolean_t *match)
*match = TRUE;
cleanup:
if (findIssuer) {
- KMF_FreeDN(&issuerDN);
- KMF_FreeDN(&certIssuerDN);
+ kmf_free_dn(&issuerDN);
+ kmf_free_dn(&certIssuerDN);
}
if (findSubject) {
- KMF_FreeDN(&subjectDN);
- KMF_FreeDN(&certSubjectDN);
+ kmf_free_dn(&subjectDN);
+ kmf_free_dn(&certSubjectDN);
}
return (rv);
}
+
+/*
+ * This function loads a certificate file into an X509 data structure, and
+ * checks if its issuer, subject or the serial number matches with those
+ * values. If it matches, then return the X509 data structure.
+ */
static KMF_RETURN
load_X509cert(KMF_HANDLE *kmfh,
- KMF_FINDCERT_PARAMS *params,
- char *pathname,
- X509 **outcert)
+ char *issuer, char *subject, KMF_BIGINT *serial,
+ char *pathname, X509 **outcert)
{
KMF_RETURN rv = KMF_OK;
X509 *xcert = NULL;
@@ -566,7 +570,7 @@ load_X509cert(KMF_HANDLE *kmfh,
* auto-detect the file format, regardless of what
* the 'format' parameters in the params say.
*/
- rv = KMF_GetFileFormat(pathname, &format);
+ rv = kmf_get_file_format(pathname, &format);
if (rv != KMF_OK) {
if (rv == KMF_ERR_OPEN_FILE)
rv = KMF_ERR_CERT_NOT_FOUND;
@@ -605,7 +609,8 @@ load_X509cert(KMF_HANDLE *kmfh,
goto cleanup;
}
- if (check_cert(xcert, params, &match) != KMF_OK || match == FALSE) {
+ if (check_cert(xcert, issuer, subject, serial, &match) != KMF_OK ||
+ match == FALSE) {
rv = KMF_ERR_CERT_NOT_FOUND;
goto cleanup;
}
@@ -635,8 +640,9 @@ datacmp(const void *a, const void *b)
}
static KMF_RETURN
-load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
- KMF_DATA **certlist, uint32_t *numcerts)
+load_certs(KMF_HANDLE *kmfh, char *issuer, char *subject, KMF_BIGINT *serial,
+ KMF_CERT_VALIDITY validity, char *pathname,
+ KMF_DATA **certlist, uint32_t *numcerts)
{
KMF_RETURN rv = KMF_OK;
int i;
@@ -645,7 +651,7 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
int hits = 0;
KMF_ENCODE_FORMAT format;
- rv = KMF_GetFileFormat(pathname, &format);
+ rv = kmf_get_file_format(pathname, &format);
if (rv != KMF_OK) {
if (rv == KMF_ERR_OPEN_FILE)
rv = KMF_ERR_CERT_NOT_FOUND;
@@ -658,7 +664,8 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
return (KMF_ERR_MEMORY);
certs->Data = NULL;
certs->Length = 0;
- rv = kmf_load_cert(kmfh, params, pathname, certs);
+ rv = kmf_load_cert(kmfh, issuer, subject, serial, validity,
+ pathname, certs);
if (rv == KMF_OK) {
*certlist = certs;
*numcerts = 1;
@@ -671,7 +678,7 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
format != KMF_FORMAT_PEM_KEYPAIR) {
/* This function only works on PEM files */
- rv = extract_objects(kmfh, params, pathname,
+ rv = extract_pem(kmfh, issuer, subject, serial, pathname,
(uchar_t *)NULL, 0, NULL, &certs, &nc);
} else {
return (KMF_ERR_ENCODING);
@@ -681,10 +688,10 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
return (rv);
for (i = 0; i < nc; i++) {
- if (params->find_cert_validity == KMF_NONEXPIRED_CERTS) {
- rv = KMF_CheckCertDate(kmfh, &certs[i]);
- } else if (params->find_cert_validity == KMF_EXPIRED_CERTS) {
- rv = KMF_CheckCertDate(kmfh, &certs[i]);
+ if (validity == KMF_NONEXPIRED_CERTS) {
+ rv = kmf_check_cert_date(kmfh, &certs[i]);
+ } else if (validity == KMF_EXPIRED_CERTS) {
+ rv = kmf_check_cert_date(kmfh, &certs[i]);
if (rv == KMF_OK)
rv = KMF_ERR_CERT_NOT_FOUND;
if (rv == KMF_ERR_VALIDITY_PERIOD)
@@ -692,7 +699,7 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
}
if (rv != KMF_OK) {
/* Remove this cert from the list by clearing it. */
- KMF_FreeData(&certs[i]);
+ kmf_free_data(&certs[i]);
} else {
hits++; /* count valid certs found */
}
@@ -714,25 +721,27 @@ load_certs(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params, char *pathname,
return (rv);
}
+
static KMF_RETURN
kmf_load_cert(KMF_HANDLE *kmfh,
- KMF_FINDCERT_PARAMS *params,
- char *pathname,
- KMF_DATA *cert)
+ char *issuer, char *subject, KMF_BIGINT *serial,
+ KMF_CERT_VALIDITY validity,
+ char *pathname,
+ KMF_DATA *cert)
{
KMF_RETURN rv = KMF_OK;
X509 *x509cert = NULL;
- rv = load_X509cert(kmfh, params, pathname, &x509cert);
+ rv = load_X509cert(kmfh, issuer, subject, serial, pathname, &x509cert);
if (rv == KMF_OK && x509cert != NULL && cert != NULL) {
rv = ssl_cert2KMFDATA(kmfh, x509cert, cert);
if (rv != KMF_OK) {
goto cleanup;
}
- if (params->find_cert_validity == KMF_NONEXPIRED_CERTS) {
- rv = KMF_CheckCertDate(kmfh, cert);
- } else if (params->find_cert_validity == KMF_EXPIRED_CERTS) {
- rv = KMF_CheckCertDate(kmfh, cert);
+ if (validity == KMF_NONEXPIRED_CERTS) {
+ rv = kmf_check_cert_date(kmfh, cert);
+ } else if (validity == KMF_EXPIRED_CERTS) {
+ rv = kmf_check_cert_date(kmfh, cert);
if (rv == KMF_OK) {
/*
* This is a valid cert so skip it.
@@ -926,7 +935,7 @@ openssl_load_key(KMF_HANDLE_T handle, const char *file)
return (NULL);
}
- if (KMF_GetFileFormat((char *)file, &format) != KMF_OK)
+ if (kmf_get_file_format((char *)file, &format) != KMF_OK)
return (NULL);
keyfile = BIO_new_file(file, "rb");
@@ -941,12 +950,12 @@ openssl_load_key(KMF_HANDLE_T handle, const char *file)
(void) BIO_free(keyfile);
keyfile = NULL;
/* Try odd ASN.1 variations */
- rv = KMF_ReadInputFile(kmfh, (char *)file,
+ rv = kmf_read_input_file(kmfh, (char *)file,
&filedata);
if (rv == KMF_OK) {
(void) readAltFormatPrivateKey(&filedata,
&pkey);
- KMF_FreeData(&filedata);
+ kmf_free_data(&filedata);
}
}
} else if (format == KMF_FORMAT_PEM ||
@@ -958,12 +967,12 @@ openssl_load_key(KMF_HANDLE_T handle, const char *file)
* Check if this is the alt. format
* RSA private key file.
*/
- rv = KMF_ReadInputFile(kmfh, (char *)file,
+ rv = kmf_read_input_file(kmfh, (char *)file,
&filedata);
if (rv == KMF_OK) {
uchar_t *d = NULL;
int len;
- rv = KMF_Pem2Der(filedata.Data,
+ rv = kmf_pem_to_der(filedata.Data,
filedata.Length, &d, &len);
if (rv == KMF_OK && d != NULL) {
derdata.Data = d;
@@ -972,7 +981,7 @@ openssl_load_key(KMF_HANDLE_T handle, const char *file)
&derdata, &pkey);
free(d);
}
- KMF_FreeData(&filedata);
+ kmf_free_data(&filedata);
}
}
}
@@ -988,31 +997,59 @@ end:
}
KMF_RETURN
-OpenSSL_FindCert(KMF_HANDLE_T handle,
- KMF_FINDCERT_PARAMS *params,
- KMF_X509_DER_CERT *kmf_cert,
- uint32_t *num_certs)
+OpenSSL_FindCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- char *fullpath;
int i, n;
uint32_t maxcerts = 0;
+ uint32_t *num_certs;
+ KMF_X509_DER_CERT *kmf_cert = NULL;
+ char *dirpath = NULL;
+ char *filename = NULL;
+ char *fullpath = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
- if (num_certs == NULL || params == NULL)
+ num_certs = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (num_certs == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ /* num_certs should reference the size of kmf_cert */
maxcerts = *num_certs;
if (maxcerts == 0)
maxcerts = 0xFFFFFFFF;
*num_certs = 0;
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.certfile);
+ /* Get the optional returned certificate list */
+ kmf_cert = kmf_get_attr_ptr(KMF_X509_DER_CERT_ATTR, attrlist,
+ numattr);
+ /*
+ * The dirpath attribute and the filename attribute can not be NULL
+ * at the same time.
+ */
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ filename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
+ numattr);
+
+ fullpath = get_fullpath(dirpath, filename);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ /* Get optional search criteria attributes */
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
+ if (rv != KMF_OK) {
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
+ }
+
if (isdir(fullpath)) {
DIR *dirp;
struct dirent *dp;
@@ -1033,14 +1070,14 @@ OpenSSL_FindCert(KMF_HANDLE_T handle,
fname = get_fullpath(fullpath, (char *)&dp->d_name);
- rv = load_certs(kmfh, params, fname, &certlist,
- &loaded_certs);
+ rv = load_certs(kmfh, issuer, subject, serial,
+ validity, fname, &certlist, &loaded_certs);
if (rv != KMF_OK) {
free(fname);
if (certlist != NULL) {
for (i = 0; i < loaded_certs; i++)
- KMF_FreeData(&certlist[i]);
+ kmf_free_data(&certlist[i]);
free(certlist);
}
continue;
@@ -1068,10 +1105,10 @@ OpenSSL_FindCert(KMF_HANDLE_T handle,
* certs that were not used.
*/
for (; i < loaded_certs; i++)
- KMF_FreeData(&certlist[i]);
+ kmf_free_data(&certlist[i]);
} else {
for (i = 0; i < loaded_certs; i++)
- KMF_FreeData(&certlist[i]);
+ kmf_free_data(&certlist[i]);
n += loaded_certs;
}
free(certlist);
@@ -1080,7 +1117,7 @@ OpenSSL_FindCert(KMF_HANDLE_T handle,
(*num_certs) = n;
if (*num_certs == 0)
rv = KMF_ERR_CERT_NOT_FOUND;
- else
+ if (*num_certs > 0)
rv = KMF_OK;
exit:
(void) closedir(dirp);
@@ -1088,8 +1125,8 @@ exit:
KMF_DATA *certlist = NULL;
uint32_t loaded_certs = 0;
- rv = load_certs(kmfh, params, fullpath,
- &certlist, &loaded_certs);
+ rv = load_certs(kmfh, issuer, subject, serial, validity,
+ fullpath, &certlist, &loaded_certs);
if (rv != KMF_OK) {
free(fullpath);
return (rv);
@@ -1112,15 +1149,14 @@ exit:
}
/* If maxcerts < loaded_certs, clean up */
for (; i < loaded_certs; i++)
- KMF_FreeData(&certlist[i]);
+ kmf_free_data(&certlist[i]);
} else if (certlist != NULL) {
for (i = 0; i < loaded_certs; i++)
- KMF_FreeData(&certlist[i]);
+ kmf_free_data(&certlist[i]);
n = loaded_certs;
}
- if (certlist)
+ if (certlist != NULL)
free(certlist);
-
*num_certs = n;
}
@@ -1145,133 +1181,92 @@ OpenSSL_FreeKMFCert(KMF_HANDLE_T handle,
}
}
+/*ARGSUSED*/
KMF_RETURN
-OpenSSL_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *params,
- KMF_DATA * pcert)
+OpenSSL_StoreCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- X509 *xcert = NULL;
- FILE *fp;
- unsigned char *outbuf;
- unsigned char *outbuf_p;
- char *fullpath;
- int outbuflen;
- int len;
+ KMF_DATA *cert = NULL;
+ char *outfilename = NULL;
+ char *dirpath = NULL;
+ char *fullpath = NULL;
KMF_ENCODE_FORMAT format;
- if (params == NULL || params->ks_opt_u.openssl_opts.certfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- /*
- * check if the cert output format is supported by OPENSSL.
- * however, since the keystore for OPENSSL is just a file, we have
- * no way to store the format along with the file.
- */
- format = params->sslparms.format;
- if (format != KMF_FORMAT_ASN1 && format != KMF_FORMAT_PEM)
- return (KMF_ERR_BAD_CERT_FORMAT);
-
-
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.certfile);
- if (fullpath == NULL)
+ /* Get the cert data */
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL || cert->Data == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /*
- * When storing a certificate, you must specify a filename.
- */
- if (isdir(fullpath)) {
- free(fullpath);
+ /* Check the output filename and directory attributes. */
+ outfilename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
+ numattr);
+ if (outfilename == NULL)
return (KMF_ERR_BAD_PARAMETER);
- }
-
- /* copy cert data to outbuf */
- outbuflen = pcert->Length;
- outbuf = malloc(outbuflen);
- if (outbuf == NULL) {
- free(fullpath);
- return (KMF_ERR_MEMORY);
- }
- (void) memcpy(outbuf, pcert->Data, pcert->Length);
- if ((fp = fopen(fullpath, "w")) == NULL) {
- SET_SYS_ERROR(kmfh, errno);
- ret = KMF_ERR_INTERNAL;
- goto out;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- len = fwrite(outbuf, 1, outbuflen, fp);
- if (len != outbuflen) {
- SET_SYS_ERROR(kmfh, errno);
- ret = KMF_ERR_WRITE_FILE;
- } else {
- ret = KMF_OK;
- }
- goto out;
- }
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ fullpath = get_fullpath(dirpath, outfilename);
+ if (fullpath == NULL)
+ return (KMF_ERR_BAD_CERTFILE);
- /*
- * The output format is not KMF_FORMAT_ASN1, so we will
- * Convert the cert data to OpenSSL internal X509 first.
- */
- outbuf_p = outbuf; /* use a temp pointer; required by openssl */
- xcert = d2i_X509(NULL, (const uchar_t **)&outbuf_p, outbuflen);
- if (xcert == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_ENCODING;
+ /* Check the optional format attribute */
+ ret = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
+ &format, NULL);
+ if (ret != KMF_OK) {
+ /* If there is no format attribute, then default to PEM */
+ format = KMF_FORMAT_PEM;
+ ret = KMF_OK;
+ } else if (format != KMF_FORMAT_ASN1 && format != KMF_FORMAT_PEM) {
+ ret = KMF_ERR_BAD_CERT_FORMAT;
goto out;
}
- if (format == KMF_FORMAT_PEM) {
- /* Convert to the PEM format and write it out */
- if (!PEM_write_X509(fp, xcert)) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_ENCODING;
- } else {
- ret = KMF_OK;
- }
- goto out;
- }
+ /* Store the certificate in the file with the specified format */
+ ret = kmf_create_cert_file(cert, format, fullpath);
out:
if (fullpath != NULL)
free(fullpath);
- if (outbuf != NULL) {
- free(outbuf);
- }
- if (fp != NULL) {
- (void) fclose(fp);
- }
-
- if (xcert != NULL) {
- X509_free(xcert);
- }
-
return (ret);
}
+
KMF_RETURN
-OpenSSL_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
+OpenSSL_DeleteCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- char *fullpath = NULL;
KMF_DATA certdata = {NULL, 0};
+ char *dirpath = NULL;
+ char *filename = NULL;
+ char *fullpath = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
- if (params == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.certfile);
-
+ /*
+ * Get the DIRPATH and CERT_FILENAME attributes. They can not be
+ * NULL at the same time.
+ */
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ filename = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist,
+ numattr);
+ fullpath = get_fullpath(dirpath, filename);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ /* Get optional search criteria attributes */
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
+ if (rv != KMF_OK) {
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
+ }
+
if (isdir(fullpath)) {
DIR *dirp;
struct dirent *dp;
@@ -1294,8 +1289,8 @@ OpenSSL_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
break;
}
- rv = kmf_load_cert(kmfh, params, fname,
- &certdata);
+ rv = kmf_load_cert(kmfh, issuer, subject,
+ serial, validity, fname, &certdata);
if (rv == KMF_ERR_CERT_NOT_FOUND) {
free(fname);
@@ -1322,7 +1317,8 @@ OpenSSL_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
(void) closedir(dirp);
} else {
/* Just try to load a single certificate */
- rv = kmf_load_cert(kmfh, params, fullpath, &certdata);
+ rv = kmf_load_cert(kmfh, issuer, subject, serial, validity,
+ fullpath, &certdata);
if (rv == KMF_OK) {
if (unlink(fullpath) != 0) {
SET_SYS_ERROR(kmfh, errno);
@@ -1386,8 +1382,8 @@ cleanup:
}
static KMF_RETURN
-ssl_write_private_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
- KMF_CREDENTIAL *cred, EVP_PKEY *pkey)
+ssl_write_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
+ KMF_CREDENTIAL *cred, EVP_PKEY *pkey, boolean_t private)
{
int rv = 0;
RSA *rsa;
@@ -1397,7 +1393,10 @@ ssl_write_private_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
case KMF_FORMAT_ASN1:
if (pkey->type == EVP_PKEY_RSA) {
rsa = EVP_PKEY_get1_RSA(pkey);
- rv = i2d_RSAPrivateKey_bio(out, rsa);
+ if (private)
+ rv = i2d_RSAPrivateKey_bio(out, rsa);
+ else
+ rv = i2d_RSAPublicKey_bio(out, rsa);
RSA_free(rsa);
} else if (pkey->type == EVP_PKEY_DSA) {
dsa = EVP_PKEY_get1_DSA(pkey);
@@ -1413,15 +1412,19 @@ ssl_write_private_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
case KMF_FORMAT_PEM:
if (pkey->type == EVP_PKEY_RSA) {
rsa = EVP_PKEY_get1_RSA(pkey);
- rv = PEM_write_bio_RSAPrivateKey(out,
- rsa, NULL /* encryption type */,
- NULL, 0, NULL, cred->cred);
+ if (private)
+ rv = PEM_write_bio_RSAPrivateKey(out,
+ rsa, NULL, NULL, 0, NULL,
+ (cred != NULL ? cred->cred : NULL));
+ else
+ rv = PEM_write_bio_RSAPublicKey(out,
+ rsa);
RSA_free(rsa);
} else if (pkey->type == EVP_PKEY_DSA) {
dsa = EVP_PKEY_get1_DSA(pkey);
rv = PEM_write_bio_DSAPrivateKey(out,
- dsa, NULL /* encryption type */,
- NULL, 0, NULL, cred->cred);
+ dsa, NULL, NULL, 0, NULL,
+ (cred != NULL ? cred->cred : NULL));
DSA_free(dsa);
}
@@ -1440,35 +1443,46 @@ ssl_write_private_key(KMF_HANDLE *kmfh, KMF_ENCODE_FORMAT format, BIO *out,
}
KMF_RETURN
-OpenSSL_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
- KMF_KEY_HANDLE *privkey, KMF_KEY_HANDLE *pubkey)
+OpenSSL_CreateKeypair(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- int format;
uint32_t eValue = 0x010001;
RSA *sslPrivKey = NULL;
DSA *sslDSAKey = NULL;
EVP_PKEY *eprikey = NULL;
EVP_PKEY *epubkey = NULL;
BIO *out = NULL;
- char *fullpath = NULL;
-
- if (params == NULL || params->sslparms.keyfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
+ KMF_KEY_HANDLE *pubkey = NULL, *privkey = NULL;
+ uint32_t keylen = 1024;
+ uint32_t keylen_size = sizeof (uint32_t);
+ boolean_t storekey = TRUE;
+ KMF_KEY_ALG keytype = KMF_RSA;
+
+ rv = kmf_get_attr(KMF_STOREKEY_BOOL_ATTR, attrlist, numattr,
+ &storekey, NULL);
+ if (rv != KMF_OK) {
+ /* "storekey" is optional. Default is TRUE */
+ rv = KMF_OK;
}
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.keyfile);
+ rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
+ if (rv != KMF_OK)
+ /* keytype is optional. KMF_RSA is default */
+ rv = KMF_OK;
- if (fullpath == NULL)
+ pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attrlist, numattr);
+ if (pubkey == NULL)
return (KMF_ERR_BAD_PARAMETER);
- /* If the requested file exists, return an error */
- if (access(fullpath, F_OK) == 0) {
- free(fullpath);
- return (KMF_ERR_DUPLICATE_KEYFILE);
- }
+ privkey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attrlist, numattr);
+ if (privkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ (void) memset(pubkey, 0, sizeof (KMF_KEY_HANDLE));
+ (void) memset(privkey, 0, sizeof (KMF_KEY_HANDLE));
eprikey = EVP_PKEY_new();
if (eprikey == NULL) {
@@ -1482,40 +1496,57 @@ OpenSSL_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
rv = KMF_ERR_KEYGEN_FAILED;
goto cleanup;
}
- if (params->keytype == KMF_RSA) {
- if (params->rsa_exponent.len > 0 &&
- params->rsa_exponent.len <= sizeof (eValue) &&
- params->rsa_exponent.val != NULL)
- /*LINTED*/
- eValue = *(uint32_t *)params->rsa_exponent.val;
+ if (keytype == KMF_RSA) {
+ KMF_BIGINT *rsaexp = NULL;
- sslPrivKey = RSA_generate_key(params->keylength, eValue,
- NULL, NULL);
+ rsaexp = kmf_get_attr_ptr(KMF_RSAEXP_ATTR, attrlist, numattr);
+ if (rsaexp != NULL) {
+ if (rsaexp->len > 0 &&
+ rsaexp->len <= sizeof (eValue) &&
+ rsaexp->val != NULL) {
+ /*LINTED*/
+ eValue = *(uint32_t *)rsaexp->val;
+ } else {
+ rv = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
+ }
+ } else {
+ /* RSA Exponent is optional. Default is 0x10001 */
+ rv = KMF_OK;
+ }
+
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
+ &keylen, &keylen_size);
+ if (rv == KMF_ERR_ATTR_NOT_FOUND)
+ /* keylen is optional, default is 1024 */
+ rv = KMF_OK;
+ if (rv != KMF_OK) {
+ rv = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
+ }
+
+ sslPrivKey = RSA_generate_key(keylen, eValue, NULL, NULL);
if (sslPrivKey == NULL) {
SET_ERROR(kmfh, ERR_get_error());
rv = KMF_ERR_KEYGEN_FAILED;
} else {
- if (privkey != NULL &&
- EVP_PKEY_set1_RSA(eprikey, sslPrivKey)) {
- privkey->kstype = KMF_KEYSTORE_OPENSSL;
- privkey->keyalg = KMF_RSA;
- privkey->keyclass = KMF_ASYM_PRI;
- privkey->israw = FALSE;
- privkey->keylabel = (char *)strdup(fullpath);
- privkey->keyp = (void *)eprikey;
- }
+ (void) EVP_PKEY_set1_RSA(eprikey, sslPrivKey);
+ privkey->kstype = KMF_KEYSTORE_OPENSSL;
+ privkey->keyalg = KMF_RSA;
+ privkey->keyclass = KMF_ASYM_PRI;
+ privkey->israw = FALSE;
+ privkey->keyp = (void *)eprikey;
+
/* OpenSSL derives the public key from the private */
- if (pubkey != NULL &&
- EVP_PKEY_set1_RSA(epubkey, sslPrivKey)) {
- pubkey->kstype = KMF_KEYSTORE_OPENSSL;
- pubkey->keyalg = KMF_RSA;
- pubkey->israw = FALSE;
- pubkey->keyclass = KMF_ASYM_PUB;
- pubkey->keylabel = (char *)strdup(fullpath);
- pubkey->keyp = (void *)epubkey;
- }
+ (void) EVP_PKEY_set1_RSA(epubkey, sslPrivKey);
+ pubkey->kstype = KMF_KEYSTORE_OPENSSL;
+ pubkey->keyalg = KMF_RSA;
+ pubkey->israw = FALSE;
+ pubkey->keyclass = KMF_ASYM_PUB;
+ pubkey->keyp = (void *)epubkey;
}
- } else if (params->keytype == KMF_DSA) {
+ } else if (keytype == KMF_DSA) {
+ DSA *dp;
sslDSAKey = DSA_new();
if (sslDSAKey == NULL) {
SET_ERROR(kmfh, ERR_get_error());
@@ -1547,89 +1578,116 @@ OpenSSL_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
goto cleanup;
}
- if (privkey != NULL) {
- privkey->kstype = KMF_KEYSTORE_OPENSSL;
- privkey->keyalg = KMF_DSA;
- privkey->keyclass = KMF_ASYM_PRI;
- privkey->israw = FALSE;
- privkey->keylabel = (char *)strdup(fullpath);
- if (EVP_PKEY_set1_DSA(eprikey, sslDSAKey)) {
- privkey->keyp = (void *)eprikey;
+ privkey->kstype = KMF_KEYSTORE_OPENSSL;
+ privkey->keyalg = KMF_DSA;
+ privkey->keyclass = KMF_ASYM_PRI;
+ privkey->israw = FALSE;
+ if (EVP_PKEY_set1_DSA(eprikey, sslDSAKey)) {
+ privkey->keyp = (void *)eprikey;
+ } else {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_KEYGEN_FAILED;
+ goto cleanup;
+ }
+ dp = DSA_new();
+ /* Make a copy for the public key */
+ if (dp != NULL) {
+ if ((dp->p = BN_new()) == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_MEMORY;
+ DSA_free(dp);
+ goto cleanup;
+ }
+ if ((dp->q = BN_new()) == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_MEMORY;
+ BN_free(dp->p);
+ DSA_free(dp);
+ goto cleanup;
+ }
+ if ((dp->g = BN_new()) == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_MEMORY;
+ BN_free(dp->q);
+ BN_free(dp->p);
+ DSA_free(dp);
+ goto cleanup;
+ }
+ if ((dp->pub_key = BN_new()) == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_MEMORY;
+ BN_free(dp->q);
+ BN_free(dp->p);
+ BN_free(dp->g);
+ DSA_free(dp);
+ goto cleanup;
+ }
+ (void) BN_copy(dp->p, sslDSAKey->p);
+ (void) BN_copy(dp->q, sslDSAKey->q);
+ (void) BN_copy(dp->g, sslDSAKey->g);
+ (void) BN_copy(dp->pub_key, sslDSAKey->pub_key);
+
+ pubkey->kstype = KMF_KEYSTORE_OPENSSL;
+ pubkey->keyalg = KMF_DSA;
+ pubkey->keyclass = KMF_ASYM_PUB;
+ pubkey->israw = FALSE;
+
+ if (EVP_PKEY_set1_DSA(epubkey, sslDSAKey)) {
+ pubkey->keyp = (void *)epubkey;
} else {
SET_ERROR(kmfh, ERR_get_error());
rv = KMF_ERR_KEYGEN_FAILED;
goto cleanup;
}
}
- if (pubkey != NULL) {
- DSA *dp = DSA_new();
- /* Make a copy for the public key */
- if (dp != NULL) {
- if ((dp->p = BN_new()) == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_MEMORY;
- DSA_free(dp);
- goto cleanup;
- }
- if ((dp->q = BN_new()) == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_MEMORY;
- BN_free(dp->p);
- DSA_free(dp);
- goto cleanup;
- }
- if ((dp->g = BN_new()) == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_MEMORY;
- BN_free(dp->q);
- BN_free(dp->p);
- DSA_free(dp);
- goto cleanup;
- }
- if ((dp->pub_key = BN_new()) == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_MEMORY;
- BN_free(dp->q);
- BN_free(dp->p);
- BN_free(dp->g);
- DSA_free(dp);
- goto cleanup;
- }
- (void) BN_copy(dp->p, sslDSAKey->p);
- (void) BN_copy(dp->q, sslDSAKey->q);
- (void) BN_copy(dp->g, sslDSAKey->g);
- (void) BN_copy(dp->pub_key, sslDSAKey->pub_key);
-
- pubkey->kstype = KMF_KEYSTORE_OPENSSL;
- pubkey->keyalg = KMF_DSA;
- pubkey->keyclass = KMF_ASYM_PUB;
- pubkey->israw = FALSE;
- pubkey->keylabel = (char *)strdup(fullpath);
-
- if (EVP_PKEY_set1_DSA(epubkey, sslDSAKey)) {
- pubkey->keyp = (void *)epubkey;
- } else {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_KEYGEN_FAILED;
- goto cleanup;
- }
- }
- }
}
if (rv != KMF_OK) {
goto cleanup;
}
- /* Store the private key to the keyfile */
- format = params->sslparms.format;
- out = BIO_new_file(fullpath, "wb");
- if (out == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_OPEN_FILE;
- goto cleanup;
+ if (storekey) {
+ KMF_ATTRIBUTE storeattrs[4]; /* max. 4 attributes needed */
+ int i = 0;
+ char *keyfile = NULL, *dirpath = NULL;
+ KMF_ENCODE_FORMAT format;
+ /*
+ * Construct a new attribute arrray and call openssl_store_key
+ */
+ kmf_set_attr_at_index(storeattrs, i, KMF_PRIVKEY_HANDLE_ATTR,
+ privkey, sizeof (privkey));
+ i++;
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ if (dirpath != NULL) {
+ storeattrs[i].type = KMF_DIRPATH_ATTR;
+ storeattrs[i].pValue = dirpath;
+ storeattrs[i].valueLen = strlen(dirpath);
+ i++;
+ } else {
+ rv = KMF_OK; /* DIRPATH is optional */
+ }
+ keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR,
+ attrlist, numattr);
+ if (keyfile != NULL) {
+ storeattrs[i].type = KMF_KEY_FILENAME_ATTR;
+ storeattrs[i].pValue = keyfile;
+ storeattrs[i].valueLen = strlen(keyfile);
+ i++;
+ } else {
+ goto cleanup; /* KEYFILE is required */
+ }
+ rv = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
+ (void *)&format, NULL);
+ if (rv == KMF_OK) {
+ storeattrs[i].type = KMF_ENCODE_FORMAT_ATTR;
+ storeattrs[i].pValue = &format;
+ storeattrs[i].valueLen = sizeof (format);
+ i++;
+ }
+
+ rv = OpenSSL_StoreKey(handle, i, storeattrs);
}
- rv = ssl_write_private_key(kmfh, format, out, &params->cred, eprikey);
cleanup:
if (rv != KMF_OK) {
@@ -1659,17 +1717,9 @@ cleanup:
if (sslDSAKey)
DSA_free(sslDSAKey);
-
if (out != NULL)
(void) BIO_free(out);
- if (fullpath)
- free(fullpath);
-
- /* Protect the file by making it read-only */
- if (rv == KMF_OK) {
- (void) chmod(fullpath, 0400);
- }
return (rv);
}
@@ -1690,7 +1740,7 @@ OpenSSL_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
return (KMF_ERR_BAD_PARAMETER);
/* Map the OID to an OpenSSL algorithm */
- AlgId = X509_AlgorithmOidToAlgId(AlgOID);
+ AlgId = x509_algoid_to_algid(AlgOID);
if (AlgId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_PARAMETER);
@@ -1777,20 +1827,31 @@ cleanup:
KMF_RETURN
/*ARGSUSED*/
-OpenSSL_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
- KMF_KEY_HANDLE *key, boolean_t destroy)
+OpenSSL_DeleteKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
+ KMF_KEY_HANDLE *key;
+ boolean_t destroy = B_TRUE;
+
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
if (key == NULL || key->keyp == NULL)
return (KMF_ERR_BAD_PARAMETER);
+ rv = kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
+ (void *)&destroy, NULL);
+ if (rv != KMF_OK) {
+ /* "destroy" is optional. Default is TRUE */
+ rv = KMF_OK;
+ }
+
if (key->keyclass != KMF_ASYM_PUB &&
key->keyclass != KMF_ASYM_PRI &&
key->keyclass != KMF_SYMMETRIC)
return (KMF_ERR_BAD_KEY_CLASS);
if (key->keyclass == KMF_SYMMETRIC) {
- KMF_FreeRawSymKey((KMF_RAW_SYM_KEY *)key->keyp);
+ kmf_free_raw_sym_key((KMF_RAW_SYM_KEY *)key->keyp);
key->keyp = NULL;
} else {
if (key->keyp != NULL) {
@@ -1826,409 +1887,6 @@ OpenSSL_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
}
KMF_RETURN
-OpenSSL_ImportCRL(KMF_HANDLE_T handle, KMF_IMPORTCRL_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- X509_CRL *xcrl = NULL;
- X509 *xcert = NULL;
- EVP_PKEY *pkey;
- KMF_ENCODE_FORMAT format;
- BIO *in = NULL, *out = NULL;
- int openssl_ret = 0;
- char *outcrlfile = NULL;
- KMF_ENCODE_FORMAT outformat;
-
- if (params == NULL || params->sslparms.crlfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- if (params->sslparms.crl_check == B_TRUE &&
- params->sslparms.certfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- outcrlfile = get_fullpath(params->sslparms.dirpath,
- params->sslparms.outcrlfile);
-
- if (outcrlfile == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- if (isdir(outcrlfile)) {
- free(outcrlfile);
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = KMF_IsCRLFile(handle, params->sslparms.crlfile, &format);
- if (ret != KMF_OK) {
- free(outcrlfile);
- return (ret);
- }
-
- in = BIO_new_file(params->sslparms.crlfile, "rb");
- if (in == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- xcrl = d2i_X509_CRL_bio(in, NULL);
- } else if (format == KMF_FORMAT_PEM) {
- xcrl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
- }
-
- if (xcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CRLFILE;
- goto end;
- }
-
- /* If bypasscheck is specified, no need to verify. */
- if (params->sslparms.crl_check == B_FALSE) {
- goto output;
- }
-
- ret = KMF_IsCertFile(handle, params->sslparms.certfile, &format);
- if (ret != KMF_OK)
- goto end;
-
- /* Read in the CA cert file and convert to X509 */
- if (BIO_read_filename(in, params->sslparms.certfile) <= 0) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- xcert = d2i_X509_bio(in, NULL);
- } else if (format == KMF_FORMAT_PEM) {
- xcert = PEM_read_bio_X509(in, NULL, NULL, NULL);
- } else {
- ret = KMF_ERR_BAD_CERT_FORMAT;
- goto end;
- }
-
- if (xcert == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CERT_FORMAT;
- goto end;
- }
- /* Now get the public key from the CA cert */
- pkey = X509_get_pubkey(xcert);
- if (!pkey) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CERTFILE;
- goto end;
- }
-
- /* Verify the CRL with the CA's public key */
- openssl_ret = X509_CRL_verify(xcrl, pkey);
- EVP_PKEY_free(pkey);
- if (openssl_ret > 0) {
- ret = KMF_OK; /* verify succeed */
- } else {
- SET_ERROR(kmfh, openssl_ret);
- ret = KMF_ERR_BAD_CRLFILE;
- }
-
-output:
- outformat = params->sslparms.format;
-
- out = BIO_new_file(outcrlfile, "wb");
- if (out == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (outformat == KMF_FORMAT_ASN1) {
- openssl_ret = (int)i2d_X509_CRL_bio(out, xcrl);
- } else if (outformat == KMF_FORMAT_PEM) {
- openssl_ret = PEM_write_bio_X509_CRL(out, xcrl);
- } else {
- ret = KMF_ERR_BAD_PARAMETER;
- goto end;
- }
-
- if (openssl_ret <= 0) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_WRITE_FILE;
- } else {
- ret = KMF_OK;
- }
-
-end:
- if (xcrl != NULL)
- X509_CRL_free(xcrl);
-
- if (xcert != NULL)
- X509_free(xcert);
-
- if (in != NULL)
- (void) BIO_free(in);
-
- if (out != NULL)
- (void) BIO_free(out);
-
- if (outcrlfile != NULL)
- free(outcrlfile);
-
- return (ret);
-}
-
-KMF_RETURN
-OpenSSL_ListCRL(KMF_HANDLE_T handle, KMF_LISTCRL_PARAMS *params,
- char **crldata)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- X509_CRL *x = NULL;
- KMF_ENCODE_FORMAT format;
- char *crlfile = NULL;
- BIO *in = NULL;
- BIO *mem = NULL;
- long len;
- char *memptr;
- char *data = NULL;
-
- if (params == NULL || params->sslparms.crlfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- crlfile = get_fullpath(params->sslparms.dirpath,
- params->sslparms.crlfile);
-
- if (crlfile == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- if (isdir(crlfile)) {
- free(crlfile);
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = KMF_IsCRLFile(handle, crlfile, &format);
- if (ret != KMF_OK) {
- free(crlfile);
- return (ret);
- }
-
- if (bio_err == NULL)
- bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
-
- in = BIO_new_file(crlfile, "rb");
- if (in == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- x = d2i_X509_CRL_bio(in, NULL);
- } else if (format == KMF_FORMAT_PEM) {
- x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
- }
-
- if (x == NULL) { /* should not happen */
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- mem = BIO_new(BIO_s_mem());
- if (mem == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_MEMORY;
- goto end;
- }
-
- (void) X509_CRL_print(mem, x);
- len = BIO_get_mem_data(mem, &memptr);
- if (len <= 0) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_MEMORY;
- goto end;
- }
-
- data = malloc(len + 1);
- if (data == NULL) {
- ret = KMF_ERR_MEMORY;
- goto end;
- }
-
- (void) memcpy(data, memptr, len);
- data[len] = '\0';
- *crldata = data;
-
-end:
- if (x != NULL)
- X509_CRL_free(x);
-
- if (crlfile != NULL)
- free(crlfile);
-
- if (in != NULL)
- (void) BIO_free(in);
-
- if (mem != NULL)
- (void) BIO_free(mem);
-
- return (ret);
-}
-
-KMF_RETURN
-OpenSSL_DeleteCRL(KMF_HANDLE_T handle, KMF_DELETECRL_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- KMF_ENCODE_FORMAT format;
- char *crlfile = NULL;
- BIO *in = NULL;
-
- if (params == NULL || params->sslparms.crlfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- crlfile = get_fullpath(params->sslparms.dirpath,
- params->sslparms.crlfile);
-
- if (crlfile == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
- if (isdir(crlfile)) {
- ret = KMF_ERR_BAD_PARAMETER;
- goto end;
- }
-
- ret = KMF_IsCRLFile(handle, crlfile, &format);
- if (ret != KMF_OK)
- goto end;
-
- if (unlink(crlfile) != 0) {
- SET_SYS_ERROR(kmfh, errno);
- ret = KMF_ERR_INTERNAL;
- goto end;
- }
-
-end:
- if (in != NULL)
- (void) BIO_free(in);
- if (crlfile != NULL)
- free(crlfile);
-
- return (ret);
-}
-
-
-KMF_RETURN
-OpenSSL_FindCertInCRL(KMF_HANDLE_T handle, KMF_FINDCERTINCRL_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- KMF_ENCODE_FORMAT format;
- BIO *in = NULL;
- X509 *xcert = NULL;
- X509_CRL *xcrl = NULL;
- STACK_OF(X509_REVOKED) *revoke_stack = NULL;
- X509_REVOKED *revoke;
- int i;
-
- if (params == NULL || params->sslparms.crlfile == NULL ||
- params->sslparms.certfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = KMF_IsCRLFile(handle, params->sslparms.crlfile, &format);
- if (ret != KMF_OK)
- return (ret);
-
- /* Read the CRL file and load it into a X509_CRL structure */
- in = BIO_new_file(params->sslparms.crlfile, "rb");
- if (in == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- xcrl = d2i_X509_CRL_bio(in, NULL);
- } else if (format == KMF_FORMAT_PEM) {
- xcrl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
- }
-
- if (xcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CRLFILE;
- goto end;
- }
- (void) BIO_free(in);
-
- /* Read the Certificate file and load it into a X509 structure */
- ret = KMF_IsCertFile(handle, params->sslparms.certfile, &format);
- if (ret != KMF_OK)
- goto end;
-
- in = BIO_new_file(params->sslparms.certfile, "rb");
- if (in == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- if (format == KMF_FORMAT_ASN1) {
- xcert = d2i_X509_bio(in, NULL);
- } else if (format == KMF_FORMAT_PEM) {
- xcert = PEM_read_bio_X509(in, NULL, NULL, NULL);
- }
-
- if (xcert == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CERTFILE;
- goto end;
- }
-
- /* Check if the certificate and the CRL have same issuer */
- if (X509_NAME_cmp(xcert->cert_info->issuer, xcrl->crl->issuer) != 0) {
- ret = KMF_ERR_ISSUER;
- goto end;
- }
-
- /* Check to see if the certificate serial number is revoked */
- revoke_stack = X509_CRL_get_REVOKED(xcrl);
- if (sk_X509_REVOKED_num(revoke_stack) <= 0) {
- /* No revoked certificates in the CRL file */
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_EMPTY_CRL;
- goto end;
- }
-
- for (i = 0; i < sk_X509_REVOKED_num(revoke_stack); i++) {
- /*LINTED*/
- revoke = sk_X509_REVOKED_value(revoke_stack, i);
- if (ASN1_INTEGER_cmp(xcert->cert_info->serialNumber,
- revoke->serialNumber) == 0) {
- break;
- }
- }
-
- if (i < sk_X509_REVOKED_num(revoke_stack)) {
- ret = KMF_OK;
- } else {
- ret = KMF_ERR_NOT_REVOKED;
- }
-
-end:
- if (in != NULL)
- (void) BIO_free(in);
- if (xcrl != NULL)
- X509_CRL_free(xcrl);
- if (xcert != NULL)
- X509_free(xcert);
-
- return (ret);
-}
-
-KMF_RETURN
OpenSSL_GetErrorString(KMF_HANDLE_T handle, char **msgstr)
{
KMF_RETURN ret = KMF_OK;
@@ -2452,8 +2110,7 @@ OpenSSL_CertGetPrintable(KMF_HANDLE_T handle, const KMF_DATA *pcert,
(void) i2a_ASN1_OBJECT(mem, X509_EXTENSION_get_object(ex));
if (BIO_printf(mem, ": %s\n",
- X509_EXTENSION_get_critical(ex) ? "critical" : "") <=
- 0) {
+ X509_EXTENSION_get_critical(ex) ? "critical" : "") <= 0) {
SET_ERROR(kmfh, ERR_get_error());
ret = KMF_ERR_ENCODING;
goto out;
@@ -2489,33 +2146,64 @@ out:
return (ret);
}
+
KMF_RETURN
/*ARGSUSED*/
-OpenSSL_GetPrikeyByCert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *SignerCertData, KMF_KEY_HANDLE *key,
- KMF_KEY_ALG keytype)
+OpenSSL_FindPrikeyByCert(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
- KMF_FINDKEY_PARAMS fkparms;
- uint32_t numkeys = 0;
-
- if (params == NULL || params->sslparms.keyfile == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_OPENSSL;
+ KMF_KEY_CLASS keyclass = KMF_ASYM_PRI;
+ KMF_KEY_HANDLE *key = NULL;
+ uint32_t numkeys = 1; /* 1 key only */
+ char *dirpath = NULL;
+ char *keyfile = NULL;
+ KMF_ATTRIBUTE new_attrlist[16];
+ int i = 0;
/*
* This is really just a FindKey operation, reuse the
* FindKey function.
*/
- (void *)memset(&fkparms, 0, sizeof (fkparms));
- fkparms.kstype = KMF_KEYSTORE_OPENSSL;
- fkparms.keyclass = KMF_ASYM_PRI;
- fkparms.keytype = keytype;
- fkparms.format = params->format;
- fkparms.sslparms = params->sslparms;
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ i++;
- rv = OpenSSL_FindKey(handle, &fkparms, key, &numkeys);
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_COUNT_ATTR, &numkeys, sizeof (uint32_t));
+ i++;
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_KEYCLASS_ATTR, &keyclass, sizeof (keyclass));
+ i++;
+
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (key == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ } else {
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_KEY_HANDLE_ATTR, key, sizeof (KMF_KEY_HANDLE));
+ i++;
+ }
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ if (dirpath != NULL) {
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_DIRPATH_ATTR, dirpath, strlen(dirpath));
+ i++;
+ }
+
+ keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR, attrlist, numattr);
+ if (keyfile == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+ else {
+ kmf_set_attr_at_index(new_attrlist, i,
+ KMF_KEY_FILENAME_ATTR, keyfile, strlen(keyfile));
+ i++;
+ }
+
+ rv = OpenSSL_FindKey(handle, i, new_attrlist);
return (rv);
}
@@ -2637,22 +2325,34 @@ end:
}
KMF_RETURN
-OpenSSL_CreateOCSPRequest(KMF_HANDLE_T handle, KMF_OCSPREQUEST_PARAMS *params,
- char *reqfile)
+OpenSSL_CreateOCSPRequest(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
OCSP_CERTID *id = NULL;
OCSP_REQUEST *req = NULL;
BIO *derbio = NULL;
+ char *reqfile;
+ KMF_DATA *issuer_cert;
+ KMF_DATA *user_cert;
- if (params->user_cert == NULL || params->issuer_cert == NULL ||
- reqfile == NULL) {
+ user_cert = kmf_get_attr_ptr(KMF_USER_CERT_DATA_ATTR,
+ attrlist, numattr);
+ if (user_cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- }
- ret = create_certid(handle, params->issuer_cert, params->user_cert,
- &id);
+ issuer_cert = kmf_get_attr_ptr(KMF_ISSUER_CERT_DATA_ATTR,
+ attrlist, numattr);
+ if (issuer_cert == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ reqfile = kmf_get_attr_ptr(KMF_OCSP_REQUEST_FILENAME_ATTR,
+ attrlist, numattr);
+ if (reqfile == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ ret = create_certid(handle, issuer_cert, user_cert, &id);
if (ret != KMF_OK) {
return (ret);
}
@@ -2854,8 +2554,7 @@ end:
KMF_RETURN
OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
- KMF_OCSPRESPONSE_PARAMS_INPUT *params_in,
- KMF_OCSPRESPONSE_PARAMS_OUTPUT *params_out)
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
BIO *derbio = NULL;
@@ -2865,19 +2564,46 @@ OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
OCSP_SINGLERESP *single = NULL;
ASN1_GENERALIZEDTIME *rev, *thisupd, *nextupd;
int index, status, reason;
+ KMF_DATA *issuer_cert;
+ KMF_DATA *user_cert;
+ KMF_DATA *signer_cert;
+ KMF_DATA *response;
+ int *response_reason, *response_status, *cert_status;
+ boolean_t ignore_response_sign = B_FALSE; /* default is FALSE */
+ uint32_t response_lifetime;
+
+ issuer_cert = kmf_get_attr_ptr(KMF_ISSUER_CERT_DATA_ATTR,
+ attrlist, numattr);
+ if (issuer_cert == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- if (params_in == NULL || params_in->issuer_cert == NULL ||
- params_in->user_cert == NULL || params_in->response == NULL) {
+ user_cert = kmf_get_attr_ptr(KMF_USER_CERT_DATA_ATTR,
+ attrlist, numattr);
+ if (user_cert == NULL)
return (KMF_ERR_BAD_PARAMETER);
- }
- if (params_out == NULL) {
+ response = kmf_get_attr_ptr(KMF_OCSP_RESPONSE_DATA_ATTR,
+ attrlist, numattr);
+ if (response == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ response_status = kmf_get_attr_ptr(KMF_OCSP_RESPONSE_STATUS_ATTR,
+ attrlist, numattr);
+ if (response_status == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ response_reason = kmf_get_attr_ptr(KMF_OCSP_RESPONSE_REASON_ATTR,
+ attrlist, numattr);
+ if (response_reason == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ cert_status = kmf_get_attr_ptr(KMF_OCSP_RESPONSE_CERT_STATUS_ATTR,
+ attrlist, numattr);
+ if (cert_status == NULL)
return (KMF_ERR_BAD_PARAMETER);
- }
/* Read in the response */
- derbio = BIO_new_mem_buf(params_in->response->Data,
- params_in->response->Length);
+ derbio = BIO_new_mem_buf(response->Data, response->Length);
if (!derbio) {
ret = KMF_ERR_MEMORY;
return (ret);
@@ -2891,7 +2617,7 @@ OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
/* Check the response status */
status = OCSP_response_status(resp);
- params_out->response_status = status;
+ *response_status = status;
if (status != OCSP_RESPONSE_STATUS_SUCCESSFUL) {
ret = KMF_ERR_OCSP_RESPONSE_STATUS;
goto end;
@@ -2913,9 +2639,17 @@ OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
#endif /* DEBUG */
/* Check the basic response signature if required */
- if (params_in->ignore_response_sign == B_FALSE) {
+ ret = kmf_get_attr(KMF_IGNORE_RESPONSE_SIGN_ATTR, attrlist, numattr,
+ (void *)&ignore_response_sign, NULL);
+ if (ret != KMF_OK)
+ ret = KMF_OK;
+
+ signer_cert = kmf_get_attr_ptr(KMF_SIGNER_CERT_DATA_ATTR,
+ attrlist, numattr);
+
+ if (ignore_response_sign == B_FALSE) {
ret = check_response_signature(handle, bs,
- params_in->signer_cert, params_in->issuer_cert);
+ signer_cert, issuer_cert);
if (ret != KMF_OK)
goto end;
}
@@ -2925,8 +2659,7 @@ OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
#endif /* DEBUG */
/* Create a certid for the certificate in question */
- ret = create_certid(handle, params_in->issuer_cert,
- params_in->user_cert, &id);
+ ret = create_certid(handle, issuer_cert, user_cert, &id);
if (ret != KMF_OK) {
ret = KMF_ERR_OCSP_CERTID;
goto end;
@@ -2953,18 +2686,21 @@ OpenSSL_GetOCSPStatusForCert(KMF_HANDLE_T handle,
status = OCSP_single_get0_status(single, &reason, &rev, &thisupd,
&nextupd);
if (status == V_OCSP_CERTSTATUS_GOOD) {
- params_out->cert_status = OCSP_GOOD;
+ *cert_status = OCSP_GOOD;
} else if (status == V_OCSP_CERTSTATUS_UNKNOWN) {
- params_out->cert_status = OCSP_UNKNOWN;
+ *cert_status = OCSP_UNKNOWN;
} else { /* revoked */
- params_out->cert_status = OCSP_REVOKED;
- params_out->reason = reason;
+ *cert_status = OCSP_REVOKED;
+ *response_reason = reason;
}
ret = KMF_OK;
- /* Verify the time */
+ /* resp. time is optional, so we don't care about the return code. */
+ (void) kmf_get_attr(KMF_RESPONSE_LIFETIME_ATTR, attrlist, numattr,
+ (void *)&response_lifetime, NULL);
+
if (!OCSP_check_validity(thisupd, nextupd, 300,
- params_in->response_lifetime)) {
+ response_lifetime)) {
ret = KMF_ERR_OCSP_STATUS_TIME_INVALID;
goto end;
}
@@ -2994,14 +2730,9 @@ fetch_key(KMF_HANDLE_T handle, char *path,
KMF_KEY_CLASS keyclass, KMF_KEY_HANDLE *key)
{
KMF_RETURN rv = KMF_OK;
- EVP_PKEY *pkey;
+ EVP_PKEY *pkey = NULL;
KMF_RAW_SYM_KEY *rkey = NULL;
- /* Make sure the requested file actually exists. */
- if (access(path, F_OK) != 0) {
- return (KMF_ERR_KEY_NOT_FOUND);
- }
-
if (keyclass == KMF_ASYM_PRI ||
keyclass == KMF_ASYM_PUB) {
pkey = openssl_load_key(handle, path);
@@ -3029,7 +2760,7 @@ fetch_key(KMF_HANDLE_T handle, char *path,
* If the file is a recognized format,
* then it is NOT a symmetric key.
*/
- rv = KMF_GetFileFormat(path, &fmt);
+ rv = kmf_get_file_format(path, &fmt);
if (rv == KMF_OK || fmt != 0) {
return (KMF_ERR_KEY_NOT_FOUND);
} else if (rv == KMF_ERR_ENCODING) {
@@ -3038,6 +2769,8 @@ fetch_key(KMF_HANDLE_T handle, char *path,
* it is probably a symmetric key.
*/
rv = KMF_OK;
+ } else if (rv == KMF_ERR_OPEN_FILE) {
+ return (KMF_ERR_KEY_NOT_FOUND);
}
if (key != NULL) {
@@ -3049,7 +2782,7 @@ fetch_key(KMF_HANDLE_T handle, char *path,
}
(void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY));
- rv = KMF_ReadInputFile(handle, path, &keyvalue);
+ rv = kmf_read_input_file(handle, path, &keyvalue);
if (rv != KMF_OK)
goto out;
@@ -3066,7 +2799,7 @@ fetch_key(KMF_HANDLE_T handle, char *path,
out:
if (rv != KMF_OK) {
if (rkey != NULL) {
- KMF_FreeRawSymKey(rkey);
+ kmf_free_raw_sym_key(rkey);
}
if (pkey != NULL)
EVP_PKEY_free(pkey);
@@ -3082,23 +2815,40 @@ out:
}
KMF_RETURN
-OpenSSL_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
- KMF_KEY_HANDLE *key, uint32_t *numkeys)
+OpenSSL_FindKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
char *fullpath = NULL;
uint32_t maxkeys;
+ KMF_KEY_HANDLE *key;
+ uint32_t *numkeys;
+ KMF_KEY_CLASS keyclass;
+ KMF_RAW_KEY_DATA *rawkey;
+ char *dirpath;
+ char *keyfile;
+
+ if (handle == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (numkeys == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
- if (handle == NULL || params == NULL || numkeys == NULL)
+ rv = kmf_get_attr(KMF_KEYCLASS_ATTR, attrlist, numattr,
+ (void *)&keyclass, NULL);
+ if (rv != KMF_OK)
return (KMF_ERR_BAD_PARAMETER);
- if (params->keyclass != KMF_ASYM_PUB &&
- params->keyclass != KMF_ASYM_PRI &&
- params->keyclass != KMF_SYMMETRIC)
+ if (keyclass != KMF_ASYM_PUB &&
+ keyclass != KMF_ASYM_PRI &&
+ keyclass != KMF_SYMMETRIC)
return (KMF_ERR_BAD_KEY_CLASS);
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.keyfile);
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR, attrlist, numattr);
+
+ fullpath = get_fullpath(dirpath, keyfile);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -3106,9 +2856,17 @@ OpenSSL_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
maxkeys = *numkeys;
if (maxkeys == 0)
maxkeys = 0xFFFFFFFF;
-
*numkeys = 0;
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ /* it is okay to have "keys" contains NULL */
+
+ /*
+ * The caller may want a list of the raw key data as well.
+ * Useful for importing keys from a file into other keystores.
+ */
+ rawkey = kmf_get_attr_ptr(KMF_RAW_KEY_ATTR, attrlist, numattr);
+
if (isdir(fullpath)) {
DIR *dirp;
struct dirent *dp;
@@ -3128,11 +2886,14 @@ OpenSSL_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
(char *)&dp->d_name);
rv = fetch_key(handle, fname,
- params->keyclass,
- key ? &key[n] : NULL);
+ keyclass, key ? &key[n] : NULL);
- if (rv == KMF_OK)
+ if (rv == KMF_OK) {
+ if (key != NULL && rawkey != NULL)
+ rv = convertToRawKey(
+ key[n].keyp, &rawkey[n]);
n++;
+ }
if (rv != KMF_OK || key == NULL)
free(fname);
@@ -3142,12 +2903,16 @@ OpenSSL_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *params,
free(fullpath);
(*numkeys) = n;
} else {
- rv = fetch_key(handle, fullpath, params->keyclass, key);
+ rv = fetch_key(handle, fullpath, keyclass, key);
if (rv == KMF_OK)
(*numkeys) = 1;
if (rv != KMF_OK || key == NULL)
free(fullpath);
+
+ if (rv == KMF_OK && key != NULL && rawkey != NULL) {
+ rv = convertToRawKey(key->keyp, rawkey);
+ }
}
if (rv == KMF_OK && (*numkeys) == 0)
@@ -3236,8 +3001,7 @@ write_pkcs12(KMF_HANDLE *kmfh,
X509 *ca = NULL;
uchar_t *p = (uchar_t *)c->certificate.Data;
- ca = d2i_X509(NULL, &p,
- c->certificate.Length);
+ ca = d2i_X509(NULL, &p, c->certificate.Length);
if (ca == NULL) {
HANDLE_PK12_ERROR
}
@@ -3466,6 +3230,12 @@ ImportRawDSAKey(KMF_RAW_DSA_KEY *key)
dsa->priv_key)) == NULL)
return (NULL);
+ if (key->pubvalue.val != NULL) {
+ if ((dsa->pub_key = BN_bin2bn(key->pubvalue.val,
+ key->pubvalue.len, dsa->pub_key)) == NULL)
+ return (NULL);
+ }
+
if ((newkey = EVP_PKEY_new()) == NULL)
return (NULL);
@@ -3541,45 +3311,49 @@ cleanup:
return (rv);
}
+
KMF_RETURN
-OpenSSL_ExportP12(KMF_HANDLE_T handle,
- KMF_EXPORTP12_PARAMS *params,
- int numcerts, KMF_X509_DER_CERT *certlist,
- int numkeys, KMF_KEY_HANDLE *keylist,
- char *filename)
+openssl_build_pk12(KMF_HANDLE_T handle, int numcerts,
+ KMF_X509_DER_CERT *certlist, int numkeys, KMF_KEY_HANDLE *keylist,
+ KMF_CREDENTIAL *p12cred, char *filename)
+{
+ KMF_RETURN rv;
+
+ if (certlist == NULL && keylist == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = ExportPK12FromRawData(handle, p12cred, numcerts, certlist,
+ numkeys, keylist, filename);
+
+ return (rv);
+}
+
+
+KMF_RETURN
+OpenSSL_ExportPK12(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- KMF_FINDCERT_PARAMS fcargs;
BIO *bio = NULL;
X509 *xcert = NULL;
char *fullpath = NULL;
EVP_PKEY *pkey = NULL;
+ char *dirpath = NULL;
+ char *certfile = NULL;
+ char *keyfile = NULL;
+ char *filename = NULL;
+ KMF_CREDENTIAL *p12cred = NULL;
- /*
- * First, find the certificate.
- */
- if (params == NULL)
+ if (handle == NULL)
return (KMF_ERR_BAD_PARAMETER);
/*
- * If the caller already sent the raw keys and certs,
- * shortcut the search and just export that
- * data.
- *
- * One *may* export a key OR a cert by itself.
+ * First, find the certificate.
*/
- if (certlist != NULL || keylist != NULL) {
- rv = ExportPK12FromRawData(handle,
- &params->p12cred, numcerts, certlist,
- numkeys, keylist, filename);
- return (rv);
- }
-
- if (params->sslparms.certfile != NULL) {
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.certfile);
-
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
+ if (certfile != NULL) {
+ fullpath = get_fullpath(dirpath, certfile);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -3588,29 +3362,19 @@ OpenSSL_ExportP12(KMF_HANDLE_T handle,
return (KMF_ERR_AMBIGUOUS_PATHNAME);
}
- (void *)memset(&fcargs, 0, sizeof (fcargs));
- fcargs.kstype = params->kstype;
- fcargs.certLabel = params->certLabel;
- fcargs.issuer = params->issuer;
- fcargs.subject = params->subject;
- fcargs.serial = params->serial;
- fcargs.idstr = params->idstr;
- fcargs.sslparms.dirpath = NULL;
- fcargs.sslparms.certfile = fullpath;
- fcargs.sslparms.format = params->sslparms.format;
-
- rv = load_X509cert(kmfh, &fcargs, fullpath, &xcert);
+ rv = load_X509cert(kmfh, NULL, NULL, NULL, fullpath, &xcert);
if (rv != KMF_OK)
goto end;
+
+ free(fullpath);
}
/*
* Now find the private key.
*/
- if (params->sslparms.keyfile != NULL) {
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.keyfile);
-
+ keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR, attrlist, numattr);
+ if (keyfile != NULL) {
+ fullpath = get_fullpath(dirpath, keyfile);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -3629,6 +3393,13 @@ OpenSSL_ExportP12(KMF_HANDLE_T handle,
/*
* Open the output file.
*/
+ filename = kmf_get_attr_ptr(KMF_OUTPUT_FILENAME_ATTR, attrlist,
+ numattr);
+ if (filename == NULL) {
+ rv = KMF_ERR_BAD_PARAMETER;
+ goto end;
+ }
+
if ((bio = BIO_new_file(filename, "wb")) == NULL) {
SET_ERROR(kmfh, ERR_get_error());
rv = KMF_ERR_OPEN_FILE;
@@ -3636,8 +3407,13 @@ OpenSSL_ExportP12(KMF_HANDLE_T handle,
}
/* Stick the key and the cert into a PKCS#12 file */
- rv = write_pkcs12(kmfh, bio, &params->p12cred,
- pkey, xcert);
+ p12cred = kmf_get_attr_ptr(KMF_PK12CRED_ATTR, attrlist, numattr);
+ if (p12cred == NULL) {
+ rv = KMF_ERR_BAD_PARAMETER;
+ goto end;
+ }
+
+ rv = write_pkcs12(kmfh, bio, p12cred, pkey, xcert);
end:
if (fullpath)
@@ -3652,6 +3428,7 @@ end:
return (rv);
}
+
#define MAX_CHAIN_LENGTH 100
/*
* Helper function to extract keys and certificates from
@@ -3660,7 +3437,8 @@ end:
* However, the file may be just a list of X509 certs with no keys.
*/
static KMF_RETURN
-extract_objects(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params,
+extract_pem(KMF_HANDLE *kmfh,
+ char *issuer, char *subject, KMF_BIGINT *serial,
char *filename, CK_UTF8CHAR *pin,
CK_ULONG pinlen, EVP_PKEY **priv_key, KMF_DATA **certs,
int *numcerts)
@@ -3690,10 +3468,11 @@ extract_objects(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params,
return (KMF_ERR_ENCODING);
}
+
for (i = 0;
i < sk_X509_INFO_num(x509_info_stack) && i < MAX_CHAIN_LENGTH;
i++) {
- /*LINTED*/
+ /* LINTED */
cert_infos[ncerts] = sk_X509_INFO_value(x509_info_stack, i);
ncerts++;
}
@@ -3736,12 +3515,10 @@ extract_objects(KMF_HANDLE *kmfh, KMF_FINDCERT_PARAMS *params,
boolean_t match = FALSE;
info = cert_infos[ncerts - 1 - i];
- if (params != NULL) {
- rv = check_cert(info->x509, params, &match);
- if (rv != KMF_OK || match != TRUE) {
- rv = KMF_OK;
- continue;
- }
+ rv = check_cert(info->x509, issuer, subject, serial, &match);
+ if (rv != KMF_OK || match != TRUE) {
+ rv = KMF_OK;
+ continue;
}
rv = ssl_cert2KMFDATA(kmfh, info->x509,
@@ -3880,7 +3657,7 @@ exportRawRSAKey(RSA *rsa, KMF_RAW_KEY_DATA *key)
goto cleanup;
cleanup:
if (rv != KMF_OK)
- KMF_FreeRawKey(key);
+ kmf_free_raw_key(key);
else
key->keytype = KMF_RSA;
@@ -3914,7 +3691,7 @@ exportRawDSAKey(DSA *dsa, KMF_RAW_KEY_DATA *key)
cleanup:
if (rv != KMF_OK)
- KMF_FreeRawKey(key);
+ kmf_free_raw_key(key);
else
key->keytype = KMF_DSA;
@@ -3983,6 +3760,33 @@ add_key_to_list(KMF_RAW_KEY_DATA **keylist,
return (KMF_OK);
}
+static KMF_RETURN
+convertToRawKey(EVP_PKEY *pkey, KMF_RAW_KEY_DATA *key)
+{
+ KMF_RETURN rv = KMF_OK;
+
+ if (pkey == NULL || key == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+ /* Convert SSL key to raw key */
+ switch (pkey->type) {
+ case EVP_PKEY_RSA:
+ rv = exportRawRSAKey(EVP_PKEY_get1_RSA(pkey),
+ key);
+ if (rv != KMF_OK)
+ return (rv);
+ break;
+ case EVP_PKEY_DSA:
+ rv = exportRawDSAKey(EVP_PKEY_get1_DSA(pkey),
+ key);
+ if (rv != KMF_OK)
+ return (rv);
+ break;
+ default:
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ return (rv);
+}
static KMF_RETURN
convertPK12Objects(
@@ -3996,27 +3800,10 @@ convertPK12Objects(
int i;
if (sslkey != NULL) {
- /* Convert SSL key to raw key */
- switch (sslkey->type) {
- case EVP_PKEY_RSA:
- rv = exportRawRSAKey(EVP_PKEY_get1_RSA(sslkey),
- &key);
- if (rv != KMF_OK)
- return (rv);
-
- break;
- case EVP_PKEY_DSA:
- rv = exportRawDSAKey(EVP_PKEY_get1_DSA(sslkey),
- &key);
- if (rv != KMF_OK)
- return (rv);
-
- break;
- default:
- return (KMF_ERR_BAD_PARAMETER);
- }
+ rv = convertToRawKey(sslkey, &key);
+ if (rv == KMF_OK)
+ rv = add_key_to_list(keylist, &key, nkeys);
- rv = add_key_to_list(keylist, &key, nkeys);
if (rv != KMF_OK)
return (rv);
}
@@ -4049,160 +3836,79 @@ convertPK12Objects(
}
KMF_RETURN
-openssl_read_pkcs12(KMF_HANDLE *kmfh,
+openssl_import_objects(KMF_HANDLE *kmfh,
char *filename, KMF_CREDENTIAL *cred,
KMF_DATA **certlist, int *ncerts,
KMF_RAW_KEY_DATA **keylist, int *nkeys)
{
KMF_RETURN rv = KMF_OK;
- BIO *bio = NULL;
EVP_PKEY *privkey = NULL;
+ KMF_ENCODE_FORMAT format;
+ BIO *bio = NULL;
X509 *cert = NULL;
STACK_OF(X509) *cacerts = NULL;
- bio = BIO_new_file(filename, "rb");
- if (bio == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_OPEN_FILE;
- goto end;
- }
-
- *certlist = NULL;
- *keylist = NULL;
- *ncerts = 0;
- *nkeys = 0;
-
- rv = extract_pkcs12(bio, (uchar_t *)cred->cred,
- (uint32_t)cred->credlen, &privkey, &cert, &cacerts);
-
- if (rv == KMF_OK)
- /* Convert keys and certs to exportable format */
- rv = convertPK12Objects(kmfh, privkey, cert, cacerts,
- keylist, nkeys, certlist, ncerts);
-
-end:
- if (bio != NULL)
- (void) BIO_free(bio);
-
- if (privkey)
- EVP_PKEY_free(privkey);
-
- if (cert)
- X509_free(cert);
-
- if (cacerts)
- sk_X509_free(cacerts);
-
- return (rv);
-}
-
-KMF_RETURN
-openssl_import_keypair(KMF_HANDLE *kmfh,
- char *filename, KMF_CREDENTIAL *cred,
- KMF_DATA **certlist, int *ncerts,
- KMF_RAW_KEY_DATA **keylist, int *nkeys)
-{
- KMF_RETURN rv = KMF_OK;
- EVP_PKEY *privkey = NULL;
- KMF_ENCODE_FORMAT format;
-
/*
* auto-detect the file format, regardless of what
* the 'format' parameters in the params say.
*/
- rv = KMF_GetFileFormat(filename, &format);
+ rv = kmf_get_file_format(filename, &format);
if (rv != KMF_OK) {
- if (rv == KMF_ERR_OPEN_FILE)
- rv = KMF_ERR_CERT_NOT_FOUND;
return (rv);
}
- /* This function only works on PEM files */
+ /* This function only works for PEM or PKCS#12 files */
if (format != KMF_FORMAT_PEM &&
- format != KMF_FORMAT_PEM_KEYPAIR)
+ format != KMF_FORMAT_PEM_KEYPAIR &&
+ format != KMF_FORMAT_PKCS12)
return (KMF_ERR_ENCODING);
*certlist = NULL;
*keylist = NULL;
*ncerts = 0;
*nkeys = 0;
- rv = extract_objects(kmfh, NULL, filename,
- (uchar_t *)cred->cred, (uint32_t)cred->credlen,
- &privkey, certlist, ncerts);
-
- /* Reached end of import file? */
- if (rv == KMF_OK)
- /* Convert keys and certs to exportable format */
- rv = convertPK12Objects(kmfh, privkey, NULL, NULL,
- keylist, nkeys, NULL, NULL);
-
-end:
- if (privkey)
- EVP_PKEY_free(privkey);
-
- return (rv);
-}
-
-KMF_RETURN
-OpenSSL_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
- KMF_RAW_KEY_DATA *key)
-{
- KMF_RETURN rv = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- char *fullpath;
- EVP_PKEY *pkey = NULL;
- BIO *bio = NULL;
- if (key != NULL) {
- if (key->keytype == KMF_RSA) {
- pkey = ImportRawRSAKey(&key->rawdata.rsa);
- } else if (key->keytype == KMF_DSA) {
- pkey = ImportRawDSAKey(&key->rawdata.dsa);
- } else {
- rv = KMF_ERR_BAD_PARAMETER;
+ if (format == KMF_FORMAT_PKCS12) {
+ bio = BIO_new_file(filename, "rb");
+ if (bio == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_OPEN_FILE;
+ goto end;
}
- } else {
- rv = KMF_ERR_BAD_PARAMETER;
- }
- if (rv != KMF_OK || pkey == NULL)
- return (rv);
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.keyfile);
+ rv = extract_pkcs12(bio, (uchar_t *)cred->cred,
+ (uint32_t)cred->credlen, &privkey, &cert, &cacerts);
- if (fullpath == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+ if (rv == KMF_OK)
+ /* Convert keys and certs to exportable format */
+ rv = convertPK12Objects(kmfh, privkey, cert, cacerts,
+ keylist, nkeys, certlist, ncerts);
- /* If the requested file exists, return an error */
- if (access(fullpath, F_OK) == 0) {
- free(fullpath);
- return (KMF_ERR_DUPLICATE_KEYFILE);
- }
+ } else {
+ rv = extract_pem(kmfh, NULL, NULL, NULL, filename,
+ (uchar_t *)cred->cred, (uint32_t)cred->credlen,
+ &privkey, certlist, ncerts);
- bio = BIO_new_file(fullpath, "wb");
- if (bio == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- rv = KMF_ERR_OPEN_FILE;
- goto cleanup;
+ /* Reached end of import file? */
+ if (rv == KMF_OK)
+ /* Convert keys and certs to exportable format */
+ rv = convertPK12Objects(kmfh, privkey, NULL, NULL,
+ keylist, nkeys, NULL, NULL);
}
- rv = ssl_write_private_key(kmfh, params->sslparms.format,
- bio, &params->cred, pkey);
+end:
+ if (privkey)
+ EVP_PKEY_free(privkey);
-cleanup:
- if (fullpath)
- free(fullpath);
+ if (bio != NULL)
+ (void) BIO_free(bio);
- if (pkey)
- EVP_PKEY_free(pkey);
+ if (cert)
+ X509_free(cert);
- if (bio)
- (void) BIO_free(bio);
+ if (cacerts)
+ sk_X509_free(cacerts);
- /* Protect the file by making it read-only */
- if (rv == KMF_OK) {
- (void) chmod(fullpath, 0400);
- }
return (rv);
}
@@ -4322,8 +4028,8 @@ out:
}
KMF_RETURN
-OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
- KMF_KEY_HANDLE *symkey)
+OpenSSL_CreateSymKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -4333,21 +4039,46 @@ OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
unsigned char *des3key = NULL;
unsigned char *random = NULL;
int fd = -1;
+ KMF_KEY_HANDLE *symkey;
+ KMF_KEY_ALG keytype;
+ uint32_t keylen;
+ uint32_t keylen_size = sizeof (keylen);
+ char *dirpath;
+ char *keyfile;
if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED);
- if (params == NULL || params->sslparms.keyfile == NULL) {
+ symkey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (symkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+
+ keyfile = kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR, attrlist, numattr);
+ if (keyfile == NULL)
return (KMF_ERR_BAD_PARAMETER);
- }
- fullpath = get_fullpath(params->sslparms.dirpath,
- params->sslparms.keyfile);
+ ret = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
+ if (ret != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ ret = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
+ &keylen, &keylen_size);
+ if (ret == KMF_ERR_ATTR_NOT_FOUND &&
+ (keytype == KMF_DES || keytype == KMF_DES3))
+ /* keylength is not required for DES and 3DES */
+ ret = KMF_OK;
+ if (ret != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ fullpath = get_fullpath(dirpath, keyfile);
if (fullpath == NULL)
return (KMF_ERR_BAD_PARAMETER);
/* If the requested file exists, return an error */
- if (access(fullpath, F_OK) == 0) {
+ if (test_for_file(fullpath, 0400) == 1) {
free(fullpath);
return (KMF_ERR_DUPLICATE_KEYFILE);
}
@@ -4365,7 +4096,7 @@ OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
}
(void) memset(rkey, 0, sizeof (KMF_RAW_SYM_KEY));
- if (params->keytype == KMF_DES) {
+ if (keytype == KMF_DES) {
if ((ret = create_deskey(&deskey)) != KMF_OK) {
goto out;
}
@@ -4374,7 +4105,7 @@ OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
symkey->keyalg = KMF_DES;
- } else if (params->keytype == KMF_DES3) {
+ } else if (keytype == KMF_DES3) {
if ((ret = create_des3key(&des3key)) != KMF_OK) {
goto out;
}
@@ -4382,25 +4113,25 @@ OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
rkey->keydata.len = DES3_KEY_SIZE;
symkey->keyalg = KMF_DES3;
- } else if (params->keytype == KMF_AES || params->keytype == KMF_RC4 ||
- params->keytype == KMF_GENERIC_SECRET) {
+ } else if (keytype == KMF_AES || keytype == KMF_RC4 ||
+ keytype == KMF_GENERIC_SECRET) {
int bytes;
- if (params->keylength % 8 != 0) {
+ if (keylen % 8 != 0) {
ret = KMF_ERR_BAD_KEY_SIZE;
goto out;
}
- if (params->keytype == KMF_AES) {
- if (params->keylength != 128 &&
- params->keylength != 192 &&
- params->keylength != 256) {
+ if (keytype == KMF_AES) {
+ if (keylen != 128 &&
+ keylen != 192 &&
+ keylen != 256) {
ret = KMF_ERR_BAD_KEY_SIZE;
goto out;
}
}
- bytes = params->keylength/8;
+ bytes = keylen/8;
random = malloc(bytes);
if (random == NULL) {
ret = KMF_ERR_MEMORY;
@@ -4413,7 +4144,7 @@ OpenSSL_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
rkey->keydata.val = (uchar_t *)random;
rkey->keydata.len = bytes;
- symkey->keyalg = params->keytype;
+ symkey->keyalg = keytype;
} else {
ret = KMF_ERR_BAD_KEY_TYPE;
@@ -4436,7 +4167,7 @@ out:
free(fullpath);
}
if (ret != KMF_OK) {
- KMF_FreeRawSymKey(rkey);
+ kmf_free_raw_sym_key(rkey);
symkey->keyp = NULL;
symkey->keyalg = KMF_KEYALG_NONE;
}
@@ -4444,159 +4175,6 @@ out:
return (ret);
}
-
-KMF_RETURN
-OpenSSL_VerifyCRLFile(KMF_HANDLE_T handle, KMF_VERIFYCRL_PARAMS *params)
-{
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- BIO *bcrl = NULL;
- X509_CRL *xcrl = NULL;
- X509 *xcert = NULL;
- EVP_PKEY *pkey;
- int sslret;
- KMF_ENCODE_FORMAT crl_format;
- unsigned char *p;
- long len;
-
- if (params->crl_name == NULL || params->tacert == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = KMF_GetFileFormat(params->crl_name, &crl_format);
- if (ret != KMF_OK)
- return (ret);
-
- bcrl = BIO_new_file(params->crl_name, "rb");
- if (bcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto cleanup;
- }
-
- if (crl_format == KMF_FORMAT_ASN1) {
- xcrl = d2i_X509_CRL_bio(bcrl, NULL);
- } else if (crl_format == KMF_FORMAT_PEM) {
- xcrl = PEM_read_bio_X509_CRL(bcrl, NULL, NULL, NULL);
- } else {
- ret = KMF_ERR_BAD_PARAMETER;
- goto cleanup;
- }
-
- if (xcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CRLFILE;
- goto cleanup;
- }
-
- p = params->tacert->Data;
- len = params->tacert->Length;
- xcert = d2i_X509(NULL, (const uchar_t **)&p, len);
-
- if (xcert == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CERTFILE;
- goto cleanup;
- }
-
- /* Get issuer certificate public key */
- pkey = X509_get_pubkey(xcert);
- if (!pkey) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CERT_FORMAT;
- goto cleanup;
- }
-
- /* Verify CRL signature */
- sslret = X509_CRL_verify(xcrl, pkey);
- EVP_PKEY_free(pkey);
- if (sslret > 0) {
- ret = KMF_OK;
- } else {
- SET_ERROR(kmfh, sslret);
- ret = KMF_ERR_BAD_CRLFILE;
- }
-
-cleanup:
- if (bcrl != NULL)
- (void) BIO_free(bcrl);
-
- if (xcrl != NULL)
- X509_CRL_free(xcrl);
-
- if (xcert != NULL)
- X509_free(xcert);
-
- return (ret);
-
-}
-
-KMF_RETURN
-OpenSSL_CheckCRLDate(KMF_HANDLE_T handle,
- KMF_CHECKCRLDATE_PARAMS *params)
-{
-
- KMF_RETURN ret = KMF_OK;
- KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
- KMF_ENCODE_FORMAT crl_format;
- BIO *bcrl = NULL;
- X509_CRL *xcrl = NULL;
- int i;
-
- if (params == NULL || params->crl_name == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
- ret = KMF_IsCRLFile(handle, params->crl_name, &crl_format);
- if (ret != KMF_OK)
- return (ret);
-
- bcrl = BIO_new_file(params->crl_name, "rb");
- if (bcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_OPEN_FILE;
- goto cleanup;
- }
-
- if (crl_format == KMF_FORMAT_ASN1) {
- xcrl = d2i_X509_CRL_bio(bcrl, NULL);
- } else if (crl_format == KMF_FORMAT_PEM) {
- xcrl = PEM_read_bio_X509_CRL(bcrl, NULL, NULL, NULL);
- }
-
- if (xcrl == NULL) {
- SET_ERROR(kmfh, ERR_get_error());
- ret = KMF_ERR_BAD_CRLFILE;
- goto cleanup;
- }
-
- i = X509_cmp_time(X509_CRL_get_lastUpdate(xcrl), NULL);
- if (i >= 0) {
- ret = KMF_ERR_VALIDITY_PERIOD;
- goto cleanup;
- }
-
- if (X509_CRL_get_nextUpdate(xcrl)) {
- i = X509_cmp_time(X509_CRL_get_nextUpdate(xcrl), NULL);
-
- if (i <= 0) {
- ret = KMF_ERR_VALIDITY_PERIOD;
- goto cleanup;
- }
- }
-
- ret = KMF_OK;
-
-cleanup:
- if (bcrl != NULL)
- (void) BIO_free(bcrl);
-
- if (xcrl != NULL)
- X509_CRL_free(xcrl);
-
- return (ret);
-}
-
/*
* Check a file to see if it is a CRL file with PEM or DER format.
* If success, return its format in the "pformat" argument.
@@ -4669,7 +4247,7 @@ OpenSSL_IsCertFile(KMF_HANDLE_T handle, char *filename,
return (KMF_ERR_BAD_PARAMETER);
}
- ret = KMF_GetFileFormat(filename, pformat);
+ ret = kmf_get_file_format(filename, pformat);
if (ret != KMF_OK)
return (ret);
@@ -4733,7 +4311,7 @@ OpenSSL_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
(void) memcpy(rkey->keydata.val, rawkey->keydata.val,
rkey->keydata.len);
} else {
- rv = KMF_ReadInputFile(handle, symkey->keylabel, &keyvalue);
+ rv = kmf_read_input_file(handle, symkey->keylabel, &keyvalue);
if (rv != KMF_OK)
return (rv);
rkey->keydata.len = keyvalue.Length;
@@ -4815,7 +4393,7 @@ OpenSSL_VerifyDataWithCert(KMF_HANDLE_T handle,
}
pkey = X509_get_pubkey(xcert);
- if (!pkey) {
+ if (pkey == NULL) {
SET_ERROR(kmfh, ERR_get_error());
ret = KMF_ERR_BAD_CERT_FORMAT;
goto cleanup;
@@ -4944,3 +4522,764 @@ cleanup:
return (ret);
}
+
+/*
+ * substitute for the unsafe access(2) function.
+ * If the file in question already exists, return 1.
+ * else 0. If an error occurs during testing (other
+ * than EEXIST), return -1.
+ */
+static int
+test_for_file(char *filename, mode_t mode)
+{
+ int fd;
+
+ /*
+ * Try to create the file with the EXCL flag.
+ * The call should fail if the file exists.
+ */
+ fd = open(filename, O_WRONLY|O_CREAT|O_EXCL, mode);
+ if (fd == -1 && errno == EEXIST)
+ return (1);
+ else if (fd == -1) /* some other error */
+ return (-1);
+
+ /* The file did NOT exist. Delete the testcase. */
+ (void) close(fd);
+ (void) unlink(filename);
+ return (0);
+}
+
+KMF_RETURN
+OpenSSL_StoreKey(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_KEY_HANDLE *pubkey = NULL, *prikey = NULL;
+ KMF_RAW_KEY_DATA *rawkey;
+ EVP_PKEY *pkey = NULL;
+ KMF_ENCODE_FORMAT format = KMF_FORMAT_PEM;
+ KMF_CREDENTIAL cred = {NULL, 0};
+ BIO *out = NULL;
+ int keys = 0;
+ char *fullpath = NULL;
+ char *keyfile = NULL;
+ char *dirpath = NULL;
+
+ pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attrlist, numattr);
+ if (pubkey != NULL)
+ keys++;
+
+ prikey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attrlist, numattr);
+ if (prikey != NULL)
+ keys++;
+
+ rawkey = kmf_get_attr_ptr(KMF_RAW_KEY_ATTR, attrlist, numattr);
+ if (rawkey != NULL)
+ keys++;
+
+ /*
+ * Exactly 1 type of key must be passed to this function.
+ */
+ if (keys != 1)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ keyfile = (char *)kmf_get_attr_ptr(KMF_KEY_FILENAME_ATTR, attrlist,
+ numattr);
+ if (keyfile == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+
+ fullpath = get_fullpath(dirpath, keyfile);
+
+ /* Once we have the full path, we don't need the pieces */
+ if (fullpath == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* If the requested file exists, return an error */
+ if (test_for_file(fullpath, 0400) == 1) {
+ free(fullpath);
+ return (KMF_ERR_DUPLICATE_KEYFILE);
+ }
+
+ rv = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
+ &format, NULL);
+ if (rv != KMF_OK)
+ /* format is optional. */
+ rv = KMF_OK;
+
+ /* CRED is not required for OpenSSL files */
+ (void) kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ &cred, NULL);
+
+ /* Store the private key to the keyfile */
+ out = BIO_new_file(fullpath, "wb");
+ if (out == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ rv = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (prikey != NULL && prikey->keyp != NULL) {
+ if (prikey->keyalg == KMF_RSA ||
+ prikey->keyalg == KMF_DSA) {
+ pkey = (EVP_PKEY *)prikey->keyp;
+
+ rv = ssl_write_key(kmfh, format,
+ out, &cred, pkey, TRUE);
+
+ if (rv == KMF_OK && prikey->keylabel == NULL) {
+ prikey->keylabel = strdup(fullpath);
+ if (prikey->keylabel == NULL)
+ rv = KMF_ERR_MEMORY;
+ }
+ }
+ } else if (pubkey != NULL && pubkey->keyp != NULL) {
+ if (pubkey->keyalg == KMF_RSA ||
+ pubkey->keyalg == KMF_DSA) {
+ pkey = (EVP_PKEY *)pubkey->keyp;
+
+ rv = ssl_write_key(kmfh, format,
+ out, &cred, pkey, FALSE);
+
+ if (rv == KMF_OK && pubkey->keylabel == NULL) {
+ pubkey->keylabel = strdup(fullpath);
+ if (pubkey->keylabel == NULL)
+ rv = KMF_ERR_MEMORY;
+ }
+ }
+ } else if (rawkey != NULL) {
+ /* RAW keys are always private */
+ if (rawkey->keytype == KMF_RSA) {
+ pkey = ImportRawRSAKey(&rawkey->rawdata.rsa);
+ } else if (rawkey->keytype == KMF_DSA) {
+ pkey = ImportRawDSAKey(&rawkey->rawdata.dsa);
+ } else {
+ rv = KMF_ERR_BAD_PARAMETER;
+ }
+ rv = ssl_write_key(kmfh, format, out, &cred, pkey, TRUE);
+ }
+
+end:
+
+ if (out)
+ (void) BIO_free(out);
+
+ if (rv == KMF_OK)
+ (void) chmod(fullpath, 0400);
+
+ free(fullpath);
+ return (rv);
+}
+
+KMF_RETURN
+OpenSSL_ImportCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ X509_CRL *xcrl = NULL;
+ X509 *xcert = NULL;
+ EVP_PKEY *pkey;
+ KMF_ENCODE_FORMAT format;
+ BIO *in = NULL, *out = NULL;
+ int openssl_ret = 0;
+ KMF_ENCODE_FORMAT outformat;
+ boolean_t crlcheck = FALSE;
+ char *certfile, *dirpath, *crlfile, *incrl, *outcrl, *outcrlfile;
+
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ /* CRL check is optional */
+ (void) kmf_get_attr(KMF_CRL_CHECK_ATTR, attrlist, numattr,
+ &crlcheck, NULL);
+
+ certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
+ if (crlcheck == B_TRUE && certfile == NULL) {
+ return (KMF_ERR_BAD_CERTFILE);
+ }
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+ incrl = kmf_get_attr_ptr(KMF_CRL_FILENAME_ATTR, attrlist, numattr);
+ outcrl = kmf_get_attr_ptr(KMF_CRL_OUTFILE_ATTR, attrlist, numattr);
+
+ crlfile = get_fullpath(dirpath, incrl);
+
+ if (crlfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ outcrlfile = get_fullpath(dirpath, outcrl);
+ if (outcrlfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ if (isdir(outcrlfile)) {
+ free(outcrlfile);
+ return (KMF_ERR_BAD_CRLFILE);
+ }
+
+ ret = kmf_is_crl_file(handle, crlfile, &format);
+ if (ret != KMF_OK) {
+ free(outcrlfile);
+ return (ret);
+ }
+
+ in = BIO_new_file(crlfile, "rb");
+ if (in == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (format == KMF_FORMAT_ASN1) {
+ xcrl = d2i_X509_CRL_bio(in, NULL);
+ } else if (format == KMF_FORMAT_PEM) {
+ xcrl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
+ }
+
+ if (xcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto end;
+ }
+
+ /* If bypasscheck is specified, no need to verify. */
+ if (crlcheck == B_FALSE)
+ goto output;
+
+ ret = kmf_is_cert_file(handle, certfile, &format);
+ if (ret != KMF_OK)
+ goto end;
+
+ /* Read in the CA cert file and convert to X509 */
+ if (BIO_read_filename(in, certfile) <= 0) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (format == KMF_FORMAT_ASN1) {
+ xcert = d2i_X509_bio(in, NULL);
+ } else if (format == KMF_FORMAT_PEM) {
+ xcert = PEM_read_bio_X509(in, NULL, NULL, NULL);
+ } else {
+ ret = KMF_ERR_BAD_CERT_FORMAT;
+ goto end;
+ }
+
+ if (xcert == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CERT_FORMAT;
+ goto end;
+ }
+ /* Now get the public key from the CA cert */
+ pkey = X509_get_pubkey(xcert);
+ if (pkey == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CERTFILE;
+ goto end;
+ }
+
+ /* Verify the CRL with the CA's public key */
+ openssl_ret = X509_CRL_verify(xcrl, pkey);
+ EVP_PKEY_free(pkey);
+ if (openssl_ret > 0) {
+ ret = KMF_OK; /* verify succeed */
+ } else {
+ SET_ERROR(kmfh, openssl_ret);
+ ret = KMF_ERR_BAD_CRLFILE;
+ }
+
+output:
+ ret = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
+ &outformat, NULL);
+ if (ret != KMF_OK) {
+ ret = KMF_OK;
+ outformat = KMF_FORMAT_PEM;
+ }
+
+ out = BIO_new_file(outcrlfile, "wb");
+ if (out == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (outformat == KMF_FORMAT_ASN1) {
+ openssl_ret = (int)i2d_X509_CRL_bio(out, xcrl);
+ } else if (outformat == KMF_FORMAT_PEM) {
+ openssl_ret = PEM_write_bio_X509_CRL(out, xcrl);
+ } else {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto end;
+ }
+
+ if (openssl_ret <= 0) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_WRITE_FILE;
+ } else {
+ ret = KMF_OK;
+ }
+
+end:
+ if (xcrl != NULL)
+ X509_CRL_free(xcrl);
+
+ if (xcert != NULL)
+ X509_free(xcert);
+
+ if (in != NULL)
+ (void) BIO_free(in);
+
+ if (out != NULL)
+ (void) BIO_free(out);
+
+ if (outcrlfile != NULL)
+ free(outcrlfile);
+
+ return (ret);
+}
+
+KMF_RETURN
+OpenSSL_ListCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ X509_CRL *x = NULL;
+ KMF_ENCODE_FORMAT format;
+ char *crlfile = NULL;
+ BIO *in = NULL;
+ BIO *mem = NULL;
+ long len;
+ char *memptr;
+ char *data = NULL;
+ char **crldata;
+ char *crlfilename, *dirpath;
+
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+ crlfilename = kmf_get_attr_ptr(KMF_CRL_FILENAME_ATTR,
+ attrlist, numattr);
+ if (crlfilename == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ crldata = (char **)kmf_get_attr_ptr(KMF_CRL_DATA_ATTR,
+ attrlist, numattr);
+
+ if (crldata == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+
+ crlfile = get_fullpath(dirpath, crlfilename);
+
+ if (crlfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ if (isdir(crlfile)) {
+ free(crlfile);
+ return (KMF_ERR_BAD_CRLFILE);
+ }
+
+ ret = kmf_is_crl_file(handle, crlfile, &format);
+ if (ret != KMF_OK) {
+ free(crlfile);
+ return (ret);
+ }
+
+ if (bio_err == NULL)
+ bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
+
+ in = BIO_new_file(crlfile, "rb");
+ if (in == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (format == KMF_FORMAT_ASN1) {
+ x = d2i_X509_CRL_bio(in, NULL);
+ } else if (format == KMF_FORMAT_PEM) {
+ x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
+ }
+
+ if (x == NULL) { /* should not happen */
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ mem = BIO_new(BIO_s_mem());
+ if (mem == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_MEMORY;
+ goto end;
+ }
+
+ (void) X509_CRL_print(mem, x);
+ len = BIO_get_mem_data(mem, &memptr);
+ if (len <= 0) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_MEMORY;
+ goto end;
+ }
+
+ data = malloc(len + 1);
+ if (data == NULL) {
+ ret = KMF_ERR_MEMORY;
+ goto end;
+ }
+
+ (void) memcpy(data, memptr, len);
+ data[len] = '\0';
+ *crldata = data;
+
+end:
+ if (x != NULL)
+ X509_CRL_free(x);
+
+ if (crlfile != NULL)
+ free(crlfile);
+
+ if (in != NULL)
+ (void) BIO_free(in);
+
+ if (mem != NULL)
+ (void) BIO_free(mem);
+
+ return (ret);
+}
+
+KMF_RETURN
+OpenSSL_DeleteCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_ENCODE_FORMAT format;
+ char *crlfile = NULL;
+ BIO *in = NULL;
+ char *crlfilename, *dirpath;
+
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ crlfilename = kmf_get_attr_ptr(KMF_CRL_FILENAME_ATTR,
+ attrlist, numattr);
+
+ if (crlfilename == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+
+ crlfile = get_fullpath(dirpath, crlfilename);
+
+ if (crlfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ if (isdir(crlfile)) {
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto end;
+ }
+
+ ret = kmf_is_crl_file(handle, crlfile, &format);
+ if (ret != KMF_OK)
+ goto end;
+
+ if (unlink(crlfile) != 0) {
+ SET_SYS_ERROR(kmfh, errno);
+ ret = KMF_ERR_INTERNAL;
+ goto end;
+ }
+
+end:
+ if (in != NULL)
+ (void) BIO_free(in);
+ if (crlfile != NULL)
+ free(crlfile);
+
+ return (ret);
+}
+
+KMF_RETURN
+OpenSSL_FindCertInCRL(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_ENCODE_FORMAT format;
+ BIO *in = NULL;
+ X509 *xcert = NULL;
+ X509_CRL *xcrl = NULL;
+ STACK_OF(X509_REVOKED) *revoke_stack = NULL;
+ X509_REVOKED *revoke;
+ int i;
+ char *crlfilename, *crlfile, *dirpath, *certfile;
+
+ if (numattr == 0 || attrlist == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ crlfilename = kmf_get_attr_ptr(KMF_CRL_FILENAME_ATTR,
+ attrlist, numattr);
+
+ if (crlfilename == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
+ if (certfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ dirpath = kmf_get_attr_ptr(KMF_DIRPATH_ATTR, attrlist, numattr);
+
+ crlfile = get_fullpath(dirpath, crlfilename);
+
+ if (crlfile == NULL)
+ return (KMF_ERR_BAD_CRLFILE);
+
+ if (isdir(crlfile)) {
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto end;
+ }
+
+ ret = kmf_is_crl_file(handle, crlfile, &format);
+ if (ret != KMF_OK)
+ goto end;
+
+ /* Read the CRL file and load it into a X509_CRL structure */
+ in = BIO_new_file(crlfilename, "rb");
+ if (in == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (format == KMF_FORMAT_ASN1) {
+ xcrl = d2i_X509_CRL_bio(in, NULL);
+ } else if (format == KMF_FORMAT_PEM) {
+ xcrl = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
+ }
+
+ if (xcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto end;
+ }
+ (void) BIO_free(in);
+
+ /* Read the Certificate file and load it into a X509 structure */
+ ret = kmf_is_cert_file(handle, certfile, &format);
+ if (ret != KMF_OK)
+ goto end;
+
+ in = BIO_new_file(certfile, "rb");
+ if (in == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto end;
+ }
+
+ if (format == KMF_FORMAT_ASN1) {
+ xcert = d2i_X509_bio(in, NULL);
+ } else if (format == KMF_FORMAT_PEM) {
+ xcert = PEM_read_bio_X509(in, NULL, NULL, NULL);
+ }
+
+ if (xcert == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CERTFILE;
+ goto end;
+ }
+
+ /* Check if the certificate and the CRL have same issuer */
+ if (X509_NAME_cmp(xcert->cert_info->issuer, xcrl->crl->issuer) != 0) {
+ ret = KMF_ERR_ISSUER;
+ goto end;
+ }
+
+ /* Check to see if the certificate serial number is revoked */
+ revoke_stack = X509_CRL_get_REVOKED(xcrl);
+ if (sk_X509_REVOKED_num(revoke_stack) <= 0) {
+ /* No revoked certificates in the CRL file */
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_EMPTY_CRL;
+ goto end;
+ }
+
+ for (i = 0; i < sk_X509_REVOKED_num(revoke_stack); i++) {
+ /*LINTED*/
+ revoke = sk_X509_REVOKED_value(revoke_stack, i);
+ if (ASN1_INTEGER_cmp(xcert->cert_info->serialNumber,
+ revoke->serialNumber) == 0) {
+ break;
+ }
+ }
+
+ if (i < sk_X509_REVOKED_num(revoke_stack)) {
+ ret = KMF_OK;
+ } else {
+ ret = KMF_ERR_NOT_REVOKED;
+ }
+
+end:
+ if (in != NULL)
+ (void) BIO_free(in);
+ if (xcrl != NULL)
+ X509_CRL_free(xcrl);
+ if (xcert != NULL)
+ X509_free(xcert);
+
+ return (ret);
+}
+
+KMF_RETURN
+OpenSSL_VerifyCRLFile(KMF_HANDLE_T handle, char *crlname, KMF_DATA *tacert)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ BIO *bcrl = NULL;
+ X509_CRL *xcrl = NULL;
+ X509 *xcert = NULL;
+ EVP_PKEY *pkey;
+ int sslret;
+ KMF_ENCODE_FORMAT crl_format;
+ unsigned char *p;
+ long len;
+
+ if (handle == NULL || crlname == NULL || tacert == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = kmf_get_file_format(crlname, &crl_format);
+ if (ret != KMF_OK)
+ return (ret);
+
+ bcrl = BIO_new_file(crlname, "rb");
+ if (bcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto cleanup;
+ }
+
+ if (crl_format == KMF_FORMAT_ASN1) {
+ xcrl = d2i_X509_CRL_bio(bcrl, NULL);
+ } else if (crl_format == KMF_FORMAT_PEM) {
+ xcrl = PEM_read_bio_X509_CRL(bcrl, NULL, NULL, NULL);
+ } else {
+ ret = KMF_ERR_BAD_PARAMETER;
+ goto cleanup;
+ }
+
+ if (xcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto cleanup;
+ }
+
+ p = tacert->Data;
+ len = tacert->Length;
+ xcert = d2i_X509(NULL, (const uchar_t **)&p, len);
+
+ if (xcert == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CERTFILE;
+ goto cleanup;
+ }
+
+ /* Get issuer certificate public key */
+ pkey = X509_get_pubkey(xcert);
+ if (pkey == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CERT_FORMAT;
+ goto cleanup;
+ }
+
+ /* Verify CRL signature */
+ sslret = X509_CRL_verify(xcrl, pkey);
+ EVP_PKEY_free(pkey);
+ if (sslret > 0) {
+ ret = KMF_OK;
+ } else {
+ SET_ERROR(kmfh, sslret);
+ ret = KMF_ERR_BAD_CRLFILE;
+ }
+
+cleanup:
+ if (bcrl != NULL)
+ (void) BIO_free(bcrl);
+
+ if (xcrl != NULL)
+ X509_CRL_free(xcrl);
+
+ if (xcert != NULL)
+ X509_free(xcert);
+
+ return (ret);
+
+}
+
+KMF_RETURN
+OpenSSL_CheckCRLDate(KMF_HANDLE_T handle, char *crlname)
+{
+ KMF_RETURN ret = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_ENCODE_FORMAT crl_format;
+ BIO *bcrl = NULL;
+ X509_CRL *xcrl = NULL;
+ int i;
+
+ if (handle == NULL || crlname == NULL) {
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ ret = kmf_is_crl_file(handle, crlname, &crl_format);
+ if (ret != KMF_OK)
+ return (ret);
+
+ bcrl = BIO_new_file(crlname, "rb");
+ if (bcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_OPEN_FILE;
+ goto cleanup;
+ }
+
+ if (crl_format == KMF_FORMAT_ASN1) {
+ xcrl = d2i_X509_CRL_bio(bcrl, NULL);
+ } else if (crl_format == KMF_FORMAT_PEM) {
+ xcrl = PEM_read_bio_X509_CRL(bcrl, NULL, NULL, NULL);
+ }
+
+ if (xcrl == NULL) {
+ SET_ERROR(kmfh, ERR_get_error());
+ ret = KMF_ERR_BAD_CRLFILE;
+ goto cleanup;
+ }
+
+ i = X509_cmp_time(X509_CRL_get_lastUpdate(xcrl), NULL);
+ if (i >= 0) {
+ ret = KMF_ERR_VALIDITY_PERIOD;
+ goto cleanup;
+ }
+
+ if (X509_CRL_get_nextUpdate(xcrl)) {
+ i = X509_cmp_time(X509_CRL_get_nextUpdate(xcrl), NULL);
+
+ if (i <= 0) {
+ ret = KMF_ERR_VALIDITY_PERIOD;
+ goto cleanup;
+ }
+ }
+
+ ret = KMF_OK;
+
+cleanup:
+ if (bcrl != NULL)
+ (void) BIO_free(bcrl);
+
+ if (xcrl != NULL)
+ X509_CRL_free(xcrl);
+
+ return (ret);
+}
diff --git a/usr/src/lib/libkmf/plugins/kmf_pkcs11/Makefile.com b/usr/src/lib/libkmf/plugins/kmf_pkcs11/Makefile.com
index fd46f0e5f8..2651b5d4de 100644
--- a/usr/src/lib/libkmf/plugins/kmf_pkcs11/Makefile.com
+++ b/usr/src/lib/libkmf/plugins/kmf_pkcs11/Makefile.com
@@ -29,7 +29,10 @@
LIBRARY= kmf_pkcs11.a
VERS= .1
-OBJECTS= pkcs11_spi.o
+
+PKCS11_COBJECTS = pkcs11_spi.o
+BIGNUM_COBJECTS = bignumimpl.o
+OBJECTS = $(PKCS11_COBJECTS) $(BIGNUM_COBJECTS)
include $(SRC)/lib/Makefile.lib
@@ -38,11 +41,18 @@ KMFINC= -I../../../include -I../../../ber_der/inc
PKCS11LIBS= -lkmf -lkmfberder -lmd -lpkcs11 -lcryptoutil -lc
+BIGNUMDIR= $(SRC)/common/bignum
+
SRCDIR= ../common
INCDIR= ../../include
+SRCS = \
+ $(PKCS11_COBJECTS:%.o=$(SRCDIR)/%.c) \
+ $(BIGNUM_COBJECTS:%.o=$(BIGNUMDIR)/%.c)
+
+
CFLAGS += $(CCVERBOSE)
-CPPFLAGS += -D_REENTRANT $(KMFINC) -I$(INCDIR) -I/usr/include/libxml2
+CPPFLAGS += -D_REENTRANT $(KMFINC) -I$(INCDIR) -I/usr/include/libxml2 -I$(BIGNUMDIR)
PICS= $(OBJECTS:%=pics/%)
SONAME= $(PLUGIN)
@@ -62,4 +72,8 @@ lint: lintcheck
FRC:
+pics/%.o: $(BIGNUMDIR)/%.c
+ $(COMPILE.c) -o $@ $(BIGNUM_CFG) $<
+ $(POST_PROCESS_O)
+
include $(SRC)/lib/Makefile.targ
diff --git a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/mapfile-vers b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/mapfile-vers
index ee3b6bcb92..0e120d0b9b 100644
--- a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/mapfile-vers
+++ b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/mapfile-vers
@@ -19,7 +19,7 @@
# CDDL HEADER END
#
#
-# Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
# Use is subject to license terms.
#
# ident "%Z%%M% %I% %E% SMI"
@@ -28,23 +28,24 @@
SUNWprivate_1.1 {
global:
KMF_Plugin_Initialize;
- KMFPK11_FindCert;
- KMFPK11_FreeKMFCert;
- KMFPK11_StoreCert;
- KMFPK11_ImportCert;
- KMFPK11_DeleteCert;
- KMFPK11_CreateKeypair;
- KMFPK11_FindKey;
- KMFPK11_EncodePubKeyData;
- KMFPK11_SignData;
- KMFPK11_DeleteKey;
- KMFPK11_GetErrorString;
- KMFPK11_GetPrikeyByCert;
- KMFPK11_DecryptData;
- KMFPK11_StorePrivateKey;
- KMFPK11_CreateSymKey;
- KMFPK11_GetSymKeyValue;
- KMFPK11_SetTokenPin;
+ KMFPK11_CreateKeypair;
+ KMFPK11_CreateSymKey;
+ KMFPK11_DecryptData;
+ KMFPK11_DeleteCert;
+ KMFPK11_DeleteKey;
+ KMFPK11_EncodePubKeyData;
+ KMFPK11_ExportPK12;
+ KMFPK11_FindCert;
+ KMFPK11_FindKey;
+ KMFPK11_FindPrikeyByCert;
+ KMFPK11_FreeKMFCert;
+ KMFPK11_GetErrorString;
+ KMFPK11_GetSymKeyValue;
+ KMFPK11_ImportCert;
+ KMFPK11_SetTokenPin;
+ KMFPK11_SignData;
+ KMFPK11_StoreCert;
+ KMFPK11_StoreKey;
local:
*;
};
diff --git a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
index f000c5eadd..3d7cfae6d2 100644
--- a/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
+++ b/usr/src/lib/libkmf/plugins/kmf_pkcs11/common/pkcs11_spi.c
@@ -36,6 +36,7 @@
#include <algorithm.h>
#include <fcntl.h>
#include <sha1.h>
+#include <bignum.h>
#include <cryptoutil.h>
#include <security/cryptoki.h>
@@ -67,38 +68,36 @@ static KMF_RETURN
keyObj2RawKey(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_KEY_DATA **);
static KMF_RETURN
-create_generic_secret_key(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *,
- CK_OBJECT_HANDLE *);
+create_generic_secret_key(KMF_HANDLE_T,
+ int, KMF_ATTRIBUTE *, CK_OBJECT_HANDLE *);
KMF_RETURN
-KMFPK11_ConfigureKeystore(KMF_HANDLE_T, KMF_CONFIG_PARAMS *);
+KMFPK11_ConfigureKeystore(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_FindCert(KMF_HANDLE_T,
- KMF_FINDCERT_PARAMS *,
- KMF_X509_DER_CERT *,
- uint32_t *);
+KMFPK11_FindCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
void
KMFPK11_FreeKMFCert(KMF_HANDLE_T,
KMF_X509_DER_CERT *kmf_cert);
KMF_RETURN
-KMFPK11_StoreCert(KMF_HANDLE_T, KMF_STORECERT_PARAMS *, KMF_DATA *);
+KMFPK11_StoreCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_ImportCert(KMF_HANDLE_T, KMF_IMPORTCERT_PARAMS *);
+KMFPK11_ImportCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_DeleteCert(KMF_HANDLE_T, KMF_DELETECERT_PARAMS *);
+KMFPK11_DeleteCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_CreateKeypair(KMF_HANDLE_T, KMF_CREATEKEYPAIR_PARAMS *,
- KMF_KEY_HANDLE *, KMF_KEY_HANDLE *);
+KMFPK11_CreateKeypair(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_DeleteKey(KMF_HANDLE_T, KMF_DELETEKEY_PARAMS *,
- KMF_KEY_HANDLE *, boolean_t);
+KMFPK11_StoreKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+
+KMF_RETURN
+KMFPK11_DeleteKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
KMFPK11_EncodePubKeyData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_DATA *);
@@ -111,35 +110,32 @@ KMF_RETURN
KMFPK11_GetErrorString(KMF_HANDLE_T, char **);
KMF_RETURN
-KMFPK11_GetPrikeyByCert(KMF_HANDLE_T, KMF_CRYPTOWITHCERT_PARAMS *, KMF_DATA *,
- KMF_KEY_HANDLE *, KMF_KEY_ALG);
+KMFPK11_FindPrikeyByCert(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
KMFPK11_DecryptData(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_OID *,
KMF_DATA *, KMF_DATA *);
KMF_RETURN
-KMFPK11_FindKey(KMF_HANDLE_T, KMF_FINDKEY_PARAMS *,
- KMF_KEY_HANDLE *, uint32_t *);
+KMFPK11_FindKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
-KMFPK11_StorePrivateKey(KMF_HANDLE_T, KMF_STOREKEY_PARAMS *,
- KMF_RAW_KEY_DATA *);
-
-KMF_RETURN
-KMFPK11_CreateSymKey(KMF_HANDLE_T, KMF_CREATESYMKEY_PARAMS *,
- KMF_KEY_HANDLE *);
+KMFPK11_CreateSymKey(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
KMFPK11_GetSymKeyValue(KMF_HANDLE_T, KMF_KEY_HANDLE *, KMF_RAW_SYM_KEY *);
KMF_RETURN
-KMFPK11_SetTokenPin(KMF_HANDLE_T, KMF_SETPIN_PARAMS *, KMF_CREDENTIAL *);
+KMFPK11_SetTokenPin(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
KMF_RETURN
KMFPK11_VerifyDataWithCert(KMF_HANDLE_T, KMF_ALGORITHM_INDEX, KMF_DATA *,
KMF_DATA *, KMF_DATA *);
+KMF_RETURN
+KMFPK11_ExportPK12(KMF_HANDLE_T, int, KMF_ATTRIBUTE *);
+
+
static
KMF_PLUGIN_FUNCLIST pk11token_plugin_table =
{
@@ -161,14 +157,14 @@ KMF_PLUGIN_FUNCLIST pk11token_plugin_table =
NULL, /* FindCRL */
NULL, /* FindCertInCRL */
KMFPK11_GetErrorString,
- KMFPK11_GetPrikeyByCert,
+ KMFPK11_FindPrikeyByCert,
KMFPK11_DecryptData,
- NULL, /* ExportP12 */
- KMFPK11_StorePrivateKey,
+ KMFPK11_ExportPK12,
KMFPK11_CreateSymKey,
KMFPK11_GetSymKeyValue,
KMFPK11_SetTokenPin,
KMFPK11_VerifyDataWithCert,
+ KMFPK11_StoreKey,
NULL /* Finalize */
};
@@ -179,15 +175,23 @@ KMF_Plugin_Initialize()
}
KMF_RETURN
-KMFPK11_ConfigureKeystore(KMF_HANDLE_T handle, KMF_CONFIG_PARAMS *params)
+KMFPK11_ConfigureKeystore(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
+ char *label;
+ boolean_t readonly = B_TRUE;
- if (params == NULL || params->pkcs11config.label == NULL)
+ label = kmf_get_attr_ptr(KMF_TOKEN_LABEL_ATTR, attrlist, numattr);
+ if (label == NULL) {
return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ /* "readonly" is optional. Default is TRUE */
+ (void) kmf_get_attr(KMF_READONLY_ATTR, attrlist, numattr,
+ (void *)&readonly, NULL);
- rv = KMF_SelectToken(handle, params->pkcs11config.label,
- params->pkcs11config.readonly);
+ rv = kmf_select_token(handle, label, readonly);
return (rv);
}
@@ -207,8 +211,8 @@ pk11_authenticate(KMF_HANDLE_T handle,
return (KMF_ERR_BAD_PARAMETER);
}
- if ((ck_rv = C_Login(hSession, CKU_USER,
- (uchar_t *)cred->cred, cred->credlen)) != CKR_OK) {
+ if ((ck_rv = C_Login(hSession, CKU_USER, (uchar_t *)cred->cred,
+ cred->credlen)) != CKR_OK) {
if (ck_rv != CKR_USER_ALREADY_LOGGED_IN) {
handle->lasterr.kstype = KMF_KEYSTORE_PK11TOKEN;
handle->lasterr.errcode = ck_rv;
@@ -306,7 +310,7 @@ PK11Cert2KMFCert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE hObj,
/* re-query the object with room for the value attr */
ckrv = C_GetAttributeValue(kmfh->pk11handle, hObj,
- templ, i);
+ templ, i);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
@@ -318,7 +322,7 @@ PK11Cert2KMFCert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE hObj,
kmfcert->certificate.Length = value_len;
kmfcert->kmf_private.flags |= KMF_FLAG_CERT_SIGNED;
kmfcert->kmf_private.keystore_type =
- KMF_KEYSTORE_PK11TOKEN;
+ KMF_KEYSTORE_PK11TOKEN;
ckrv = getObjectLabel(kmfh, hObj, &label);
if (ckrv == CKR_OK && label != NULL) {
@@ -417,8 +421,8 @@ matchcert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj,
name.Length = certattr.ulValueLen;
rv = DerDecodeName(&name, &dn);
if (rv == KMF_OK) {
- rv = KMF_CompareRDNs(issuer, &dn);
- KMF_FreeDN(&dn);
+ rv = kmf_compare_rdns(issuer, &dn);
+ kmf_free_dn(&dn);
}
free(certattr.pValue);
}
@@ -438,8 +442,8 @@ matchcert(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj,
name.Length = certattr.ulValueLen;
rv = DerDecodeName(&name, &dn);
if (rv == KMF_OK) {
- rv = KMF_CompareRDNs(subject, &dn);
- KMF_FreeDN(&dn);
+ rv = kmf_compare_rdns(subject, &dn);
+ kmf_free_dn(&dn);
}
free(certattr.pValue);
}
@@ -470,7 +474,7 @@ pk11_delete_obj_from_list(OBJLIST **newlist,
}
/*
- * prepare_object_search
+ * search_certs
*
* Because this code is shared by the FindCert and
* DeleteCert functions, put it in a separate routine
@@ -502,8 +506,7 @@ search_certs(KMF_HANDLE_T handle,
i = 0;
SETATTR(templ, i, CKA_TOKEN, &true, sizeof (true)); i++;
SETATTR(templ, i, CKA_CLASS, &oclass, sizeof (oclass)); i++;
- SETATTR(templ, i, CKA_CERTIFICATE_TYPE, &ctype,
- sizeof (ctype)); i++;
+ SETATTR(templ, i, CKA_CERTIFICATE_TYPE, &ctype, sizeof (ctype)); i++;
if (label != NULL && strlen(label)) {
SETATTR(templ, i, CKA_LABEL, label, strlen(label));
@@ -514,17 +517,16 @@ search_certs(KMF_HANDLE_T handle,
}
if (issuer != NULL && strlen(issuer)) {
- if ((rv = KMF_DNParser(issuer, &issuerDN)) != KMF_OK)
+ if ((rv = kmf_dn_parser(issuer, &issuerDN)) != KMF_OK)
return (rv);
}
if (subject != NULL && strlen(subject)) {
- if ((rv = KMF_DNParser(subject, &subjectDN)) != KMF_OK)
+ if ((rv = kmf_dn_parser(subject, &subjectDN)) != KMF_OK)
return (rv);
}
if (serial != NULL && serial->val != NULL && serial->len > 0) {
- SETATTR(templ, i, CKA_SERIAL_NUMBER,
- serial->val, serial->len);
+ SETATTR(templ, i, CKA_SERIAL_NUMBER, serial->val, serial->len);
i++;
}
@@ -606,7 +608,7 @@ cleanup:
goto cleanup1;
}
- rv = KMF_CheckCertDate(handle,
+ rv = kmf_check_cert_date(handle,
&tmp_kmf_cert.certificate);
if (validity == KMF_NONEXPIRED_CERTS) {
@@ -643,7 +645,7 @@ cleanup:
}
}
i++;
- KMF_FreeKMFCert(handle, &tmp_kmf_cert);
+ kmf_free_kmf_cert(handle, &tmp_kmf_cert);
}
*numobj = num_ok_certs;
*objlist = newlist;
@@ -658,10 +660,10 @@ cleanup1:
}
if (issuer != NULL)
- KMF_FreeDN(&issuerDN);
+ kmf_free_dn(&issuerDN);
if (subject != NULL)
- KMF_FreeDN(&subjectDN);
+ kmf_free_dn(&subjectDN);
return (rv);
}
@@ -671,22 +673,29 @@ cleanup1:
* just return the number of certs found (in num_certs).
*/
KMF_RETURN
-KMFPK11_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
- KMF_X509_DER_CERT *kmf_cert,
- uint32_t *num_certs)
+KMFPK11_FindCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = 0;
uint32_t want_certs;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
OBJLIST *objlist = NULL;
+ uint32_t *num_certs;
+ KMF_X509_DER_CERT *kmf_cert = NULL;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
+ boolean_t private;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL || num_certs == NULL)
+ num_certs = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (num_certs == NULL)
return (KMF_ERR_BAD_PARAMETER);
if (*num_certs > 0)
@@ -696,19 +705,40 @@ KMFPK11_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
*num_certs = 0;
- rv = search_certs(handle,
- params->certLabel, params->issuer,
- params->subject, params->serial,
- params->pkcs11parms.private,
- params->find_cert_validity,
- &objlist, num_certs);
+ /* Get the optional returned certificate list */
+ kmf_cert = kmf_get_attr_ptr(KMF_X509_DER_CERT_ATTR, attrlist,
+ numattr);
+
+ /* Get optional search criteria attributes */
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
+ if (rv != KMF_OK) {
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
+ }
+
+ rv = kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
+ (void *)&private, NULL);
+ if (rv != KMF_OK) {
+ private = B_FALSE;
+ rv = KMF_OK;
+ }
+
+ /* Start searching */
+ rv = search_certs(handle, certlabel, issuer, subject, serial, private,
+ validity, &objlist, num_certs);
if (rv == KMF_OK && objlist != NULL && kmf_cert != NULL) {
OBJLIST *node = objlist;
int i = 0;
while (node != NULL && i < want_certs) {
rv = PK11Cert2KMFCert(kmfh, node->handle,
- &kmf_cert[i]);
+ &kmf_cert[i]);
i++;
node = node->next;
}
@@ -725,8 +755,7 @@ KMFPK11_FindCert(KMF_HANDLE_T handle, KMF_FINDCERT_PARAMS *params,
/*ARGSUSED*/
void
-KMFPK11_FreeKMFCert(KMF_HANDLE_T handle,
- KMF_X509_DER_CERT *kmf_cert)
+KMFPK11_FreeKMFCert(KMF_HANDLE_T handle, KMF_X509_DER_CERT *kmf_cert)
{
if (kmf_cert != NULL && kmf_cert->certificate.Data != NULL) {
free(kmf_cert->certificate.Data);
@@ -758,7 +787,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
CK_ATTRIBUTE rsaTemplate[4];
CK_ATTRIBUTE dsaTemplate[6];
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
@@ -778,7 +807,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
SETATTR(rsaTemplate, 1, CKA_KEY_TYPE, &ckKeyType, sizeof (ckKeyType));
SETATTR(rsaTemplate, 2, CKA_MODULUS, Modulus.Data, &Modulus.Length);
SETATTR(rsaTemplate, 3, CKA_PUBLIC_EXPONENT, Exponent.Data,
- &Exponent.Length);
+ &Exponent.Length);
SETATTR(dsaTemplate, 0, CKA_CLASS, &ckObjClass, sizeof (ckObjClass));
SETATTR(dsaTemplate, 1, CKA_KEY_TYPE, &ckKeyType, sizeof (ckKeyType));
@@ -791,8 +820,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
case KMF_RSA:
/* Get the length of the fields */
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pKey->keyp,
- rsaTemplate, 4);
+ (CK_OBJECT_HANDLE)pKey->keyp, rsaTemplate, 4);
if (rv != CKR_OK) {
SET_ERROR(kmfh, rv);
return (KMF_ERR_BAD_PARAMETER);
@@ -811,13 +839,12 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
}
SETATTR(rsaTemplate, 2, CKA_MODULUS, Modulus.Data,
- Modulus.Length);
+ Modulus.Length);
SETATTR(rsaTemplate, 3, CKA_PUBLIC_EXPONENT,
- Exponent.Data, Exponent.Length);
+ Exponent.Data, Exponent.Length);
/* Now get the values */
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pKey->keyp,
- rsaTemplate, 4);
+ (CK_OBJECT_HANDLE)pKey->keyp, rsaTemplate, 4);
if (rv != CKR_OK) {
SET_ERROR(kmfh, rv);
free(Modulus.Data);
@@ -829,7 +856,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
* This is the KEY algorithm, not the
* signature algorithm.
*/
- Algorithm = X509_AlgIdToAlgorithmOid(KMF_ALGID_RSA);
+ Algorithm = x509_algid_to_algoid(KMF_ALGID_RSA);
if (Algorithm != NULL) {
/* Encode the RSA Key Data */
@@ -838,9 +865,9 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
free(Exponent.Data);
return (KMF_ERR_MEMORY);
}
- if (kmfber_printf(asn1, "{II}",
- Modulus.Data, Modulus.Length,
- Exponent.Data, Exponent.Length) == -1) {
+ if (kmfber_printf(asn1, "{II}", Modulus.Data,
+ Modulus.Length, Exponent.Data,
+ Exponent.Length) == -1) {
kmfber_free(asn1, 1);
free(Modulus.Data);
free(Exponent.Data);
@@ -862,8 +889,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
case KMF_DSA:
/* Get the length of the fields */
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pKey->keyp,
- dsaTemplate, 6);
+ (CK_OBJECT_HANDLE)pKey->keyp, dsaTemplate, 6);
if (rv != CKR_OK) {
SET_ERROR(kmfh, rv);
return (KMF_ERR_BAD_PARAMETER);
@@ -898,18 +924,17 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
return (KMF_ERR_MEMORY);
}
SETATTR(dsaTemplate, 2, CKA_PRIME, Prime.Data,
- Prime.Length);
+ Prime.Length);
SETATTR(dsaTemplate, 3, CKA_SUBPRIME, Subprime.Data,
- Subprime.Length);
+ Subprime.Length);
SETATTR(dsaTemplate, 4, CKA_BASE, Base.Data,
- Base.Length);
+ Base.Length);
SETATTR(dsaTemplate, 5, CKA_VALUE, Value.Data,
- Value.Length);
+ Value.Length);
/* Now get the values */
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pKey->keyp,
- dsaTemplate, 6);
+ (CK_OBJECT_HANDLE)pKey->keyp, dsaTemplate, 6);
if (rv != CKR_OK) {
free(Prime.Data);
free(Subprime.Data);
@@ -922,8 +947,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
* This is the KEY algorithm, not the
* signature algorithm.
*/
- Algorithm =
- X509_AlgIdToAlgorithmOid(KMF_ALGID_DSA);
+ Algorithm = x509_algid_to_algoid(KMF_ALGID_DSA);
/* Encode the DSA Algorithm Parameters */
if ((asn1 = kmfder_alloc()) == NULL) {
@@ -934,10 +958,9 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
return (KMF_ERR_MEMORY);
}
- if (kmfber_printf(asn1, "{III}",
- Prime.Data, Prime.Length,
- Subprime.Data, Subprime.Length,
- Base.Data, Base.Length) == -1) {
+ if (kmfber_printf(asn1, "{III}", Prime.Data,
+ Prime.Length, Subprime.Data, Subprime.Length,
+ Base.Data, Base.Length) == -1) {
kmfber_free(asn1, 1);
free(Prime.Data);
@@ -966,7 +989,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
}
if (kmfber_printf(asn1, "I",
- Value.Data, Value.Length) == -1) {
+ Value.Data, Value.Length) == -1) {
kmfber_free(asn1, 1);
free(Value.Data);
return (KMF_ERR_ENCODING);
@@ -987,7 +1010,7 @@ KMFPK11_EncodePubKeyData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *pKey,
spki.algorithm.algorithm = *Algorithm;
if (PubKeyParams != NULL) {
spki.algorithm.parameters.Data =
- (uchar_t *)PubKeyParams->bv_val;
+ (uchar_t *)PubKeyParams->bv_val;
spki.algorithm.parameters.Length = PubKeyParams->bv_len;
} else {
spki.algorithm.parameters.Data = NULL;
@@ -1040,7 +1063,7 @@ CreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
CK_OBJECT_HANDLE hCert = NULL;
int i;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_INTERNAL); /* should not happen */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
@@ -1055,7 +1078,7 @@ CreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
* the PKCS#11 attributes can be filled in correctly.
*/
rv = DerDecodeSignedCertificate((const KMF_DATA *)pcert,
- &signed_cert_ptr);
+ &signed_cert_ptr);
if (rv != KMF_OK) {
return (KMF_ERR_ENCODING);
}
@@ -1101,7 +1124,7 @@ CreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
/* Generate an ID from the SPKI data */
rv = GetIDFromSPKI(&signed_cert_ptr->certificate.subjectPublicKeyInfo,
- &Id);
+ &Id);
if (rv != KMF_OK) {
SET_ERROR(kmfh, rv);
@@ -1109,10 +1132,10 @@ CreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
}
i = 0;
- SETATTR(x509templ, i, CKA_CLASS, &certClass,
- sizeof (certClass)); i++;
+ SETATTR(x509templ, i, CKA_CLASS, &certClass, sizeof (certClass)); i++;
SETATTR(x509templ, i, CKA_CERTIFICATE_TYPE, &certtype,
- sizeof (certtype)); i++;
+ sizeof (certtype));
+ i++;
SETATTR(x509templ, i, CKA_TOKEN, &true, sizeof (true)); i++;
SETATTR(x509templ, i, CKA_SUBJECT, subject, subject_len); i++;
SETATTR(x509templ, i, CKA_ISSUER, issuer, issuer_len); i++;
@@ -1120,8 +1143,7 @@ CreateCertObject(KMF_HANDLE_T handle, char *label, KMF_DATA *pcert)
SETATTR(x509templ, i, CKA_VALUE, pcert->Data, pcert->Length); i++;
SETATTR(x509templ, i, CKA_ID, Id.Data, Id.Length); i++;
if (label != NULL && strlen(label)) {
- SETATTR(x509templ, i, CKA_LABEL, label, strlen(label));
- i++;
+ SETATTR(x509templ, i, CKA_LABEL, label, strlen(label)); i++;
}
/*
* The cert object handle is actually "leaked" here. If the app
@@ -1141,7 +1163,7 @@ cleanup:
free(Id.Data);
if (signed_cert_ptr) {
- KMF_FreeSignedCert(signed_cert_ptr);
+ kmf_free_signed_cert(signed_cert_ptr);
free(signed_cert_ptr);
}
return (rv);
@@ -1149,67 +1171,75 @@ cleanup:
KMF_RETURN
-KMFPK11_StoreCert(KMF_HANDLE_T handle, KMF_STORECERT_PARAMS *params,
- KMF_DATA *pcert)
+KMFPK11_StoreCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = 0;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_DATA *cert = NULL;
+ char *label = NULL;
- if (!kmfh)
- return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
+ if (kmfh == NULL)
+ return (KMF_ERR_UNINITIALIZED);
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (pcert == NULL || pcert->Data == NULL || pcert->Length == 0)
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL || cert->Data == NULL || cert->Length == 0)
return (KMF_ERR_BAD_PARAMETER);
- rv = CreateCertObject(handle, params->certLabel, pcert);
+ /* label attribute is optional */
+ label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+
+ rv = CreateCertObject(handle, label, cert);
return (rv);
}
-
-
KMF_RETURN
-KMFPK11_ImportCert(KMF_HANDLE_T handle, KMF_IMPORTCERT_PARAMS *params)
+KMFPK11_ImportCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = 0;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ char *certfile = NULL;
+ char *label = NULL;
KMF_ENCODE_FORMAT format;
KMF_DATA cert1 = { NULL, 0};
KMF_DATA cert2 = { NULL, 0};
- if (!kmfh)
- return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
+ if (kmfh == NULL)
+ return (KMF_ERR_UNINITIALIZED);
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL || params->certfile == NULL) {
- return (KMF_ERR_BAD_PARAMETER);
- }
-
/*
- * Check if the input cert file is a valid certificate and
- * auto-detect the file format of it.
+ * Get the input cert filename attribute, check if it is a valid
+ * certificate and auto-detect the file format of it.
*/
- rv = KMF_IsCertFile(handle, params->certfile, &format);
+ certfile = kmf_get_attr_ptr(KMF_CERT_FILENAME_ATTR, attrlist, numattr);
+ if (certfile == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_is_cert_file(handle, certfile, &format);
if (rv != KMF_OK)
return (rv);
/* Read in the CERT file */
- rv = KMF_ReadInputFile(handle, params->certfile, &cert1);
+ rv = kmf_read_input_file(handle, certfile, &cert1);
if (rv != KMF_OK) {
return (rv);
}
+ /* The label attribute is optional */
+ label = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+
/*
* If the input certificate is in PEM format, we need to convert
* it to DER first.
*/
if (format == KMF_FORMAT_PEM) {
int derlen;
- rv = KMF_Pem2Der(cert1.Data, cert1.Length,
+ rv = kmf_pem_to_der(cert1.Data, cert1.Length,
&cert2.Data, &derlen);
if (rv != KMF_OK) {
goto out;
@@ -1217,7 +1247,7 @@ KMFPK11_ImportCert(KMF_HANDLE_T handle, KMF_IMPORTCERT_PARAMS *params)
cert2.Length = (size_t)derlen;
}
- rv = CreateCertObject(handle, params->certLabel,
+ rv = CreateCertObject(handle, label,
format == KMF_FORMAT_ASN1 ? &cert1 : &cert2);
out:
@@ -1233,41 +1263,60 @@ out:
}
KMF_RETURN
-KMFPK11_DeleteCert(KMF_HANDLE_T handle, KMF_DELETECERT_PARAMS *params)
+KMFPK11_DeleteCert(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = 0;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
OBJLIST *objlist;
uint32_t numObjects = 0;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_CERT_VALIDITY validity;
+ boolean_t private;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL)
- return (KMF_ERR_BAD_PARAMETER);
+
+ /* Get the search criteria attributes. They are all optional. */
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+
+ rv = kmf_get_attr(KMF_CERT_VALIDITY_ATTR, attrlist, numattr,
+ &validity, NULL);
+ if (rv != KMF_OK) {
+ validity = KMF_ALL_CERTS;
+ rv = KMF_OK;
+ }
+
+ rv = kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
+ (void *)&private, NULL);
+ if (rv != KMF_OK) {
+ private = B_FALSE;
+ rv = KMF_OK;
+ }
/*
- * Use the same search routine as is used for the FindCert
- * operation.
+ * Start searching for certificates that match the criteria and
+ * delete them.
*/
objlist = NULL;
- rv = search_certs(handle,
- params->certLabel, params->issuer,
- params->subject, params->serial,
- params->pkcs11parms.private,
- params->find_cert_validity,
- &objlist, &numObjects);
+ rv = search_certs(handle, certlabel, issuer, subject, serial,
+ private, validity, &objlist, &numObjects);
if (rv == KMF_OK && objlist != NULL) {
OBJLIST *node = objlist;
while (node != NULL) {
CK_RV ckrv;
- ckrv = C_DestroyObject(kmfh->pk11handle,
- node->handle);
+ ckrv = C_DestroyObject(kmfh->pk11handle, node->handle);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
@@ -1286,8 +1335,9 @@ out:
}
KMF_RETURN
-KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
- KMF_KEY_HANDLE *privkey, KMF_KEY_HANDLE *pubkey)
+KMFPK11_CreateKeypair(KMF_HANDLE_T handle,
+ int numattr,
+ KMF_ATTRIBUTE *attlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -1302,14 +1352,15 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
static CK_ULONG rsaKeyType = CKK_RSA;
static CK_ULONG modulusBits = 1024;
+ uint32_t modulusBits_size = sizeof (CK_ULONG);
static CK_BYTE PubExpo[3] = {0x01, 0x00, 0x01};
static CK_BBOOL true = TRUE;
static CK_BBOOL ontoken = TRUE;
static CK_BBOOL false = FALSE;
static CK_ULONG dsaKeyType = CKK_DSA;
- CK_ATTRIBUTE rsaPubKeyTemplate[8];
- CK_ATTRIBUTE rsaPriKeyTemplate[6];
+ CK_ATTRIBUTE rsaPubKeyTemplate[16];
+ CK_ATTRIBUTE rsaPriKeyTemplate[16];
static CK_BYTE ckDsaPrime[128] = {
0xb2, 0x6b, 0xc3, 0xfb, 0xe3, 0x26, 0xf4, 0xc2,
@@ -1381,106 +1432,146 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
char IDHashData[SHA1_HASH_LENGTH];
KMF_DATA IDInput, IDOutput;
SHA1_CTX ctx;
+ KMF_CREDENTIAL *cred;
+ KMF_KEY_ALG keytype = KMF_RSA;
+ boolean_t storekey = TRUE;
+ char *keylabel = NULL;
+ KMF_KEY_HANDLE *pubkey, *privkey;
#define NUMBER_DSA_PRI_TEMPLATES (sizeof (ckDsaPriKeyTemplate) / \
sizeof (CK_ATTRIBUTE))
#define MAX_DSA_PRI_TEMPLATES (sizeof (ckDsaPriKeyTemplate) / \
sizeof (CK_ATTRIBUTE))
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL)
+ /* "storekey" is optional. Default is TRUE */
+ (void) kmf_get_attr(KMF_STOREKEY_BOOL_ATTR, attlist, numattr,
+ &storekey, NULL);
+
+ cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attlist, numattr);
+ if (cred == NULL)
return (KMF_ERR_BAD_PARAMETER);
- rv = pk11_authenticate(handle, &params->cred);
- if (rv != KMF_OK) {
+ rv = pk11_authenticate(handle, cred);
+ if (rv != KMF_OK)
return (rv);
- }
- if (params->keytype == KMF_RSA) {
- CK_MECHANISM keyGenMech = {CKM_RSA_PKCS_KEY_PAIR_GEN,
- NULL, 0};
+ /* keytype is optional. KMF_RSA is default */
+ (void) kmf_get_attr(KMF_KEYALG_ATTR, attlist, numattr,
+ (void *)&keytype, NULL);
+
+ pubkey = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attlist, numattr);
+ if (pubkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ privkey = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attlist, numattr);
+ if (privkey == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ (void) memset(pubkey, 0, sizeof (KMF_KEY_HANDLE));
+ (void) memset(privkey, 0, sizeof (KMF_KEY_HANDLE));
+ if (keytype == KMF_RSA) {
+ CK_MECHANISM keyGenMech = {CKM_RSA_PKCS_KEY_PAIR_GEN, NULL, 0};
CK_BYTE *modulus;
CK_ULONG modulusLength;
CK_ATTRIBUTE modattr[1];
+ KMF_BIGINT *rsaexp = NULL;
+ int numpubattr = 0, numpriattr = 0;
+
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attlist, numattr,
+ &modulusBits, &modulusBits_size);
+ if (rv == KMF_ERR_ATTR_NOT_FOUND)
+ /* Default modulusBits = 1024 */
+ rv = KMF_OK;
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
- SETATTR(rsaPubKeyTemplate, 0, CKA_CLASS,
- &pubClass, sizeof (pubClass));
- SETATTR(rsaPubKeyTemplate, 1, CKA_KEY_TYPE,
- &rsaKeyType, sizeof (rsaKeyType));
- SETATTR(rsaPubKeyTemplate, 2, CKA_TOKEN,
- &false, sizeof (false));
- SETATTR(rsaPubKeyTemplate, 3, CKA_PRIVATE,
- &false, sizeof (false));
- SETATTR(rsaPubKeyTemplate, 4, CKA_MODULUS_BITS,
- &modulusBits, sizeof (modulusBits));
- if (params->rsa_exponent.len > 0 &&
- params->rsa_exponent.val != NULL) {
- SETATTR(rsaPubKeyTemplate, 5,
- CKA_PUBLIC_EXPONENT,
- params->rsa_exponent.val,
- params->rsa_exponent.len);
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_CLASS,
+ &pubClass, sizeof (pubClass));
+ numpubattr++;
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_KEY_TYPE,
+ &rsaKeyType, sizeof (rsaKeyType));
+ numpubattr++;
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_TOKEN,
+ (storekey ? &true : &false), sizeof (CK_BBOOL));
+ numpubattr++;
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_PRIVATE,
+ &false, sizeof (false));
+ numpubattr++;
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_MODULUS_BITS,
+ &modulusBits, sizeof (modulusBits));
+ numpubattr++;
+
+ if ((rsaexp = kmf_get_attr_ptr(KMF_RSAEXP_ATTR, attlist,
+ numattr)) != NULL &&
+ (rsaexp->len > 0 && rsaexp->val != NULL)) {
+ SETATTR(rsaPubKeyTemplate, numpubattr,
+ CKA_PUBLIC_EXPONENT,
+ rsaexp->val, rsaexp->len);
+ numpubattr++;
} else {
- SETATTR(rsaPubKeyTemplate, 5,
- CKA_PUBLIC_EXPONENT, &PubExpo,
- sizeof (PubExpo));
- }
- SETATTR(rsaPubKeyTemplate, 6, CKA_ENCRYPT,
- &true, sizeof (true));
- SETATTR(rsaPubKeyTemplate, 7, CKA_VERIFY,
- &true, sizeof (true));
-
- SETATTR(rsaPriKeyTemplate, 0, CKA_CLASS, &priClass,
- sizeof (priClass));
- SETATTR(rsaPriKeyTemplate, 1, CKA_KEY_TYPE, &rsaKeyType,
- sizeof (rsaKeyType));
- SETATTR(rsaPriKeyTemplate, 2, CKA_TOKEN, &ontoken,
- sizeof (ontoken));
- SETATTR(rsaPriKeyTemplate, 3, CKA_PRIVATE, &true,
- sizeof (true));
- SETATTR(rsaPriKeyTemplate, 4, CKA_DECRYPT, &true,
- sizeof (true));
- SETATTR(rsaPriKeyTemplate, 5, CKA_SIGN, &true,
- sizeof (true));
+ rv = KMF_OK;
+ SETATTR(rsaPubKeyTemplate, numpubattr,
+ CKA_PUBLIC_EXPONENT, &PubExpo, sizeof (PubExpo));
+ numpubattr++;
+ }
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_ENCRYPT,
+ &true, sizeof (true));
+ numpubattr++;
+ SETATTR(rsaPubKeyTemplate, numpubattr, CKA_VERIFY,
+ &true, sizeof (true));
+ numpubattr++;
+
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_CLASS, &priClass,
+ sizeof (priClass));
+ numpriattr++;
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_KEY_TYPE,
+ &rsaKeyType, sizeof (rsaKeyType));
+ numpriattr++;
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_TOKEN,
+ (storekey ? &true : &false), sizeof (CK_BBOOL));
+ numpriattr++;
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_PRIVATE, &true,
+ sizeof (true));
+ numpriattr++;
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_DECRYPT, &true,
+ sizeof (true));
+ numpriattr++;
+ SETATTR(rsaPriKeyTemplate, numpriattr, CKA_SIGN, &true,
+ sizeof (true));
+ numpriattr++;
SETATTR(modattr, 0, CKA_MODULUS, NULL, &modulusLength);
- modulusBits = params->keylength;
-
pubKey = CK_INVALID_HANDLE;
priKey = CK_INVALID_HANDLE;
ckrv = C_GenerateKeyPair(hSession, &keyGenMech,
- rsaPubKeyTemplate,
- (sizeof (rsaPubKeyTemplate)/sizeof (CK_ATTRIBUTE)),
- rsaPriKeyTemplate,
- (sizeof (rsaPriKeyTemplate)/sizeof (CK_ATTRIBUTE)),
- &pubKey, &priKey);
+ rsaPubKeyTemplate, numpubattr,
+ rsaPriKeyTemplate, numpriattr,
+ &pubKey, &priKey);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
return (KMF_ERR_KEYGEN_FAILED);
}
- if (privkey != NULL) {
- privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
- privkey->keyalg = KMF_RSA;
- privkey->keyclass = KMF_ASYM_PRI;
- privkey->keyp = (void *)priKey;
- }
- if (pubkey != NULL) {
- pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
- pubkey->keyalg = KMF_RSA;
- pubkey->keyclass = KMF_ASYM_PUB;
- pubkey->keyp = (void *)pubKey;
- }
+ privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
+ privkey->keyalg = KMF_RSA;
+ privkey->keyclass = KMF_ASYM_PRI;
+ privkey->keyp = (void *)priKey;
+
+ pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
+ pubkey->keyalg = KMF_RSA;
+ pubkey->keyclass = KMF_ASYM_PUB;
+ pubkey->keyp = (void *)pubKey;
/* Get the Modulus field to use as input for creating the ID */
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pubKey,
- modattr, 1);
+ (CK_OBJECT_HANDLE)pubKey, modattr, 1);
if (rv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
return (KMF_ERR_BAD_PARAMETER);
@@ -1493,8 +1584,7 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
modattr[0].pValue = modulus;
rv = C_GetAttributeValue(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)pubKey,
- modattr, 1);
+ (CK_OBJECT_HANDLE)pubKey, modattr, 1);
if (rv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
free(modulus);
@@ -1504,43 +1594,40 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
IDInput.Data = modulus;
IDInput.Length = modulusLength;
- } else if (params->keytype == KMF_DSA) {
+ } else if (keytype == KMF_DSA) {
CK_MECHANISM keyGenMech = {CKM_DSA_KEY_PAIR_GEN, NULL, 0};
CK_BYTE *keyvalue;
CK_ULONG valueLen;
CK_ATTRIBUTE valattr[1];
SETATTR(ckDsaPriKeyTemplate, 2, CKA_TOKEN,
- &ontoken, sizeof (ontoken));
+ (storekey ? &true : &false), sizeof (CK_BBOOL));
SETATTR(valattr, 0, CKA_VALUE, NULL, &valueLen);
ckrv = C_GenerateKeyPair(hSession, &keyGenMech,
- ckDsaPubKeyTemplate,
- (sizeof (ckDsaPubKeyTemplate)/sizeof (CK_ATTRIBUTE)),
- ckDsaPriKeyTemplate,
- (sizeof (ckDsaPriKeyTemplate)/sizeof (CK_ATTRIBUTE)),
- &pubKey, &priKey);
+ ckDsaPubKeyTemplate,
+ (sizeof (ckDsaPubKeyTemplate)/sizeof (CK_ATTRIBUTE)),
+ ckDsaPriKeyTemplate,
+ (sizeof (ckDsaPriKeyTemplate)/sizeof (CK_ATTRIBUTE)),
+ &pubKey, &priKey);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
return (KMF_ERR_KEYGEN_FAILED);
}
- if (privkey != NULL) {
- privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
- privkey->keyalg = KMF_DSA;
- privkey->keyclass = KMF_ASYM_PRI;
- privkey->keyp = (void *)priKey;
- }
- if (pubkey != NULL) {
- pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
- pubkey->keyalg = KMF_DSA;
- pubkey->keyclass = KMF_ASYM_PUB;
- pubkey->keyp = (void *)pubKey;
- }
+ privkey->kstype = KMF_KEYSTORE_PK11TOKEN;
+ privkey->keyalg = KMF_DSA;
+ privkey->keyclass = KMF_ASYM_PRI;
+ privkey->keyp = (void *)priKey;
+
+ pubkey->kstype = KMF_KEYSTORE_PK11TOKEN;
+ pubkey->keyalg = KMF_DSA;
+ pubkey->keyclass = KMF_ASYM_PUB;
+ pubkey->keyp = (void *)pubKey;
+
/* Get the Public Value to use as input for creating the ID */
rv = C_GetAttributeValue(hSession,
- (CK_OBJECT_HANDLE)pubKey,
- valattr, 1);
+ (CK_OBJECT_HANDLE)pubKey, valattr, 1);
if (rv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
return (KMF_ERR_BAD_PARAMETER);
@@ -1553,8 +1640,7 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
valattr[0].pValue = keyvalue;
rv = C_GetAttributeValue(hSession,
- (CK_OBJECT_HANDLE)pubKey,
- valattr, 1);
+ (CK_OBJECT_HANDLE)pubKey, valattr, 1);
if (rv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
free(keyvalue);
@@ -1567,41 +1653,35 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
return (KMF_ERR_BAD_PARAMETER);
}
- if (params->keylabel != NULL &&
- strlen(params->keylabel)) {
-
- SETATTR(labelattr, 0, CKA_LABEL, params->keylabel,
- strlen(params->keylabel));
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attlist, numattr);
+ if (keylabel != NULL && strlen(keylabel)) {
+ SETATTR(labelattr, 0, CKA_LABEL, keylabel, strlen(keylabel));
/* Set the CKA_LABEL if one was indicated */
if ((ckrv = C_SetAttributeValue(hSession, pubKey,
- labelattr, 1)) != CKR_OK) {
+ labelattr, 1)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
goto cleanup;
}
- if (pubkey != NULL) {
- pubkey->keylabel =
- (char *)strdup(params->keylabel);
- if (pubkey->keylabel == NULL) {
- rv = KMF_ERR_MEMORY;
- goto cleanup;
- }
+ pubkey->keylabel = (char *)strdup(keylabel);
+ if (pubkey->keylabel == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto cleanup;
}
if ((ckrv = C_SetAttributeValue(hSession, priKey,
- labelattr, 1)) != CKR_OK) {
+ labelattr, 1)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
goto cleanup;
}
- if (privkey != NULL) {
- privkey->keylabel =
- (char *)strdup(params->keylabel);
- if (privkey->keylabel == NULL) {
- rv = KMF_ERR_MEMORY;
- goto cleanup;
- }
+ privkey->keylabel = (char *)strdup(keylabel);
+ if (privkey->keylabel == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto cleanup;
}
+ } else {
+ rv = KMF_OK;
}
/* Now, assign a CKA_ID value so it can be searched */
@@ -1623,13 +1703,13 @@ KMFPK11_CreateKeypair(KMF_HANDLE_T handle, KMF_CREATEKEYPAIR_PARAMS *params,
}
SETATTR(idattr, 0, CKA_ID, IDOutput.Data, IDOutput.Length);
if ((ckrv = C_SetAttributeValue(hSession, pubKey,
- idattr, 1)) != CKR_OK) {
+ idattr, 1)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
goto cleanup;
}
if ((ckrv = C_SetAttributeValue(hSession, priKey,
- idattr, 1)) != CKR_OK) {
+ idattr, 1)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
goto cleanup;
@@ -1641,44 +1721,52 @@ cleanup:
(void) C_DestroyObject(hSession, pubKey);
if (priKey != CK_INVALID_HANDLE)
(void) C_DestroyObject(hSession, priKey);
- if (privkey) {
- privkey->keyp = NULL;
- if (privkey->keylabel)
- free(privkey->keylabel);
- }
- if (pubkey) {
- pubkey->keyp = NULL;
- if (pubkey->keylabel)
- free(pubkey->keylabel);
- }
+
+ if (privkey->keylabel)
+ free(privkey->keylabel);
+ if (pubkey->keylabel)
+ free(pubkey->keylabel);
}
return (rv);
}
KMF_RETURN
-KMFPK11_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
- KMF_KEY_HANDLE *key, boolean_t destroy)
+KMFPK11_DeleteKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
CK_RV ckrv = CKR_OK;
KMF_RETURN rv = KMF_OK;
+ KMF_KEY_HANDLE *key;
+ KMF_CREDENTIAL cred;
+ boolean_t destroy = B_TRUE;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
if (key == NULL || key->keyp == NULL)
return (KMF_ERR_BAD_PARAMETER);
if (key->keyclass != KMF_ASYM_PUB &&
- key->keyclass != KMF_ASYM_PRI &&
- key->keyclass != KMF_SYMMETRIC)
+ key->keyclass != KMF_ASYM_PRI &&
+ key->keyclass != KMF_SYMMETRIC)
return (KMF_ERR_BAD_KEY_CLASS);
+ /* "destroy" is optional. Default is TRUE */
+ (void) kmf_get_attr(KMF_DESTROY_BOOL_ATTR, attrlist, numattr,
+ (void *)&destroy, NULL);
+
if (destroy) {
- rv = pk11_authenticate(handle, &params->cred);
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = pk11_authenticate(handle, &cred);
if (rv != KMF_OK) {
return (rv);
}
@@ -1686,19 +1774,17 @@ KMFPK11_DeleteKey(KMF_HANDLE_T handle, KMF_DELETEKEY_PARAMS *params,
if (!key->israw && destroy)
ckrv = C_DestroyObject(kmfh->pk11handle,
- (CK_OBJECT_HANDLE)key->keyp);
+ (CK_OBJECT_HANDLE)key->keyp);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
/* Report authentication failures to the caller */
- if (ckrv == CKR_PIN_EXPIRED ||
- ckrv == CKR_SESSION_READ_ONLY)
+ if (ckrv == CKR_PIN_EXPIRED || ckrv == CKR_SESSION_READ_ONLY)
rv = KMF_ERR_AUTH_FAILED;
else
rv = KMF_ERR_INTERNAL;
}
return (rv);
-
}
KMF_RETURN
@@ -1712,9 +1798,9 @@ KMFPK11_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
CK_SESSION_HANDLE hSession = kmfh->pk11handle;
CK_MECHANISM mechanism;
PKCS_ALGORITHM_MAP *pAlgMap;
- KMF_ALGORITHM_INDEX AlgId;
+ KMF_ALGORITHM_INDEX AlgId;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
@@ -1725,13 +1811,13 @@ KMFPK11_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
return (KMF_ERR_BAD_PARAMETER);
/* These functions are available to the plugin from libkmf */
- AlgId = X509_AlgorithmOidToAlgId(algOID);
+ AlgId = x509_algoid_to_algid(algOID);
if (AlgId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_PARAMETER);
/* Map the Algorithm OID to a PKCS#11 mechanism */
- pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE,
- AlgId, PKCS_GetDefaultSignatureMode(AlgId));
+ pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE,
+ AlgId, PKCS_GetDefaultSignatureMode(AlgId));
if (pAlgMap == NULL)
return (KMF_ERR_BAD_PARAMETER);
@@ -1746,9 +1832,8 @@ KMFPK11_SignData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *keyp,
return (KMF_ERR_INTERNAL);
}
- ckrv = C_Sign(hSession,
- tobesigned->Data, tobesigned->Length,
- output->Data, (CK_ULONG *)&output->Length);
+ ckrv = C_Sign(hSession, tobesigned->Data, tobesigned->Length,
+ output->Data, (CK_ULONG *)&output->Length);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
@@ -1816,11 +1901,10 @@ getObjectLabel(KMF_HANDLE_T handle, CK_OBJECT_HANDLE obj,
return (rv);
}
+
KMF_RETURN
-KMFPK11_GetPrikeyByCert(KMF_HANDLE_T handle,
- KMF_CRYPTOWITHCERT_PARAMS *params,
- KMF_DATA *SignerCertData, KMF_KEY_HANDLE *key,
- KMF_KEY_ALG keytype)
+KMFPK11_FindPrikeyByCert(KMF_HANDLE_T handle, int numattr,
+ KMF_ATTRIBUTE *attrlist)
{
KMF_X509_SPKI *pubkey;
KMF_X509_CERTIFICATE *SignerCert = NULL;
@@ -1833,9 +1917,27 @@ KMFPK11_GetPrikeyByCert(KMF_HANDLE_T handle,
CK_OBJECT_CLASS certClass = CKO_PRIVATE_KEY;
CK_BBOOL true = TRUE;
KMF_DATA Id = { NULL, 0 };
+ KMF_KEY_HANDLE *key = NULL;
+ KMF_DATA *cert = NULL;
+ KMF_CREDENTIAL cred;
+ KMF_ENCODE_FORMAT format = KMF_FORMAT_UNDEF;
+ CK_ULONG keytype;
+
+ /* Get the key handle */
+ key = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (key == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Get the optional encoded format */
+ (void) kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist, numattr,
+ (void *)&format, NULL);
/* Decode the signer cert so we can get the SPKI data */
- if ((rv = DerDecodeSignedCertificate(SignerCertData,
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert == NULL || cert->Data == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ if ((rv = DerDecodeSignedCertificate(cert,
&SignerCert)) != KMF_OK)
return (rv);
@@ -1844,22 +1946,28 @@ KMFPK11_GetPrikeyByCert(KMF_HANDLE_T handle,
/* Generate an ID from the SPKI data */
rv = GetIDFromSPKI(pubkey, &Id);
-
if (rv != KMF_OK) {
SET_ERROR(kmfh, rv);
goto errout;
}
- SETATTR(templ, 0, CKA_CLASS, &certClass, sizeof (certClass));
- SETATTR(templ, 1, CKA_TOKEN, &true, sizeof (true));
- SETATTR(templ, 2, CKA_PRIVATE, &true, sizeof (true));
- SETATTR(templ, 3, CKA_ID, Id.Data, Id.Length);
+ /* Get the credential and login */
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
- rv = pk11_authenticate(handle, &params->cred);
+ rv = pk11_authenticate(handle, &cred);
if (rv != KMF_OK) {
return (rv);
}
+ /* Start searching */
+ SETATTR(templ, 0, CKA_CLASS, &certClass, sizeof (certClass));
+ SETATTR(templ, 1, CKA_TOKEN, &true, sizeof (true));
+ SETATTR(templ, 2, CKA_PRIVATE, &true, sizeof (true));
+ SETATTR(templ, 3, CKA_ID, Id.Data, Id.Length);
+
if ((ckrv = C_FindObjectsInit(kmfh->pk11handle, templ, 4)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_INTERNAL;
@@ -1881,14 +1989,29 @@ KMFPK11_GetPrikeyByCert(KMF_HANDLE_T handle,
key->kstype = KMF_KEYSTORE_PK11TOKEN;
key->keyclass = KMF_ASYM_PRI;
- key->keyalg = keytype;
key->keyp = (void *)pri_obj;
+ key->israw = FALSE;
(void) C_FindObjectsFinal(kmfh->pk11handle);
ckrv = getObjectLabel(handle, (CK_OBJECT_HANDLE)key->keyp,
- &key->keylabel);
+ &key->keylabel);
+ if (ckrv != CKR_OK) {
+ SET_ERROR(handle, ckrv);
+ rv = KMF_ERR_INTERNAL;
+ } else {
+ rv = KMF_OK;
+ }
+ /*
+ * The key->keyalg value is needed if we need to convert the key
+ * to raw key. However, the key->keyalg value will not be set if
+ * this function is not called thru the kmf_find_prikey_by_cert()
+ * framework function. To be safe, we will get the keytype from
+ * the key object and set key->keyalg value here.
+ */
+ ckrv = getObjectKeytype(handle, (CK_OBJECT_HANDLE)key->keyp,
+ &keytype);
if (ckrv != CKR_OK) {
SET_ERROR(handle, ckrv);
rv = KMF_ERR_INTERNAL;
@@ -1896,7 +2019,17 @@ KMFPK11_GetPrikeyByCert(KMF_HANDLE_T handle,
rv = KMF_OK;
}
- if (rv == KMF_OK && params->format == KMF_FORMAT_RAWKEY) {
+ if (keytype == CKK_RSA)
+ key->keyalg = KMF_RSA;
+ else if (keytype == CKK_DSA)
+ key->keyalg = KMF_DSA;
+ else {
+ /* For asymmetric keys, we only support RSA and DSA */
+ rv = KMF_ERR_KEY_NOT_FOUND;
+ goto errout;
+ }
+
+ if (rv == KMF_OK && format == KMF_FORMAT_RAWKEY) {
KMF_RAW_KEY_DATA *rkey = NULL;
rv = keyObj2RawKey(handle, key, &rkey);
if (rv == KMF_OK) {
@@ -1910,7 +2043,7 @@ errout:
free(Id.Data);
if (SignerCert != NULL) {
- KMF_FreeSignedCert(SignerCert);
+ kmf_free_signed_cert(SignerCert);
free(SignerCert);
}
return (rv);
@@ -1932,7 +2065,7 @@ KMFPK11_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
int i, blocks;
CK_ATTRIBUTE ckTemplate[1];
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
@@ -1942,12 +2075,12 @@ KMFPK11_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
ciphertext == NULL || output == NULL)
return (KMF_ERR_BAD_PARAMETER);
- AlgId = X509_AlgorithmOidToAlgId(algOID);
+ AlgId = x509_algoid_to_algid(algOID);
if (AlgId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_PARAMETER);
/* Map the Algorithm ID to a PKCS#11 mechanism */
- pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE,
+ pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE,
AlgId, PKCS_GetDefaultSignatureMode(AlgId));
if (pAlgMap == NULL)
@@ -1980,7 +2113,7 @@ KMFPK11_DecryptData(KMF_HANDLE_T handle, KMF_KEY_HANDLE *key,
for (i = 0; i < blocks; i++) {
ckrv = C_DecryptInit(hSession, &mechanism,
- (CK_OBJECT_HANDLE)key->keyp);
+ (CK_OBJECT_HANDLE)key->keyp);
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
@@ -2019,7 +2152,7 @@ get_raw_rsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_RSA_KEY *rawrsa)
KMF_RETURN rv = KMF_OK;
CK_RV ckrv;
CK_SESSION_HANDLE sess = kmfh->pk11handle;
- CK_ATTRIBUTE rsa_pri_attrs[8] = {
+ CK_ATTRIBUTE rsa_pri_attrs[8] = {
{ CKA_MODULUS, NULL, 0 },
{ CKA_PUBLIC_EXPONENT, NULL, 0 },
{ CKA_PRIVATE_EXPONENT, NULL, 0 }, /* optional */
@@ -2029,11 +2162,11 @@ get_raw_rsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_RSA_KEY *rawrsa)
{ CKA_EXPONENT_2, NULL, 0 }, /* | */
{ CKA_COEFFICIENT, NULL, 0 } /* V */
};
- CK_ULONG count = sizeof (rsa_pri_attrs) / sizeof (CK_ATTRIBUTE);
- int i;
+ CK_ULONG count = sizeof (rsa_pri_attrs) / sizeof (CK_ATTRIBUTE);
+ int i;
if ((ckrv = C_GetAttributeValue(sess, obj,
- rsa_pri_attrs, count)) != CKR_OK) {
+ rsa_pri_attrs, count)) != CKR_OK) {
SET_ERROR(kmfh, ckrv);
/* Tell the caller know why the key data cannot be retrieved. */
if (ckrv == CKR_ATTRIBUTE_SENSITIVE)
@@ -2059,7 +2192,7 @@ get_raw_rsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_RSA_KEY *rawrsa)
}
/* Now that we have space, really get the attributes */
if ((rv = C_GetAttributeValue(sess, obj,
- rsa_pri_attrs, count)) != CKR_OK) {
+ rsa_pri_attrs, count)) != CKR_OK) {
SET_ERROR(kmfh, rv);
rv = KMF_ERR_INTERNAL;
goto end;
@@ -2109,10 +2242,78 @@ end:
return (rv);
}
+#define DSA_PRIME_BUFSIZE 256 /* 8192 bits */
+#define DSA_PRIVATE_BUFSIZE 5 /* 160 bits */
+
+/*
+ * This function calculates the pubkey value from the prime,
+ * base and private key values of a DSA key.
+ */
+static KMF_RETURN
+compute_dsa_pubvalue(KMF_RAW_DSA_KEY *rawdsa)
+{
+ KMF_RETURN rv = KMF_OK;
+ BIGNUM p, g, x, y;
+ BIG_ERR_CODE err;
+ uchar_t *pubvalue;
+ uint32_t pubvalue_len;
+
+ if ((err = big_init1(&p, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
+ rv = KMF_ERR_MEMORY;
+ return (rv);
+ }
+ bytestring2bignum(&p, rawdsa->prime.val, rawdsa->prime.len);
+
+ if ((err = big_init1(&g, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
+ rv = KMF_ERR_MEMORY;
+ goto ret1;
+ }
+ bytestring2bignum(&g, rawdsa->base.val, rawdsa->base.len);
+
+ if ((err = big_init1(&x, DSA_PRIVATE_BUFSIZE, NULL, 0)) != BIG_OK) {
+ rv = KMF_ERR_MEMORY;
+ goto ret2;
+ }
+ bytestring2bignum(&x, rawdsa->value.val, rawdsa->value.len);
+
+ if ((err = big_init1(&y, DSA_PRIME_BUFSIZE, NULL, 0)) != BIG_OK) {
+ rv = KMF_ERR_MEMORY;
+ goto ret3;
+ }
+
+ err = big_modexp(&y, &g, &x, &p, NULL);
+ if (err != BIG_OK) {
+ rv = KMF_ERR_INTERNAL;
+ goto ret3;
+ }
+
+ pubvalue_len = y.len * (int)sizeof (uint32_t);
+ if ((pubvalue = malloc(pubvalue_len)) == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto ret4;
+ }
+ bignum2bytestring(pubvalue, &y, pubvalue_len);
+
+ rawdsa->pubvalue.val = pubvalue;
+ rawdsa->pubvalue.len = pubvalue_len;
+
+ret4:
+ big_finish(&y);
+ret3:
+ big_finish(&x);
+ret2:
+ big_finish(&g);
+ret1:
+ big_finish(&p);
+ return (rv);
+}
+
+
static KMF_RETURN
get_raw_dsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_DSA_KEY *rawdsa)
{
KMF_RETURN rv = KMF_OK;
+ CK_RV ckrv;
CK_SESSION_HANDLE sess = kmfh->pk11handle;
CK_ATTRIBUTE dsa_pri_attrs[8] = {
{ CKA_PRIME, NULL, 0 },
@@ -2123,9 +2324,15 @@ get_raw_dsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_DSA_KEY *rawdsa)
CK_ULONG count = sizeof (dsa_pri_attrs) / sizeof (CK_ATTRIBUTE);
int i;
- if ((rv = C_GetAttributeValue(sess, obj,
- dsa_pri_attrs, count)) != CKR_OK) {
- SET_ERROR(kmfh, rv);
+ if ((ckrv = C_GetAttributeValue(sess, obj,
+ dsa_pri_attrs, count)) != CKR_OK) {
+ SET_ERROR(kmfh, ckrv);
+
+ /* Tell the caller know why the key data cannot be retrieved. */
+ if (ckrv == CKR_ATTRIBUTE_SENSITIVE)
+ return (KMF_ERR_SENSITIVE_KEY);
+ else if (ckrv == CKR_KEY_UNEXTRACTABLE)
+ return (KMF_ERR_UNEXTRACTABLE_KEY);
return (KMF_ERR_INTERNAL);
}
@@ -2143,7 +2350,7 @@ get_raw_dsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_DSA_KEY *rawdsa)
}
}
if ((rv = C_GetAttributeValue(sess, obj,
- dsa_pri_attrs, count)) != CKR_OK) {
+ dsa_pri_attrs, count)) != CKR_OK) {
SET_ERROR(kmfh, rv);
rv = KMF_ERR_INTERNAL;
goto end;
@@ -2156,6 +2363,9 @@ get_raw_dsa(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_DSA_KEY *rawdsa)
attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->base);
attr2bigint(&(dsa_pri_attrs[i++]), &rawdsa->value);
+ /* Compute the public key value and store it */
+ rv = compute_dsa_pubvalue(rawdsa);
+
end:
if (rv != KMF_OK) {
for (i = 0; i < count; i++) {
@@ -2181,19 +2391,16 @@ get_raw_sym(KMF_HANDLE *kmfh, CK_OBJECT_HANDLE obj, KMF_RAW_SYM_KEY *rawsym)
sym_attr[0].pValue = NULL;
sym_attr[0].ulValueLen = value_len;
if ((ckrv = C_GetAttributeValue(sess, obj, sym_attr, 1)) != CKR_OK) {
- /*
- * Don't return error if the key is sensitive, just
- * don't return any raw data. Operations like "list"
- * need to succeed even if the raw data is not
- * available.
- */
+ rawsym->keydata.val = NULL;
+ rawsym->keydata.len = 0;
if (ckrv == CKR_ATTRIBUTE_SENSITIVE) {
- rawsym->keydata.val = NULL;
- rawsym->keydata.len = 0;
- return (CKR_OK);
+ return (KMF_ERR_SENSITIVE_KEY);
+ } else if (ckrv == CKR_KEY_UNEXTRACTABLE) {
+ return (KMF_ERR_UNEXTRACTABLE_KEY);
+ } else {
+ SET_ERROR(kmfh, ckrv);
+ return (KMF_ERR_INTERNAL);
}
- SET_ERROR(kmfh, ckrv);
- return (KMF_ERR_INTERNAL);
}
/* Allocate memory for pValue */
@@ -2232,10 +2439,10 @@ keyObj2RawKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *inkey,
if (inkey->keyalg == KMF_RSA) {
rv = get_raw_rsa(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
- &rkey->rawdata.rsa);
+ &rkey->rawdata.rsa);
} else if (inkey->keyalg == KMF_DSA) {
rv = get_raw_dsa(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
- &rkey->rawdata.dsa);
+ &rkey->rawdata.dsa);
} else if (inkey->keyalg == KMF_AES ||
inkey->keyalg == KMF_RC4 ||
inkey->keyalg == KMF_DES ||
@@ -2243,6 +2450,18 @@ keyObj2RawKey(KMF_HANDLE_T handle, KMF_KEY_HANDLE *inkey,
inkey->keyalg == KMF_GENERIC_SECRET) {
rv = get_raw_sym(kmfh, (CK_OBJECT_HANDLE)inkey->keyp,
&rkey->rawdata.sym);
+ /*
+ * If sensitive or non-extractable, mark them as such
+ * but return "OK" status so the keys get counted
+ * when doing FindKey operations.
+ */
+ if (rv == KMF_ERR_SENSITIVE_KEY) {
+ rkey->sensitive = B_TRUE;
+ rv = KMF_OK;
+ } else if (rv == KMF_ERR_UNEXTRACTABLE_KEY) {
+ rkey->not_extractable = B_TRUE;
+ rv = KMF_OK;
+ }
} else {
rv = KMF_ERR_BAD_PARAMETER;
}
@@ -2333,8 +2552,8 @@ IDStringToData(char *idstr, KMF_DATA *iddata)
}
KMF_RETURN
-KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
- KMF_KEY_HANDLE *keys, uint32_t *numkeys)
+KMFPK11_FindKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -2344,63 +2563,80 @@ KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
CK_OBJECT_CLASS class;
CK_BBOOL true = TRUE;
CK_ULONG alg;
- CK_BBOOL is_token;
+ boolean_t is_token, is_private;
+ KMF_KEY_HANDLE *keys;
+ uint32_t *numkeys;
+ KMF_CREDENTIAL cred;
+ KMF_KEY_CLASS keyclass = KMF_KEYCLASS_NONE;
+ char *findLabel, *idstr;
+ KMF_KEY_ALG keytype = KMF_KEYALG_NONE;
+ KMF_ENCODE_FORMAT format;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (parms == NULL || numkeys == NULL)
+ numkeys = kmf_get_attr_ptr(KMF_COUNT_ATTR, attrlist, numattr);
+ if (numkeys == NULL)
return (KMF_ERR_BAD_PARAMETER);
- if (numkeys != NULL && *numkeys > 0)
+ if (*numkeys > 0)
want_keys = *numkeys;
else
want_keys = MAXINT; /* count them all */
- is_token = parms->pkcs11parms.token;
- if (parms->keyclass == KMF_ASYM_PUB) {
+ /* keyclass is optional */
+ (void) kmf_get_attr(KMF_KEYCLASS_ATTR, attrlist, numattr,
+ (void *)&keyclass, NULL);
+
+ if (keyclass == KMF_ASYM_PUB) {
class = CKO_PUBLIC_KEY;
- } else if (parms->keyclass == KMF_ASYM_PRI) {
+ } else if (keyclass == KMF_ASYM_PRI) {
class = CKO_PRIVATE_KEY;
- } else if (parms->keyclass == KMF_SYMMETRIC) {
+ } else if (keyclass == KMF_SYMMETRIC) {
class = CKO_SECRET_KEY;
- } else {
- return (KMF_ERR_BAD_KEY_CLASS);
}
+ rv = kmf_get_attr(KMF_TOKEN_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_token, NULL);
+ if (rv != KMF_OK)
+ return (rv);
+
i = 0;
- pTmpl[i].type = CKA_TOKEN;
- pTmpl[i].pValue = &is_token;
- pTmpl[i].ulValueLen = sizeof (CK_BBOOL);
- i++;
+ if (is_token) {
+ SETATTR(pTmpl, i, CKA_TOKEN, &true, sizeof (true));
+ i++;
+ }
- pTmpl[i].type = CKA_CLASS;
- pTmpl[i].pValue = &class;
- pTmpl[i].ulValueLen = sizeof (class);
- i++;
+ if (keyclass != KMF_KEYCLASS_NONE) {
+ SETATTR(pTmpl, i, CKA_CLASS, &class, sizeof (class));
+ i++;
+ }
- if (parms->findLabel != NULL && strlen(parms->findLabel)) {
- pTmpl[i].type = CKA_LABEL;
- pTmpl[i].pValue = parms->findLabel;
- pTmpl[i].ulValueLen = strlen(parms->findLabel);
+ findLabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+
+ if (findLabel != NULL && strlen(findLabel)) {
+ SETATTR(pTmpl, i, CKA_LABEL, findLabel, strlen(findLabel));
i++;
}
+ /* keytype is optional */
+ (void) kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
- if (parms->keytype != 0) {
- rv = kmf2pk11keytype(parms->keytype, &alg);
+ if (keytype != 0) {
+ rv = kmf2pk11keytype(keytype, &alg);
if (rv != KMF_OK) {
return (KMF_ERR_BAD_KEY_TYPE);
}
- pTmpl[i].type = CKA_KEY_TYPE;
- pTmpl[i].pValue = &alg;
- pTmpl[i].ulValueLen = sizeof (alg);
+ SETATTR(pTmpl, i, CKA_KEY_TYPE, &alg, sizeof (alg));
i++;
}
- if (parms->idstr != NULL) {
+ idstr = kmf_get_attr_ptr(KMF_IDSTR_ATTR, attrlist, numattr);
+
+ if (idstr != NULL) {
KMF_DATA iddata = { NULL, 0 };
/*
@@ -2411,21 +2647,21 @@ KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
* We must convert this back to binary in order to
* use it in a search.
*/
- rv = IDStringToData(parms->idstr, &iddata);
+ rv = IDStringToData(idstr, &iddata);
if (rv == KMF_OK) {
- pTmpl[i].type = CKA_ID;
- pTmpl[i].pValue = iddata.Data;
- pTmpl[i].ulValueLen = iddata.Length;
+ SETATTR(pTmpl, i, CKA_ID, iddata.Data, iddata.Length);
i++;
} else {
return (rv);
}
}
- if (parms->pkcs11parms.private) {
- pTmpl[i].type = CKA_PRIVATE;
- pTmpl[i].pValue = &true;
- pTmpl[i].ulValueLen = sizeof (true);
+ /* is_private is optional */
+ (void) kmf_get_attr(KMF_PRIVATE_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_private, NULL);
+
+ if (is_private) {
+ SETATTR(pTmpl, i, CKA_PRIVATE, &true, sizeof (true));
i++;
}
@@ -2433,13 +2669,20 @@ KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
* Authenticate if the object is a token object,
* a private or secred key, or if the user passed in credentials.
*/
- if (parms->cred.credlen > 0) {
- rv = pk11_authenticate(handle, &parms->cred);
- if (rv != KMF_OK) {
- return (rv);
+ if ((rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL)) == KMF_OK) {
+ if (cred.credlen > 0) {
+ rv = pk11_authenticate(handle, &cred);
+ if (rv != KMF_OK)
+ return (rv);
}
+ } else {
+ rv = KMF_OK; /* cred is optional */
}
+ keys = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ /* it is okay to have "keys" contains NULL */
+
ckrv = C_FindObjectsInit(kmfh->pk11handle, pTmpl, i);
if (ckrv == CKR_OK) {
CK_ULONG obj_count, n = 0;
@@ -2447,42 +2690,56 @@ KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
CK_OBJECT_HANDLE hObj;
ckrv = C_FindObjects(kmfh->pk11handle, &hObj,
- 1, &obj_count);
+ 1, &obj_count);
if (ckrv == CKR_OK && obj_count == 1) {
if (keys != NULL) {
CK_ULONG keytype;
keys[n].kstype = KMF_KEYSTORE_PK11TOKEN;
- keys[n].keyclass = parms->keyclass;
+ keys[n].keyclass = keyclass;
keys[n].israw = FALSE;
keys[n].keyp = (void *)hObj;
ckrv = getObjectKeytype(handle,
- (CK_OBJECT_HANDLE)keys[n].keyp,
- &keytype);
+ (CK_OBJECT_HANDLE)keys[n].keyp,
+ &keytype);
if (ckrv != CKR_OK)
goto end;
ckrv = getObjectLabel(handle,
- (CK_OBJECT_HANDLE)keys[n].keyp,
- &(keys[n].keylabel));
+ (CK_OBJECT_HANDLE)keys[n].keyp,
+ &(keys[n].keylabel));
if (ckrv != CKR_OK)
goto end;
- if (keytype == CKK_RSA)
+ if (keytype == CKK_RSA) {
keys[n].keyalg = KMF_RSA;
- else if (keytype == CKK_DSA)
+ keys[n].keyclass = KMF_ASYM_PRI;
+ } else if (keytype == CKK_DSA) {
keys[n].keyalg = KMF_DSA;
- else if (keytype == CKK_AES)
+ keys[n].keyclass = KMF_ASYM_PRI;
+ } else if (keytype == CKK_AES) {
keys[n].keyalg = KMF_AES;
- else if (keytype == CKK_RC4)
+ keys[n].keyclass =
+ KMF_SYMMETRIC;
+ } else if (keytype == CKK_RC4) {
keys[n].keyalg = KMF_RC4;
- else if (keytype == CKK_DES)
+ keys[n].keyclass =
+ KMF_SYMMETRIC;
+ } else if (keytype == CKK_DES) {
keys[n].keyalg = KMF_DES;
- else if (keytype == CKK_DES3)
+ keys[n].keyclass =
+ KMF_SYMMETRIC;
+ } else if (keytype == CKK_DES3) {
keys[n].keyalg = KMF_DES3;
- else if (keytype == CKK_GENERIC_SECRET)
+ keys[n].keyclass =
+ KMF_SYMMETRIC;
+ } else if (keytype ==
+ CKK_GENERIC_SECRET) {
keys[n].keyalg =
KMF_GENERIC_SECRET;
+ keys[n].keyclass =
+ KMF_SYMMETRIC;
+ }
}
n++;
@@ -2495,21 +2752,30 @@ KMFPK11_FindKey(KMF_HANDLE_T handle, KMF_FINDKEY_PARAMS *parms,
/* "numkeys" indicates the number that were actually found */
*numkeys = n;
}
+
if (ckrv == KMF_OK && keys != NULL && (*numkeys) > 0) {
- if (parms->format == KMF_FORMAT_RAWKEY) {
- /* Convert keys to "rawkey" format */
- for (i = 0; i < (*numkeys); i++) {
- KMF_RAW_KEY_DATA *rkey = NULL;
- rv = keyObj2RawKey(handle, &keys[i], &rkey);
- if (rv == KMF_OK) {
- keys[i].keyp = rkey;
- keys[i].israw = TRUE;
- } else {
- break;
+ if ((rv = kmf_get_attr(KMF_ENCODE_FORMAT_ATTR, attrlist,
+ numattr, (void *)&format, NULL)) == KMF_OK) {
+ if (format == KMF_FORMAT_RAWKEY ||
+ format == KMF_FORMAT_PEM) {
+ /* Convert keys to "rawkey" format */
+ for (i = 0; i < (*numkeys); i++) {
+ KMF_RAW_KEY_DATA *rkey = NULL;
+ rv = keyObj2RawKey(handle, &keys[i],
+ &rkey);
+ if (rv == KMF_OK) {
+ keys[i].keyp = rkey;
+ keys[i].israw = TRUE;
+ } else {
+ break;
+ }
}
}
+ } else {
+ rv = KMF_OK; /* format is optional */
}
}
+
end:
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
@@ -2549,8 +2815,9 @@ convertDate(char *fulldate)
return ((char *)strdup(newtime));
}
-KMF_RETURN
-KMFPK11_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
+static KMF_RETURN
+store_raw_key(KMF_HANDLE_T handle,
+ KMF_ATTRIBUTE *attrlist, int numattr,
KMF_RAW_KEY_DATA *rawkey)
{
KMF_RETURN rv = KMF_OK;
@@ -2567,20 +2834,18 @@ KMFPK11_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
KMF_DATA subject = {NULL, 0};
KMF_X509EXT_KEY_USAGE kuext;
KMF_X509_CERTIFICATE *x509 = NULL;
- CK_BBOOL kufound;
+ CK_BBOOL kufound = B_FALSE;
+ KMF_DATA *cert = NULL;
char *notbefore = NULL, *start = NULL;
char *notafter = NULL, *end = NULL;
+ char *keylabel = NULL;
- if (!kmfh)
+ if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL || params->certificate == NULL ||
- rawkey == NULL)
- return (KMF_ERR_BAD_PARAMETER);
-
if (rawkey->keytype == KMF_RSA)
keytype = CKK_RSA;
else if (rawkey->keytype == KMF_DSA)
@@ -2588,57 +2853,77 @@ KMFPK11_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
else
return (KMF_ERR_BAD_PARAMETER);
- rv = pk11_authenticate(handle, &params->cred);
- if (rv != KMF_OK) {
- return (rv);
- }
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
- id.Data = NULL;
- id.Length = 0;
- rv = KMF_GetCertIDData(params->certificate, &id);
- if (rv != KMF_OK) {
- goto cleanup;
- }
+ i = 0;
+ SETATTR(templ, i, CKA_CLASS, &oClass, sizeof (CK_OBJECT_CLASS)); i++;
+ SETATTR(templ, i, CKA_KEY_TYPE, &keytype, sizeof (keytype)); i++;
+ SETATTR(templ, i, CKA_TOKEN, &cktrue, sizeof (cktrue)); i++;
+ SETATTR(templ, i, CKA_PRIVATE, &cktrue, sizeof (cktrue)); i++;
+ SETATTR(templ, i, CKA_DECRYPT, &cktrue, sizeof (cktrue)); i++;
- rv = DerDecodeSignedCertificate(
- (const KMF_DATA *)params->certificate, &x509);
- if (rv != KMF_OK) {
- goto cleanup;
- }
+ cert = kmf_get_attr_ptr(KMF_CERT_DATA_ATTR, attrlist, numattr);
+ if (cert != NULL) {
+ id.Data = NULL;
+ id.Length = 0;
+ rv = kmf_get_cert_id_data(cert, &id);
+ if (rv != KMF_OK) {
+ goto cleanup;
+ }
- rv = DerEncodeName(&x509->certificate.subject, &subject);
- if (rv != KMF_OK) {
- goto cleanup;
- }
+ rv = DerDecodeSignedCertificate((const KMF_DATA *)cert, &x509);
+ if (rv != KMF_OK) {
+ goto cleanup;
+ }
- rv = KMF_GetCertStartDateString(handle, params->certificate,
- &notbefore);
- if (rv != KMF_OK) {
- goto cleanup;
- }
- start = convertDate(notbefore);
+ rv = DerEncodeName(&x509->certificate.subject, &subject);
+ if (rv != KMF_OK) {
+ goto cleanup;
+ }
+ SETATTR(templ, i, CKA_SUBJECT, subject.Data, subject.Length);
+ i++;
- rv = KMF_GetCertEndDateString(handle, params->certificate,
- &notafter);
- if (rv != KMF_OK) {
- goto cleanup;
- }
- end = convertDate(notafter);
+ rv = kmf_get_cert_start_date_str(handle, cert, &notbefore);
+ if (rv != KMF_OK) {
+ goto cleanup;
+ }
+ start = convertDate(notbefore);
- if ((rv = KMF_GetCertKeyUsageExt(params->certificate, &kuext))
- != KMF_OK && rv != KMF_ERR_EXTENSION_NOT_FOUND)
- goto cleanup;
+ rv = kmf_get_cert_end_date_str(handle, cert, &notafter);
+ if (rv != KMF_OK) {
+ goto cleanup;
+ }
+ end = convertDate(notafter);
+ if (id.Data != NULL && id.Data != NULL && id.Length > 0) {
+ SETATTR(templ, i, CKA_ID, id.Data, id.Length);
+ i++;
+ }
+ if (start != NULL) {
+ /*
+ * This makes some potentially dangerous assumptions:
+ * 1. that the startdate in the parameter block is
+ * properly formatted as YYYYMMDD
+ * 2. That the CK_DATE structure is always the same.
+ */
+ (void) memcpy(&startdate, start, sizeof (CK_DATE));
+ SETATTR(templ, i, CKA_START_DATE, &startdate,
+ sizeof (startdate));
+ i++;
+ }
+ if (end != NULL) {
+ (void) memcpy(&enddate, end, sizeof (CK_DATE));
+ SETATTR(templ, i, CKA_END_DATE, &enddate,
+ sizeof (enddate));
+ i++;
+ }
- kufound = (rv == KMF_OK);
- rv = KMF_OK; /* reset if we got KMF_ERR_EXTENSION_NOT_FOUND above */
+ if ((rv = kmf_get_cert_ku(cert, &kuext)) != KMF_OK &&
+ rv != KMF_ERR_EXTENSION_NOT_FOUND)
+ goto cleanup;
- i = 0;
- SETATTR(templ, i, CKA_CLASS, &oClass, sizeof (CK_OBJECT_CLASS)); i++;
- SETATTR(templ, i, CKA_KEY_TYPE, &keytype, sizeof (keytype)); i++;
- SETATTR(templ, i, CKA_TOKEN, &cktrue, sizeof (cktrue)); i++;
- SETATTR(templ, i, CKA_PRIVATE, &cktrue, sizeof (cktrue)); i++;
- SETATTR(templ, i, CKA_SUBJECT, subject.Data, subject.Length); i++;
- SETATTR(templ, i, CKA_DECRYPT, &cktrue, sizeof (cktrue)); i++;
+ kufound = (rv == KMF_OK);
+ rv = KMF_OK; /* reset if we got KMF_ERR_EXTENSION_NOT_FOUND */
+ }
/*
* Only set the KeyUsage stuff if the KU extension was present.
@@ -2647,110 +2932,90 @@ KMFPK11_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
CK_BBOOL condition;
condition = (kuext.KeyUsageBits & KMF_keyEncipherment) ?
- B_TRUE : B_FALSE;
- SETATTR(templ, i, CKA_UNWRAP, &condition,
- sizeof (CK_BBOOL)); i++;
+ B_TRUE : B_FALSE;
+ SETATTR(templ, i, CKA_UNWRAP, &condition, sizeof (CK_BBOOL));
+ i++;
condition = (kuext.KeyUsageBits & KMF_dataEncipherment) ?
- B_TRUE : B_FALSE;
- SETATTR(templ, i, CKA_DECRYPT, &condition,
- sizeof (CK_BBOOL)); i++;
+ B_TRUE : B_FALSE;
+ SETATTR(templ, i, CKA_DECRYPT, &condition, sizeof (CK_BBOOL));
+ i++;
condition = (kuext.KeyUsageBits & KMF_digitalSignature) ?
- B_TRUE : B_FALSE;
- SETATTR(templ, i, CKA_SIGN, &condition,
- sizeof (CK_BBOOL)); i++;
+ B_TRUE : B_FALSE;
+ SETATTR(templ, i, CKA_SIGN, &condition, sizeof (CK_BBOOL));
+ i++;
condition = (kuext.KeyUsageBits & KMF_digitalSignature) ?
- B_TRUE : B_FALSE;
+ B_TRUE : B_FALSE;
SETATTR(templ, i, CKA_SIGN_RECOVER, &condition,
- sizeof (CK_BBOOL)); i++;
- }
- if (params->label != NULL) {
- SETATTR(templ, i, CKA_LABEL, params->label,
- strlen(params->label));
- i++;
- }
- if (id.Data != NULL &&
- id.Data != NULL && id.Length > 0) {
- SETATTR(templ, i, CKA_ID, id.Data, id.Length);
- i++;
- }
- if (start != NULL) {
- /*
- * This make some potentially dangerous assumptions:
- * 1. that the startdate in the parameter block is
- * properly formatted as YYYYMMDD
- * 2. That the CK_DATE structure is always the same.
- */
- (void) memcpy(&startdate, start, sizeof (CK_DATE));
- SETATTR(templ, i, CKA_START_DATE, &startdate,
- sizeof (startdate));
+ sizeof (CK_BBOOL));
i++;
+
}
- if (end != NULL) {
- (void) memcpy(&enddate, end, sizeof (CK_DATE));
- SETATTR(templ, i, CKA_END_DATE, &enddate, sizeof (enddate));
+
+ if (keylabel != NULL) {
+ SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
i++;
}
if (keytype == CKK_RSA) {
SETATTR(templ, i, CKA_MODULUS,
- rawkey->rawdata.rsa.mod.val,
- rawkey->rawdata.rsa.mod.len);
+ rawkey->rawdata.rsa.mod.val,
+ rawkey->rawdata.rsa.mod.len);
i++;
SETATTR(templ, i, CKA_PUBLIC_EXPONENT,
- rawkey->rawdata.rsa.pubexp.val,
- rawkey->rawdata.rsa.pubexp.len);
+ rawkey->rawdata.rsa.pubexp.val,
+ rawkey->rawdata.rsa.pubexp.len);
i++;
if (rawkey->rawdata.rsa.priexp.val != NULL) {
SETATTR(templ, i, CKA_PRIVATE_EXPONENT,
- rawkey->rawdata.rsa.priexp.val,
- rawkey->rawdata.rsa.priexp.len);
+ rawkey->rawdata.rsa.priexp.val,
+ rawkey->rawdata.rsa.priexp.len);
i++;
}
if (rawkey->rawdata.rsa.prime1.val != NULL) {
SETATTR(templ, i, CKA_PRIME_1,
- rawkey->rawdata.rsa.prime1.val,
- rawkey->rawdata.rsa.prime1.len);
+ rawkey->rawdata.rsa.prime1.val,
+ rawkey->rawdata.rsa.prime1.len);
i++;
}
if (rawkey->rawdata.rsa.prime2.val != NULL) {
SETATTR(templ, i, CKA_PRIME_2,
- rawkey->rawdata.rsa.prime2.val,
- rawkey->rawdata.rsa.prime2.len);
+ rawkey->rawdata.rsa.prime2.val,
+ rawkey->rawdata.rsa.prime2.len);
i++;
}
if (rawkey->rawdata.rsa.exp1.val != NULL) {
SETATTR(templ, i, CKA_EXPONENT_1,
- rawkey->rawdata.rsa.exp1.val,
- rawkey->rawdata.rsa.exp1.len);
+ rawkey->rawdata.rsa.exp1.val,
+ rawkey->rawdata.rsa.exp1.len);
i++;
}
if (rawkey->rawdata.rsa.exp2.val != NULL) {
SETATTR(templ, i, CKA_EXPONENT_2,
- rawkey->rawdata.rsa.exp2.val,
- rawkey->rawdata.rsa.exp2.len);
+ rawkey->rawdata.rsa.exp2.val,
+ rawkey->rawdata.rsa.exp2.len);
i++;
}
if (rawkey->rawdata.rsa.coef.val != NULL) {
SETATTR(templ, i, CKA_COEFFICIENT,
- rawkey->rawdata.rsa.coef.val,
- rawkey->rawdata.rsa.coef.len);
+ rawkey->rawdata.rsa.coef.val,
+ rawkey->rawdata.rsa.coef.len);
i++;
}
} else {
SETATTR(templ, i, CKA_PRIME,
- rawkey->rawdata.dsa.prime.val,
- rawkey->rawdata.dsa.prime.len);
+ rawkey->rawdata.dsa.prime.val,
+ rawkey->rawdata.dsa.prime.len);
i++;
SETATTR(templ, i, CKA_SUBPRIME,
- rawkey->rawdata.dsa.subprime.val,
- rawkey->rawdata.dsa.subprime.len);
+ rawkey->rawdata.dsa.subprime.val,
+ rawkey->rawdata.dsa.subprime.len);
i++;
SETATTR(templ, i, CKA_BASE,
- rawkey->rawdata.dsa.base.val,
- rawkey->rawdata.dsa.base.len);
+ rawkey->rawdata.dsa.base.val,
+ rawkey->rawdata.dsa.base.len);
i++;
SETATTR(templ, i, CKA_VALUE,
- rawkey->rawdata.dsa.value.val,
- rawkey->rawdata.dsa.value.len);
+ rawkey->rawdata.dsa.value.val,
+ rawkey->rawdata.dsa.value.len);
i++;
}
@@ -2770,17 +3035,17 @@ KMFPK11_StorePrivateKey(KMF_HANDLE_T handle, KMF_STOREKEY_PARAMS *params,
rv = KMF_ERR_INTERNAL;
}
cleanup:
- KMF_FreeData(&id);
- KMF_FreeData(&subject);
- KMF_FreeSignedCert(x509);
+ kmf_free_data(&id);
+ kmf_free_data(&subject);
+ kmf_free_signed_cert(x509);
free(x509);
return (rv);
}
KMF_RETURN
-KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
- KMF_KEY_HANDLE *symkey)
+KMFPK11_CreateSymKey(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -2794,7 +3059,17 @@ KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
CK_BBOOL true = TRUE;
CK_BBOOL false = FALSE;
CK_ATTRIBUTE templ[15];
- int i;
+ CK_BYTE *keydata = NULL;
+ int i = 0;
+ KMF_KEY_HANDLE *symkey;
+ KMF_KEY_ALG keytype;
+ uint32_t keylen = 0;
+ uint32_t attrkeylen = 0;
+ uint32_t keylen_size = sizeof (uint32_t);
+ char *keylabel = NULL;
+ KMF_CREDENTIAL cred;
+ uint32_t is_sensitive = B_FALSE;
+ uint32_t is_not_extractable = B_FALSE;
if (kmfh == NULL)
return (KMF_ERR_UNINITIALIZED);
@@ -2802,8 +3077,29 @@ KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
if (kmfh->pk11handle == CK_INVALID_HANDLE)
return (KMF_ERR_NO_TOKEN_SELECTED);
- if (params == NULL)
+ symkey = kmf_get_attr_ptr(KMF_KEY_HANDLE_ATTR, attrlist, numattr);
+ if (symkey == NULL)
return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_KEYALG_ATTR, attrlist, numattr,
+ (void *)&keytype, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+ if (keylabel == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_SENSITIVE_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_sensitive, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_NON_EXTRACTABLE_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_not_extractable, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
/*
* For AES, RC4, DES and 3DES, call C_GenerateKey() to create a key.
*
@@ -2811,68 +3107,115 @@ KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
* C_GenerateKey() for some PKCS11 providers, we will handle it
* differently.
*/
- if (params->keytype == KMF_GENERIC_SECRET) {
- rv = create_generic_secret_key(handle, params, &keyhandle);
+ if (keytype == KMF_GENERIC_SECRET) {
+ rv = create_generic_secret_key(handle, numattr,
+ attrlist, &keyhandle);
if (rv != KMF_OK)
goto out;
else
goto setup;
}
+ rv = kmf_get_attr(KMF_KEY_DATA_ATTR, attrlist, numattr,
+ NULL, &attrkeylen);
+ if (rv == KMF_OK && attrkeylen > 0) {
+ keydata = kmf_get_attr_ptr(KMF_KEY_DATA_ATTR, attrlist,
+ numattr);
+ } else {
+ keydata = NULL;
+ attrkeylen = 0;
+ rv = KMF_OK;
+ }
+ if (keydata != NULL) {
+ if (keytype == KMF_DES && attrkeylen != 8) {
+ rv = KMF_ERR_BAD_KEY_SIZE;
+ goto out;
+ }
+ if (keytype == KMF_DES3 && attrkeylen != 24) {
+ rv = KMF_ERR_BAD_KEY_SIZE;
+ goto out;
+ }
+ /*
+ * This may override what the user gave on the
+ * command line.
+ */
+ keylen = attrkeylen * 8; /* bytes to bits */
+ } else {
+ /*
+ * If keydata was not given, key length must be
+ * provided.
+ */
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
+ &keylen, &keylen_size);
+ if (rv == KMF_ERR_ATTR_NOT_FOUND &&
+ (keytype == KMF_DES || keytype == KMF_DES3))
+ /* keylength is not required for DES and 3DES */
+ rv = KMF_OK;
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+ }
+
+ if ((keylen % 8) != 0) {
+ return (KMF_ERR_BAD_KEY_SIZE);
+ }
+ secKeyLen = keylen / 8; /* in bytes for RC4/AES */
+
+ /*
+ * Only set CKA_VALUE_LEN if the key data was not given and
+ * we are creating an RC4 or AES key.
+ */
+ if (keydata == NULL &&
+ (keytype == KMF_AES || keytype == KMF_RC4)) {
+ SETATTR(templ, i, CKA_VALUE_LEN, &secKeyLen,
+ sizeof (secKeyLen));
+ i++;
+ }
+
/* Other keytypes */
keyGenMech.pParameter = NULL_PTR;
keyGenMech.ulParameterLen = 0;
- switch (params->keytype) {
- case KMF_AES:
- keyGenMech.mechanism = CKM_AES_KEY_GEN;
- secKeyType = CKK_AES;
- break;
- case KMF_RC4:
- keyGenMech.mechanism = CKM_RC4_KEY_GEN;
- secKeyType = CKK_RC4;
- break;
- case KMF_DES:
- keyGenMech.mechanism = CKM_DES_KEY_GEN;
- secKeyType = CKK_DES;
- break;
- case KMF_DES3:
- keyGenMech.mechanism = CKM_DES3_KEY_GEN;
- secKeyType = CKK_DES3;
- break;
- default:
- return (KMF_ERR_BAD_KEY_TYPE);
+ switch (keytype) {
+ case KMF_AES:
+ keyGenMech.mechanism = CKM_AES_KEY_GEN;
+ secKeyType = CKK_AES;
+ break;
+ case KMF_RC4:
+ keyGenMech.mechanism = CKM_RC4_KEY_GEN;
+ secKeyType = CKK_RC4;
+ break;
+ case KMF_DES:
+ keyGenMech.mechanism = CKM_DES_KEY_GEN;
+ secKeyType = CKK_DES;
+ break;
+ case KMF_DES3:
+ keyGenMech.mechanism = CKM_DES3_KEY_GEN;
+ secKeyType = CKK_DES3;
+ break;
+ default:
+ return (KMF_ERR_BAD_KEY_TYPE);
+ }
+ if (keydata != NULL) {
+ SETATTR(templ, i, CKA_VALUE, keydata, secKeyLen);
+ i++;
}
-
- i = 0;
SETATTR(templ, i, CKA_CLASS, &class, sizeof (class));
i++;
SETATTR(templ, i, CKA_KEY_TYPE, &secKeyType, sizeof (secKeyType));
i++;
- if (params->keytype == KMF_AES || params->keytype == KMF_RC4) {
- if ((params->keylength % 8) != 0) {
- return (KMF_ERR_BAD_KEY_SIZE);
- }
- secKeyLen = params->keylength/8; /* in bytes for RC4/AES */
- SETATTR(templ, i, CKA_VALUE_LEN, &secKeyLen,
- sizeof (secKeyLen));
+ if (keylabel != NULL) {
+ SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
i++;
}
- if (params->keylabel != NULL) {
- SETATTR(templ, i, CKA_LABEL, params->keylabel,
- strlen(params->keylabel));
- i++;
- }
-
- if (params->pkcs11parms.sensitive == B_TRUE) {
+ if (is_sensitive == B_TRUE) {
SETATTR(templ, i, CKA_SENSITIVE, &true, sizeof (true));
} else {
SETATTR(templ, i, CKA_SENSITIVE, &false, sizeof (false));
}
i++;
- if (params->pkcs11parms.not_extractable == B_TRUE) {
+ if (is_not_extractable == B_TRUE) {
SETATTR(templ, i, CKA_EXTRACTABLE, &false, sizeof (false));
} else {
SETATTR(templ, i, CKA_EXTRACTABLE, &true, sizeof (true));
@@ -2892,12 +3235,23 @@ KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
SETATTR(templ, i, CKA_VERIFY, &true, sizeof (true));
i++;
- rv = pk11_authenticate(handle, &params->cred);
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = pk11_authenticate(handle, &cred);
if (rv != KMF_OK) {
return (rv);
}
- ckrv = C_GenerateKey(hSession, &keyGenMech, templ, i, &keyhandle);
+ /* If the key data was given, use C_CreateObject */
+ if (keydata != NULL) {
+ ckrv = C_CreateObject(hSession, templ, i, &keyhandle);
+ } else {
+ ckrv = C_GenerateKey(hSession, &keyGenMech, templ, i,
+ &keyhandle);
+ }
if (ckrv != CKR_OK) {
SET_ERROR(kmfh, ckrv);
rv = KMF_ERR_KEYGEN_FAILED;
@@ -2906,7 +3260,7 @@ KMFPK11_CreateSymKey(KMF_HANDLE_T handle, KMF_CREATESYMKEY_PARAMS *params,
setup:
symkey->kstype = KMF_KEYSTORE_PK11TOKEN;
- symkey->keyalg = params->keytype;
+ symkey->keyalg = keytype;
symkey->keyclass = KMF_SYMMETRIC;
symkey->israw = FALSE;
symkey->keyp = (void *)keyhandle;
@@ -2915,7 +3269,6 @@ out:
return (rv);
}
-
KMF_RETURN
KMFPK11_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
KMF_RAW_SYM_KEY *rkey)
@@ -2934,19 +3287,29 @@ KMFPK11_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
else if (symkey->keyclass != KMF_SYMMETRIC)
return (KMF_ERR_BAD_KEY_CLASS);
+ /*
+ * If the key is already in "raw" format, copy the data
+ * to the new record if possible.
+ */
if (symkey->israw) {
KMF_RAW_KEY_DATA *rawkey = (KMF_RAW_KEY_DATA *)symkey->keyp;
- if (rawkey == NULL ||
- rawkey->rawdata.sym.keydata.val == NULL ||
- rawkey->rawdata.sym.keydata.len == 0)
+ if (rawkey == NULL)
return (KMF_ERR_BAD_KEYHANDLE);
+ if (rawkey->sensitive)
+ return (KMF_ERR_SENSITIVE_KEY);
+ if (rawkey->not_extractable)
+ return (KMF_ERR_UNEXTRACTABLE_KEY);
+
+ if (rawkey->rawdata.sym.keydata.val == NULL ||
+ rawkey->rawdata.sym.keydata.len == 0)
+ return (KMF_ERR_GETKEYVALUE_FAILED);
rkey->keydata.len = rawkey->rawdata.sym.keydata.len;
if ((rkey->keydata.val = malloc(rkey->keydata.len)) == NULL)
return (KMF_ERR_MEMORY);
(void) memcpy(rkey->keydata.val,
- rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
+ rawkey->rawdata.sym.keydata.val, rkey->keydata.len);
} else {
rv = get_raw_sym(kmfh, (CK_OBJECT_HANDLE)symkey->keyp, rkey);
}
@@ -2955,20 +3318,50 @@ KMFPK11_GetSymKeyValue(KMF_HANDLE_T handle, KMF_KEY_HANDLE *symkey,
}
KMF_RETURN
-KMFPK11_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
- KMF_CREDENTIAL *newpin)
+KMFPK11_SetTokenPin(KMF_HANDLE_T handle,
+ int numattr, KMF_ATTRIBUTE *attrlist)
{
KMF_RETURN ret = KMF_OK;
CK_RV rv = CKR_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
CK_SESSION_HANDLE session = NULL;
+ KMF_CREDENTIAL oldcred = {NULL, 0};
+ KMF_CREDENTIAL newcred = {NULL, 0};
+ CK_SLOT_ID slotid;
+
+ if (handle == NULL || attrlist == NULL || numattr == 0)
+ return (KMF_ERR_BAD_PARAMETER);
- if (handle == NULL || params == NULL || newpin == NULL)
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attrlist, numattr,
+ (void *)&oldcred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_NEWPIN_ATTR, attrlist, numattr,
+ (void *)&newcred, NULL);
+ if (rv != KMF_OK)
return (KMF_ERR_BAD_PARAMETER);
- rv = C_OpenSession(params->pkcs11parms.slot,
- CKF_SERIAL_SESSION | CKF_RW_SESSION,
- NULL, NULL, &session);
+ rv = kmf_get_attr(KMF_SLOT_ID_ATTR, attrlist, numattr,
+ (void *)&slotid, NULL);
+ if (rv != KMF_OK) {
+ char *tokenlabel = NULL;
+ /*
+ * If a slot wasn't given, the user must pass
+ * a token label so we can find the slot here.
+ */
+ rv = kmf_get_string_attr(KMF_TOKEN_LABEL_ATTR, attrlist,
+ numattr, &tokenlabel);
+ if (rv != KMF_OK)
+ return (rv);
+
+ rv = kmf_pk11_token_lookup(handle, tokenlabel, &slotid);
+ if (rv != KMF_OK)
+ return (rv);
+ }
+
+ rv = C_OpenSession(slotid, CKF_SERIAL_SESSION | CKF_RW_SESSION,
+ NULL, NULL, &session);
if (rv != CKR_OK) {
SET_ERROR(kmfh, rv);
ret = KMF_ERR_UNINITIALIZED;
@@ -2976,8 +3369,8 @@ KMFPK11_SetTokenPin(KMF_HANDLE_T handle, KMF_SETPIN_PARAMS *params,
}
rv = C_SetPIN(session,
- (CK_BYTE *)params->cred.cred, params->cred.credlen,
- (CK_BYTE *)newpin->cred, newpin->credlen);
+ (CK_BYTE *)oldcred.cred, oldcred.credlen,
+ (CK_BYTE *)newcred.cred, newcred.credlen);
if (rv != CKR_OK) {
SET_ERROR(kmfh, rv);
@@ -3007,8 +3400,7 @@ create_pk11_session(CK_SESSION_HANDLE *sessionp, CK_MECHANISM_TYPE wanted_mech,
int i;
rv = C_Initialize(NULL);
- if ((rv != CKR_OK) &&
- (rv != CKR_CRYPTOKI_ALREADY_INITIALIZED)) {
+ if ((rv != CKR_OK) && (rv != CKR_CRYPTOKI_ALREADY_INITIALIZED)) {
kmf_rv = KMF_ERR_UNINITIALIZED;
goto out;
}
@@ -3038,7 +3430,7 @@ create_pk11_session(CK_SESSION_HANDLE *sessionp, CK_MECHANISM_TYPE wanted_mech,
}
if (i < pulCount) {
rv = C_OpenSession(pSlotList[i], CKF_SERIAL_SESSION,
- NULL, NULL, sessionp);
+ NULL, NULL, sessionp);
if (rv != CKR_OK) {
kmf_rv = KMF_ERR_UNINITIALIZED;
@@ -3072,20 +3464,20 @@ verify_data(KMF_HANDLE_T handle,
if (AlgorithmId == KMF_ALGID_NONE)
return (KMF_ERR_BAD_ALGORITHM);
- pAlgMap = PKCS_GetAlgorithmMap(KMF_ALGCLASS_SIGNATURE,
- AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId));
+ pAlgMap = pkcs_get_alg_map(KMF_ALGCLASS_SIGNATURE,
+ AlgorithmId, PKCS_GetDefaultSignatureMode(AlgorithmId));
if (!pAlgMap)
return (KMF_ERR_BAD_ALGORITHM);
ret = create_pk11_session(&ckSession, pAlgMap->pkcs_mechanism,
- CKF_VERIFY);
+ CKF_VERIFY);
if (ret != KMF_OK)
return (ret);
/* Fetch the verifying key */
ret = PKCS_AcquirePublicKeyHandle(ckSession, keyp,
- pAlgMap->key_type, &ckKeyHandle, &bTempKey);
+ pAlgMap->key_type, &ckKeyHandle, &bTempKey);
if (ret != KMF_OK) {
return (ret);
@@ -3104,11 +3496,9 @@ verify_data(KMF_HANDLE_T handle,
goto cleanup;
}
- ckRv = C_Verify(ckSession,
- (CK_BYTE *)data->Data,
- (CK_ULONG)data->Length,
- (CK_BYTE *)signed_data->Data,
- (CK_ULONG)signed_data->Length);
+ ckRv = C_Verify(ckSession, (CK_BYTE *)data->Data,
+ (CK_ULONG)data->Length, (CK_BYTE *)signed_data->Data,
+ (CK_ULONG)signed_data->Length);
if (ckRv != CKR_OK) {
SET_ERROR(kmfh, ckRv);
@@ -3150,7 +3540,7 @@ KMFPK11_VerifyDataWithCert(KMF_HANDLE_T handle,
/* If no algorithm specified, use the certs signature algorithm */
if (algid == KMF_ALGID_NONE) {
- algid = X509_AlgorithmOidToAlgId(CERT_ALG_OID(SignerCert));
+ algid = x509_algoid_to_algid(CERT_ALG_OID(SignerCert));
}
if (algid == KMF_ALGID_NONE) {
@@ -3161,7 +3551,7 @@ KMFPK11_VerifyDataWithCert(KMF_HANDLE_T handle,
cleanup:
if (SignerCert) {
- KMF_FreeSignedCert(SignerCert);
+ kmf_free_signed_cert(SignerCert);
free(SignerCert);
}
@@ -3170,7 +3560,7 @@ cleanup:
static KMF_RETURN
create_generic_secret_key(KMF_HANDLE_T handle,
- KMF_CREATESYMKEY_PARAMS *params, CK_OBJECT_HANDLE *key)
+ int numattr, KMF_ATTRIBUTE *attrlist, CK_OBJECT_HANDLE *key)
{
KMF_RETURN rv = KMF_OK;
KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
@@ -3185,45 +3575,90 @@ create_generic_secret_key(KMF_HANDLE_T handle,
int i;
int random_fd = -1;
int nread;
+ int freebuf = 0;
char *buf = NULL;
+ uint32_t keylen = 0, attrkeylen = 0;
+ char *keylabel = NULL;
+ KMF_CREDENTIAL *cred;
+ uint32_t is_sensitive, is_not_extractable;
- /*
- * Check the key size.
- */
- if ((params->keylength % 8) != 0) {
- return (KMF_ERR_BAD_KEY_SIZE);
+ keylabel = kmf_get_attr_ptr(KMF_KEYLABEL_ATTR, attrlist, numattr);
+ if (keylabel == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
+ if (cred == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_SENSITIVE_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_sensitive, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_NON_EXTRACTABLE_BOOL_ATTR, attrlist, numattr,
+ (void *)&is_not_extractable, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = kmf_get_attr(KMF_KEY_DATA_ATTR, attrlist, numattr,
+ NULL, &attrkeylen);
+ if (rv == KMF_OK && attrkeylen > 0) {
+ buf = kmf_get_attr_ptr(KMF_KEY_DATA_ATTR, attrlist,
+ numattr);
+ secKeyLen = attrkeylen;
} else {
- secKeyLen = params->keylength/8; /* in bytes */
+ buf = NULL;
+ rv = KMF_OK;
}
+ if (buf == NULL) {
+ /*
+ * If the key data was not given, key length must
+ * be provided.
+ */
+ rv = kmf_get_attr(KMF_KEYLENGTH_ATTR, attrlist, numattr,
+ &keylen, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
- /*
- * Generate a random number with the key size first.
- */
- buf = malloc(secKeyLen);
- if (buf == NULL)
- return (KMF_ERR_MEMORY);
+ /*
+ * Check the key size.
+ */
+ if ((keylen % 8) != 0) {
+ return (KMF_ERR_BAD_KEY_SIZE);
+ } else {
+ secKeyLen = keylen/8; /* in bytes */
+ }
- while ((random_fd = open(DEV_RANDOM, O_RDONLY)) < 0) {
- if (errno != EINTR)
- break;
- }
+ /*
+ * Generate a random number with the key size first.
+ */
+ buf = malloc(secKeyLen);
+ if (buf == NULL)
+ return (KMF_ERR_MEMORY);
- if (random_fd < 0) {
- rv = KMF_ERR_KEYGEN_FAILED;
- goto out;
- }
+ freebuf = 1;
+ while ((random_fd = open(DEV_RANDOM, O_RDONLY)) < 0) {
+ if (errno != EINTR)
+ break;
+ }
- nread = read(random_fd, buf, secKeyLen);
- if (nread <= 0 || nread != secKeyLen) {
- rv = KMF_ERR_KEYGEN_FAILED;
- goto out;
+ if (random_fd < 0) {
+ rv = KMF_ERR_KEYGEN_FAILED;
+ goto out;
+ }
+
+ nread = read(random_fd, buf, secKeyLen);
+ if (nread <= 0 || nread != secKeyLen) {
+ rv = KMF_ERR_KEYGEN_FAILED;
+ goto out;
+ }
}
/*
* Authenticate into the token and call C_CreateObject to generate
* a generic secret token key.
*/
- rv = pk11_authenticate(handle, &params->cred);
+ rv = pk11_authenticate(handle, cred);
if (rv != KMF_OK) {
goto out;
}
@@ -3236,20 +3671,19 @@ create_generic_secret_key(KMF_HANDLE_T handle,
SETATTR(templ, i, CKA_VALUE, buf, secKeyLen);
i++;
- if (params->keylabel != NULL) {
- SETATTR(templ, i, CKA_LABEL, params->keylabel,
- strlen(params->keylabel));
+ if (keylabel != NULL) {
+ SETATTR(templ, i, CKA_LABEL, keylabel, strlen(keylabel));
i++;
}
- if (params->pkcs11parms.sensitive == B_TRUE) {
+ if (is_sensitive == B_TRUE) {
SETATTR(templ, i, CKA_SENSITIVE, &true, sizeof (true));
} else {
SETATTR(templ, i, CKA_SENSITIVE, &false, sizeof (false));
}
i++;
- if (params->pkcs11parms.not_extractable == B_TRUE) {
+ if (is_not_extractable == B_TRUE) {
SETATTR(templ, i, CKA_EXTRACTABLE, &false, sizeof (false));
} else {
SETATTR(templ, i, CKA_EXTRACTABLE, &true, sizeof (true));
@@ -3270,7 +3704,7 @@ create_generic_secret_key(KMF_HANDLE_T handle,
}
out:
- if (buf != NULL)
+ if (buf != NULL && freebuf)
free(buf);
if (random_fd != -1)
@@ -3278,3 +3712,241 @@ out:
return (rv);
}
+
+KMF_RETURN
+KMFPK11_StoreKey(KMF_HANDLE_T handle,
+ int numattr,
+ KMF_ATTRIBUTE *attlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_CREDENTIAL cred = {NULL, 0};
+ KMF_KEY_HANDLE *key;
+ KMF_RAW_KEY_DATA *rawkey;
+ CK_BBOOL btrue = TRUE;
+ CK_ATTRIBUTE tokenattr[1];
+ CK_OBJECT_HANDLE newobj;
+ CK_RV ckrv;
+
+ if (kmfh == NULL)
+ return (KMF_ERR_UNINITIALIZED);
+
+ if (kmfh->pk11handle == CK_INVALID_HANDLE)
+ return (KMF_ERR_NO_TOKEN_SELECTED);
+
+ rv = kmf_get_attr(KMF_CREDENTIAL_ATTR, attlist, numattr,
+ (void *)&cred, NULL);
+ if (rv != KMF_OK)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ rv = pk11_authenticate(handle, &cred);
+ if (rv != KMF_OK)
+ return (rv);
+
+ key = kmf_get_attr_ptr(KMF_PUBKEY_HANDLE_ATTR, attlist, numattr);
+ if (key == NULL) {
+ key = kmf_get_attr_ptr(KMF_PRIVKEY_HANDLE_ATTR, attlist,
+ numattr);
+ if (key == NULL)
+ rawkey = kmf_get_attr_ptr(KMF_RAW_KEY_ATTR, attlist,
+ numattr);
+ }
+ if (key == NULL && rawkey == NULL)
+ return (KMF_ERR_ATTR_NOT_FOUND);
+
+ if (rawkey != NULL) {
+ rv = store_raw_key(handle, attlist, numattr, rawkey);
+ } else if (key && key->kstype == KMF_KEYSTORE_PK11TOKEN) {
+
+ SETATTR(tokenattr, 0, CKA_TOKEN, &btrue, sizeof (btrue));
+ /* Copy the key object to the token */
+ ckrv = C_CopyObject(kmfh->pk11handle,
+ (CK_OBJECT_HANDLE)key->keyp, tokenattr, 1, &newobj);
+ if (ckrv != CKR_OK) {
+ SET_ERROR(kmfh, ckrv);
+ return (KMF_ERR_INTERNAL);
+ }
+
+ /* Replace the object handle with the new token-based one */
+ ckrv = C_DestroyObject(kmfh->pk11handle,
+ (CK_OBJECT_HANDLE)key->keyp);
+ if (ckrv != CKR_OK) {
+ SET_ERROR(kmfh, ckrv);
+ return (KMF_ERR_INTERNAL);
+ }
+ key->keyp = (void *)newobj;
+ } else {
+ rv = KMF_ERR_BAD_PARAMETER;
+ }
+
+ return (rv);
+}
+
+
+KMF_RETURN
+KMFPK11_ExportPK12(KMF_HANDLE_T handle, int numattr, KMF_ATTRIBUTE *attrlist)
+{
+ KMF_RETURN rv = KMF_OK;
+ KMF_HANDLE *kmfh = (KMF_HANDLE *)handle;
+ KMF_CREDENTIAL *cred = NULL;
+ KMF_CREDENTIAL *p12cred = NULL;
+ char *filename = NULL;
+ KMF_X509_DER_CERT *certlist = NULL;
+ KMF_KEY_HANDLE *keylist = NULL;
+ uint32_t numcerts;
+ uint32_t numkeys;
+ char *certlabel = NULL;
+ char *issuer = NULL;
+ char *subject = NULL;
+ KMF_BIGINT *serial = NULL;
+ KMF_KEYSTORE_TYPE kstype = KMF_KEYSTORE_PK11TOKEN;
+ KMF_ATTRIBUTE fc_attrlist[16];
+ int i;
+
+ if (kmfh == NULL)
+ return (KMF_ERR_UNINITIALIZED); /* Plugin Not Initialized */
+
+ if (kmfh->pk11handle == CK_INVALID_HANDLE)
+ return (KMF_ERR_NO_TOKEN_SELECTED);
+
+ /* First get the required attributes */
+ cred = kmf_get_attr_ptr(KMF_CREDENTIAL_ATTR, attrlist, numattr);
+ if (cred == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ p12cred = kmf_get_attr_ptr(KMF_PK12CRED_ATTR, attrlist, numattr);
+ if (p12cred == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ filename = kmf_get_attr_ptr(KMF_OUTPUT_FILENAME_ATTR, attrlist,
+ numattr);
+ if (filename == NULL)
+ return (KMF_ERR_BAD_PARAMETER);
+
+ /* Find all the certificates that match the searching criteria */
+ i = 0;
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ i++;
+
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_COUNT_ATTR, &numcerts, sizeof (uint32_t));
+ i++;
+
+ certlabel = kmf_get_attr_ptr(KMF_CERT_LABEL_ATTR, attrlist, numattr);
+ if (certlabel != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_CERT_LABEL_ATTR, certlabel, strlen(certlabel));
+ i++;
+ }
+
+ issuer = kmf_get_attr_ptr(KMF_ISSUER_NAME_ATTR, attrlist, numattr);
+ if (issuer != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_ISSUER_NAME_ATTR, issuer, strlen(issuer));
+ i++;
+ }
+
+ subject = kmf_get_attr_ptr(KMF_SUBJECT_NAME_ATTR, attrlist, numattr);
+ if (subject != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_SUBJECT_NAME_ATTR, subject, strlen(subject));
+ i++;
+ }
+
+ serial = kmf_get_attr_ptr(KMF_BIGINT_ATTR, attrlist, numattr);
+ if (serial != NULL) {
+ kmf_set_attr_at_index(fc_attrlist, i,
+ KMF_BIGINT_ATTR, serial, sizeof (KMF_BIGINT));
+ i++;
+ }
+
+ rv = KMFPK11_FindCert(handle, i, fc_attrlist);
+
+ if (rv == KMF_OK && numcerts > 0) {
+ certlist = (KMF_X509_DER_CERT *)malloc(numcerts *
+ sizeof (KMF_X509_DER_CERT));
+ if (certlist == NULL)
+ return (KMF_ERR_MEMORY);
+
+ (void) memset(certlist, 0, numcerts *
+ sizeof (KMF_X509_DER_CERT));
+
+ kmf_set_attr_at_index(fc_attrlist, i, KMF_X509_DER_CERT_ATTR,
+ certlist, sizeof (KMF_X509_DER_CERT));
+ i++;
+
+ rv = kmf_find_cert(handle, i, fc_attrlist);
+ if (rv != KMF_OK) {
+ free(certlist);
+ return (rv);
+ }
+ } else {
+ return (rv);
+ }
+
+ /* For each certificate, find the matching private key */
+ numkeys = 0;
+ for (i = 0; i < numcerts; i++) {
+ KMF_ATTRIBUTE fk_attrlist[16];
+ int j = 0;
+ KMF_KEY_HANDLE newkey;
+ KMF_ENCODE_FORMAT format = KMF_FORMAT_RAWKEY;
+
+ kmf_set_attr_at_index(fk_attrlist, j,
+ KMF_KEYSTORE_TYPE_ATTR, &kstype, sizeof (kstype));
+ j++;
+
+ kmf_set_attr_at_index(fk_attrlist, j,
+ KMF_ENCODE_FORMAT_ATTR, &format, sizeof (format));
+ j++;
+
+ kmf_set_attr_at_index(fk_attrlist, j,
+ KMF_CREDENTIAL_ATTR, cred, sizeof (KMF_CREDENTIAL));
+ j++;
+
+ kmf_set_attr_at_index(fk_attrlist, j,
+ KMF_CERT_DATA_ATTR, &certlist[i].certificate,
+ sizeof (KMF_DATA));
+ j++;
+
+ kmf_set_attr_at_index(fk_attrlist, j,
+ KMF_KEY_HANDLE_ATTR, &newkey, sizeof (KMF_KEY_HANDLE));
+ j++;
+
+ rv = KMFPK11_FindPrikeyByCert(handle, j, fk_attrlist);
+ if (rv == KMF_OK) {
+ numkeys++;
+ keylist = realloc(keylist,
+ numkeys * sizeof (KMF_KEY_HANDLE));
+ if (keylist == NULL) {
+ rv = KMF_ERR_MEMORY;
+ goto out;
+ }
+ keylist[numkeys - 1] = newkey;
+ } else if (rv == KMF_ERR_KEY_NOT_FOUND) {
+ /* it is OK if a key is not found */
+ rv = KMF_OK;
+ }
+ }
+
+ if (rv != KMF_OK)
+ goto out;
+
+ rv = kmf_build_pk12(handle, numcerts, certlist, numkeys, keylist,
+ p12cred, filename);
+
+out:
+ if (certlist != NULL) {
+ for (i = 0; i < numcerts; i++)
+ kmf_free_kmf_cert(handle, &certlist[i]);
+ free(certlist);
+ }
+ if (keylist != NULL) {
+ for (i = 0; i < numkeys; i++)
+ kmf_free_kmf_key(handle, &keylist[i]);
+ free(keylist);
+ }
+
+ return (rv);
+}