gcrypt: Support setting private value and testing of DH backend
authorMartin Willi <martin@revosec.ch>
Mon, 13 Apr 2015 10:12:09 +0000 (12:12 +0200)
committerMartin Willi <martin@revosec.ch>
Wed, 15 Apr 2015 12:38:42 +0000 (14:38 +0200)
src/libstrongswan/plugins/gcrypt/gcrypt_dh.c

index 744ec0b..cee25ea 100644 (file)
@@ -145,6 +145,24 @@ METHOD(diffie_hellman_t, get_my_public_value, bool,
        return TRUE;
 }
 
+METHOD(diffie_hellman_t, set_private_value, bool,
+       private_gcrypt_dh_t *this, chunk_t value)
+{
+       gcry_error_t err;
+       gcry_mpi_t xa;
+
+       err = gcry_mpi_scan(&xa, GCRYMPI_FMT_USG, value.ptr, value.len, NULL);
+       if (!err)
+       {
+               gcry_mpi_release(this->xa);
+               this->xa = xa;
+               gcry_mpi_powm(this->ya, this->g, this->xa, this->p);
+               gcry_mpi_release(this->zz);
+               this->zz = NULL;
+       }
+       return !err;
+}
+
 METHOD(diffie_hellman_t, get_shared_secret, bool,
        private_gcrypt_dh_t *this, chunk_t *secret)
 {
@@ -191,6 +209,7 @@ gcrypt_dh_t *create_generic(diffie_hellman_group_t group, size_t exp_len,
                                .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,
                        },