关键词搜索

源码搜索 ×
×

漫话Redis源码之十七

发布2021-11-28浏览523次

详情内容

sha是典型的哈希算法,我曾经在博客中写过源码来实现,现在只需要读懂源码就可以了。

这是安全相关的函数,其实,很多安全函数都是挺难读懂的,里面各种奇奇怪怪的数字。

  1. void sha256_update(SHA256_CTX *ctx, const BYTE data[], size_t len)
  2. {
  3. WORD i;
  4. for (i = 0; i < len; ++i) {
  5. ctx->data[ctx->datalen] = data[i];
  6. ctx->datalen++;
  7. if (ctx->datalen == 64) {
  8. sha256_transform(ctx, ctx->data);
  9. ctx->bitlen += 512;
  10. ctx->datalen = 0;
  11. }
  12. }
  13. }
  14. void sha256_final(SHA256_CTX *ctx, BYTE hash[])
  15. {
  16. WORD i;
  17. i = ctx->datalen;
  18. // Pad whatever data is left in the buffer.
  19. if (ctx->datalen < 56) {
  20. ctx->data[i++] = 0x80;
  21. while (i < 56)
  22. ctx->data[i++] = 0x00;
  23. }
  24. else {
  25. ctx->data[i++] = 0x80;
  26. while (i < 64)
  27. ctx->data[i++] = 0x00;
  28. sha256_transform(ctx, ctx->data);
  29. memset(ctx->data, 0, 56);
  30. }
  31. // Append to the padding the total message's length in bits and transform.
  32. ctx->bitlen += ctx->datalen * 8;
  33. ctx->data[63] = ctx->bitlen;
  34. ctx->data[62] = ctx->bitlen >> 8;
  35. ctx->data[61] = ctx->bitlen >> 16;
  36. ctx->data[60] = ctx->bitlen >> 24;
  37. ctx->data[59] = ctx->bitlen >> 32;
  38. ctx->data[58] = ctx->bitlen >> 40;
  39. ctx->data[57] = ctx->bitlen >> 48;
  40. ctx->data[56] = ctx->bitlen >> 56;
  41. sha256_transform(ctx, ctx->data);
  42. // Since this implementation uses little endian byte ordering and SHA uses big endian,
  43. // reverse all the bytes when copying the final state to the output hash.
  44. for (i = 0; i < 4; ++i) {
  45. hash[i] = (ctx->state[0] >> (24 - i * 8)) & 0x000000ff;
  46. hash[i + 4] = (ctx->state[1] >> (24 - i * 8)) & 0x000000ff;
  47. hash[i + 8] = (ctx->state[2] >> (24 - i * 8)) & 0x000000ff;
  48. hash[i + 12] = (ctx->state[3] >> (24 - i * 8)) & 0x000000ff;
  49. hash[i + 16] = (ctx->state[4] >> (24 - i * 8)) & 0x000000ff;
  50. hash[i + 20] = (ctx->state[5] >> (24 - i * 8)) & 0x000000ff;
  51. hash[i + 24] = (ctx->state[6] >> (24 - i * 8)) & 0x000000ff;
  52. hash[i + 28] = (ctx->state[7] >> (24 - i * 8)) & 0x000000ff;
  53. }
  54. }

相关技术文章

点击QQ咨询
开通会员
返回顶部
×
微信扫码支付
微信扫码支付
确定支付下载
请使用微信描二维码支付
×

提示信息

×

选择支付方式

  • 微信支付
  • 支付宝付款
确定支付下载