|
Packit |
b00eeb |
/*
|
|
Packit |
b00eeb |
* gnome-keyring
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Copyright (C) 2008 Stefan Walter
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This program is free software; you can redistribute it and/or modify
|
|
Packit |
b00eeb |
* it under the terms of the GNU Lesser General Public License as
|
|
Packit |
b00eeb |
* published by the Free Software Foundation; either version 2.1 of
|
|
Packit |
b00eeb |
* the License, or (at your option) any later version.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This program is distributed in the hope that it will be useful, but
|
|
Packit |
b00eeb |
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
Packit |
b00eeb |
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
Packit |
b00eeb |
* Lesser General Public License for more details.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* You should have received a copy of the GNU Lesser General Public
|
|
Packit |
b00eeb |
* License along with this program; if not, see <http://www.gnu.org/licenses/>.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "config.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "gcr-certificate.h"
|
|
Packit |
b00eeb |
#include "gcr-certificate-extensions.h"
|
|
Packit |
b00eeb |
#include "gcr-comparable.h"
|
|
Packit |
b00eeb |
#include "gcr-icons.h"
|
|
Packit |
b00eeb |
#include "gcr-internal.h"
|
|
Packit |
b00eeb |
#include "gcr-subject-public-key.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "gcr/gcr-oids.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include "egg/egg-asn1x.h"
|
|
Packit |
b00eeb |
#include "egg/egg-asn1-defs.h"
|
|
Packit |
b00eeb |
#include "egg/egg-dn.h"
|
|
Packit |
b00eeb |
#include "egg/egg-hex.h"
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
#include <string.h>
|
|
Packit |
b00eeb |
#include <glib/gi18n-lib.h>
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* SECTION:gcr-certificate
|
|
Packit |
b00eeb |
* @title: GcrCertificate
|
|
Packit |
b00eeb |
* @short_description: Represents an X.509 certificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This is an interface that represents an X.509 certificate. Objects can
|
|
Packit |
b00eeb |
* implement this interface to make a certificate usable with the GCR
|
|
Packit |
b00eeb |
* library.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Various methods are available to parse out relevant bits of the certificate.
|
|
Packit |
b00eeb |
* However no verification of the validity of a certificate is done here. Use
|
|
Packit |
b00eeb |
* your favorite crypto library to do this.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* You can use #GcrSimpleCertificate to simply load a certificate for which
|
|
Packit |
b00eeb |
* you already have the raw certificate data.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The #GcrCertificate interface has several properties that must be implemented.
|
|
Packit |
b00eeb |
* You can use a mixin to implement these properties if desired. See the
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_class_init() and gcr_certificate_mixin_get_property()
|
|
Packit |
b00eeb |
* functions.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* All certificates are comparable. If implementing a #GcrCertificate, you can
|
|
Packit |
b00eeb |
* use GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE() to implement the #GcrComparable
|
|
Packit |
b00eeb |
* interface.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* An object which holds a certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificateIface:
|
|
Packit |
b00eeb |
* @parent: the parent interface type
|
|
Packit |
b00eeb |
* @get_der_data: a method which returns the RAW der data of the certificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The interface that implementors of #GcrCertificate must implement.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GCR_CERTIFICATE_COLUMNS:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The columns that are valid for a certificate. This is to be used with
|
|
Packit |
b00eeb |
* the #GcrTreeSelector or #GcrCollectionModel.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This is an array of #GcrColumn, owned by the gcr library.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/*
|
|
Packit |
b00eeb |
* The DER data in this structure is owned by the derived class.
|
|
Packit |
b00eeb |
* It is only valid for the duration of the current call stack
|
|
Packit |
b00eeb |
* after we call gcr_certificate_get_der_data(). We shouldn't
|
|
Packit |
b00eeb |
* save it anywhere else.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* We keep the pointer around and compare it so that if the derived
|
|
Packit |
b00eeb |
* class returns exactly the same pointer and size, then we can
|
|
Packit |
b00eeb |
* keep from parsing things over again.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
typedef struct _GcrCertificateInfo {
|
|
Packit |
b00eeb |
gconstpointer der;
|
|
Packit |
b00eeb |
gsize n_der;
|
|
Packit |
b00eeb |
GNode *asn1;
|
|
Packit |
b00eeb |
guint key_size;
|
|
Packit |
b00eeb |
} GcrCertificateInfo;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Forward declarations */
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GBytes * _gcr_certificate_get_subject_const (GcrCertificate *self);
|
|
Packit |
b00eeb |
static GBytes * _gcr_certificate_get_issuer_const (GcrCertificate *self);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
enum {
|
|
Packit |
b00eeb |
PROP_FIRST = 0x0007000,
|
|
Packit |
b00eeb |
PROP_LABEL,
|
|
Packit |
b00eeb |
PROP_MARKUP,
|
|
Packit |
b00eeb |
PROP_DESCRIPTION,
|
|
Packit |
b00eeb |
PROP_ICON,
|
|
Packit |
b00eeb |
PROP_SUBJECT,
|
|
Packit |
b00eeb |
PROP_ISSUER,
|
|
Packit |
b00eeb |
PROP_EXPIRY
|
|
Packit |
b00eeb |
};
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* -----------------------------------------------------------------------------
|
|
Packit |
b00eeb |
* INTERNAL
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GQuark CERTIFICATE_INFO = 0;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
certificate_info_free (gpointer data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info = data;
|
|
Packit |
b00eeb |
if (info) {
|
|
Packit |
b00eeb |
g_assert (info->asn1);
|
|
Packit |
b00eeb |
egg_asn1x_destroy (info->asn1);
|
|
Packit |
b00eeb |
g_free (info);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GcrCertificateInfo*
|
|
Packit |
b00eeb |
certificate_info_load (GcrCertificate *cert)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GBytes *bytes;
|
|
Packit |
b00eeb |
GNode *asn1;
|
|
Packit |
b00eeb |
gconstpointer der;
|
|
Packit |
b00eeb |
gsize n_der;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_assert (GCR_IS_CERTIFICATE (cert));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
der = gcr_certificate_get_der_data (cert, &n_der);
|
|
Packit |
b00eeb |
if (der == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = g_object_get_qdata (G_OBJECT (cert), CERTIFICATE_INFO);
|
|
Packit |
b00eeb |
if (info != NULL) {
|
|
Packit |
b00eeb |
if (n_der == info->n_der && der == info->der)
|
|
Packit |
b00eeb |
return info;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* TODO: Once GBytes is public, add to GcrCertificate interface */
|
|
Packit |
b00eeb |
bytes = g_bytes_new_static (der, n_der);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* Cache is invalid or non existent */
|
|
Packit |
b00eeb |
asn1 = egg_asn1x_create_and_decode (pkix_asn1_tab, "Certificate", bytes);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_bytes_unref (bytes);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (asn1 == NULL) {
|
|
Packit |
b00eeb |
g_warning ("a derived class provided an invalid or unparseable X.509 DER certificate data.");
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = g_new0 (GcrCertificateInfo, 1);
|
|
Packit |
b00eeb |
info->der = der;
|
|
Packit |
b00eeb |
info->n_der = n_der;
|
|
Packit |
b00eeb |
info->asn1 = asn1;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_set_qdata_full (G_OBJECT (cert), CERTIFICATE_INFO, info, certificate_info_free);
|
|
Packit |
b00eeb |
return info;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GChecksum*
|
|
Packit |
b00eeb |
digest_certificate (GcrCertificate *self, GChecksumType type)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GChecksum *digest;
|
|
Packit |
b00eeb |
gconstpointer der;
|
|
Packit |
b00eeb |
gsize n_der;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_assert (GCR_IS_CERTIFICATE (self));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
der = gcr_certificate_get_der_data (self, &n_der);
|
|
Packit |
b00eeb |
if (der == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
digest = g_checksum_new (type);
|
|
Packit |
b00eeb |
g_return_val_if_fail (digest, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_checksum_update (digest, der, n_der);
|
|
Packit |
b00eeb |
return digest;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_markup_text:
|
|
Packit |
b00eeb |
* @self: a certificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Calculate a GMarkup string for displaying this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer full): the markup string
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_markup_text (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
gchar *label = NULL;
|
|
Packit |
b00eeb |
gchar *issuer;
|
|
Packit |
b00eeb |
gchar *markup;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_object_get (self, "label", &label, NULL);
|
|
Packit |
b00eeb |
issuer = gcr_certificate_get_issuer_name (self);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (issuer)
|
|
Packit |
b00eeb |
markup = g_markup_printf_escaped ("%s\n<small>Issued by: %s</small>", label, issuer);
|
|
Packit |
b00eeb |
else
|
|
Packit |
b00eeb |
markup = g_markup_printf_escaped ("%s\n<small>Issued by: No name</small>", label);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_free (label);
|
|
Packit |
b00eeb |
g_free (issuer);
|
|
Packit |
b00eeb |
return markup;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
on_transform_date_to_string (const GValue *src, GValue *dest)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
static const gsize len = 256;
|
|
Packit |
b00eeb |
GDate *date;
|
|
Packit |
b00eeb |
gchar *result;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_if_fail (G_VALUE_TYPE (src) == G_TYPE_DATE);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
date = g_value_get_boxed (src);
|
|
Packit |
b00eeb |
g_return_if_fail (date);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
result = g_malloc0 (len);
|
|
Packit |
b00eeb |
if (!g_date_strftime (result, len, "%x", date)) {
|
|
Packit |
b00eeb |
g_free (result);
|
|
Packit |
b00eeb |
result = NULL;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_value_take_string (dest, result);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* ---------------------------------------------------------------------------------
|
|
Packit |
b00eeb |
* INTERFACE
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static void
|
|
Packit |
b00eeb |
gcr_certificate_default_init (GcrCertificateIface *iface)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
static volatile gsize initialized = 0;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (g_once_init_enter (&initialized)) {
|
|
Packit |
b00eeb |
CERTIFICATE_INFO = g_quark_from_static_string ("_gcr_certificate_certificate_info");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:label:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* A readable label for this certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_string ("label", "Label", "Certificate label",
|
|
Packit |
b00eeb |
"", G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:description:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* A readable description for this certificate
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_string ("description", "Description", "Description of object being rendered",
|
|
Packit |
b00eeb |
"", G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:markup:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* GLib markup to describe the certificate
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_string ("markup", "Markup", "Markup which describes object being rendered",
|
|
Packit |
b00eeb |
"", G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:icon:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* An icon representing the certificate
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_object ("icon", "Icon", "Icon for the object being rendered",
|
|
Packit |
b00eeb |
G_TYPE_ICON, G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:subject:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Common name part of the certificate subject
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_string ("subject", "Subject", "Common name of subject",
|
|
Packit |
b00eeb |
"", G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:issuer:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Common name part of the certificate issuer
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_string ("issuer", "Issuer", "Common name of issuer",
|
|
Packit |
b00eeb |
"", G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GcrCertificate:expiry:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The expiry date of the certificate
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
g_object_interface_install_property (iface,
|
|
Packit |
b00eeb |
g_param_spec_boxed ("expiry", "Expiry", "Certificate expiry",
|
|
Packit |
b00eeb |
G_TYPE_DATE, G_PARAM_READABLE));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_once_init_leave (&initialized, 1);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
typedef GcrCertificateIface GcrCertificateInterface;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
G_DEFINE_INTERFACE (GcrCertificate, gcr_certificate, GCR_TYPE_COMPARABLE);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* -----------------------------------------------------------------------------
|
|
Packit |
b00eeb |
* PUBLIC
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_columns: (skip)
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the columns appropriate for a certificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer none): the columns
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
const GcrColumn*
|
|
Packit |
b00eeb |
gcr_certificate_get_columns (void)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
static GcrColumn columns[] = {
|
|
Packit |
b00eeb |
{ "icon", /* later */ 0, /* later */ 0, NULL, 0 },
|
|
Packit |
b00eeb |
{ "label", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Name"),
|
|
Packit |
b00eeb |
GCR_COLUMN_SORTABLE },
|
|
Packit |
b00eeb |
{ "issuer", G_TYPE_STRING, G_TYPE_STRING, NC_("column", "Issued By"),
|
|
Packit |
b00eeb |
GCR_COLUMN_SORTABLE },
|
|
Packit |
b00eeb |
{ "expiry", /* later */ 0, G_TYPE_STRING, NC_("column", "Expires"),
|
|
Packit |
b00eeb |
GCR_COLUMN_SORTABLE, on_transform_date_to_string },
|
|
Packit |
b00eeb |
{ NULL }
|
|
Packit |
b00eeb |
};
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
columns[0].property_type = columns[0].column_type = G_TYPE_ICON;
|
|
Packit |
b00eeb |
columns[3].property_type = G_TYPE_DATE;
|
|
Packit |
b00eeb |
return columns;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_compare:
|
|
Packit |
b00eeb |
* @first: (allow-none): the certificate to compare
|
|
Packit |
b00eeb |
* @other: (allow-none): the certificate to compare against
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Compare one certificate against another. If the certificates are equal
|
|
Packit |
b00eeb |
* then zero is returned. If one certificate is %NULL or not a certificate,
|
|
Packit |
b00eeb |
* then a non-zero value is returned.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The return value is useful in a stable sort, but has no user logical
|
|
Packit |
b00eeb |
* meaning.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: zero if the certificates match, non-zero otherwise.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gint
|
|
Packit |
b00eeb |
gcr_certificate_compare (GcrComparable *first, GcrComparable *other)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
gconstpointer data1, data2;
|
|
Packit |
b00eeb |
gsize size1, size2;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (!GCR_IS_CERTIFICATE (first))
|
|
Packit |
b00eeb |
first = NULL;
|
|
Packit |
b00eeb |
if (!GCR_IS_CERTIFICATE (other))
|
|
Packit |
b00eeb |
other = NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (first == other)
|
|
Packit |
b00eeb |
return TRUE;
|
|
Packit |
b00eeb |
if (!first)
|
|
Packit |
b00eeb |
return 1;
|
|
Packit |
b00eeb |
if (!other)
|
|
Packit |
b00eeb |
return -1;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
data1 = gcr_certificate_get_der_data (GCR_CERTIFICATE (first), &size1);
|
|
Packit |
b00eeb |
data2 = gcr_certificate_get_der_data (GCR_CERTIFICATE (other), &size2);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return gcr_comparable_memcmp (data1, size1, data2, size2);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_der_data:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @n_data: a pointer to a location to store the size of the resulting DER data.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Gets the raw DER data for an X.509 certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer none) (array length=n_data): raw DER data of the X.509 certificate
|
|
Packit |
b00eeb |
**/
|
|
Packit |
b00eeb |
const guint8 *
|
|
Packit |
b00eeb |
gcr_certificate_get_der_data (GcrCertificate *self,
|
|
Packit |
b00eeb |
gsize *n_data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (n_data != NULL, NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_CERTIFICATE_GET_INTERFACE (self)->get_der_data, NULL);
|
|
Packit |
b00eeb |
return GCR_CERTIFICATE_GET_INTERFACE (self)->get_der_data (self, n_data);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issuer_name:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get a name to represent the issuer of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This will try to lookup the common name, orianizational unit,
|
|
Packit |
b00eeb |
* organization in that order.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: the allocated issuer name, or NULL if no issuer name
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_issuer_name (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
gchar *name;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
name = gcr_certificate_get_issuer_part (self, "cn");
|
|
Packit |
b00eeb |
if (name == NULL)
|
|
Packit |
b00eeb |
name = gcr_certificate_get_issuer_part (self, "ou");
|
|
Packit |
b00eeb |
if (name == NULL)
|
|
Packit |
b00eeb |
name = gcr_certificate_get_issuer_part (self, "o");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return name;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issuer_cn:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the common name of the issuer of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: The allocated issuer CN, or NULL if no issuer CN present.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_issuer_cn (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
return gcr_certificate_get_issuer_part (self, "cn");
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issuer_part:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @part: a DN type string or OID.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get a part of the DN of the issuer of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Examples of a @part might be the 'OU' (organizational unit)
|
|
Packit |
b00eeb |
* or the 'CN' (common name). Only the value of that part
|
|
Packit |
b00eeb |
* of the DN is returned.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (allow-none): the allocated part of the issuer DN, or %NULL if no
|
|
Packit |
b00eeb |
* such part is present
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_issuer_part (GcrCertificate *self, const char *part)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_dn_read_part (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL), part);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GBytes *
|
|
Packit |
b00eeb |
_gcr_certificate_get_issuer_const (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_asn1x_get_element_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", NULL));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issuer_raw:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @n_data: The length of the returned data.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the raw DER data for the issuer DN of the certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The data should be freed by using g_free() when no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer full) (array length=n_data): allocated memory containing
|
|
Packit |
b00eeb |
* the raw issuer
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
guchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_issuer_raw (GcrCertificate *self,
|
|
Packit |
b00eeb |
gsize *n_data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GBytes *bytes;
|
|
Packit |
b00eeb |
guchar *result;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (n_data != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
bytes = _gcr_certificate_get_issuer_const (self);
|
|
Packit |
b00eeb |
if (bytes == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
*n_data = g_bytes_get_size (bytes);
|
|
Packit |
b00eeb |
result = g_memdup (g_bytes_get_data (bytes, NULL), *n_data);
|
|
Packit |
b00eeb |
g_bytes_unref (bytes);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return result;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_is_issuer:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @issuer: a possible issuer #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Check if @issuer could be the issuer of this certificate. This is done by
|
|
Packit |
b00eeb |
* comparing the relevant subject and issuer fields. No signature check is
|
|
Packit |
b00eeb |
* done. Proper verification of certificates must be done via a crypto
|
|
Packit |
b00eeb |
* library.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: whether @issuer could be the issuer of the certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gboolean
|
|
Packit |
b00eeb |
gcr_certificate_is_issuer (GcrCertificate *self, GcrCertificate *issuer)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GBytes *subject_dn;
|
|
Packit |
b00eeb |
GBytes *issuer_dn;
|
|
Packit |
b00eeb |
gboolean ret;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE);
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (issuer), FALSE);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
subject_dn = _gcr_certificate_get_subject_const (issuer);
|
|
Packit |
b00eeb |
if (subject_dn == NULL)
|
|
Packit |
b00eeb |
return FALSE;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
issuer_dn = _gcr_certificate_get_issuer_const (self);
|
|
Packit |
b00eeb |
if (issuer_dn == NULL)
|
|
Packit |
b00eeb |
return FALSE;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
ret = g_bytes_equal (subject_dn, issuer_dn);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_bytes_unref (subject_dn);
|
|
Packit |
b00eeb |
g_bytes_unref (issuer_dn);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return ret;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issuer_dn:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the full issuer DN of the certificate as a (mostly)
|
|
Packit |
b00eeb |
* readable string.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: The allocated issuer DN of the certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_issuer_dn (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_dn_read (egg_asn1x_node (info->asn1, "tbsCertificate", "issuer", "rdnSequence", NULL));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_subject_cn:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the common name of the subject of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: The allocated subject CN, or NULL if no subject CN present.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_subject_cn (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
return gcr_certificate_get_subject_part (self, "cn");
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_subject_name:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get a name to represent the subject of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* This will try to lookup the common name, orianizational unit,
|
|
Packit |
b00eeb |
* organization in that order.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: the allocated subject name, or NULL if no subject name
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_subject_name (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
gchar *name;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
name = gcr_certificate_get_subject_part (self, "cn");
|
|
Packit |
b00eeb |
if (name == NULL)
|
|
Packit |
b00eeb |
name = gcr_certificate_get_subject_part (self, "ou");
|
|
Packit |
b00eeb |
if (name == NULL)
|
|
Packit |
b00eeb |
name = gcr_certificate_get_subject_part (self, "o");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return name;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_subject_part:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @part: a DN type string or OID.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get a part of the DN of the subject of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Examples of a @part might be the 'OU' (organizational unit)
|
|
Packit |
b00eeb |
* or the 'CN' (common name). Only the value of that part
|
|
Packit |
b00eeb |
* of the DN is returned.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (allow-none): the allocated part of the subject DN, or %NULL if no
|
|
Packit |
b00eeb |
* such part is present.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_subject_part (GcrCertificate *self, const char *part)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (part != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_dn_read_part (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", "rdnSequence", NULL), part);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_subject_dn:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the full subject DN of the certificate as a (mostly)
|
|
Packit |
b00eeb |
* readable string.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The string returned should be freed by the caller when no longer
|
|
Packit |
b00eeb |
* required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: The allocated subject DN of the certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_subject_dn (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_dn_read (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", "rdnSequence", NULL));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
static GBytes *
|
|
Packit |
b00eeb |
_gcr_certificate_get_subject_const (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return egg_asn1x_get_element_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "subject", NULL));
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_subject_raw:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @n_data: The length of the returned data.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the raw DER data for the subject DN of the certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The data should be freed by using g_free() when no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer full) (array length=n_data): allocated memory containing
|
|
Packit |
b00eeb |
* the raw subject
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
guchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_subject_raw (GcrCertificate *self, gsize *n_data)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GBytes *bytes;
|
|
Packit |
b00eeb |
guchar *result;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (n_data != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
bytes = _gcr_certificate_get_subject_const (self);
|
|
Packit |
b00eeb |
if (bytes == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
*n_data = g_bytes_get_size (bytes);
|
|
Packit |
b00eeb |
result = g_memdup (g_bytes_get_data (bytes, NULL), *n_data);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_bytes_unref (bytes);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return result;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_issued_date:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the issued date of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The #GDate returned should be freed by the caller using
|
|
Packit |
b00eeb |
* g_date_free() when no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: An allocated issued date of this certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
GDate*
|
|
Packit |
b00eeb |
gcr_certificate_get_issued_date (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GDate *date;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
date = g_date_new ();
|
|
Packit |
b00eeb |
if (!egg_asn1x_get_time_as_date (egg_asn1x_node (info->asn1, "tbsCertificate", "validity", "notBefore", NULL), date)) {
|
|
Packit |
b00eeb |
g_date_free (date);
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return date;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_expiry_date:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the expiry date of this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The #GDate returned should be freed by the caller using
|
|
Packit |
b00eeb |
* g_date_free() when no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: An allocated expiry date of this certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
GDate*
|
|
Packit |
b00eeb |
gcr_certificate_get_expiry_date (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GDate *date;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
date = g_date_new ();
|
|
Packit |
b00eeb |
if (!egg_asn1x_get_time_as_date (egg_asn1x_node (info->asn1, "tbsCertificate", "validity", "notAfter", NULL), date)) {
|
|
Packit |
b00eeb |
g_date_free (date);
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return date;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_key_size:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the key size in bits of the public key represented
|
|
Packit |
b00eeb |
* by this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: The key size of the certificate.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
guint
|
|
Packit |
b00eeb |
gcr_certificate_get_key_size (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GNode *subject_public_key;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), 0);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return 0;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (!info->key_size) {
|
|
Packit |
b00eeb |
subject_public_key = egg_asn1x_node (info->asn1, "tbsCertificate",
|
|
Packit |
b00eeb |
"subjectPublicKeyInfo", NULL);
|
|
Packit |
b00eeb |
info->key_size = _gcr_subject_public_key_calculate_size (subject_public_key);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return info->key_size;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_fingerprint:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @type: the type of algorithm for the fingerprint.
|
|
Packit |
b00eeb |
* @n_length: The length of the resulting fingerprint.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Calculate the fingerprint for this certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the @type
|
|
Packit |
b00eeb |
* parameter.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The caller should free the returned data using g_free() when
|
|
Packit |
b00eeb |
* it is no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (array length=n_length): the raw binary fingerprint
|
|
Packit |
b00eeb |
**/
|
|
Packit |
b00eeb |
guchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_fingerprint (GcrCertificate *self, GChecksumType type, gsize *n_length)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GChecksum *sum;
|
|
Packit |
b00eeb |
guchar *digest;
|
|
Packit |
b00eeb |
gssize length;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (n_length != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
sum = digest_certificate (self, type);
|
|
Packit |
b00eeb |
if (sum == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
length = g_checksum_type_get_length (type);
|
|
Packit |
b00eeb |
g_return_val_if_fail (length > 0, NULL);
|
|
Packit |
b00eeb |
digest = g_malloc (length);
|
|
Packit |
b00eeb |
*n_length = length;
|
|
Packit |
b00eeb |
g_checksum_get_digest (sum, digest, n_length);
|
|
Packit |
b00eeb |
g_checksum_free (sum);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
return digest;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_fingerprint_hex:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @type: the type of algorithm for the fingerprint.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Calculate the fingerprint for this certificate, and return it
|
|
Packit |
b00eeb |
* as a hex string.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* You can pass G_CHECKSUM_SHA1 or G_CHECKSUM_MD5 as the @type
|
|
Packit |
b00eeb |
* parameter.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The caller should free the returned data using g_free() when
|
|
Packit |
b00eeb |
* it is no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: an allocated hex string which contains the fingerprint.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_fingerprint_hex (GcrCertificate *self, GChecksumType type)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GChecksum *sum;
|
|
Packit |
b00eeb |
guchar *digest;
|
|
Packit |
b00eeb |
gsize n_digest;
|
|
Packit |
b00eeb |
gssize length;
|
|
Packit |
b00eeb |
gchar *hex;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
sum = digest_certificate (self, type);
|
|
Packit |
b00eeb |
if (sum == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
length = g_checksum_type_get_length (type);
|
|
Packit |
b00eeb |
g_return_val_if_fail (length > 0, NULL);
|
|
Packit |
b00eeb |
digest = g_malloc (length);
|
|
Packit |
b00eeb |
n_digest = length;
|
|
Packit |
b00eeb |
g_checksum_get_digest (sum, digest, &n_digest);
|
|
Packit |
b00eeb |
hex = egg_hex_encode_full (digest, n_digest, TRUE, " ", 1);
|
|
Packit |
b00eeb |
g_checksum_free (sum);
|
|
Packit |
b00eeb |
g_free (digest);
|
|
Packit |
b00eeb |
return hex;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_serial_number:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
* @n_length: the length of the returned data.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the raw binary serial number of the certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The caller should free the returned data using g_free() when
|
|
Packit |
b00eeb |
* it is no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (array length=n_length): the raw binary serial number.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
guchar *
|
|
Packit |
b00eeb |
gcr_certificate_get_serial_number (GcrCertificate *self, gsize *n_length)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GBytes *bytes;
|
|
Packit |
b00eeb |
guchar *result;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
g_return_val_if_fail (n_length != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
bytes = egg_asn1x_get_integer_as_raw (egg_asn1x_node (info->asn1, "tbsCertificate", "serialNumber", NULL));
|
|
Packit |
b00eeb |
g_return_val_if_fail (bytes != NULL, NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
*n_length = g_bytes_get_size (bytes);
|
|
Packit |
b00eeb |
result = g_memdup (g_bytes_get_data (bytes, NULL), *n_length);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_bytes_unref (bytes);
|
|
Packit |
b00eeb |
return result;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_serial_number_hex:
|
|
Packit |
b00eeb |
* @self: a #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the serial number of the certificate as a hex string.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* The caller should free the returned data using g_free() when
|
|
Packit |
b00eeb |
* it is no longer required.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: an allocated string containing the serial number as hex.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gchar*
|
|
Packit |
b00eeb |
gcr_certificate_get_serial_number_hex (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
guchar *serial;
|
|
Packit |
b00eeb |
gsize n_serial;
|
|
Packit |
b00eeb |
gchar *hex;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), NULL);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
serial = gcr_certificate_get_serial_number (self, &n_serial);
|
|
Packit |
b00eeb |
if (serial == NULL)
|
|
Packit |
b00eeb |
return NULL;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
hex = egg_hex_encode (serial, n_serial);
|
|
Packit |
b00eeb |
g_free (serial);
|
|
Packit |
b00eeb |
return hex;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_icon: (skip)
|
|
Packit |
b00eeb |
* @self: The certificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the icon for a certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: (transfer full): the icon for this certificate, which should be
|
|
Packit |
b00eeb |
* released with g_object_unref()
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
GIcon *
|
|
Packit |
b00eeb |
gcr_certificate_get_icon (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE);
|
|
Packit |
b00eeb |
return g_themed_icon_new (GCR_ICON_CERTIFICATE);
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_get_basic_constraints:
|
|
Packit |
b00eeb |
* @self: the certificate
|
|
Packit |
b00eeb |
* @is_ca: (out) (allow-none): location to place a %TRUE if is an authority
|
|
Packit |
b00eeb |
* @path_len: (out) (allow-none): location to place the max path length
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Get the basic constraints for the certificate if present. If %FALSE is
|
|
Packit |
b00eeb |
* returned then no basic constraints are present and the @is_ca and
|
|
Packit |
b00eeb |
* @path_len arguments are not changed.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Returns: whether basic constraints are present or not
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
gboolean
|
|
Packit |
b00eeb |
gcr_certificate_get_basic_constraints (GcrCertificate *self,
|
|
Packit |
b00eeb |
gboolean *is_ca,
|
|
Packit |
b00eeb |
gint *path_len)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificateInfo *info;
|
|
Packit |
b00eeb |
GBytes *value;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_val_if_fail (GCR_IS_CERTIFICATE (self), FALSE);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
info = certificate_info_load (self);
|
|
Packit |
b00eeb |
if (info == NULL)
|
|
Packit |
b00eeb |
return FALSE;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
value = _gcr_certificate_extension_find (info->asn1, GCR_OID_BASIC_CONSTRAINTS, NULL);
|
|
Packit |
b00eeb |
if (!value)
|
|
Packit |
b00eeb |
return FALSE;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
if (!_gcr_certificate_extension_basic_constraints (value, is_ca, path_len))
|
|
Packit |
b00eeb |
g_return_val_if_reached (FALSE);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_bytes_unref (value);
|
|
Packit |
b00eeb |
return TRUE;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/* -----------------------------------------------------------------------------
|
|
Packit |
b00eeb |
* MIXIN
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Implement the GcrComparable interface. Use this macro like this:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* <informalexample><programlisting>
|
|
Packit |
b00eeb |
* G_DEFINE_TYPE_WITH_CODE (MyCertificate, my_certificate, G_TYPE_OBJECT,
|
|
Packit |
b00eeb |
* GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE ();
|
|
Packit |
b00eeb |
* G_IMPLEMENT_INTERFACE (GCR_TYPE_CERTIFICATE, my_certificate_iface_init);
|
|
Packit |
b00eeb |
* );
|
|
Packit |
b00eeb |
* </programlisting></informalexample>
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_emit_notify:
|
|
Packit |
b00eeb |
* @self: the #GcrCertificate
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Implementers of the #GcrCertificate mixin should call this function to notify
|
|
Packit |
b00eeb |
* when the certificate has changed to emit notifications on the various
|
|
Packit |
b00eeb |
* properties.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
void
|
|
Packit |
b00eeb |
gcr_certificate_mixin_emit_notify (GcrCertificate *self)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GObject *obj;
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
g_return_if_fail (GCR_IS_CERTIFICATE (self));
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
obj = G_OBJECT (self);
|
|
Packit |
b00eeb |
g_object_notify (obj, "label");
|
|
Packit |
b00eeb |
g_object_notify (obj, "markup");
|
|
Packit |
b00eeb |
g_object_notify (obj, "subject");
|
|
Packit |
b00eeb |
g_object_notify (obj, "issuer");
|
|
Packit |
b00eeb |
g_object_notify (obj, "expiry");
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_comparable_init: (skip)
|
|
Packit |
b00eeb |
* @iface: The interface
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Initialize a #GcrComparableIface to compare the current certificate.
|
|
Packit |
b00eeb |
* In general it's easier to use the GCR_CERTIFICATE_MIXIN_IMPLEMENT_COMPARABLE()
|
|
Packit |
b00eeb |
* macro instead of this function.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
void
|
|
Packit |
b00eeb |
gcr_certificate_mixin_comparable_init (GcrComparableIface *iface)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
iface->compare = gcr_certificate_compare;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_class_init: (skip)
|
|
Packit |
b00eeb |
* @object_class: The GObjectClass for this class
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Initialize the certificate mixin for the class. This mixin implements the
|
|
Packit |
b00eeb |
* various required properties for the certificate.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Call this function near the end of your derived class_init function. The
|
|
Packit |
b00eeb |
* derived class must implement the #GcrCertificate interface.
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
void
|
|
Packit |
b00eeb |
gcr_certificate_mixin_class_init (GObjectClass *object_class)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "description"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_DESCRIPTION, "description");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "markup"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_MARKUP, "markup");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "label"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_LABEL, "label");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "icon"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_ICON, "icon");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "subject"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_SUBJECT, "subject");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "issuer"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_ISSUER, "issuer");
|
|
Packit |
b00eeb |
if (!g_object_class_find_property (object_class, "expiry"))
|
|
Packit |
b00eeb |
g_object_class_override_property (object_class, PROP_EXPIRY, "expiry");
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
_gcr_initialize_library ();
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
/**
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_get_property: (skip)
|
|
Packit |
b00eeb |
* @obj: The object
|
|
Packit |
b00eeb |
* @prop_id: The property id
|
|
Packit |
b00eeb |
* @value: The value to fill in.
|
|
Packit |
b00eeb |
* @pspec: The param specification.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Implementation to get various required certificate properties. This should
|
|
Packit |
b00eeb |
* be called from your derived class get_property function, or used as a
|
|
Packit |
b00eeb |
* get_property virtual function.
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Example of use as called from derived class get_property function:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* <informalexample><programlisting>
|
|
Packit |
b00eeb |
* static void
|
|
Packit |
b00eeb |
* my_get_property (GObject *obj, guint prop_id, GValue *value, GParamSpec *pspec)
|
|
Packit |
b00eeb |
* {
|
|
Packit |
b00eeb |
* switch (prop_id) {
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* ...
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* default:
|
|
Packit |
b00eeb |
* gcr_certificate_mixin_get_property (obj, prop_id, value, pspec);
|
|
Packit |
b00eeb |
* break;
|
|
Packit |
b00eeb |
* }
|
|
Packit |
b00eeb |
*}
|
|
Packit |
b00eeb |
* </programlisting></informalexample>
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* Example of use as get_property function:
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* <informalexample><programlisting>
|
|
Packit |
b00eeb |
* static void
|
|
Packit |
b00eeb |
* my_class_init (MyClass *klass)
|
|
Packit |
b00eeb |
* {
|
|
Packit |
b00eeb |
* GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
|
|
Packit |
b00eeb |
* gobject_class->get_property = gcr_certificate_mixin_get_property;
|
|
Packit |
b00eeb |
*
|
|
Packit |
b00eeb |
* ...
|
|
Packit |
b00eeb |
* }
|
|
Packit |
b00eeb |
* </programlisting></informalexample>
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
*/
|
|
Packit |
b00eeb |
void
|
|
Packit |
b00eeb |
gcr_certificate_mixin_get_property (GObject *obj, guint prop_id,
|
|
Packit |
b00eeb |
GValue *value, GParamSpec *pspec)
|
|
Packit |
b00eeb |
{
|
|
Packit |
b00eeb |
GcrCertificate *cert = GCR_CERTIFICATE (obj);
|
|
Packit |
b00eeb |
|
|
Packit |
b00eeb |
switch (prop_id) {
|
|
Packit |
b00eeb |
case PROP_LABEL:
|
|
Packit |
b00eeb |
g_value_take_string (value, gcr_certificate_get_subject_name (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_SUBJECT:
|
|
Packit |
b00eeb |
g_value_take_string (value, gcr_certificate_get_subject_name (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_ICON:
|
|
Packit |
b00eeb |
g_value_set_object (value, gcr_certificate_get_icon (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_DESCRIPTION:
|
|
Packit |
b00eeb |
g_value_set_string (value, _("Certificate"));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_MARKUP:
|
|
Packit |
b00eeb |
g_value_take_string (value, gcr_certificate_get_markup_text (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_ISSUER:
|
|
Packit |
b00eeb |
g_value_take_string (value, gcr_certificate_get_issuer_name (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
case PROP_EXPIRY:
|
|
Packit |
b00eeb |
g_value_take_boxed (value, gcr_certificate_get_expiry_date (cert));
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
default:
|
|
Packit |
b00eeb |
G_OBJECT_WARN_INVALID_PROPERTY_ID (obj, prop_id, pspec);
|
|
Packit |
b00eeb |
break;
|
|
Packit |
b00eeb |
}
|
|
Packit |
b00eeb |
}
|