From 709c2f8afebe9151aa947ec53ab801c2e5be4746 Mon Sep 17 00:00:00 2001 From: Stefan Boberg Date: Thu, 2 Sep 2021 13:01:52 +0200 Subject: Introduced support for compressed buffer attachments --- zencore/compactbinaryvalidation.cpp | 49 ++++++++++++++++++++++++++++--------- 1 file changed, 37 insertions(+), 12 deletions(-) (limited to 'zencore/compactbinaryvalidation.cpp') diff --git a/zencore/compactbinaryvalidation.cpp b/zencore/compactbinaryvalidation.cpp index 80b8bf32a..87455860c 100644 --- a/zencore/compactbinaryvalidation.cpp +++ b/zencore/compactbinaryvalidation.cpp @@ -415,34 +415,59 @@ ValidateCbPackageField(MemoryView& View, CbValidateMode Mode, CbValidateError& E static IoHash ValidateCbPackageAttachment(CbFieldView& Value, MemoryView& View, CbValidateMode Mode, CbValidateError& Error) { - const MemoryView ValueView = Value.AsBinaryView(); - if (Value.HasError() && EnumHasAnyFlags(Mode, CbValidateMode::Package)) + const CbObjectView ObjectView = Value.AsObjectView(); + if (Value.HasError()) { - if (EnumHasAnyFlags(Mode, CbValidateMode::Package)) + const MemoryView BinaryView = Value.AsBinaryView(); + if (Value.HasError() && EnumHasAnyFlags(Mode, CbValidateMode::Package)) { - AddError(Error, CbValidateError::InvalidPackageFormat); + if (EnumHasAnyFlags(Mode, CbValidateMode::Package)) + { + AddError(Error, CbValidateError::InvalidPackageFormat); + } + } + else if (BinaryView.GetSize()) + { + if (EnumHasAnyFlags(Mode, CbValidateMode::Package | CbValidateMode::PackageHash)) + { + CompressedBuffer Buffer = CompressedBuffer::FromCompressed(SharedBuffer::MakeView(BinaryView)); + if (EnumHasAnyFlags(Mode, CbValidateMode::Package) && Buffer.IsNull()) + { + AddError(Error, CbValidateError::InvalidPackageFormat); + } + if (EnumHasAnyFlags(Mode, CbValidateMode::PackageHash) && + (IoHash::FromBLAKE3(Buffer.GetRawHash()) != IoHash::HashMemory(Buffer.DecompressToComposite()))) + { + AddError(Error, CbValidateError::InvalidPackageHash); + } + return IoHash::FromBLAKE3(Buffer.GetRawHash()); + } } } - else if (ValueView.GetSize()) + else { - if (CbFieldView HashField = ValidateCbPackageField(View, Mode, Error)) + if (ObjectView) { - const IoHash Hash = HashField.AsAttachment(); - if (EnumHasAnyFlags(Mode, CbValidateMode::Package)) + if (CbFieldView HashField = ValidateCbPackageField(View, Mode, Error)) { - if (HashField.HasError()) + const IoHash Hash = HashField.AsAttachment(); + if (EnumHasAnyFlags(Mode, CbValidateMode::Package) && HashField.HasError()) { AddError(Error, CbValidateError::InvalidPackageFormat); } - else if (Hash != IoHash::HashMemory(ValueView.GetData(), ValueView.GetSize())) + if (EnumHasAnyFlags(Mode, CbValidateMode::PackageHash) && (Hash != ObjectView.GetHash())) { AddError(Error, CbValidateError::InvalidPackageHash); } + return Hash; } - return Hash; + } + else + { + return CbObject().GetHash(); } } - return IoHash(); + return {}; } static IoHash -- cgit v1.2.3