summaryrefslogtreecommitdiff
path: root/gnutls-helpers.c
blob: a2f8446c614653509c0c0e3c1db91356ab5d9fca (plain)
  1. /* Author: Daniel Kahn Gillmor <dkg@fifthhorseman.net> */
  2. /* Date: Fri, 04 Apr 2008 19:31:16 -0400 */
  3. /* License: GPL v3 or later */
  4. #include "gnutls-helpers.h"
  5. int loglevel = 0;
  6. void err(const char* fmt, ...) {
  7. va_list ap;
  8. va_start(ap, fmt);
  9. vfprintf(stderr, fmt, ap);
  10. va_end(ap);
  11. }
  12. void logfunc(int level, const char* string) {
  13. fprintf(stderr, "GnuTLS Logging (%d): %s\n", level, string);
  14. }
  15. void init_keyid(gnutls_openpgp_keyid_t keyid) {
  16. memset(keyid, 'x', sizeof(gnutls_openpgp_keyid_t));
  17. }
  18. void make_keyid_printable(printable_keyid out, gnutls_openpgp_keyid_t keyid)
  19. {
  20. static const char hex[16] = "0123456789ABCDEF";
  21. unsigned int kix = 0, outix = 0;
  22. while (kix < sizeof(gnutls_openpgp_keyid_t)) {
  23. out[outix] = hex[(keyid[kix] >> 4) & 0x0f];
  24. out[outix + 1] = hex[keyid[kix] & 0x0f];
  25. kix++;
  26. outix += 2;
  27. }
  28. }
  29. int init_gnutls() {
  30. const char* version = NULL;
  31. const char* debug_string = NULL;
  32. int ret;
  33. if (ret = gnutls_global_init(), ret) {
  34. err("Failed to do gnutls_global_init() (error: %d)\n", ret);
  35. return 1;
  36. }
  37. version = gnutls_check_version(NULL);
  38. if (version)
  39. err("gnutls version: %s\n", version);
  40. else {
  41. err("no version found!\n");
  42. return 1;
  43. }
  44. if (debug_string = getenv("MONKEYSPHERE_DEBUG"), debug_string) {
  45. loglevel = atoi(debug_string);
  46. gnutls_global_set_log_function(logfunc);
  47. gnutls_global_set_log_level(loglevel);
  48. err("set log level to %d\n", loglevel);
  49. }
  50. return 0;
  51. }
  52. void init_datum(gnutls_datum_t* d) {
  53. d->data = NULL;
  54. d->size = 0;
  55. }
  56. void copy_datum(gnutls_datum_t* dest, const gnutls_datum_t* src) {
  57. dest->data = gnutls_realloc(dest->data, src->size);
  58. dest->size = src->size;
  59. memcpy(dest->data, src->data, src->size);
  60. }
  61. int compare_data(const gnutls_datum_t* a, const gnutls_datum_t* b) {
  62. if (a->size > b->size) {
  63. err("a is larger\n");
  64. return 1;
  65. }
  66. if (a->size < b->size) {
  67. err("b is larger\n");
  68. return -1;
  69. }
  70. return memcmp(a->data, b->data, a->size);
  71. }
  72. void free_datum(gnutls_datum_t* d) {
  73. gnutls_free(d->data);
  74. d->data = NULL;
  75. d->size = 0;
  76. }
  77. /* read the passed-in string, store in a single datum */
  78. int set_datum_string(gnutls_datum_t* d, const char* s) {
  79. unsigned int x = strlen(s)+1;
  80. unsigned char* c = NULL;
  81. c = gnutls_realloc(d->data, x);
  82. if (NULL == c)
  83. return -1;
  84. d->data = c;
  85. d->size = x;
  86. memcpy(d->data, s, x);
  87. return 0;
  88. }
  89. /* read the passed-in file descriptor until EOF, store in a single
  90. datum */
  91. int set_datum_fd(gnutls_datum_t* d, int fd) {
  92. unsigned int bufsize = 1024;
  93. unsigned int len = 0;
  94. FILE* f = fdopen(fd, "r");
  95. if (bufsize > d->size) {
  96. bufsize = 1024;
  97. d->data = gnutls_realloc(d->data, bufsize);
  98. if (d->data == NULL) {
  99. err("out of memory!\n");
  100. return -1;
  101. }
  102. d->size = bufsize;
  103. } else {
  104. bufsize = d->size;
  105. }
  106. f = fdopen(fd, "r");
  107. if (NULL == f) {
  108. err("could not fdopen FD %d\n", fd);
  109. }
  110. clearerr(f);
  111. while (!feof(f) && !ferror(f)) {
  112. if (len == bufsize) {
  113. /* allocate more space by doubling: */
  114. bufsize *= 2;
  115. d->data = gnutls_realloc(d->data, bufsize);
  116. if (d->data == NULL) {
  117. err("out of memory!\n");
  118. return -1;
  119. };
  120. d->size = bufsize;
  121. }
  122. len += fread(d->data + len, 1, bufsize - len, f);
  123. /* err("read %d bytes\n", len); */
  124. }
  125. if (ferror(f)) {
  126. err("Error reading from fd %d (error: %d) (error: %d '%s')\n", fd, ferror(f), errno, strerror(errno));
  127. return -1;
  128. }
  129. /* touch up buffer size to match reality: */
  130. d->data = gnutls_realloc(d->data, len);
  131. d->size = len;
  132. return 0;
  133. }
  134. /* read the file indicated (by na1me) in the fname parameter. store
  135. its entire contents in a single datum. */
  136. int set_datum_file(gnutls_datum_t* d, const char* fname) {
  137. struct stat sbuf;
  138. unsigned char* c = NULL;
  139. FILE* file = NULL;
  140. size_t x = 0;
  141. if (0 != stat(fname, &sbuf)) {
  142. err("failed to stat '%s'\n", fname);
  143. return -1;
  144. }
  145. c = gnutls_realloc(d->data, sbuf.st_size);
  146. if (NULL == c) {
  147. err("failed to allocate %d bytes for '%s'\n", sbuf.st_size, fname);
  148. return -1;
  149. }
  150. d->data = c;
  151. d->size = sbuf.st_size;
  152. file = fopen(fname, "r");
  153. if (NULL == file) {
  154. err("failed to open '%s' for reading\n", fname);
  155. return -1;
  156. }
  157. x = fread(d->data, d->size, 1, file);
  158. if (x != 1) {
  159. err("tried to read %d bytes, read %d instead from '%s'\n", d->size, x, fname);
  160. fclose(file);
  161. return -1;
  162. }
  163. fclose(file);
  164. return 0;
  165. }