|
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 |
}
|