ecc_rc4.c 768 B

123456789101112131415161718192021222324252627282930313233
  1. #include "cipher/ecc_rc4.h"
  2. /* https://en.wikipedia.org/wiki/RC4#Description */
  3. void rc4_init(struct rc4_state *rc4, unsigned char *key, unsigned int keylen)
  4. {
  5. for (unsigned int i = 0; i < 256; i++) {
  6. rc4->S[i] = (unsigned char) i;
  7. }
  8. unsigned int j = 0;
  9. for (unsigned int i = 0; i < 256; i++) {
  10. j = (j + rc4->S[i] + key[i % keylen]) % 256;
  11. unsigned char temp = rc4->S[i];
  12. rc4->S[i] = rc4->S[j];
  13. rc4->S[j] = temp;
  14. }
  15. rc4->i = 0;
  16. rc4->j = 0;
  17. }
  18. unsigned char rc4_get_byte(struct rc4_state *rc4)
  19. {
  20. rc4->i = (rc4->i + 1) % 256;
  21. rc4->j = (rc4->j + rc4->S[rc4->i]) % 256;
  22. unsigned char temp = rc4->S[rc4->i];
  23. rc4->S[rc4->i] = rc4->S[rc4->j];
  24. rc4->S[rc4->j] = temp;
  25. return rc4->S[(rc4->S[rc4->i] + rc4->S[rc4->j]) % 256];
  26. }