diff options
Diffstat (limited to 'zencore/compactbinaryvalidation.cpp')
| -rw-r--r-- | zencore/compactbinaryvalidation.cpp | 49 |
1 files changed, 37 insertions, 12 deletions
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 |