gmp: Support setting Diffie-Hellman private values
authorMartin Willi <martin@revosec.ch>
Thu, 9 Apr 2015 12:59:04 +0000 (14:59 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 15 Apr 2015 12:38:41 +0000 (14:38 +0200)
src/libstrongswan/plugins/gmp/gmp_diffie_hellman.c

index 4fcb168..b7ee94e 100644 (file)
@@ -162,6 +162,15 @@ METHOD(diffie_hellman_t, get_my_public_value, bool,
        return TRUE;
 }
 
        return TRUE;
 }
 
+METHOD(diffie_hellman_t, set_private_value, bool,
+       private_gmp_diffie_hellman_t *this, chunk_t value)
+{
+       mpz_import(this->xa, value.len, 1, 1, 1, 0, value.ptr);
+       mpz_powm(this->ya, this->g, this->xa, this->p);
+       this->computed = FALSE;
+       return TRUE;
+}
+
 METHOD(diffie_hellman_t, get_shared_secret, bool,
        private_gmp_diffie_hellman_t *this, chunk_t *secret)
 {
 METHOD(diffie_hellman_t, get_shared_secret, bool,
        private_gmp_diffie_hellman_t *this, chunk_t *secret)
 {
@@ -212,6 +221,7 @@ static gmp_diffie_hellman_t *create_generic(diffie_hellman_group_t group,
                                .get_shared_secret = _get_shared_secret,
                                .set_other_public_value = _set_other_public_value,
                                .get_my_public_value = _get_my_public_value,
                                .get_shared_secret = _get_shared_secret,
                                .set_other_public_value = _set_other_public_value,
                                .get_my_public_value = _get_my_public_value,
+                               .set_private_value = _set_private_value,
                                .get_dh_group = _get_dh_group,
                                .destroy = _destroy,
                        },
                                .get_dh_group = _get_dh_group,
                                .destroy = _destroy,
                        },