Blame gcr/gcr-gnupg-util.c

Packit b00eeb
/*
Packit b00eeb
 * Copyright (C) 2011 Collabora Ltd.
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
 * Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
 */
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-hex.h"
Packit b00eeb
Packit b00eeb
#include "gcr-gnupg-util.h"
Packit b00eeb
Packit b00eeb
#include <gcrypt.h>
Packit b00eeb
Packit b00eeb
/**
Packit b00eeb
 * _gcr_gnupg_build_xa1_record:
Packit b00eeb
 * @meta: Status metadata record about the attribute data.
Packit b00eeb
 * @attribute: Pointer to attribute data.
Packit b00eeb
 * @n_attribute: Length of attribute data.
Packit b00eeb
 *
Packit b00eeb
 * Build a record for attribute data. We use this records to convert attribute
Packit b00eeb
 * data into something we can keep with an array of GcrRecord.
Packit b00eeb
 *
Packit b00eeb
 * Returns: (transfer full): The newly allocated record.
Packit b00eeb
 */
Packit b00eeb
GcrRecord*
Packit b00eeb
_gcr_gnupg_build_xa1_record (GcrRecord *meta, gpointer attribute,
Packit b00eeb
                             gsize n_attribute)
Packit b00eeb
{
Packit b00eeb
	gchar hash[20];
Packit b00eeb
	gchar *hex;
Packit b00eeb
	gchar status = 0;
Packit b00eeb
	GcrRecord *record;
Packit b00eeb
	guint flags, type;
Packit b00eeb
	const gchar *created, *expiry;
Packit b00eeb
Packit b00eeb
	g_return_val_if_fail (meta, NULL);
Packit b00eeb
Packit b00eeb
	record = _gcr_record_new (GCR_RECORD_SCHEMA_XA1, GCR_RECORD_XA1_MAX, ':');
Packit b00eeb
Packit b00eeb
	gcry_md_hash_buffer (GCRY_MD_RMD160, hash, attribute, n_attribute);
Packit b00eeb
	hex = egg_hex_encode_full (hash, sizeof (hash), TRUE, NULL, 1);
Packit b00eeb
	_gcr_record_take_raw (record, GCR_RECORD_XA1_FINGERPRINT, hex);
Packit b00eeb
Packit b00eeb
	if (!_gcr_record_get_uint (meta, GCR_RECORD_ATTRIBUTE_FLAGS, &flags))
Packit b00eeb
		flags = 0;
Packit b00eeb
Packit b00eeb
	if (_gcr_record_get_uint (meta, GCR_RECORD_ATTRIBUTE_TYPE, &type))
Packit b00eeb
		_gcr_record_set_uint (record, GCR_RECORD_XA1_TYPE, type);
Packit b00eeb
Packit b00eeb
	created = _gcr_record_get_raw (meta, GCR_RECORD_ATTRIBUTE_TIMESTAMP);
Packit b00eeb
	if (created == NULL)
Packit b00eeb
		_gcr_record_set_raw (record, GCR_RECORD_XA1_TIMESTAMP, created);
Packit b00eeb
Packit b00eeb
	expiry = _gcr_record_get_raw (meta, GCR_RECORD_ATTRIBUTE_EXPIRY);
Packit b00eeb
	if (expiry != NULL)
Packit b00eeb
		_gcr_record_set_raw (record, GCR_RECORD_XA1_EXPIRY, expiry);
Packit b00eeb
Packit b00eeb
	/* These values are from gnupg doc/DETAILS */
Packit b00eeb
	if (flags & 0x02)
Packit b00eeb
		status = 'r';
Packit b00eeb
	else if (flags & 0x04)
Packit b00eeb
		status = 'e';
Packit b00eeb
	else if (flags & 0x01)
Packit b00eeb
		status = 'P';
Packit b00eeb
	if (status != 0)
Packit b00eeb
		_gcr_record_set_char (record, GCR_RECORD_XA1_TRUST, status);
Packit b00eeb
Packit b00eeb
	_gcr_record_set_base64 (record, GCR_RECORD_XA1_DATA, attribute, n_attribute);
Packit b00eeb
Packit b00eeb
	return record;
Packit b00eeb
}