aboutsummaryrefslogtreecommitdiff
path: root/zencore/compactbinaryvalidation.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-09-02 13:01:52 +0200
committerStefan Boberg <[email protected]>2021-09-02 13:01:52 +0200
commit709c2f8afebe9151aa947ec53ab801c2e5be4746 (patch)
treef64fb6137580d21d116563776b4708207e4c352d /zencore/compactbinaryvalidation.cpp
parentAdded HashMemory() function accepting CompositeBuffer argument (diff)
downloadzen-709c2f8afebe9151aa947ec53ab801c2e5be4746.tar.xz
zen-709c2f8afebe9151aa947ec53ab801c2e5be4746.zip
Introduced support for compressed buffer attachments
Diffstat (limited to 'zencore/compactbinaryvalidation.cpp')
-rw-r--r--zencore/compactbinaryvalidation.cpp49
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