gen.c 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. /**
  2. * \file gen.c
  3. *
  4. * Generate a fake RSA certificate file, given as input e, d, p, q.
  5. */
  6. #define _GNU_SOURCE
  7. #include <errno.h>
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <openssl/bn.h>
  11. #include <openssl/ssl.h>
  12. #include <openssl/rsa.h>
  13. void usage(void)
  14. {
  15. static const char* help_message = "%s usage: %s"
  16. " <pub key> <priv key> <p> <q>"
  17. "\n";
  18. fprintf(stderr, help_message, program_invocation_short_name,
  19. program_invocation_name);
  20. }
  21. int main(int argc, char **argv)
  22. {
  23. BN_CTX* ctx;
  24. BIGNUM* p1, *q1;
  25. RSA* rsa;
  26. rsa = RSA_new();
  27. p1 = BN_new();
  28. q1 = BN_new();
  29. ctx = BN_CTX_new();
  30. rsa->n = BN_new();
  31. rsa->iqmp = BN_new();
  32. rsa->dmp1 = BN_new();
  33. rsa->dmq1 = BN_new();
  34. if (argc < 4+1) {
  35. usage();
  36. return EXIT_FAILURE;
  37. }
  38. /* generating RSA key */
  39. BN_dec2bn(&rsa->e, argv[1]);
  40. BN_dec2bn(&rsa->d, argv[2]);
  41. BN_dec2bn(&rsa->p, argv[3]);
  42. BN_dec2bn(&rsa->q, argv[4]);
  43. BN_mul(rsa->n, rsa->p, rsa->q, ctx);
  44. BN_sub(p1, rsa->p, BN_value_one());
  45. BN_sub(q1, rsa->q, BN_value_one());
  46. BN_mod(rsa->dmq1, rsa->d, q1, ctx);
  47. BN_mod(rsa->dmp1, rsa->d, p1, ctx);
  48. BN_mod_inverse(rsa->iqmp, rsa->q, rsa->p, ctx);
  49. /* PEM_write_RSAPrivateKey(stdout, rsa, NULL, NULL, 0, NULL, NULL); */
  50. /* creating public key */
  51. EVP_PKEY *pk;
  52. pk = EVP_PKEY_new();
  53. EVP_PKEY_set1_RSA(pk, rsa);
  54. /* creating dummy certificate */
  55. X509* crt;
  56. crt = X509_new();
  57. if (!X509_set_pubkey(crt, pk)) exit(EXIT_FAILURE);
  58. PEM_write_X509(stdout, crt);
  59. X509_free(crt);
  60. EVP_PKEY_free(pk);
  61. BN_CTX_free(ctx);
  62. BN_free(q1);
  63. BN_free(p1);
  64. RSA_free(rsa);
  65. return EXIT_SUCCESS;
  66. }