| ... | @@ -178,6 +178,24 @@ test Tag { | ... | @@ -178,6 +178,24 @@ test Tag { |
| 178 | try std.testing.expectEqual(Tag.init(@enumFromInt(3), true, .context_specific), t); | 178 | try std.testing.expectEqual(Tag.init(@enumFromInt(3), true, .context_specific), t); |
| 179 | } | 179 | } |
| 180 | | 180 | |
| | 181 | test "Tag.encode produces the exact bytes from X.690" { |
| | 182 | const cases = [_]struct { number: u16, expected: []const u8 }{ |
| | 183 | .{ .number = 0, .expected = &.{0x00} }, |
| | 184 | .{ .number = 30, .expected = &.{0x1e} }, |
| | 185 | .{ .number = 31, .expected = &.{ 0x1f, 0x1f } }, |
| | 186 | .{ .number = 127, .expected = &.{ 0x1f, 0x7f } }, |
| | 187 | .{ .number = 128, .expected = &.{ 0x1f, 0x81, 0x00 } }, |
| | 188 | .{ .number = 16383, .expected = &.{ 0x1f, 0xff, 0x7f } }, |
| | 189 | .{ .number = 16384, .expected = &.{ 0x1f, 0x81, 0x80, 0x00 } }, |
| | 190 | .{ .number = 65535, .expected = &.{ 0x1f, 0x83, 0xff, 0x7f } }, |
| | 191 | }; |
| | 192 | for (cases) |c| { |
| | 193 | const tag = Tag.init(@enumFromInt(c.number), false, .universal); |
| | 194 | var buf: [Tag.max_encoded_len]u8 = undefined; |
| | 195 | try std.testing.expectEqualSlices(u8, c.expected, tag.encodeToSlice(&buf)); |
| | 196 | } |
| | 197 | } |
| | 198 | |
| 181 | test "Tag.encode/decode round trip" { | 199 | test "Tag.encode/decode round trip" { |
| 182 | for ([_]u16{ 0, 30, 31, 32, 127, 128, 16383, 16384, 65535 }) |n| { | 200 | for ([_]u16{ 0, 30, 31, 32, 127, 128, 16383, 16384, 65535 }) |n| { |
| 183 | const tag = Tag.init(@enumFromInt(n), false, .universal); | 201 | const tag = Tag.init(@enumFromInt(n), false, .universal); |