| ... | @@ -85,6 +85,14 @@ test toDot { | ... | @@ -85,6 +85,14 @@ test toDot { |
| 85 | } | 85 | } |
| 86 | } | 86 | } |
| 87 | | 87 | |
| | 88 | test "malformed OID" { |
| | 89 | var empty: der.Decoder = .{ .bytes = &.{ 0x06, 0x00 } }; |
| | 90 | try std.testing.expectError(error.EndOfStream, decodeDer(&empty)); |
| | 91 | |
| | 92 | var truncated: der.Decoder = .{ .bytes = &.{ 0x06, 0x02, 0x2a, 0x80 } }; |
| | 93 | try std.testing.expectError(error.InvalidEncoding, decodeDer(&truncated)); |
| | 94 | } |
| | 95 | |
| 88 | const TestCase = struct { | 96 | const TestCase = struct { |
| 89 | encoded: []const u8, | 97 | encoded: []const u8, |
| 90 | dot_notation: []const u8, | 98 | dot_notation: []const u8, |
| ... | @@ -109,7 +117,10 @@ pub const asn1_tag = asn1.Tag.init(.oid, false, .universal); | ... | @@ -109,7 +117,10 @@ pub const asn1_tag = asn1.Tag.init(.oid, false, .universal); |
| 109 | | 117 | |
| 110 | pub fn decodeDer(decoder: *der.Decoder) !Oid { | 118 | pub fn decodeDer(decoder: *der.Decoder) !Oid { |
| 111 | const ele = try decoder.element(asn1_tag.toExpected()); | 119 | const ele = try decoder.element(asn1_tag.toExpected()); |
| 112 | return Oid{ .encoded = decoder.view(ele) }; | 120 | const encoded = decoder.view(ele); |
| | 121 | if (encoded.len == 0) return error.EndOfStream; |
| | 122 | if (encoded[encoded.len - 1] & 0x80 != 0) return error.InvalidEncoding; |
| | 123 | return Oid{ .encoded = encoded }; |
| 113 | } | 124 | } |
| 114 | | 125 | |
| 115 | pub fn encodeDer(self: Oid, encoder: *der.Encoder) !void { | 126 | pub fn encodeDer(self: Oid, encoder: *der.Encoder) !void { |