diff options
author | David Woodhouse <David.Woodhouse@intel.com> | 2016-08-15 16:28:17 +0100 |
---|---|---|
committer | David Woodhouse <David.Woodhouse@intel.com> | 2016-08-15 16:28:17 +0100 |
commit | 7d0a125f5b3d4db5925905b40ae5fe220374664d (patch) | |
tree | b285c572f86ecb59551c55eb90b8a1242bfb85b7 | |
parent | 659caa4bbee18dc4ca8912b9c9654dbf015f79d3 (diff) | |
download | nss-hg-7d0a125f5b3d4db5925905b40ae5fe220374664d.tar.gz |
Bug 1162897, Add PK11_GetTokenURI() and use it from certutil, r=rrelyea
-rw-r--r-- | cmd/certutil/certutil.c | 3 | ||||
-rw-r--r-- | lib/nss/nss.def | 1 | ||||
-rw-r--r-- | lib/pk11wrap/pk11pub.h | 1 | ||||
-rw-r--r-- | lib/pk11wrap/pk11slot.c | 58 |
4 files changed, 63 insertions, 0 deletions
diff --git a/cmd/certutil/certutil.c b/cmd/certutil/certutil.c index 24acdbcb4..fbc752c1b 100644 --- a/cmd/certutil/certutil.c +++ b/cmd/certutil/certutil.c @@ -1002,9 +1002,12 @@ ListModules(void) /* look at each slot*/ for (le = list->head; le; le = le->next) { + char *token_uri = PK11_GetTokenURI(le->slot); printf("\n"); printf(" slot: %s\n", PK11_GetSlotName(le->slot)); printf(" token: %s\n", PK11_GetTokenName(le->slot)); + printf(" uri: %s\n", token_uri); + PORT_Free(token_uri); } PK11_FreeSlotList(list); diff --git a/lib/nss/nss.def b/lib/nss/nss.def index e84260d7c..f52237b05 100644 --- a/lib/nss/nss.def +++ b/lib/nss/nss.def @@ -1108,6 +1108,7 @@ PK11_HasAttributeSet; ;+ global: CERT_GetCertIsPerm; CERT_GetCertIsTemp; +PK11_GetTokenURI; ;+ local: ;+ *; ;+}; diff --git a/lib/pk11wrap/pk11pub.h b/lib/pk11wrap/pk11pub.h index 3bef897a4..b31865082 100644 --- a/lib/pk11wrap/pk11pub.h +++ b/lib/pk11wrap/pk11pub.h @@ -76,6 +76,7 @@ PRBool PK11_IsReadOnly(PK11SlotInfo *slot); PRBool PK11_IsInternal(PK11SlotInfo *slot); PRBool PK11_IsInternalKeySlot(PK11SlotInfo *slot); char *PK11_GetTokenName(PK11SlotInfo *slot); +char *PK11_GetTokenURI(PK11SlotInfo *slot); char *PK11_GetSlotName(PK11SlotInfo *slot); PRBool PK11_NeedLogin(PK11SlotInfo *slot); PRBool PK11_IsFriendly(PK11SlotInfo *slot); diff --git a/lib/pk11wrap/pk11slot.c b/lib/pk11wrap/pk11slot.c index cc8d42697..7efe9c3c4 100644 --- a/lib/pk11wrap/pk11slot.c +++ b/lib/pk11wrap/pk11slot.c @@ -18,6 +18,7 @@ #include "dev3hack.h" #include "pkim.h" #include "utilpars.h" +#include "pkcs11uri.h" /************************************************************* * local static and global data @@ -1688,6 +1689,63 @@ PK11_GetTokenName(PK11SlotInfo *slot) } char * +PK11_GetTokenURI(PK11SlotInfo *slot) +{ + PK11URI *uri; + char *ret = NULL; + char label[32 + 1], manufacturer[32 + 1], serial[16 + 1], model[16 + 1]; + PK11URIAttribute attrs[4]; + size_t nattrs = 0; + + PK11_MakeString(NULL, label, (char *)slot->tokenInfo.label, + sizeof(slot->tokenInfo.label)); + if (*label != '\0') { + attrs[nattrs].name = PK11URI_PATTR_TOKEN; + attrs[nattrs].value = label; + nattrs++; + } + + PK11_MakeString(NULL, manufacturer, (char *)slot->tokenInfo.manufacturerID, + sizeof(slot->tokenInfo.manufacturerID)); + if (*manufacturer != '\0') { + attrs[nattrs].name = PK11URI_PATTR_MANUFACTURER; + attrs[nattrs].value = manufacturer; + nattrs++; + } + + PK11_MakeString(NULL, serial, (char *)slot->tokenInfo.serialNumber, + sizeof(slot->tokenInfo.serialNumber)); + if (*serial != '\0') { + attrs[nattrs].name = PK11URI_PATTR_SERIAL; + attrs[nattrs].value = serial; + nattrs++; + } + + PK11_MakeString(NULL, model, (char *)slot->tokenInfo.model, + sizeof(slot->tokenInfo.model)); + if (*model != '\0') { + attrs[nattrs].name = PK11URI_PATTR_MODEL; + attrs[nattrs].value = model; + nattrs++; + } + + uri = PK11URI_CreateURI(attrs, nattrs, NULL, 0); + if (uri == NULL) { + PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); + return NULL; + } + + ret = PK11URI_FormatURI(NULL, uri); + PK11URI_DestroyURI(uri); + + if (ret == NULL) { + PORT_SetError(SEC_ERROR_LIBRARY_FAILURE); + } + + return ret; +} + +char * PK11_GetSlotName(PK11SlotInfo *slot) { return slot->slot_name; |