Blame egg/egg-oid.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/* egg-oid.c - OID helper routines
Packit b00eeb
Packit b00eeb
   Copyright (C) 2007 Stefan Walter
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stef@memberwebs.com>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "egg-oid.h"
Packit b00eeb
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
#include <glib/gi18n-lib.h>
Packit b00eeb
Packit b00eeb
typedef struct _OidInfo {
Packit b00eeb
	GQuark oid;
Packit b00eeb
	const gchar *oidstr;
Packit b00eeb
	const gchar *attr;
Packit b00eeb
	const gchar *description;
Packit b00eeb
	guint flags;
Packit b00eeb
} OidInfo;
Packit b00eeb
Packit b00eeb
static OidInfo oid_info[] = {
Packit b00eeb
	{ 0, "0.9.2342.19200300.100.1.25", "DC", N_("Domain Component"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "0.9.2342.19200300.100.1.1", "UID", N_("User ID"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
Packit b00eeb
	{ 0, "1.2.840.113549.1.9.1", "EMAIL", N_("Email Address"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "1.2.840.113549.1.9.7", NULL, NULL,
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
Packit b00eeb
	{ 0, "1.2.840.113549.1.9.20", NULL, NULL,
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.9.1", "dateOfBirth", N_("Date of Birth"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.9.2", "placeOfBirth", N_("Place of Birth"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.9.3", "gender", N_("Gender"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.9.4", "countryOfCitizenship", N_("Country of Citizenship"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.9.5", "countryOfResidence", N_("Country of Residence"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
Packit b00eeb
	{ 0, "2.5.4.3", "CN", N_("Common Name"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.4", "surName", N_("Surname"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.5", "serialNumber", N_("Serial Number"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "2.5.4.6", "C", N_("Country"),
Packit b00eeb
		EGG_OID_PRINTABLE, },
Packit b00eeb
	{ 0, "2.5.4.7", "L", N_("Locality"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.8", "ST", N_("State"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.9", "STREET", N_("Street"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.10", "O", N_("Organization"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.11", "OU", N_("Organizational Unit"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.12", "T", N_("Title"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.20", "telephoneNumber", N_("Telephone Number"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "2.5.4.42", "givenName", N_("Given Name"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.43", "initials", N_("Initials"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.44", "generationQualifier", N_("Generation Qualifier"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
	{ 0, "2.5.4.46", "dnQualifier", N_("DN Qualifier"),
Packit b00eeb
		EGG_OID_PRINTABLE },
Packit b00eeb
	{ 0, "2.5.4.65", "pseudonym", N_("Pseudonym"),
Packit b00eeb
		EGG_OID_PRINTABLE | EGG_OID_IS_CHOICE },
Packit b00eeb
Packit b00eeb
	{ 0, "1.2.840.113549.1.1.1", "rsaEncryption", N_("RSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.113549.1.1.2", "md2WithRSAEncryption", N_("MD2 with RSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.113549.1.1.4", "md5WithRSAEncryption", N_("MD5 with RSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.113549.1.1.5", "sha1WithRSAEncryption", N_("SHA1 with RSA"), 0 },
Packit b00eeb
Packit b00eeb
	{ 0, "1.2.840.10040.4.1", "dsa", N_("DSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.10040.4.3", "sha1WithDSA", N_("SHA1 with DSA"), 0 },
Packit b00eeb
Packit b00eeb
	{ 0, "1.2.840.10045.2.1", "ec", N_("Elliptic Curve"), 0, },
Packit b00eeb
	{ 0, "1.2.840.10045.4.1", "sha1WithECDSA", N_("SHA1 with ECDSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.10045.4.3.1", "sha224WithECDSA", N_("SHA224 with ECDSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.10045.4.3.2", "sha256WithECDSA", N_("SHA256 with ECDSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.10045.4.3.3", "sha384WithECDSA", N_("SHA384 with ECDSA"), 0 },
Packit b00eeb
	{ 0, "1.2.840.10045.4.3.4", "sha512WithECDSA", N_("SHA512 with ECDSA"), 0 },
Packit b00eeb
Packit b00eeb
	/* Extended Key Usages */
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.3.1", NULL, N_("Server Authentication"), 0 },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.3.2", NULL, N_("Client Authentication"), 0 },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.3.3", NULL, N_("Code Signing"), 0 },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.3.4", NULL, N_("Email Protection"), 0 },
Packit b00eeb
	{ 0, "1.3.6.1.5.5.7.3.8", NULL, N_("Time Stamping"), 0 },
Packit b00eeb
Packit b00eeb
	{ 0, NULL, NULL, NULL, FALSE }
Packit b00eeb
};
Packit b00eeb
Packit b00eeb
static OidInfo*
Packit b00eeb
find_oid_info (GQuark oid)
Packit b00eeb
{
Packit b00eeb
	static volatile gsize inited_oids = 0;
Packit b00eeb
	int i;
Packit b00eeb
Packit b00eeb
	g_return_val_if_fail (oid != 0, NULL);
Packit b00eeb
Packit b00eeb
	/* Initialize first time around */
Packit b00eeb
	if (g_once_init_enter (&inited_oids)) {
Packit b00eeb
		for (i = 0; oid_info[i].oidstr != NULL; ++i)
Packit b00eeb
			oid_info[i].oid = g_quark_from_static_string (oid_info[i].oidstr);
Packit b00eeb
		g_once_init_leave (&inited_oids, 1);
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	for (i = 0; oid_info[i].oidstr != NULL; ++i) {
Packit b00eeb
		if (oid_info[i].oid == oid)
Packit b00eeb
			return &oid_info[i];
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	return NULL;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
const gchar*
Packit b00eeb
egg_oid_get_name (GQuark oid)
Packit b00eeb
{
Packit b00eeb
	OidInfo *info;
Packit b00eeb
Packit b00eeb
	g_return_val_if_fail (oid, NULL);
Packit b00eeb
Packit b00eeb
	info = find_oid_info (oid);
Packit b00eeb
	if (info == NULL)
Packit b00eeb
		return g_quark_to_string (oid);
Packit b00eeb
Packit b00eeb
	return info->attr;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
const gchar*
Packit b00eeb
egg_oid_get_description (GQuark oid)
Packit b00eeb
{
Packit b00eeb
	OidInfo *info;
Packit b00eeb
Packit b00eeb
	g_return_val_if_fail (oid, NULL);
Packit b00eeb
Packit b00eeb
	info = find_oid_info (oid);
Packit b00eeb
	if (info == NULL)
Packit b00eeb
		return g_quark_to_string (oid);
Packit b00eeb
Packit b00eeb
	return _(info->description);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
guint
Packit b00eeb
egg_oid_get_flags (GQuark oid)
Packit b00eeb
{
Packit b00eeb
	OidInfo *info;
Packit b00eeb
Packit b00eeb
	g_return_val_if_fail (oid, 0);
Packit b00eeb
Packit b00eeb
	info = find_oid_info (oid);
Packit b00eeb
	if (info == NULL)
Packit b00eeb
		return 0;
Packit b00eeb
Packit b00eeb
	return info->flags;
Packit b00eeb
}