pike.git
/
src
/
post_modules
/
Nettle
/
hogweed.cmod
version
»
Context lines:
10
20
40
80
file
none
3
pike.git/src/post_modules/Nettle/hogweed.cmod:27:
push_int(num); apply_svalue((struct svalue *)f, 1); if(TYPEOF(Pike_sp[-1])!=T_STRING) Pike_error("Random function did not return string value.\n"); if(Pike_sp[-1].u.string->len != num) Pike_error("Random function did not return correct number of bytes.\n"); memcpy(out, Pike_sp[-1].u.string->str, num); pop_stack(); }
-
#define MAKE_GMP(X,Y) do { push_int(0); \
-
apply_svalue(&auto_bignum_program, 1); \
-
Y = Pike_sp[-1].u.object; \
-
memcpy(&X.Y, get_storage(Y, auto_bignum_program.u.program), sizeof(mpz_t));\
-
} while(0)
-
+
/*! @decl array(object(Gmp.mpz)) @ *! dsa_generate_keypair(int p_bits, int q_bits, @ *! function(int:string(0..255)) rnd) *! *! Generates a DSA key pair with @[p_bits] number of bits (sometimes *! referred to as L) for p, and @[q_bits] number of bits (sometimes *! referred to as N) for q, using the random function @[rnd]. *! *! Valid combinations as per FIPS 186-3 are *! @pre{
pike.git/src/post_modules/Nettle/hogweed.cmod:68:
*! @elem Gmp.mpz 3 *! The value y, the public value. *! @elem Gmp.mpz 4 *! The value x, the private value. *! @endarray */ PIKEFUN array(object(Gmp.mpz)) dsa_generate_keypair(int p_bits, int q_bits, function(int:string(0..255)) rnd) { struct dsa_public_key pub;
-
struct object *p, *q, *g, *y;
+
struct dsa_private_key key;
-
struct object *x;
+
-
MAKE
_
GMP(pub,p);
-
MAKE
_
GMP(pub,q);
-
MAKE
_
GMP
(pub
,g
);
-
MAKE
_
GMP(pub,y);
-
MAKE
_
GMP
(key
,x
);
+
dsa
_
public
_
key
_
init
(
&
pub);
+
dsa
_
private
_
key_init
(
&
key);
if( !nettle_dsa_generate_keypair(&pub, &key, rnd, random_func_wrapper, NULL, NULL, p_bits, q_bits) ) {
-
+
dsa_private_key_clear(&key);
+
dsa_public_key_clear(&pub);
+
Pike_error("Illegal parameter value.\n"); }
-
memcpy(get
_
storage
(
p, auto
_
bignum_program.u.program),
&pub.p
, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage
(
q, auto
_
bignum_program.u.program),
&pub.q
, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage
(
g, auto
_
bignum_program.u.program),
&pub.g
, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage
(
y, auto
_
bignum_program.u.program),
&pub.y
, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage
(
x, auto
_
bignum_program.u.program),
&key.x
, sizeof(mpz_t
)
)
;
+
push_bignum
(
(MP
_
INT
*
)&pub.p);
+
push_bignum
(
(MP
_
INT
*
)&pub.q);
+
push_bignum
(
(MP
_
INT
*
)&pub.g);
+
push_bignum
(
(MP
_
INT
*
)&pub.y);
+
push_bignum
(
(MP
_
INT
*
)&key.x);
-
+
dsa_private_key_clear(&key);
+
dsa_public_key_clear(&pub);
+
f_aggregate(5);
-
stack_pop_n_elems_keep_top(
3
); /* Remove p_bits, q_bits and rnd. */
+
stack_pop_n_elems_keep_top(
args
); /* Remove p_bits, q_bits and rnd. */
} /*! @decl array(object(Gmp.mpz)) @ *! rsa_generate_keypair(int bits, int e, function(int:string(0..255)) rnd) *! *! Generates an RSA key pair with a @[bits] sized modulus (n), using *! the provided value for @[e] and random function @[rnd]. *! *! @returns *! @array
pike.git/src/post_modules/Nettle/hogweed.cmod:116:
*! @elem Gmp.mpz 2 *! The value p, a prime. *! @elem Gmp.mpz 3 *! The value q, a prime. *! @endarray */ PIKEFUN array(object(Gmp.mpz)) rsa_generate_keypair(int bits, int e, function(int:string(0..255)) rnd) { struct rsa_public_key pub;
-
struct object *n, *_e;
+
struct rsa_private_key key;
-
struct object *d, *p, *q, *a, *b, *c;
+
-
push
_
int(e);
-
apply
_
svalue
(&
auto_bignum_program, 1
);
-
_
e = Pike
_
sp[-1].u.object;
-
memcpy(&pub.e, get
_
storage
(
_e, auto_bignum_program.u.program
)
,
-
sizeof(mpz_t))
;
+
rsa
_
public
_
key_init
(&
pub
);
+
rsa
_
private
_
key_init
(&
key
);
-
MAKE
_
GMP
(pub,
n);
-
MAKE_GMP(key,d
);
-
MAKE_GMP(key,p);
-
MAKE_GMP(key,q);
-
MAKE_GMP(key,a);
-
MAKE_GMP(key,b);
-
MAKE_GMP(key,c);
+
mpz
_
set_ui
(
&
pub
.e
,
e
);
if( !nettle_rsa_generate_keypair(&pub, &key, rnd, random_func_wrapper, NULL, NULL, bits, 0) ) {
-
+
rsa_private_key_clear(&key);
+
rsa_public_key_clear(&pub);
+
Pike_error("Illegal parameter value.\n"); }
-
memcpy(get
_
storage
(
n, auto
_
bignum_program.u.program),
&pub.n
, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage(d, auto_
bignum
_program.u.program), &key.d, sizeof
(
mpz_t));
-
memcpy
(
get
_
storage(p,
auto_bignum_program.u.program
)
,
&key.
p, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage(q, auto_
bignum
_program.u.program), &key.q, sizeof
(
mpz_t));
-
memcpy
(
get
_
storage(a,
auto_bignum_program.u.program
)
,
&key.
a, sizeof(mpz_t
)
)
;
-
memcpy(get
_
storage(b, auto_
bignum
_program.u.program), &key.b, sizeof
(
mpz_t));
-
memcpy
(
get
_
storage(c,
auto_bignum_program.u.program
)
,
&key.
c, sizeof(mpz_t
)
)
;
+
push_bignum
(
(MP
_
INT
*
)&pub.n);
+
push
_bignum((
MP
_
INT
*
)&key.
d
);
+
push
_bignum((
MP
_
INT
*
)&key.
p
);
+
push
_bignum((
MP
_
INT
*
)&key.
q
);
-
pop
_
n
_
elems
(
3
);
/*
We don't need a, b, c. */
+
rsa
_
private
_
key_clear
(
&key
);
+
rsa_public_key_clear(&pub);
+
f_aggregate(4);
-
stack_pop_n_elems_keep_top(
3
); /* Remove bits, e and rnd. */
+
stack_pop_n_elems_keep_top(
args
); /* Remove bits, e and rnd. */
} void hogweed_init(void) { INIT; } void hogweed_exit(void) { EXIT; } #endif