diff options
| -rw-r--r-- | lib/lib6.c | 17 | ||||
| -rw-r--r-- | lib/lib6.h | 2 | ||||
| -rw-r--r-- | set6/task45.c | 105 |
3 files changed, 122 insertions, 2 deletions
@@ -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); + +} @@ -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)); +} |
