/*
- * Copyright (C) 2011 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2011-2013 Andre Noll <maan@systemlinux.org>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
/** \file gcrypt.c Libgrcypt-based encryption/decryption routines. */
#include <regex.h>
-#include <stdbool.h>
#include <gcrypt.h>
#include "para.h"
/* rfc 3447, section 7.1.2 */
static int unpad_oaep(unsigned char *in, size_t in_len, unsigned char *out,
size_t *out_len)
-{ int ret;
+{
unsigned char *masked_seed = in + 1;
unsigned char *db = in + 1 + HASH_SIZE;
unsigned char seed[HASH_SIZE], seed_mask[HASH_SIZE];
p++;
*out_len = in + in_len - p;
memcpy(out, p, *out_len);
- return ret;
+ return 1;
}
struct asymmetric_key {
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.
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) {
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)
PARA_DEBUG_LOG("decrypted buffer before unpad (%d bytes):\n",
key_size);
dump_buffer("non-unpadded decrypted buffer", oaep_buf, key_size);;
- unpad_oaep(oaep_buf, key_size, outbuf, nbytes);
+ ret = unpad_oaep(oaep_buf, key_size, outbuf, nbytes);
+ if (ret < 0)
+ goto out_mpi_release;
PARA_DEBUG_LOG("decrypted buffer after unpad (%zu bytes):\n",
*nbytes);
dump_buffer("unpadded decrypted buffer", outbuf, *nbytes);;
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;
}
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);
+}