int Ebml_SerializeFloat(EbmlGlobal *glob, uint32_t class_id, double d) { int rc = ebml_WriteID(glob, class_id); if (RT_SUCCESS(rc)) rc = ebml_WriteU8(glob, 0x80 | 8); if (RT_SUCCESS(rc)) rc = ebml_WriteU64(glob, RT_H2BE_U64(*(uint64_t*)&d)); return rc; }
int Ebml_SerializeUnsigned64(EbmlGlobal *glob, uint32_t class_id, uint64_t ui) { int rc = ebml_WriteID(glob, class_id); if (RT_SUCCESS(rc)) rc = ebml_WriteU8(glob, 8 | 0x80); if (RT_SUCCESS(rc)) rc = ebml_WriteU64(glob, RT_H2BE_U64(ui)); return rc; }
static int ebml_StartSubElement(EbmlGlobal *glob, uint64_t *ebmlLoc, uint32_t class_id) { // todo this is always taking 8 bytes, this may need later optimization // this is a key that says lenght unknown uint64_t unknownLen = UINT64_C(0x01FFFFFFFFFFFFFF); ebml_WriteID(glob, class_id); *ebmlLoc = RTFileTell(glob->file); return ebml_WriteU64(glob, RT_H2BE_U64(unknownLen)); }
RTDECL(void) RTSha1Final(PRTSHA1CONTEXT pCtx, uint8_t pabDigest[RTSHA1_HASH_SIZE]) { Assert(pCtx->AltPrivate.cbMessage < UINT64_MAX / 2); /* * Complete the message by adding a single bit (0x80), padding till * the next 448-bit boundrary, the add the message length. */ uint64_t const cMessageBits = pCtx->AltPrivate.cbMessage * 8; unsigned cbMissing = RTSHA1_BLOCK_SIZE - ((unsigned)pCtx->AltPrivate.cbMessage & (RTSHA1_BLOCK_SIZE - 1U)); static uint8_t const s_abSingleBitAndSomePadding[12] = { 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; if (cbMissing < 1U + 8U) /* Less than 64+8 bits left in the current block, force a new block. */ RTSha1Update(pCtx, &s_abSingleBitAndSomePadding, sizeof(s_abSingleBitAndSomePadding)); else RTSha1Update(pCtx, &s_abSingleBitAndSomePadding, 1); unsigned cbBuffered = (unsigned)pCtx->AltPrivate.cbMessage & (RTSHA1_BLOCK_SIZE - 1U); cbMissing = RTSHA1_BLOCK_SIZE - cbBuffered; Assert(cbMissing >= 8); memset((uint8_t *)&pCtx->AltPrivate.auW[0] + cbBuffered, 0, cbMissing - 8); *(uint64_t *)&pCtx->AltPrivate.auW[14] = RT_H2BE_U64(cMessageBits); /* * Process the last buffered block constructed/completed above. */ rtSha1BlockInitBuffered(pCtx); rtSha1BlockProcess(pCtx); /* * Convert the byte order of the hash words and we're done. */ pCtx->AltPrivate.auH[0] = RT_H2BE_U32(pCtx->AltPrivate.auH[0]); pCtx->AltPrivate.auH[1] = RT_H2BE_U32(pCtx->AltPrivate.auH[1]); pCtx->AltPrivate.auH[2] = RT_H2BE_U32(pCtx->AltPrivate.auH[2]); pCtx->AltPrivate.auH[3] = RT_H2BE_U32(pCtx->AltPrivate.auH[3]); pCtx->AltPrivate.auH[4] = RT_H2BE_U32(pCtx->AltPrivate.auH[4]); memcpy(pabDigest, &pCtx->AltPrivate.auH[0], RTSHA1_HASH_SIZE); RT_ZERO(pCtx->AltPrivate); pCtx->AltPrivate.cbMessage = UINT64_MAX; }
static int ebml_EndSubElement(EbmlGlobal *glob, uint64_t ebmlLoc) { /* Save the current file pointer */ uint64_t pos = RTFileTell(glob->file); /* Calculate the size of this element */ uint64_t size = pos - ebmlLoc - 8; size |= UINT64_C(0x0100000000000000); /* Seek back to the beginning of the element and write the new size */ RTFileSeek(glob->file, ebmlLoc, RTFILE_SEEK_BEGIN, NULL); int rc = ebml_WriteU64(glob, RT_H2BE_U64(size)); /* Reset the file pointer */ RTFileSeek(glob->file, pos, RTFILE_SEEK_BEGIN, NULL); return rc; }