diff options
Diffstat (limited to 'lib/lib6.c')
| -rw-r--r-- | lib/lib6.c | 98 |
1 files changed, 98 insertions, 0 deletions
@@ -0,0 +1,98 @@ +#include "lib6.h" +#include "lib5.h" +#include "lib4.h" +#include "lib3.h" +#include "lib2.h" +#include "lib.h" + + +int rsa_sign_bignum(BIGNUM *message, BIGNUM *signed_message, struct rsa_key_bignum *private) +{ + rsa_encrypt_bignum(message, signed_message, private); +} + +int rsa_verify_bignum(BIGNUM *signed_message, BIGNUM *org_message, struct rsa_key_bignum *public) +{ + BIGNUM *res = BN_new(); + int ret = -1; + + rsa_decrypt_bignum(signed_message, res, public); + ret = BN_cmp(res, org_message); + printf("\nverfied mess ret: %i, message:\n", ret); + BN_print(out, res); + printf("\n"); + BN_free(res); + + return ret == 0; +} +/** + * construct a VALID pkcs_padding + **/ +void pkcs1_5_padding(char *message, char *result, unsigned int target_length_byte) +{ + SHA1Context sha1; + char sha1_hash[20]; + int i; + + memset(result, 0xff, target_length_byte); + result[0] = 0x00; + result[1] = 0x01; + result[target_length_byte-21] = 0x00; + + // TODO ASN.1 things + + SHA1Reset(&sha1); + SHA1Input(&sha1, message, strlen(message)); + SHA1Result(&sha1); + memcpy(sha1_hash, &(sha1.Message_Digest), 20); + + for(i = 20;i>0;i--) + result[target_length_byte-i] = sha1_hash[20-i]; +} + +int pkcs1_5_padding_verify(char *to_verify, int len, char *message) +{ + char result[1024/8]; + int i; + + // construct the padding how the expect it and than compare + pkcs1_5_padding(message, result, 1024/8); + // printf both paddings + char buf[(1024/8)*2]; + hex_binary_to_string(result, buf, 1024/8); + printf("expected padding:\n%s\n", buf); + hex_binary_to_string(to_verify, buf, len); + printf("got:\n%s\n", buf); + + return memcmp(to_verify, result, 128) == 0; +} + +int shitty_pkcs1_5_padding_verify(char *to_verify, int len, char *message) +{ + int i = 2; + SHA1Context sha1; + char sha1_hash[20]; + + if (len < 2 && to_verify[0] != 0x00 && to_verify[1] != 0x01) + return 0; + + // search for the next 0x00 no matter what's in between + while(to_verify[i] != 0x00) + i++; + + i++; + // TODO check asn.1 things + // verfiy the hash + SHA1Reset(&sha1); + SHA1Input(&sha1, message, strlen(message)); + SHA1Result(&sha1); + memcpy(sha1_hash, &(sha1.Message_Digest), 20); + + int j; + for(j=0;j<20;j++, i++) { + if (to_verify[i] != sha1_hash[j]) + return 0; + } + + return 1; +} |
