/*** Copyright (C) 2021 J Reece Wilson (a/k/a "Reece"). All rights reserved. File: HashStream.cpp Date: 2021-6-12 Author: Reece ***/ #include #include #include "HashStream.hpp" namespace Aurora::Hashing { HashStream::HashStream(EHashType type) : type_(type) { switch (type) { case EHashType::eMD5: md5_init(&this->state_); break; case EHashType::eSHA1: sha1_init(&this->state_); break; case EHashType::eSHA2_32: sha256_init(&this->state_); break; case EHashType::eSHA2_64: sha512_init(&this->state_); break; case EHashType::eTiger: tiger_init(&this->state_); break; } } void HashStream::Ingest(const Memory::MemoryViewRead &input) { if (this->finished_) { return; } auto buffer = reinterpret_cast(input.ptr); auto len = input.length; switch (this->type_) { case EHashType::eMD5: md5_process(&this->state_, buffer, len); break; case EHashType::eSHA1: sha1_process(&this->state_, buffer, len); break; case EHashType::eSHA2_32: sha256_process(&this->state_, buffer, len); break; case EHashType::eSHA2_64: sha512_process(&this->state_, buffer, len); break; case EHashType::eTiger: tiger_process(&this->state_, buffer, len); break; } } AuUInt8 const* HashStream::GetBytes(AuUInt32 &length) { switch (this->type_) { case EHashType::eMD5: length = 16; if (!AuExchange(this->finished_, true)) { md5_done(&this->state_, reinterpret_cast(this->buffer_)); } return this->buffer_; case EHashType::eSHA1: length = 20; if (!AuExchange(this->finished_, true)) { sha1_done(&this->state_, reinterpret_cast(this->buffer_)); } return this->buffer_; case EHashType::eSHA2_32: length = 32; if (!AuExchange(this->finished_, true)) { sha256_done(&this->state_, reinterpret_cast(this->buffer_)); } return this->buffer_; case EHashType::eSHA2_64: length = 64; if (!AuExchange(this->finished_, true)) { sha512_done(&this->state_, reinterpret_cast(this->buffer_)); } return this->buffer_; case EHashType::eTiger: length = 24; if (!AuExchange(this->finished_, true)) { tiger_done(&this->state_, reinterpret_cast(this->buffer_)); } return this->buffer_; } return nullptr; } AUKN_SYM IHashStream *HashStreamNew(EHashType type) { return _new HashStream(type); } AUKN_SYM void HashStreamRelease(IHashStream *stream) { AuSafeDelete(stream); } }