From b0ed602d5d9358128471588f00a073f2545809fa Mon Sep 17 00:00:00 2001 From: Frank Denis <124872+jedisct1@users.noreply.github.com> Date: Thu, 6 Feb 2025 16:37:42 +0100 Subject: [PATCH] crypto/phc-encoding: forbid parameters named 'v' (#22569) The spec is ambiguous, and it's too late to change it. So the most reasonable thing to do in order to avoid generating strings that could be parsed differently by other implementations is to forbid parameters named "v" at compile-time. See https://github.com/P-H-C/phc-string-format/issues/8 --- lib/std/crypto/phc_encoding.zig | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/lib/std/crypto/phc_encoding.zig b/lib/std/crypto/phc_encoding.zig index ee814861b323261b71a74d6cb07e77a7f818e767..507a02b983e5c9ea113e87ed1e8c945ded2f2d29 100644 --- a/lib/std/crypto/phc_encoding.zig +++ b/lib/std/crypto/phc_encoding.zig @@ -75,6 +75,10 @@ pub fn BinValue(comptime max_len: usize) type { /// /// Other fields will also be deserialized from the function parameters section. pub fn deserialize(comptime HashResult: type, str: []const u8) Error!HashResult { + if (@hasField(HashResult, version_param_name)) { + @compileError("Field name '" ++ version_param_name ++ "'' is reserved for the algorithm version"); + } + var out = mem.zeroes(HashResult); var it = mem.splitScalar(u8, str, fields_delimiter_scalar); var set_fields: usize = 0; @@ -198,6 +202,11 @@ pub fn calcSize(params: anytype) usize { fn serializeTo(params: anytype, out: anytype) !void { const HashResult = @TypeOf(params); + + if (@hasField(HashResult, version_param_name)) { + @compileError("Field name '" ++ version_param_name ++ "'' is reserved for the algorithm version"); + } + try out.writeAll(fields_delimiter); try out.writeAll(params.alg_id); -- 2.54.0