X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=gnutls-helpers.c;h=6eae29e0aa3a32352c62212587a33118d5ca973f;hb=d1ac46b53ec182fec1397ccd651a699551a99970;hp=ce77d0cbdd4ad9ad81093a3e2b3e946c32457a26;hpb=76c17804015ffb6c18232cd9ba80cf2a641fd59e;p=monkeysphere.git diff --git a/gnutls-helpers.c b/gnutls-helpers.c index ce77d0c..6eae29e 100644 --- a/gnutls-helpers.c +++ b/gnutls-helpers.c @@ -20,6 +20,7 @@ void err(const char* fmt, ...) { va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap); + fflush(stderr); } void logfunc(int level, const char* string) { @@ -210,11 +211,29 @@ int write_datum_fd(int fd, const gnutls_datum_t* d) { int write_datum_fd_with_length(int fd, const gnutls_datum_t* d) { - uint32_t len = htonl(d->size); + uint32_t len; + int looks_negative = (d->data[0] & 0x80); + unsigned char zero = 0; + + /* if the first bit is 1, then the datum will appear negative in the + MPI encoding style used by OpenSSH. In that case, we'll increase + the length by one, and dump out one more byte */ + + if (looks_negative) { + len = htonl(d->size + 1); + } else { + len = htonl(d->size); + } if (write(fd, &len, sizeof(len)) != sizeof(len)) { err("failed to write size of datum.\n"); return -2; } + if (looks_negative) { + if (write(fd, &zero, 1) != 1) { + err("failed to write padding byte for MPI.\n"); + return -2; + } + } return write_datum_fd(fd, d); } @@ -268,6 +287,10 @@ int create_writing_pipe(pid_t* pid, const char* path, char* const argv[]) { } execv(path, argv); err("exec %s failed (error: %d \"%s\")\n", path, errno, strerror(errno)); + /* close the open file descriptors */ + close(p[0]); + close(0); + exit(1); } else { /* this is the parent */ close(p[0]); /* close unused read end */ @@ -322,3 +345,20 @@ int validate_ssh_host_userid(const char* userid) { setlocale(LC_ALL, oldlocale); return 1; } + +/* http://tools.ietf.org/html/rfc4880#section-5.5.2 */ +size_t get_openpgp_mpi_size(gnutls_datum_t* d) { + return 2 + d->size; +} + +int write_openpgp_mpi_to_fd(int fd, gnutls_datum_t* d) { + uint16_t x; + + x = d->size * 8; + x = htons(x); + + write(fd, &x, sizeof(x)); + write(fd, d->data, d->size); + + return 0; +}