|
楼主 |
发表于 2021-6-12 19:50:36
|
显示全部楼层
浙江省台州市
- void sha256_done(sha256_context *ctx, byte *Digest)
- {
- uint64 BitLength = ctx->Count * 8;
- uint BufPos = (uint)ctx->Count & 0x3f;
- ctx->Buffer[BufPos++] = 0x80;
- if (BufPos!=56)
- {
- if (BufPos>56)
- {
- while (BufPos<64)
- ctx->Buffer[BufPos++] = 0;
- BufPos=0;
- }
- if (BufPos==0)
- sha256_transform(ctx);
- memset(ctx->Buffer+BufPos,0,56-BufPos);
- }
- RawPutBE4((uint32)(BitLength>>32), ctx->Buffer + 56);
- RawPutBE4((uint32)(BitLength), ctx->Buffer + 60);
- sha256_transform(ctx);
- RawPutBE4(ctx->H[0], Digest + 0);
- RawPutBE4(ctx->H[1], Digest + 4);
- RawPutBE4(ctx->H[2], Digest + 8);
- RawPutBE4(ctx->H[3], Digest + 12);
- RawPutBE4(ctx->H[4], Digest + 16);
- RawPutBE4(ctx->H[5], Digest + 20);
- RawPutBE4(ctx->H[6], Digest + 24);
- RawPutBE4(ctx->H[7], Digest + 28);
- sha256_init(ctx); //<<<<<<<< 这个
- }
- static void hmac_sha256(const byte* Key, size_t KeyLength, const byte* Salt, size_t SaltLength, byte* ResDigest,
- sha256_context* ICtxOpt, bool* SetIOpt, sha256_context* RCtxOpt, bool* SetROpt)
- {
- byte KeyBuf[64];
- sha256_context ICtx;
- if (ICtxOpt && *SetIOpt)
- ICtx = *ICtxOpt; //<<< ICtx 是从 ICtxOpt 复制的 并不影响ICtxOpt
- else
- {
- memset(KeyBuf, 0x36, 64);
- for (size_t i = 0; i < KeyLength; i++)
- KeyBuf[i] ^= Key[i];
- sha256_init(&ICtx);
- sha256_process(&ICtx, KeyBuf, 64);
- if (ICtxOpt && !*SetIOpt)
- {
- *ICtxOpt = ICtx;
- *SetIOpt = true;
- }
- }
- sha256_process(&ICtx, Salt, SaltLength);
- byte IDig[32];
- sha256_done(&ICtx, IDig); //<<< ICtx 直到函数结束 都不再引用
- sha256_context RCtx;
- if (RCtxOpt && *SetROpt)
- RCtx = *RCtxOpt; //<<< RCtx 是从 RCtxOpt 复制的 并不影响ICtxOpt
- else
- {
- memset(KeyBuf, 0x5c, 64);
- for (size_t i = 0; i < KeyLength; i++)
- KeyBuf[i] ^= Key[i];
- sha256_init(&RCtx);
- sha256_process(&RCtx, KeyBuf, 64);
- if (RCtxOpt && !*SetROpt)
- {
- *RCtxOpt = RCtx;
- *SetROpt = true;
- }
- }
- sha256_process(&RCtx, IDig, 32);
- sha256_done(&RCtx, ResDigest);//<<< RCtx 直到函数结束 都不再引用
- //此处函数结束返回后两个?Ctx变量就不存在了
- //那么在 sha256_done 的最后加个 sha256_init(&Ctx) 有什么意义
- }
复制代码 |
|