+Version 0.9.90
+- Updated the openpgp key API.
+
Version 0.9.8 (02/10/2003)
- Updated the SRP implementation to follow the latest draft
(draft-ietf-tls-srp-05).
dnl Gnutls Version
GNUTLS_MAJOR_VERSION=0
GNUTLS_MINOR_VERSION=9
-GNUTLS_MICRO_VERSION=8
+GNUTLS_MICRO_VERSION=90
GNUTLS_VERSION=$GNUTLS_MAJOR_VERSION.$GNUTLS_MINOR_VERSION.$GNUTLS_MICRO_VERSION
AC_DEFINE_UNQUOTED(GNUTLS_VERSION, "$GNUTLS_VERSION", [version of gnutls])
ex-crq.tex ex-session-info.tex ex-pkcs12.tex
TEX_OBJECTS = gnutls.tex ../../lib/gnutls-api.tex fdl.tex ../../lib/x509/x509-api.tex \
+ ../../libextra/openpgp/pgp-api.tex \
macros.tex cover.tex ciphersuites.tex handshake.tex translayer.tex \
auth.tex ciphers.tex errors.tex layers.tex alert.tex record.tex \
funcs.tex examples.tex ../../libextra/gnutls-extra-api.tex \
build_api_x509:
cd ../../lib/x509 && make x509-api.tex
+build_api_pgp:
+ cd ../../libextra/openpgp && make pgp-api.tex
+
build_api_extra:
cd ../../libextra && make gnutls-extra-api.tex
x509-api.tex: ../../lib/x509/x509-api.tex
-../scripts/sort1.pl < ../../lib/x509/x509-api.tex > x509-api.tex
-DOC_OBJECTS = x509-api.tex gnutls-api.tex gnutls-extra-api.tex error_codes.tex
+pgp-api.tex: ../../libextra/openpgp/pgp-api.tex
+ -../scripts/sort1.pl < ../../libextra/openpgp/pgp-api.tex > pgp-api.tex
+
+DOC_OBJECTS = pgp-api.tex x509-api.tex gnutls-api.tex gnutls-extra-api.tex error_codes.tex
gnutls.ps: build_api_lib build_api_x509 build_api_extra $(TEX_OBJECTS) $(DOC_OBJECTS)
-latex gnutls.tex
library called ``gnutls-extra''. The prototypes for this library lie
in ``gnutls/extra.h''.
+\section{\gnutls{} OpenPGP key handling\index{Function reference!for OpenPGP keys}}
+\label{sec:x509api}
+The following functions are to be used for OpenPGP certificate handling.
+Their prototypes lie in ``gnutls/openpgp.h''.
+
+\input{pgp-api}
+
\input{gnutls-extra-api}
## Process this file with automake to produce Makefile.in
nobase_include_HEADERS = gnutls/extra.h gnutls/openssl.h gnutls/gnutls.h \
- gnutls/compat4.h gnutls/x509.h gnutls/compat8.h gnutls/pkcs12.h
+ gnutls/compat4.h gnutls/x509.h gnutls/compat8.h gnutls/pkcs12.h \
+ gnutls/openpgp.h
SUBDIRS = gnutls
#include <gnutls/gnutls.h>
-struct gnutls_openpgp_key; /* object to hold (parsed) openpgp keys */
+struct gnutls_openpgp_key_int; /* object to hold (parsed) openpgp keys */
+typedef struct gnutls_openpgp_key_int* gnutls_openpgp_key;
typedef enum gnutls_openpgp_key_fmt { GNUTLS_X509_FMT_RAW,
GNUTLS_X509_FMT_BASE64 } gnutls_openpgp_key_fmt;
char* result, size_t* result_size);
int gnutls_openpgp_key_get_name( gnutls_openpgp_key key,
- int idx,
- char *buf, size_t *sizeof_buf);
+ int idx, char *buf, size_t *sizeof_buf);
int gnutls_openpgp_key_get_pk_algorithm(gnutls_openpgp_key key,
int *r_bits);
int gnutls_openpgp_key_check_hostname( gnutls_openpgp_key key, const char *hostname);
-int gnutls_openpgp_key_to_xml( gnutls_openpgp_key key key, gnutls_datum *xmlkey,
+int gnutls_openpgp_key_to_xml( gnutls_openpgp_key key, gnutls_datum *xmlkey,
int ext);
/* Keyring stuff.
*/
-struct gnutls_openpgp_keyring;
+struct gnutls_openpgp_keyring_int; /* object to hold (parsed) openpgp keyrings */
+typedef struct gnutls_openpgp_keyring_int* gnutls_openpgp_keyring;
int gnutls_openpgp_keyring_init( gnutls_openpgp_keyring* ring);
void gnutls_openpgp_keyring_deinit(gnutls_openpgp_keyring ring);
/* Trustdb functions.
*/
-struct gnutls_openpgp_trustdb;
+struct gnutls_openpgp_trustdb_int; /* object to hold (parsed) openpgp trustdbs */
+typedef struct gnutls_openpgp_trustdb_int* gnutls_openpgp_trustdb;
int gnutls_openpgp_trustdb_init( gnutls_openpgp_trustdb* db);
void gnutls_openpgp_trustdb_deinit(gnutls_openpgp_trustdb db);
int gnutls_openpgp_key_verify_ring(
gnutls_openpgp_key key,
gnutls_openpgp_keyring ring,
- unsigned int flags /* if not used reserved for future use,
+ unsigned int flags,
unsigned int * verify /* the output of the verification */);
int gnutls_openpgp_key_verify_trustdb(
gnutls_openpgp_key key,
gnutls_openpgp_trustdb db,
- unsigned int flags /* if not used reserved for future use,
+ unsigned int flags,
unsigned int * verify /* the output of the verification */);
**/
void gnutls_x509_crl_deinit(gnutls_x509_crl crl)
{
+ if (!crl) return;
+
if (crl->crl)
asn1_delete_structure(&crl->crl);
_gnutls_free_datum(&crl->signed_data);
**/
void gnutls_x509_crq_deinit(gnutls_x509_crq crq)
{
+ if (!crq) return;
+
if (crq->crq)
asn1_delete_structure(&crq->crq);
**/
void gnutls_pkcs12_deinit(gnutls_pkcs12 pkcs12)
{
+ if (!pkcs12) return;
+
if (pkcs12->pkcs12)
asn1_delete_structure(&pkcs12->pkcs12);
**/
void gnutls_pkcs12_bag_deinit(gnutls_pkcs12_bag bag)
{
+ if (!bag) return;
+
_pkcs12_bag_free_data( bag);
gnutls_free(bag);
**/
void gnutls_pkcs7_deinit(gnutls_pkcs7 pkcs7)
{
+ if (!pkcs7) return;
+
if (pkcs7->pkcs7)
asn1_delete_structure(&pkcs7->pkcs7);
{
int i;
+ if (!key) return;
+
for (i = 0; i < key->params_size; i++) {
_gnutls_mpi_release( &key->params[i]);
}
**/
void gnutls_x509_crt_deinit(gnutls_x509_crt cert)
{
+ if (!cert) return;
+
if (cert->cert)
asn1_delete_structure(&cert->cert);
_gnutls_free_datum(&cert->signed_data);
libgnutls_extra_la_LIBADD = $(LZO_OBJECTS) ../lib/libgnutls.la \
openpgp/openpgp.lo openpgp/xml.lo openpgp/gnutls_openpgp.lo \
- openpgp/extras.lo openpgp/verify.lo
+ openpgp/extras.lo openpgp/verify.lo openpgp/compat.lo
EXTRA_libgnutls_extra_la_SOURCES = minilzo.c
#include <gnutls_errors.h>
#include <gnutls_extensions.h>
#include <ext_srp.h>
-#include <gnutls_openpgp.h>
+#include <openpgp/gnutls_openpgp.h>
#include <gnutls_extra.h>
#include <gnutls_algorithms.h>
#include <minilzo.h>
extern OPENPGP_KEY_REQUEST _E_gnutls_openpgp_request_key;
static void _gnutls_add_openpgp_functions(void) {
+#ifdef HAVE_LIBOPENCDK
_E_gnutls_openpgp_verify_key = gnutls_openpgp_verify_key;
_E_gnutls_openpgp_extract_key_expiration_time = gnutls_openpgp_extract_key_expiration_time;
_E_gnutls_openpgp_extract_key_creation_time = gnutls_openpgp_extract_key_creation_time;
_E_gnutls_openpgp_fingerprint = gnutls_openpgp_fingerprint;
_E_gnutls_openpgp_request_key = _gnutls_openpgp_request_key;
_E_gnutls_openpgp_cert2gnutls_cert = _gnutls_openpgp_cert2gnutls_cert;
+#endif
}
extern const char* gnutls_check_version( const char*);
noinst_LTLIBRARIES = libpgp.la
-COBJECTS = openpgp.c xml.c gnutls_openpgp.c verify.c extras.c
+COBJECTS = openpgp.c xml.c gnutls_openpgp.c verify.c extras.c compat.c
libpgp_la_SOURCES = $(COBJECTS)
cdk_keydb_hd_t kbx_to_keydb( keybox_blob *blob );
void kbx_blob_release( keybox_blob *ctx );
+int gnutls_openpgp_verify_key(const char *trustdb,
+ const gnutls_datum * keyring,
+ const gnutls_datum * cert_list,
+ int cert_list_length);
+int gnutls_openpgp_fingerprint(const gnutls_datum * cert,
+ unsigned char *fpr, size_t * fprlen);
+time_t gnutls_openpgp_extract_key_creation_time(const gnutls_datum * cert);
+time_t gnutls_openpgp_extract_key_expiration_time(const gnutls_datum * cert);
+
#endif /*GNUTLS_OPENPGP_H*/
**/
void gnutls_openpgp_key_deinit(gnutls_openpgp_key key)
{
+ if (!key) return;
+
if (key->knode) {
cdk_kbnode_release( key->knode);
key->knode = NULL;
* Extract the version of the OpenPGP key.
**/
int
-gnutls_openpgp_extract_key_version( gnutls_openpgp_key key)
+gnutls_openpgp_key_get_version( gnutls_openpgp_key key)
{
CDK_PACKET *pkt;
int version = 0;
* Returns the timestamp when the OpenPGP key was created.
**/
time_t
-gnutls_openpgp_extract_key_creation_time( gnutls_openpgp_key key)
+gnutls_openpgp_key_get_creation_time( gnutls_openpgp_key key)
{
CDK_PACKET *pkt;
time_t timestamp = 0;
gnutls_openpgp_key_get_name( gnutls_openpgp_key key,
int idx,
char *buf, size_t *sizeof_buf);
+int gnutls_openpgp_key_get_fingerprint( gnutls_openpgp_key key,
+ unsigned char *fpr, size_t *fprlen);
+int gnutls_openpgp_key_get_pk_algorithm( gnutls_openpgp_key key, int *r_bits);
+int gnutls_openpgp_key_get_version( gnutls_openpgp_key key);
+time_t gnutls_openpgp_key_get_creation_time( gnutls_openpgp_key key);
+time_t gnutls_openpgp_key_get_expiration_time( gnutls_openpgp_key key);
+int gnutls_openpgp_key_get_id( gnutls_openpgp_key key,
+ unsigned char keyid[8]);
+int gnutls_openpgp_key_init(gnutls_openpgp_key * key);
+void gnutls_openpgp_key_deinit(gnutls_openpgp_key key);
+int gnutls_openpgp_key_import(gnutls_openpgp_key key,
+ const gnutls_datum * data, gnutls_openpgp_key_fmt format);
+
+
+void gnutls_openpgp_keyring_deinit(gnutls_openpgp_keyring keyring);
+int gnutls_openpgp_keyring_init(gnutls_openpgp_keyring * keyring);
+int gnutls_openpgp_keyring_import(gnutls_openpgp_keyring keyring,
+ const gnutls_datum * data,
+ gnutls_openpgp_key_fmt format);
+
+void gnutls_openpgp_trustdb_deinit(gnutls_openpgp_trustdb trustdb);
+int gnutls_openpgp_trustdb_init(gnutls_openpgp_trustdb * trustdb);
+int gnutls_openpgp_trustdb_import_file(gnutls_openpgp_trustdb trustdb,
+ const char * file);
+
+int gnutls_openpgp_key_verify_ring( gnutls_openpgp_key key,
+ gnutls_openpgp_keyring keyring,
+ unsigned int flags, unsigned int *verify);
+
+int gnutls_openpgp_key_verify_trustdb( gnutls_openpgp_key key,
+ gnutls_openpgp_trustdb trustdb,
+ unsigned int flags, unsigned int *verify);
#endif
#include <gnutls/gnutls.h>
#include <gnutls/extra.h>
#include <gnutls/x509.h>
+#include <gnutls/openpgp.h>
#include <time.h>
#include <common.h>
int xml = 0;
#define PRINTX(x,y) if (y[0]!=0) printf(" # %s %s\n", x, y)
-#define PRINT_PGP_NAME(X) PRINTX( "NAME:", X.name); \
- PRINTX( "EMAIL:", X.email)
+#define PRINT_PGP_NAME(X) PRINTX( "NAME:", name)
const char str_unknown[] = "(unknown)";
}
-void print_openpgp_info(gnutls_session session)
+void print_openpgp_info(gnutls_session session, const char* hostname)
{
- gnutls_openpgp_name pgp_name;
char digest[20];
- int digest_size = sizeof(digest), i;
+ int digest_size = sizeof(digest), i, ret;
char printable[120];
char *print;
+ char name[256];
+ size_t name_len = sizeof(name);
+ gnutls_openpgp_key crt;
const gnutls_datum *cert_list;
int cert_list_size = 0;
- time_t expiret = gnutls_certificate_expiration_time_peers(session);
- time_t activet = gnutls_certificate_activation_time_peers(session);
-
+ time_t expiret;
+ time_t activet;
+
cert_list = gnutls_certificate_get_peers(session, &cert_list_size);
if (cert_list_size > 0) {
int algo, bits;
-#if 0
- if (xml) {
- gnutls_datum res;
+ gnutls_openpgp_key_init(&crt);
+ ret =
+ gnutls_openpgp_key_import(crt, &cert_list[0], 0);
+ if (ret < 0) {
+ const char* str = gnutls_strerror(ret);
+ if (str == NULL) str = str_unknown;
+ fprintf(stderr, "Decoding error: %s\n", str);
+ return;
+ }
+
+ if (hostname != NULL) { /* Check the hostname of the first certificate
+ * if it matches the name of the host we
+ * connected to.
+ */
+ if (gnutls_openpgp_key_check_hostname( crt, hostname)==0) {
+ printf(" # The hostname in the key does NOT match '%s'.\n", hostname);
+ } else {
+ printf(" # The hostname in the key matches '%s'.\n", hostname);
+ }
+ }
- gnutls_openpgp_key_to_xml(&cert_list[0], &res, 0);
- puts(res.data);
+ if (xml) {
+ gnutls_datum xml_data;
- free(res.data);
+ ret = gnutls_openpgp_key_to_xml( crt, &xml_data, 0);
+ if (ret < 0) {
+ const char* str = gnutls_strerror(ret);
+ if (str == NULL) str = str_unknown;
+ fprintf(stderr, "XML encoding error: %s\n",
+ str);
+ return;
+ }
+
+ printf("%s", xml_data.data);
+ gnutls_free( xml_data.data);
return;
}
-#endif
+
+ activet = gnutls_openpgp_key_get_creation_time( crt);
+ expiret = gnutls_openpgp_key_get_expiration_time( crt);
printf(" # Key was created at: %s", my_ctime(&activet));
printf(" # Key expires: ");
else
printf("Never\n");
- if (gnutls_openpgp_fingerprint
- (&cert_list[0], digest, &digest_size) >= 0) {
+ if (gnutls_openpgp_key_get_fingerprint(crt, digest, &digest_size) >= 0)
+ {
print = printable;
for (i = 0; i < digest_size; i++) {
sprintf(print, "%.2x ",
}
printf(" # PGP Key version: %d\n",
- gnutls_openpgp_extract_key_version
- (&cert_list[0]));
+ gnutls_openpgp_key_get_version(crt));
algo =
- gnutls_openpgp_extract_key_pk_algorithm
- (&cert_list[0], &bits);
+ gnutls_openpgp_key_get_pk_algorithm(crt, &bits);
printf(" # PGP Key public key algorithm: ");
printf(" # PGP Key fingerprint: %s\n", printable);
- if (gnutls_openpgp_extract_key_name(&cert_list[0],
- 0,
- &pgp_name) <
- 0) {
+ name_len = sizeof(name);
+ if (gnutls_openpgp_key_get_name(crt, 0, name, &name_len) < 0) {
fprintf(stderr,
"Could not extract name\n");
} else {
- PRINT_PGP_NAME(pgp_name);
+ PRINT_PGP_NAME(name);
}
}
break;
case GNUTLS_CRT_OPENPGP:
printf("OpenPGP\n");
- print_openpgp_info(session);
+ print_openpgp_info(session, hostname);
break;
}