Merge branch 't/wma_improvements'
[paraslash.git] / gcrypt.c
index f825f6c6a3de6388959d7b900f31ef9d48e6397b..aaf97d424b4e5725c025288d4dd5cc341da9a6a2 100644 (file)
--- a/gcrypt.c
+++ b/gcrypt.c
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2011-2012 Andre Noll <maan@systemlinux.org>
  *
  * Licensed under the GPL v2. For licencing details see COPYING.
  */
@@ -7,7 +7,6 @@
 /** \file gcrypt.c Libgrcypt-based encryption/decryption routines. */
 
 #include <regex.h>
-#include <stdbool.h>
 #include <gcrypt.h>
 
 #include "para.h"
@@ -500,7 +499,6 @@ static int get_private_key(const char *key_file, struct asymmetric_key **result)
        ret = read_bignum(cp, end, &u, NULL);
        if (ret < 0)
                goto release_q;
-       cp += ret;
        /*
         * OpenSSL uses slightly different parameters than gcrypt. To use these
         * parameters we need to swap the values of p and q and recompute u.
@@ -575,7 +573,6 @@ static int get_asn_public_key(const char *key_file, struct asymmetric_key **resu
        ret = read_bignum(cp, end, &e, NULL);
        if (ret < 0)
                goto release_n;
-       cp += ret;
 
        gret = gcry_sexp_build(&sexp, &erroff, RSA_PUBKEY_SEXP, n, e);
        if (gret) {
@@ -698,7 +695,6 @@ int get_asymmetric_key(const char *key_file, int private,
        key->num_bytes = ret;
        key->sexp = sexp;
        *result = key;
-       ret = key->num_bytes;
 unmap:
        ret2 = para_munmap(map, map_size);
        if (ret >= 0 && ret2 < 0)
@@ -952,7 +948,7 @@ int sc_send_bin_buffer(struct stream_cipher_context *scc, char *buf,
        gret = gcry_cipher_encrypt(scc->send->handle, tmp, size,
                (unsigned char *)buf, size);
        assert(gret == 0);
-       ret = write_all(scc->fd, (char *)tmp, &size);
+       ret = xwrite(scc->fd, (char *)tmp, size);
        free(tmp);
        return ret;
 }
@@ -973,3 +969,15 @@ int sc_recv_bin_buffer(struct stream_cipher_context *scc, char *buf,
        assert(gret == 0);
        return ret;
 }
+
+void sc_crypt(struct stream_cipher *sc, struct iovec *src, struct iovec *dst)
+{
+       gcry_cipher_hd_t handle = sc->handle;
+       gcry_error_t gret;
+
+       /* perform in-place encryption */
+       *dst = *src;
+       gret = gcry_cipher_encrypt(handle, src->iov_base, src->iov_len,
+               NULL, 0);
+       assert(gret == 0);
+}