1 /* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
2 /* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
3 /* License: GPL v3 or later */
5 #include "gnutls-helpers.h"
10 void err(const char* fmt, ...) {
13 vfprintf(stderr, fmt, ap);
17 void logfunc(int level, const char* string) {
18 fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
21 void init_keyid(gnutls_openpgp_keyid_t keyid) {
22 memset(keyid, 'x', sizeof(gnutls_openpgp_keyid_t));
27 void make_keyid_printable(printable_keyid out, gnutls_openpgp_keyid_t keyid)
29 static const char hex[16] = "0123456789ABCDEF";
30 unsigned int kix = 0, outix = 0;
32 while (kix < sizeof(gnutls_openpgp_keyid_t)) {
33 out[outix] = hex[(keyid[kix] >> 4) & 0x0f];
34 out[outix + 1] = hex[keyid[kix] & 0x0f];
42 const char* version = NULL;
43 const char* debug_string = NULL;
46 if (ret = gnutls_global_init(), ret) {
47 err("Failed to do gnutls_global_init() (error: %d)\n", ret);
51 version = gnutls_check_version(NULL);
54 err("gnutls version: %s\n", version);
56 err("no version found!\n");
60 if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
61 loglevel = atoi(debug_string);
62 gnutls_global_set_log_function(logfunc);
64 gnutls_global_set_log_level(loglevel);
65 err("set log level to %d\n", loglevel);
70 void init_datum(gnutls_datum_t* d) {
74 void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
75 dest->data = gnutls_realloc(dest->data, src->size);
76 dest->size = src->size;
77 memcpy(dest->data, src->data, src->size);
79 int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
80 if (a->size > b->size) {
84 if (a->size < b->size) {
88 return memcmp(a->data, b->data, a->size);
90 void free_datum(gnutls_datum_t* d) {
96 /* read the passed-in string, store in a single datum */
97 int set_datum_string(gnutls_datum_t* d, const char* s) {
98 unsigned int x = strlen(s)+1;
99 unsigned char* c = NULL;
101 c = gnutls_realloc(d->data, x);
106 memcpy(d->data, s, x);
110 /* read the passed-in file descriptor until EOF, store in a single
112 int set_datum_fd(gnutls_datum_t* d, int fd) {
113 unsigned int bufsize = 1024;
114 unsigned int len = 0;
116 FILE* f = fdopen(fd, "r");
117 if (bufsize > d->size) {
119 d->data = gnutls_realloc(d->data, bufsize);
120 if (d->data == NULL) {
121 err("out of memory!\n");
130 err("could not fdopen FD %d\n", fd);
133 while (!feof(f) && !ferror(f)) {
134 if (len == bufsize) {
135 /* allocate more space by doubling: */
137 d->data = gnutls_realloc(d->data, bufsize);
138 if (d->data == NULL) {
139 err("out of memory!\n");
144 len += fread(d->data + len, 1, bufsize - len, f);
145 /* err("read %d bytes\n", len); */
148 err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
152 /* touch up buffer size to match reality: */
153 d->data = gnutls_realloc(d->data, len);
158 /* read the file indicated (by na1me) in the fname parameter. store
159 its entire contents in a single datum. */
160 int set_datum_file(gnutls_datum_t* d, const char* fname) {
162 unsigned char* c = NULL;
166 if (0 != stat(fname, &sbuf)) {
167 err("failed to stat '%s'\n", fname);
171 c = gnutls_realloc(d->data, sbuf.st_size);
173 err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
178 d->size = sbuf.st_size;
179 file = fopen(fname, "r");
181 err("failed to open '%s' for reading\n", fname);
185 x = fread(d->data, d->size, 1, file);
187 err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);