|
List Info
Thread: rc4 for m_utils?
|
|
| rc4 for m_utils? |

|
2007-06-12 22:26:01 |
|
Hi All,
just knocked this up (and tested) - i was looking through the code for the gaim myspace plugin and noticed that it uses RC4 during authentication - thought it might be a candidate for inclusion in the utils module? i followed the format used there for MD5 and SHA1 as closely as i could
(note: called 'ARC4' for 'Alleged RC4' since apparently actual RC4 was never publically released - not sure it makes any difference anymore)
typedef struct { char lookup[256]; int x, y;
} mir_arc4_ctx;
struct ARC4_INTERFACE { int cbSize; void (*arc4_init)(mir_arc4_ctx *ctx, char *key, int keylen); void (*arc4_crypt)(mir_arc4_ctx *ctx, char *dataIn, char *dataOut, int datalen);
};
void swap(char *b1, char *b2) { char b = *b1; *b1 = *b2; *b2 = b; }
void arc4_init(mir_arc4_ctx *ctx, char *key, int keylen) { int i; for(i = 0; i < 256; i++) ctx->lookup[i] = i;
ctx->x = 0; for(i = 0; i < 256; i++) { ctx->x = (key[i % keylen] + ctx->lookup[i] + ctx->x) & 0xFF; swap(&ctx->lookup[ctx->x], &ctx->lookup[i]);
} ctx->x = 0; ctx->y = 0; }
void arc4_crypt(mir_arc4_ctx *ctx, char *dataIn, char *dataOut, int datalen) { for(int i = 0; i < datalen; i++) { ctx->x = (ctx->x + 1) & 0xFF;
ctx->y = (ctx->lookup[ctx->x] + ctx->y) & 0xFF; swap(&ctx->lookup[ctx->x], &ctx->lookup[ctx->y]); dataOut[i] = (dataIn[i] ^ ctx->lookup[(ctx->lookup[ctx->x] + ctx->lookup[ctx->y]) & 0xFF]);
} }
int GetARC4Interface(WPARAM wParam, LPARAM lParam) { struct ARC4_INTERFACE *arc4i = (struct ARC4_INTERFACE*) lParam; if ( arc4i == NULL ) return 1; if ( arc4i->cbSize != sizeof( struct ARC4_INTERFACE ))
return 1; arc4i->arc4_init = arc4_init; arc4i->arc4_crypt = arc4_crypt; return 0; }
Scott
|
[1]
|
|
|
about | contact Other archives ( Real Estate discussion Medical topics )
|