struct asymmetric_key {
gcry_sexp_t sexp;
- int num_bytes;
+ int bits;
};
static const char *gcrypt_strerror(gcry_error_t gret)
}
PARA_INFO_LOG("successfully read %u bit ssh public key\n", bits);
key = alloc(sizeof(*key));
- key->num_bytes = ret;
key->sexp = sexp;
+ key->bits = bits;
*result = key;
ret = bits / 8;
release_n:
free(key);
}
-static int decode_rsa(gcry_sexp_t sexp, unsigned char *outbuf, size_t *nbytes)
+static int decode_rsa(gcry_sexp_t sexp, unsigned char **outbuf, size_t *nbytes)
{
const char *p = gcry_sexp_nth_data(sexp, 1, nbytes);
- if (!p)
+ if (!p) {
+ *outbuf = NULL;
return -E_RSA_DECODE;
- memcpy(outbuf, p, *nbytes);
+ }
+ *outbuf = alloc(*nbytes);
+ memcpy(*outbuf, p, *nbytes);
return 1;
}
-int apc_priv_decrypt(const char *key_file, unsigned char *outbuf,
+int apc_priv_decrypt(const char *key_file, unsigned char **outbuf,
unsigned char *inbuf, int inlen)
{
gcry_error_t gret;
gcry_sexp_t in, out, priv_key;
size_t nbytes;
+ *outbuf = NULL;
ret = check_private_key_file(key_file);
if (ret < 0)
return ret;
}
int apc_pub_encrypt(struct asymmetric_key *pub, unsigned char *inbuf,
- unsigned len, unsigned char *outbuf)
+ unsigned len, unsigned char **outbuf)
{
gcry_error_t gret;
gcry_sexp_t pub_key, in, out, out_a;
size_t nbytes;
int ret;
- PARA_INFO_LOG("encrypting %u byte input with %d-byte key\n", len, pub->num_bytes);
-
+ *outbuf = NULL;
/* get pub key */
pub_key = gcry_sexp_find_token(pub->sexp, "public-key", 0);
if (!pub_key)
ret = -E_SEXP_FIND;
goto out_a_release;
}
- gret = gcry_mpi_print(GCRYMPI_FMT_USG, outbuf, 512 /* FIXME */, &nbytes, out_mpi);
+ *outbuf = alloc(pub->bits);
+ gret = gcry_mpi_print(GCRYMPI_FMT_USG, *outbuf, pub->bits, &nbytes,
+ out_mpi);
if (gret) {
+ free(*outbuf);
+ *outbuf = NULL;
PARA_ERROR_LOG("%s\n", gcrypt_strerror(gret));
ret = -E_SEXP_ENCRYPT;
goto out_mpi_release;
}
PARA_INFO_LOG("encrypted buffer is %zu bytes\n", nbytes);
- dump_buffer("enc buf", outbuf, nbytes);
+ dump_buffer("enc buf", *outbuf, nbytes);
ret = nbytes;
out_mpi_release: