summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/lib6.c113
-rw-r--r--lib/lib6.h26
-rw-r--r--set6/task43.c98
3 files changed, 236 insertions, 1 deletions
diff --git a/lib/lib6.c b/lib/lib6.c
index fe2cd60..7239228 100644
--- a/lib/lib6.c
+++ b/lib/lib6.c
@@ -4,6 +4,7 @@
#include "lib3.h"
#include "lib2.h"
#include "lib.h"
+#include <openssl/sha.h>
int rsa_sign_bignum(BIGNUM *message, BIGNUM *signed_message, struct rsa_key_bignum *private)
@@ -96,3 +97,115 @@ int shitty_pkcs1_5_padding_verify(char *to_verify, int len, char *message)
return 1;
}
+
+void init_dsa_pub_param(struct dsa_public_params *p)
+{
+ char *p_str = "800000000000000089e1855218a0e7dac38136ffafa72eda7"
+ "859f2171e25e65eac698c1702578b07dc2a1076da241c76c6"
+ "2d374d8389ea5aeffd3226a0530cc565f3bf6b50929139ebe"
+ "ac04f48c3c84afb796d61e5a4f9a8fda812ab59494232c7d2"
+ "b4deb50aa18ee9e132bfa85ac4374d7f9091abc3d015efc87"
+ "1a584471bb1";
+
+ char *q_str = "f4f47f05794b256174bba6e9b396a7707e563c5b";
+
+ char *g_str = "5958c9d3898b224b12672c0b98e06c60df923cb8bc999d119"
+ "458fef538b8fa4046c8db53039db620c094c9fa077ef389b5"
+ "322a559946a71903f990f1f7e0e025e2d7f7cf494aff1a047"
+ "0f5b64c36b625a097f1651fe775323556fe00b3608c887892"
+ "878480e99041be601a62166ca6894bdd41a7054ec89f756ba"
+ "9fc95302291";
+
+ p->p = BN_new();
+ p->q = BN_new();
+ p->g = BN_new();
+
+ BN_hex2bn(&p->p, p_str);
+ BN_hex2bn(&p->q, q_str);
+ BN_hex2bn(&p->g, g_str);
+ p->bits = BN_num_bytes(p->q)*16;
+}
+
+void dsa_compute_per_user_keys(struct dsa_public_params *pub_param, struct
+ dsa_per_user_param *priv_param)
+{
+ BN_pseudo_rand(priv_param->private, pub_param->bits, -1, -1);
+ BN_mod(priv_param->private, priv_param->private, pub_param->q, ctx);
+ BN_mod_exp(priv_param->public, pub_param->g, priv_param->private,
+ pub_param->p, ctx);
+}
+
+void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_user_param
+ *priv_param, BIGNUM *k)
+{
+ // random per message value
+ BIGNUM *k_1 = BN_new();
+ BIGNUM *hash_bn = BN_new();
+ BIGNUM *tmp = BN_new();
+ SHA_CTX sha1;
+ char sha1_hash[20];
+
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, mess, strlen(mess));
+ SHA1_Final(sha1_hash, &sha1);
+ BN_bin2bn(sha1_hash, 20, hash_bn);
+ BN_zero(priv_param->r);
+ BN_zero(priv_param->s);
+
+ while(BN_is_zero(priv_param->r) || BN_is_zero(priv_param->s)) {
+ if(BN_is_zero(k)) {
+ BN_pseudo_rand(k, pub_param->bits, -1, -1);
+ BN_mod(k, k, pub_param->q, ctx);
+ }
+ BN_mod_exp(priv_param->r, pub_param->g, k, pub_param->p, ctx);
+ BN_mod(priv_param->r, priv_param->r, pub_param->q, ctx);
+
+ BN_mod_mul(tmp, priv_param->private, priv_param->r, pub_param->q, ctx);
+ BN_mod_add(tmp, hash_bn, tmp, pub_param->q, ctx);
+ BN_mod_inverse(k_1, k, pub_param->q, ctx);
+ BN_mod_mul(priv_param->s, k_1, tmp, pub_param->q, ctx);
+ }
+}
+
+
+int dsa_verify(char *mess, struct dsa_public_params *pub, struct dsa_per_user_param
+ *priv)
+{
+ SHA_CTX sha1;
+ char sha1_hash[20];
+ BIGNUM *w = BN_new();
+ BIGNUM *u1 = BN_new();
+ BIGNUM *u2 = BN_new();
+ BIGNUM *tmp1 = BN_new();
+ BIGNUM *tmp2 = BN_new();
+ BIGNUM *v = BN_new();
+ BIGNUM *hash_bn = BN_new();
+
+ BN_mod_inverse(w, priv->s, pub->q, ctx);
+
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, mess, strlen(mess));
+ SHA1_Final(sha1_hash, &sha1);
+ BN_bin2bn(sha1_hash, 20, hash_bn);
+
+ BN_mod_mul(u1, w, hash_bn, pub->q, ctx);
+ BN_mod_mul(u2, priv->r, w, pub->q, ctx);
+
+ BN_mod_exp(tmp1, pub->g, u1, pub->p, ctx);
+ BN_mod_exp(tmp2, priv->public, u2, pub->p, ctx);
+
+ BN_mod_mul(v, tmp1, tmp2, pub->p, ctx);
+ BN_mod(v, v, pub->q, ctx);
+
+ return BN_cmp(v, priv->r);
+}
+
+void dsa_recover_x_from_known_k(struct dsa_public_params *pub, BIGNUM *k,
+ struct dsa_per_user_param *priv, BIGNUM *mess_hash)
+{
+ BIGNUM *r_1 = BN_new();
+ BN_mod_inverse(r_1, priv->r, pub->q, ctx);
+ BN_mod_mul(priv->private, k, priv->s, pub->q, ctx);
+ BN_mod_sub(priv->private, priv->private, mess_hash, pub->q, ctx);
+ BN_mod_mul(priv->private, priv->private, r_1, pub->q, ctx);
+}
diff --git a/lib/lib6.h b/lib/lib6.h
index 23741b0..88fc530 100644
--- a/lib/lib6.h
+++ b/lib/lib6.h
@@ -8,9 +8,33 @@
#include "lib.h"
+struct dsa_public_params {
+ BIGNUM *p;
+ BIGNUM *q;
+ BIGNUM *g;
+ unsigned int bits;
+};
+
+struct dsa_per_user_param {
+ BIGNUM *public;
+ BIGNUM *private;
+ // signature data here also because they should not be here
+ BIGNUM *r;
+ BIGNUM *s;
+};
+
+
int rsa_sign_bignum(BIGNUM *message, BIGNUM *signed_message, struct rsa_key_bignum *private);
int rsa_verify_bignum(BIGNUM *signed_message, BIGNUM *org_message, struct rsa_key_bignum *public);
int shitty_pkcs1_5_padding_verify(char *to_verify, int len, char *message);
int pkcs1_5_padding_verify(char *to_verify, int len, char *message);
-
+void init_dsa_pub_param(struct dsa_public_params *p);
+void dsa_compute_per_user_keys(struct dsa_public_params *pub_param, struct
+ dsa_per_user_param *priv_param);
+void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_user_param
+ *priv_param, BIGNUM *k);
+int dsa_verify(char *mess, struct dsa_public_params *pub, struct dsa_per_user_param
+ *priv);
+void dsa_recover_x_from_known_k(struct dsa_public_params *pub, BIGNUM *k,
+ struct dsa_per_user_param *priv, BIGNUM *mess_hash);
#endif /* __LIB_6_H__ */
diff --git a/set6/task43.c b/set6/task43.c
new file mode 100644
index 0000000..b1386fa
--- /dev/null
+++ b/set6/task43.c
@@ -0,0 +1,98 @@
+#include "../lib/lib.h"
+#include "../lib/lib2.h"
+#include "../lib/lib3.h"
+#include "../lib/lib4.h"
+#include "../lib/lib5.h"
+#include "../lib/lib6.h"
+#include <openssl/sha.h>
+
+int main()
+{
+ int i;
+ struct dsa_public_params dsa_pub;
+ struct dsa_per_user_param dsa_user;
+ struct dsa_per_user_param dsa_user_org;
+ BIGNUM *hash_bn = BN_new();
+ BIGNUM *k = BN_new();
+ char *message = "For those that envy a MC it can be hazardous to your health\nSo be friendly, a matter of life and death, just like a etch-a-sketch\n";
+
+ out = BIO_new(BIO_s_file());
+ BIO_set_fp(out, stdout, BIO_NOCLOSE);
+ ctx = BN_CTX_new();
+
+ printf("message is:\n%s\n", message);
+ SHA_CTX sha1;
+ char sha1_hash[20];
+ char hex[40];
+ dsa_user.public = BN_new();
+ dsa_user.private = BN_new();
+ dsa_user.r= BN_new();
+ dsa_user.s = BN_new();
+
+ dsa_user_org.public = BN_new();
+ dsa_user_org.private = BN_new();
+ dsa_user_org.r= BN_new();
+ dsa_user_org.s = BN_new();
+
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, message, strlen(message));
+ SHA1_Final(sha1_hash, &sha1);
+ hex_binary_to_string(sha1_hash, hex, 20);
+ printf("hash of message is: %s\n", hex);
+ BN_bin2bn(sha1_hash, 20, hash_bn);
+ BN_print(out, hash_bn);
+
+ init_dsa_pub_param(&dsa_pub);
+
+ // set public key
+ char * y = "84ad4719d044495496a3201c8ff484feb45b962e7302e56a392aee4"
+ "abab3e4bdebf2955b4736012f21a08084056b19bcd7fee56048e004"
+ "e44984e2f411788efdc837a0d2e5abb7b555039fd243ac01f0fb2ed"
+ "1dec568280ce678e931868d23eb095fde9d3779191b8c0299d6e07b"
+ "bb283e6633451e535c45513b2d33c99ea17";
+ char *r = "548099063082341131477253921760299949438196259240";
+ char *s = "857042759984254168557880549501802188789837994940";
+
+ BN_hex2bn(&dsa_user.public, y);
+ // well this is decimal ....
+ BN_dec2bn(&dsa_user.r, r);
+ BN_dec2bn(&dsa_user.s, s);
+
+ BN_copy(dsa_user_org.public, dsa_user.public);
+ BN_copy(dsa_user_org.r, dsa_user.r);
+ BN_copy(dsa_user_org.s, dsa_user.s);
+
+ // can i verfiy that?
+ // brute force
+ BIGNUM *tmp = BN_new();
+ for(i=0;i<65536;i++) {
+ BN_set_word(k, i);
+ //BN_copy(dsa_user.r, dsa_user_org.r);
+ //BN_copy(dsa_user.s, dsa_user_org.s);
+ //BN_copy(dsa_user.public, dsa_user_org.public);
+ dsa_recover_x_from_known_k(&dsa_pub, k, &dsa_user, hash_bn);
+ // compute signture with this x,k and compare
+ printf("\nprivate key for k = %i\n", i);
+ BN_print(out, dsa_user.private);
+ //dsa_sign(message, &dsa_pub, &dsa_user, k);
+ BN_mod_exp(tmp, dsa_pub.g, dsa_user.private, dsa_pub.p, ctx);
+ if(!BN_cmp(tmp, dsa_user.public))
+ break;
+ }
+ printf("\nk is: %i, private key:\n", i);
+ BN_print(out, dsa_user.private);
+ char *str_priv = malloc(BN_num_bytes(dsa_user.private));
+ char *str_priv_hex = malloc(BN_num_bytes(dsa_user.private)*2+1);
+ BN_bn2bin(dsa_user.private, str_priv);
+ hex_binary_to_string(str_priv, str_priv_hex, BN_num_bytes(dsa_user.private));
+
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, str_priv_hex, BN_num_bytes(dsa_user.private)*2);
+ SHA1_Final(sha1_hash, &sha1);
+
+ char *given_hash = "0954edd5e0afe5542a4adf012611a91912a3ec16";
+ hex_binary_to_string(sha1_hash, hex, 20);
+ printf("\nhash of private key is: %s\n", hex);
+ printf("given one: %s\n", given_hash);
+ printf("equal?: %i", !memcmp(hex, given_hash, 20));
+}