I've browsning some of the code, and have a few comments.
I think Crypto.SHA ought to be renamed Crypto.SHA1.
The name Crypto.Proxy is somewhat strange (it's actually a buffer). Perhaps it should be renamed, and perhaps it would make sense with a feed/drain interface. Also the pad method looks a little strange,
PIKEFUN string pad() { ptrdiff_t i;
for (i = THIS->backlog_len; i < THIS->block_size - 1; i++) THIS->backlog[i] = DO_NOT_WARN((unsigned char)(my_rand() & 0xff));
THIS->backlog[THIS->block_size - 1] = DO_NOT_WARN((unsigned char)(7 - THIS->backlog_len)); ^
The constant should probably be something like THIS->block_size - 1.