rc4.c 1.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. #include "os.h"
  2. #include <libsec.h>
  3. void
  4. setupRC4state(RC4state *key, uchar *start, int n)
  5. {
  6. int t;
  7. int index2;
  8. uchar *state;
  9. uchar *p, *e, *sp, *se;
  10. state = key->state;
  11. se = &state[256];
  12. for(sp = state; sp < se; sp++)
  13. *sp = sp - state;
  14. key->x = 0;
  15. key->y = 0;
  16. index2 = 0;
  17. e = start + n;
  18. p = start;
  19. for(sp = state; sp < se; sp++)
  20. {
  21. t = *sp;
  22. index2 = (*p + t + index2) & 255;
  23. *sp = state[index2];
  24. state[index2] = t;
  25. if(++p >= e)
  26. p = start;
  27. }
  28. }
  29. void
  30. rc4(RC4state *key, uchar *p, int len)
  31. {
  32. int tx, ty;
  33. int x, y;
  34. uchar *state;
  35. uchar *e;
  36. x = key->x;
  37. y = key->y;
  38. state = &key->state[0];
  39. for(e = p + len; p < e; p++)
  40. {
  41. x = (x+1)&255;
  42. tx = state[x];
  43. y = (y+tx)&255;
  44. ty = state[y];
  45. state[x] = ty;
  46. state[y] = tx;
  47. *p ^= state[(tx+ty)&255];
  48. }
  49. key->x = x;
  50. key->y = y;
  51. }
  52. void
  53. rc4skip(RC4state *key, int len)
  54. {
  55. int tx, ty;
  56. int x, y;
  57. uchar *state;
  58. int i;
  59. x = key->x;
  60. y = key->y;
  61. state = &key->state[0];
  62. for(i=0; i<len; i++)
  63. {
  64. x = (x+1)&255;
  65. tx = state[x];
  66. y = (y+tx)&255;
  67. ty = state[y];
  68. state[x] = ty;
  69. state[y] = tx;
  70. }
  71. key->x = x;
  72. key->y = y;
  73. }
  74. void
  75. rc4back(RC4state *key, int len)
  76. {
  77. int tx, ty;
  78. int x, y;
  79. uchar *state;
  80. int i;
  81. x = key->x;
  82. y = key->y;
  83. state = &key->state[0];
  84. for(i=0; i<len; i++)
  85. {
  86. ty = state[x];
  87. tx = state[y];
  88. state[y] = ty;
  89. state[x] = tx;
  90. y = (y-tx)&255;
  91. x = (x-1)&255;
  92. }
  93. key->x = x;
  94. key->y = y;
  95. }