ecc.c 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. #include "cipher/ecc.h"
  2. #include "cipher/ecc_rc4.h"
  3. #include <assert.h>
  4. /* pseudo random number generator with 128 bit internal state... probably not suited for cryptographical usage */
  5. typedef struct
  6. {
  7. uint32_t a;
  8. uint32_t b;
  9. uint32_t c;
  10. uint32_t d;
  11. } prng_t;
  12. static prng_t prng_ctx;
  13. static uint32_t prng_rotate(uint32_t x, uint32_t k)
  14. {
  15. return (x << k) | (x >> (32 - k));
  16. }
  17. static uint32_t prng_next(void)
  18. {
  19. uint32_t e = prng_ctx.a - prng_rotate(prng_ctx.b, 27);
  20. prng_ctx.a = prng_ctx.b ^ prng_rotate(prng_ctx.c, 17);
  21. prng_ctx.b = prng_ctx.c + prng_ctx.d;
  22. prng_ctx.c = prng_ctx.d + e;
  23. prng_ctx.d = e + prng_ctx.a;
  24. return prng_ctx.d;
  25. }
  26. static void prng_init(uint32_t seed)
  27. {
  28. uint32_t i;
  29. prng_ctx.a = 0xf1ea5eed;
  30. prng_ctx.b = prng_ctx.c = prng_ctx.d = seed;
  31. for (i = 0; i < 31; ++i)
  32. {
  33. (void) prng_next();
  34. }
  35. }
  36. int ecc_init_keys(uint8_t *pub, uint8_t *pri)
  37. {
  38. uint8_t puba[ECC_PUB_KEY_SIZE];
  39. uint8_t prva[ECC_PRV_KEY_SIZE];
  40. uint8_t pubb[ECC_PUB_KEY_SIZE];
  41. uint8_t prvb[ECC_PRV_KEY_SIZE];
  42. int i = 0;
  43. /* 0. Initialize and seed random number generator */
  44. static int initialized = 0;
  45. if (!initialized)
  46. {
  47. prng_init((0xbad ^ 0xc0ffee ^ 42) | 0xcafebabe | 666);
  48. initialized = 1;
  49. }
  50. /* 1. Alice picks a (secret) random natural number 'a', calculates P = a * g and sends P to Bob. */
  51. for (i = 0; i < ECC_PRV_KEY_SIZE; ++i)
  52. {
  53. prva[i] = prng_next();
  54. }
  55. if(ecdh_generate_keys(puba, prva)!=1) return -1;
  56. /* 2. Bob picks a (secret) random natural number 'b', calculates Q = b * g and sends Q to Alice. */
  57. for (i = 0; i < ECC_PRV_KEY_SIZE; ++i)
  58. {
  59. prvb[i] = prng_next();
  60. }
  61. assert(ecdh_generate_keys(pubb, prvb));
  62. for(i = 0; i< ECC_KEYSIZE;i++)
  63. {
  64. if(i<ECC_PRV_KEY_SIZE)
  65. {
  66. pub[i] = prva[i];
  67. pri[i] = prvb[i];
  68. }
  69. else{
  70. pub[i] = pubb[i-ECC_PRV_KEY_SIZE];
  71. pri[i] = puba[i-ECC_PRV_KEY_SIZE];
  72. }
  73. }
  74. return 1;
  75. }
  76. int ecc_encrypt(uint8_t *pubkey,uint8_t *in, uint32_t in_size, uint8_t *out, uint32_t *out_size)
  77. {
  78. uint8_t common_key[ECC_PUB_KEY_SIZE];
  79. assert(ecdh_shared_secret(pubkey, pubkey+ECC_PRV_KEY_SIZE, common_key));
  80. struct rc4_state rc4;
  81. rc4_init(&rc4,common_key,ECC_PUB_KEY_SIZE);
  82. int i =0;
  83. for(i=0; i< in_size;i++)
  84. {
  85. unsigned char b = rc4_get_byte(&rc4);
  86. out[i] = b ^ in[i];
  87. }
  88. *out_size = in_size;
  89. return *out_size;
  90. }
  91. int ecc_decrypt(uint8_t *prvkey,uint8_t *in, uint32_t in_size, uint8_t *out, uint32_t *out_size)
  92. {
  93. uint8_t common_key[ECC_PUB_KEY_SIZE];
  94. assert(ecdh_shared_secret(prvkey, prvkey+ECC_PRV_KEY_SIZE, common_key));
  95. struct rc4_state rc4;
  96. rc4_init(&rc4,common_key,ECC_PUB_KEY_SIZE);
  97. int i =0;
  98. for(i=0; i< in_size;i++)
  99. {
  100. unsigned char b = rc4_get_byte(&rc4);
  101. out[i] = b ^ in[i];
  102. }
  103. *out_size = in_size;
  104. return *out_size;
  105. }