add i2d_DHparams

This commit is contained in:
Love Hornquist Astrand
2010-06-16 14:55:04 -07:00
parent ae9088c375
commit cda41d7252

View File

@@ -37,6 +37,9 @@
#include <stdio.h> #include <stdio.h>
#include <stdlib.h> #include <stdlib.h>
#include <krb5-types.h>
#include <rfc2459_asn1.h>
#include <dh.h> #include <dh.h>
#include <roken.h> #include <roken.h>
@@ -487,3 +490,63 @@ DH_get_default_method(void)
return dh_default_method; return dh_default_method;
} }
/*
*
*/
static int
bn2heim_int(BIGNUM *bn, heim_integer *integer)
{
integer->length = BN_num_bytes(bn);
integer->data = malloc(integer->length);
if (integer->data == NULL) {
integer->length = 0;
return ENOMEM;
}
BN_bn2bin(bn, integer->data);
integer->negative = BN_is_negative(bn);
return 0;
}
/**
*
*/
int
i2d_DHparams(DH *dh, const char **pp)
{
DHParameter data;
size_t size;
int ret;
memset(&data, 0, sizeof(data));
if (bn2heim_int(dh->p, &data.prime) ||
bn2heim_int(dh->g, &data.base))
{
free_DHParameter(&data);
return -1;
}
if (pp == NULL) {
size = length_DHParameter(&data);
free_DHParameter(&data);
} else {
void *p;
size_t len;
ASN1_MALLOC_ENCODE(DHParameter, p, len, &data, &size, ret);
free_DHParameter(&data);
if (ret)
return -1;
if (len != size)
abort();
memcpy(*pp, p, size);
free(p);
*pp += size;
}
return size;
}