int Sha384Update(Sha384* sha384, const byte* data, word32 len) { /* do block size increments */ byte* local = (byte*)sha384->buffer; while (len) { word32 add = min(len, SHA384_BLOCK_SIZE - sha384->buffLen); XMEMCPY(&local[sha384->buffLen], data, add); sha384->buffLen += add; data += add; len -= add; if (sha384->buffLen == SHA384_BLOCK_SIZE) { int ret; #ifdef LITTLE_ENDIAN_ORDER ByteReverseWords64(sha384->buffer, sha384->buffer, SHA384_BLOCK_SIZE); #endif ret = Transform384(sha384); if (ret != 0) return ret; AddLength384(sha384, SHA384_BLOCK_SIZE); sha384->buffLen = 0; } } return 0; }
int wc_Sha384Final(Sha384* sha384, byte* hash) { byte* local = (byte*)sha384->buffer; int ret; AddLength384(sha384, sha384->buffLen); /* before adding pads */ local[sha384->buffLen++] = 0x80; /* add 1 */ /* pad with zeros */ if (sha384->buffLen > SHA384_PAD_SIZE) { XMEMSET(&local[sha384->buffLen], 0, SHA384_BLOCK_SIZE -sha384->buffLen); sha384->buffLen += SHA384_BLOCK_SIZE - sha384->buffLen; #if defined(LITTLE_ENDIAN_ORDER) ByteReverseWords64(sha384->buffer, sha384->buffer, SHA384_BLOCK_SIZE); #endif ret = _Transform384(sha384); if (ret != 0) return ret; sha384->buffLen = 0; } XMEMSET(&local[sha384->buffLen], 0, SHA384_PAD_SIZE - sha384->buffLen); /* put lengths in bits */ sha384->hiLen = (sha384->loLen >> (8*sizeof(sha384->loLen) - 3)) + (sha384->hiLen << 3); sha384->loLen = sha384->loLen << 3; /* store lengths */ #if defined(LITTLE_ENDIAN_ORDER) ByteReverseWords64(sha384->buffer, sha384->buffer, SHA384_BLOCK_SIZE); #endif /* ! length ordering dependent on digest endian type ! */ sha384->buffer[SHA384_BLOCK_SIZE / sizeof(word64) - 2] = sha384->hiLen; sha384->buffer[SHA384_BLOCK_SIZE / sizeof(word64) - 1] = sha384->loLen; ret = _Transform384(sha384); if (ret != 0) return ret; #ifdef LITTLE_ENDIAN_ORDER ByteReverseWords64(sha384->digest, sha384->digest, SHA384_DIGEST_SIZE); #endif XMEMCPY(hash, sha384->digest, SHA384_DIGEST_SIZE); return wc_InitSha384(sha384); /* reset state */ }