/*
- * Copyright (C) 2011-2013 Andre Noll <maan@systemlinux.org>
+ * Copyright (C) 2011 Andre Noll <maan@tuebingen.mpg.de>
*
* Licensed under the GPL v2. For licencing details see COPYING.
*/
#include "crypt.h"
#include "crypt_backend.h"
#include "fd.h"
+#include "base64.h"
//#define GCRYPT_DEBUG 1
{
int i;
- fprintf(stderr, "%s (%u bytes): ", msg, len);
+ fprintf(stderr, "%s (%d bytes): ", msg, len);
for (i = 0; i < len; i++)
fprintf(stderr, "%02x ", buf[i]);
fprintf(stderr, "\n");
}
/** S-expression for the public part of an RSA key. */
-#define RSA_PUBKEY_SEXP "(public-key (rsa (n %m) (e %m)))"
+#define RSA_PUBKEY_SEXP "(public-key (rsa (n %m) (e %m)))"
/** S-expression for a private RSA key. */
#define RSA_PRIVKEY_SEXP "(private-key (rsa (n %m) (e %m) (d %m) (p %m) (q %m) (u %m)))"
{
gcry_error_t gret;
gcry_md_hd_t handle;
- size_t n;;
+ size_t n;
unsigned char *md;
unsigned char octet_string[4], *rp = result, *end = rp + result_len;
ret = mmap_full_file(key_file, O_RDONLY, &map, &map_size, NULL);
if (ret < 0)
- return ret;
+ goto out;
ret = -E_KEY_MARKER;
if (strncmp(map, header_str, strlen(header_str)))
goto unmap;
key[j++] = begin[i];
}
key[j] = '\0';
- //PARA_CRIT_LOG("key: %s\n", key);
- blob_size = key_size * 2;
- blob = para_malloc(blob_size);
- ret = base64_decode(key, blob, blob_size);
+ ret = base64_decode(key, j, (char **)&blob, &blob_size);
free(key);
if (ret < 0)
goto free_unmap;
+ ret = blob_size;
goto unmap;
free_unmap:
free(blob);
free(blob);
blob = NULL;
}
+out:
*result = blob;
return ret;
}
/* bit 6 has value 0 */
static inline bool is_primitive(unsigned char c)
{
- return ((c & (1<<6)) == 0);
+ return (c & (1<<6)) == 0;
}
static inline bool is_primitive_integer(unsigned char c)
{
if (!is_primitive(c))
return false;
- return ((c & 0x1f) == ASN1_TYPE_INTEGER);
+ return (c & 0x1f) == ASN1_TYPE_INTEGER;
}
/* Bit 8 is zero (and bits 7-1 give the length) */
{
const unsigned char *p = data, *end = data + len;
- /* the whole thing istarts with one sequence */
+ /* the whole thing starts with one sequence */
if (*p != ASN1_TYPE_SEQUENCE)
return -E_ASN1_PARSE;
p++;
for (i = 0; i < num_bytes; i++, cp++)
bn_size = (bn_size << 8) + *cp;
}
- PARA_DEBUG_LOG("bn_size %d (0x%x)\n", bn_size, bn_size);
+ PARA_DEBUG_LOG("bn_size %d (0x%x)\n", bn_size, (unsigned)bn_size);
gret = gcry_mpi_scan(bn, GCRYMPI_FMT_STD, cp, bn_size, NULL);
if (gret) {
PARA_ERROR_LOG("%s while scanning n\n",
if (p >= end)
return -E_ASN1_PARSE;
- /* Skip next integer */
+ /* skip next integer */
if (*p != ASN1_TYPE_INTEGER)
return -E_ASN1_PARSE;
p++;
}
key = para_malloc(sizeof(*key));
key->sexp = sexp;
+ key->num_bytes = n_size;
*result = key;
ret = n_size;
- PARA_INFO_LOG("successfully read %u bit asn public key\n", n_size * 8);
+ PARA_INFO_LOG("successfully read %d bit asn public key\n", n_size * 8);
release_e:
gcry_mpi_release(e);
size_t nr_scanned, erroff, decoded_size;
gcry_mpi_t e = NULL, n = NULL;
- PARA_DEBUG_LOG("decoding %d byte public rsa-ssh key\n", size);
- if (size > INT_MAX / 4)
- return -ERRNO_TO_PARA_ERROR(EOVERFLOW);
- blob = para_malloc(2 * size);
- ret = uudecode((char *)data, blob, 2 * size);
+ PARA_DEBUG_LOG("decoding %d byte public rsa-ssh key\n", size);
+ ret = uudecode((char *)data, size, (char **)&blob, &decoded_size);
if (ret < 0)
goto free_blob;
- decoded_size = ret;
end = blob + decoded_size;
dump_buffer("decoded key", blob, decoded_size);
ret = check_ssh_key_header(blob, decoded_size);
goto release_n;
}
ret = nr_scanned / 32 * 32;
- PARA_INFO_LOG("successfully read %u bit ssh public key\n", ret * 8);
+ PARA_INFO_LOG("successfully read %d bit ssh public key\n", ret * 8);
release_n:
gcry_mpi_release(n);
release_e:
gcry_sexp_t in, out, priv_key;
size_t nbytes;
+ ret = check_key_file(key_file, true);
+ if (ret < 0)
+ return ret;
PARA_INFO_LOG("decrypting %d byte input\n", inlen);
/* key_file -> asymmetric key priv */
ret = get_private_key(key_file, &priv);
gcry_cipher_hd_t handle;
};
-struct stream_cipher *sc_new(const unsigned char *data, int len)
+struct stream_cipher *sc_new(const unsigned char *data, int len,
+ bool use_aes)
{
gcry_error_t gret;
-
struct stream_cipher *sc = para_malloc(sizeof(*sc));
+
+ if (use_aes) {
+ assert(len >= 2 * AES_CRT128_BLOCK_SIZE);
+ gret = gcry_cipher_open(&sc->handle, GCRY_CIPHER_AES128,
+ GCRY_CIPHER_MODE_CTR, 0);
+ assert(gret == 0);
+ gret = gcry_cipher_setkey(sc->handle, data,
+ AES_CRT128_BLOCK_SIZE);
+ assert(gret == 0);
+ gret = gcry_cipher_setctr(sc->handle,
+ data + AES_CRT128_BLOCK_SIZE, AES_CRT128_BLOCK_SIZE);
+ assert(gret == 0);
+ return sc;
+ }
gret = gcry_cipher_open(&sc->handle, GCRY_CIPHER_ARCFOUR,
GCRY_CIPHER_MODE_STREAM, 0);
if (gret) {