| ... | @@ -580,7 +580,10 @@ pub fn parseTime(cert: Certificate, elem: der.Element) ParseTimeError!u64 { | ... | @@ -580,7 +580,10 @@ pub fn parseTime(cert: Certificate, elem: der.Element) ParseTimeError!u64 { |
| 580 | return error.CertificateTimeInvalid; | 580 | return error.CertificateTimeInvalid; |
| 581 | | 581 | |
| 582 | return Date.toSeconds(.{ | 582 | return Date.toSeconds(.{ |
| 583 | .year = @as(u16, 2000) + try parseTimeDigits(bytes[0..2], 0, 99), | 583 | .year = blk: { |
| | 584 | const year = try parseTimeDigits(bytes[0..2], 0, 99); |
| | 585 | break :blk if (year < 50) @as(u16, 2000) + year else @as(u16, 1900) + year; |
| | 586 | }, |
| 584 | .month = try parseTimeDigits(bytes[2..4], 1, 12), | 587 | .month = try parseTimeDigits(bytes[2..4], 1, 12), |
| 585 | .day = try parseTimeDigits(bytes[4..6], 1, 31), | 588 | .day = try parseTimeDigits(bytes[4..6], 1, 31), |
| 586 | .hour = try parseTimeDigits(bytes[6..8], 0, 23), | 589 | .hour = try parseTimeDigits(bytes[6..8], 0, 23), |
| ... | @@ -670,6 +673,15 @@ pub fn parseTimeDigits(text: *const [2]u8, min: u8, max: u8) !u8 { | ... | @@ -670,6 +673,15 @@ pub fn parseTimeDigits(text: *const [2]u8, min: u8, max: u8) !u8 { |
| 670 | return @intCast(result); | 673 | return @intCast(result); |
| 671 | } | 674 | } |
| 672 | | 675 | |
| | 676 | test "parseTime UTCTime year mapping per RFC 5280" { |
| | 677 | const utc_time_id: der.Identifier = .{ .tag = .utc_time, .pc = .primitive, .class = .universal }; |
| | 678 | const elem = der.Element{ .identifier = utc_time_id, .slice = .{ .start = 0, .end = 13 } }; |
| | 679 | const cert49 = Certificate{ .buffer = "490101000000Z", .index = 0 }; |
| | 680 | try std.testing.expectEqual(@as(u64, 2493072000), try cert49.parseTime(elem)); |
| | 681 | const cert99 = Certificate{ .buffer = "990101000000Z", .index = 0 }; |
| | 682 | try std.testing.expectEqual(@as(u64, 915148800), try cert99.parseTime(elem)); |
| | 683 | } |
| | 684 | |
| 673 | test parseTimeDigits { | 685 | test parseTimeDigits { |
| 674 | const expectEqual = std.testing.expectEqual; | 686 | const expectEqual = std.testing.expectEqual; |
| 675 | try expectEqual(@as(u8, 0), try parseTimeDigits("00", 0, 99)); | 687 | try expectEqual(@as(u8, 0), try parseTimeDigits("00", 0, 99)); |