aboutsummaryrefslogtreecommitdiffstats
path: root/smime/lib/e-cert.c
diff options
context:
space:
mode:
Diffstat (limited to 'smime/lib/e-cert.c')
-rw-r--r--smime/lib/e-cert.c162
1 files changed, 162 insertions, 0 deletions
diff --git a/smime/lib/e-cert.c b/smime/lib/e-cert.c
index 9563468de3..a8fa5879c2 100644
--- a/smime/lib/e-cert.c
+++ b/smime/lib/e-cert.c
@@ -55,10 +55,16 @@
*
*/
+#include <time.h>
+
+#include <libgnome/gnome-i18n.h>
+#include <gal/util/e-util.h> /* for e_utf8_strftime, what about e_time_format_time? */
+
#include "e-cert.h"
#include "e-cert-trust.h"
#include "pk11func.h"
#include "certdb.h"
+#include "hasht.h"
struct _ECertPrivate {
CERTCertificate *cert;
@@ -66,8 +72,24 @@ struct _ECertPrivate {
/* pointers we cache since the nss implementation allocs the
string */
char *org_name;
+ char *org_unit_name;
char *cn;
+ char *issuer_org_name;
+ char *issuer_org_unit_name;
+ char *issuer_cn;
+
+ PRTime issued_on;
+ PRTime expires_on;
+
+ char *issued_on_string;
+ char *expires_on_string;
+
+ char *serial_number;
+
+ char *sha1_fingerprint;
+ char *md5_fingerprint;
+
gboolean delete;
};
@@ -84,9 +106,30 @@ e_cert_dispose (GObject *object)
if (ec->priv->org_name)
PORT_Free (ec->priv->org_name);
+ if (ec->priv->org_unit_name)
+ PORT_Free (ec->priv->org_unit_name);
if (ec->priv->cn)
PORT_Free (ec->priv->cn);
+ if (ec->priv->issuer_org_name)
+ PORT_Free (ec->priv->issuer_org_name);
+ if (ec->priv->issuer_org_unit_name)
+ PORT_Free (ec->priv->issuer_org_unit_name);
+ if (ec->priv->issuer_cn)
+ PORT_Free (ec->priv->issuer_cn);
+
+ if (ec->priv->issued_on_string)
+ PORT_Free (ec->priv->issued_on_string);
+ if (ec->priv->expires_on_string)
+ PORT_Free (ec->priv->expires_on_string);
+ if (ec->priv->serial_number)
+ PORT_Free (ec->priv->serial_number);
+
+ if (ec->priv->sha1_fingerprint)
+ PORT_Free (ec->priv->sha1_fingerprint);
+ if (ec->priv->md5_fingerprint)
+ PORT_Free (ec->priv->md5_fingerprint);
+
if (ec->priv->delete) {
printf ("attempting to delete cert marked for deletion\n");
if (e_cert_get_cert_type (ec) == E_CERT_USER) {
@@ -154,8 +197,61 @@ static void
e_cert_populate (ECert *cert)
{
CERTCertificate *c = cert->priv->cert;
+ unsigned char fingerprint[20];
+ SECItem fpItem;
+
cert->priv->org_name = CERT_GetOrgName (&c->subject);
+ cert->priv->org_unit_name = CERT_GetOrgUnitName (&c->subject);
+
+ cert->priv->issuer_org_name = CERT_GetOrgName (&c->issuer);
+ cert->priv->issuer_org_unit_name = CERT_GetOrgUnitName (&c->issuer);
+
cert->priv->cn = CERT_GetCommonName (&c->subject);
+ cert->priv->issuer_cn = CERT_GetCommonName (&c->issuer);
+
+ if (SECSuccess == CERT_GetCertTimes (c, &cert->priv->issued_on, &cert->priv->expires_on)) {
+ PRExplodedTime explodedTime;
+ struct tm exploded_tm;
+ char buf[32];
+
+ PR_ExplodeTime (cert->priv->issued_on, PR_LocalTimeParameters, &explodedTime);
+ exploded_tm.tm_sec = explodedTime.tm_sec;
+ exploded_tm.tm_min = explodedTime.tm_min;
+ exploded_tm.tm_hour = explodedTime.tm_hour;
+ exploded_tm.tm_mday = explodedTime.tm_mday;
+ exploded_tm.tm_mon = explodedTime.tm_month;
+ exploded_tm.tm_year = explodedTime.tm_year - 1900;
+ e_utf8_strftime (buf, sizeof(buf), _("%d/%m/%Y"), &exploded_tm);
+ cert->priv->issued_on_string = g_strdup (buf);
+
+ PR_ExplodeTime (cert->priv->expires_on, PR_LocalTimeParameters, &explodedTime);
+ exploded_tm.tm_sec = explodedTime.tm_sec;
+ exploded_tm.tm_min = explodedTime.tm_min;
+ exploded_tm.tm_hour = explodedTime.tm_hour;
+ exploded_tm.tm_mday = explodedTime.tm_mday;
+ exploded_tm.tm_mon = explodedTime.tm_month;
+ exploded_tm.tm_year = explodedTime.tm_year - 1900;
+ e_utf8_strftime (buf, sizeof(buf), _("%d/%m/%Y"), &exploded_tm);
+ cert->priv->expires_on_string = g_strdup (buf);
+ }
+
+ cert->priv->serial_number = CERT_Hexify (&cert->priv->cert->serialNumber, TRUE);
+
+ memset(fingerprint, 0, sizeof fingerprint);
+ PK11_HashBuf(SEC_OID_SHA1, fingerprint,
+ cert->priv->cert->derCert.data,
+ cert->priv->cert->derCert.len);
+ fpItem.data = fingerprint;
+ fpItem.len = SHA1_LENGTH;
+ cert->priv->sha1_fingerprint = CERT_Hexify (&fpItem, TRUE);
+
+ memset(fingerprint, 0, sizeof fingerprint);
+ PK11_HashBuf(SEC_OID_MD5, fingerprint,
+ cert->priv->cert->derCert.data,
+ cert->priv->cert->derCert.len);
+ fpItem.data = fingerprint;
+ fpItem.len = MD5_LENGTH;
+ cert->priv->md5_fingerprint = CERT_Hexify (&fpItem, TRUE);
}
ECert*
@@ -230,6 +326,12 @@ e_cert_get_org (ECert *cert)
}
const char*
+e_cert_get_org_unit (ECert *cert)
+{
+ return cert->priv->org_unit_name;
+}
+
+const char*
e_cert_get_cn (ECert *cert)
{
return cert->priv->cn;
@@ -242,11 +344,71 @@ e_cert_get_issuer_name (ECert *cert)
}
const char*
+e_cert_get_issuer_cn (ECert *cert)
+{
+ return cert->priv->issuer_cn;
+}
+
+const char*
+e_cert_get_issuer_org (ECert *cert)
+{
+ return cert->priv->issuer_org_name;
+}
+
+const char*
+e_cert_get_issuer_org_unit (ECert *cert)
+{
+ return cert->priv->issuer_org_unit_name;
+}
+
+const char*
e_cert_get_subject_name (ECert *cert)
{
return cert->priv->cert->subjectName;
}
+PRTime
+e_cert_get_issued_on_time (ECert *cert)
+{
+ return cert->priv->issued_on;
+}
+
+const char*
+e_cert_get_issued_on (ECert *cert)
+{
+ return cert->priv->issued_on_string;
+}
+
+PRTime
+e_cert_get_expires_on_time (ECert *cert)
+{
+ return cert->priv->expires_on;
+}
+
+const char*
+e_cert_get_expires_on (ECert *cert)
+{
+ return cert->priv->expires_on_string;
+}
+
+const char*
+e_cert_get_serial_number (ECert *cert)
+{
+ return cert->priv->serial_number;
+}
+
+const char*
+e_cert_get_sha1_fingerprint (ECert *cert)
+{
+ return cert->priv->sha1_fingerprint;
+}
+
+const char*
+e_cert_get_md5_fingerprint (ECert *cert)
+{
+ return cert->priv->md5_fingerprint;
+}
+
gboolean
e_cert_mark_for_deletion (ECert *cert)
{