summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/lib6.c17
-rw-r--r--lib/lib6.h2
-rw-r--r--set6/task45.c105
3 files changed, 122 insertions, 2 deletions
diff --git a/lib/lib6.c b/lib/lib6.c
index ef0db85..432c959 100644
--- a/lib/lib6.c
+++ b/lib/lib6.c
@@ -152,7 +152,7 @@ void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_us
BN_zero(priv_param->r);
BN_zero(priv_param->s);
- while(BN_is_zero(priv_param->r) || BN_is_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);
@@ -164,7 +164,7 @@ void dsa_sign(char *mess, struct dsa_public_params *pub_param, struct dsa_per_us
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);
- }
+ //}
}
@@ -224,3 +224,16 @@ void dsa_recover_k_from_repeated_nonce(BIGNUM *mess1_hash, BIGNUM *mess2_hash,
printf("recoverd k is: \n");
BN_print(out, k);
}
+
+void dsa_generate_magic_signature(struct dsa_public_params *pub, struct dsa_per_user_param
+ *priv, BIGNUM *mess_hash)
+{
+ BIGNUM *tmp = BN_new();
+
+ BN_mod_exp(tmp, priv->public, mess_hash, pub->p, ctx);
+ BN_mod(priv->r, tmp, pub->q, ctx);
+
+ BN_mod_inverse(tmp, mess_hash, pub->q, ctx);
+ BN_mod_mul(priv->s, priv->r, tmp, pub->q, ctx);
+
+}
diff --git a/lib/lib6.h b/lib/lib6.h
index dbd435b..d4578df 100644
--- a/lib/lib6.h
+++ b/lib/lib6.h
@@ -40,4 +40,6 @@ void dsa_recover_x_from_known_k(struct dsa_public_params *pub, BIGNUM *k,
void dsa_recover_k_from_repeated_nonce(BIGNUM *mess1_hash, BIGNUM *mess2_hash,
BIGNUM *s1, BIGNUM *s2, struct dsa_public_params *pub,
struct dsa_per_user_param *priv, BIGNUM *k);
+void dsa_generate_magic_signature(struct dsa_public_params *pub, struct dsa_per_user_param
+ *priv, BIGNUM *mess_hash);
#endif /* __LIB_6_H__ */
diff --git a/set6/task45.c b/set6/task45.c
new file mode 100644
index 0000000..ab6964a
--- /dev/null
+++ b/set6/task45.c
@@ -0,0 +1,105 @@
+#include "../lib/lib.h"
+#include "../lib/lib2.h"
+#include "../lib/lib4.h"
+#include "../lib/lib5.h"
+#include "../lib/lib6.h"
+#include <openssl/sha.h>
+
+int main()
+{
+ struct dsa_public_params dsa_pub;
+ struct dsa_per_user_param dsa_user;
+ struct dsa_per_user_param dsa_user2;
+
+ char *message = "Hello World";
+ char *message2 = "Goodbye World";
+
+ BIGNUM *k = BN_new();
+
+ dsa_user.public = BN_new();
+ dsa_user.private = BN_new();
+ dsa_user.r = BN_new();
+ dsa_user.s = BN_new();
+
+ dsa_user2.public = BN_new();
+ dsa_user2.private = BN_new();
+ dsa_user2.r = BN_new();
+ dsa_user2.s = BN_new();
+
+ out = BIO_new(BIO_s_file());
+ BIO_set_fp(out, stdout, BIO_NOCLOSE);
+ ctx = BN_CTX_new();
+
+ init_dsa_pub_param(&dsa_pub);
+ dsa_compute_per_user_keys(&dsa_pub, &dsa_user);
+ dsa_compute_per_user_keys(&dsa_pub, &dsa_user2);
+
+ // set the pub params
+ BN_zero(dsa_pub.g);
+ printf("with g = 0\n");
+ BN_zero(k);
+ dsa_sign(message, &dsa_pub, &dsa_user, k);
+ printf("signature is:\n");
+ printf("r: ");
+ BN_print(out, dsa_user.r);
+ printf("\ns: ");
+ BN_print(out, dsa_user.s);
+ printf("\nverified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user));
+ printf("checking signature for message which hasn't been signed\n");
+ printf("verified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user));
+ // for goodybye
+ printf("sign message %s\n", message2);
+ BN_zero(k);
+ dsa_sign(message2, &dsa_pub, &dsa_user, k);
+ printf("signature is:\n");
+ printf("r: ");
+ BN_print(out, dsa_user.r);
+ printf("\ns: ");
+ BN_print(out, dsa_user.s);
+ printf("\nverified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user));
+ printf("checking signature for message which hasn't been signed\n");
+ printf("verified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user));
+
+ // set g to p+1
+ BIGNUM *tmp = BN_new();
+ BIGNUM *one = BN_new();
+ BN_set_word(one, 1);
+ BN_add(tmp, dsa_pub.p, one);
+ BN_copy(dsa_pub.g, tmp);
+
+ BN_zero(dsa_user.r);
+ BN_zero(dsa_user.s);
+ printf("\nmaking magic signature for g = p + 1...\n");
+ // Generate hash of abitrary string
+ char hash[20];
+ BIGNUM *hash_bn = BN_new();
+ SHA_CTX sha1;
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, message, strlen(message));
+ SHA1_Final(hash, &sha1);
+ BN_bin2bn(hash, 20, hash_bn);
+ dsa_generate_magic_signature(&dsa_pub, &dsa_user, hash_bn);
+ printf("signature is:\n");
+ printf("r: ");
+ BN_print(out, dsa_user.r);
+ printf("\ns: ");
+ BN_print(out, dsa_user.s);
+ printf("\nverified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user));
+ printf("checking signature for message which hasn't been signed\n");
+ printf("verified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user));
+
+ // generate a signature for second message
+ SHA1_Init(&sha1);
+ SHA1_Update(&sha1, message2, strlen(message2));
+ SHA1_Final(hash, &sha1);
+ BN_bin2bn(hash, 20, hash_bn);
+ dsa_generate_magic_signature(&dsa_pub, &dsa_user, hash_bn);
+ printf("signature is:\n");
+ printf("r: ");
+ BN_print(out, dsa_user.r);
+ printf("\ns: ");
+ BN_print(out, dsa_user.s);
+ printf("\nverified?: %i\n", !dsa_verify(message2, &dsa_pub, &dsa_user));
+ printf("checking signature for message which hasn't been signed\n");
+ printf("verified?: %i\n", !dsa_verify(message, &dsa_pub, &dsa_user));
+}