15
15
*/
16
16
package okhttp3.tls.internal.der
17
17
18
- import java.math.BigInteger
19
- import java.net.InetAddress
20
- import java.net.ProtocolException
21
- import java.text.SimpleDateFormat
22
- import java.util.Date
23
- import java.util.TimeZone
24
18
import okhttp3.tls.internal.der.CertificateAdapters.generalNameDnsName
25
19
import okhttp3.tls.internal.der.CertificateAdapters.generalNameIpAddress
26
20
import okhttp3.tls.internal.der.ObjectIdentifiers.basicConstraints
@@ -33,7 +27,15 @@ import okio.ByteString.Companion.encodeUtf8
33
27
import okio.ByteString.Companion.toByteString
34
28
import org.assertj.core.api.Assertions.assertThat
35
29
import org.junit.Assert.fail
30
+ import org.junit.Ignore
36
31
import org.junit.Test
32
+ import java.math.BigInteger
33
+ import java.net.InetAddress
34
+ import java.net.ProtocolException
35
+ import java.text.ParseException
36
+ import java.text.SimpleDateFormat
37
+ import java.util.Date
38
+ import java.util.TimeZone
37
39
38
40
internal class DerTest {
39
41
@Test fun `decode tag and length` () {
@@ -683,59 +685,60 @@ internal class DerTest {
683
685
assertThat(string).isEqualTo(" hi" )
684
686
}
685
687
686
- @Test fun `encode ia5` () {
687
- val byteString = Adapters .IA5_STRING .toDer(" hi" )
688
- assertThat(byteString).isEqualTo(" 16026869" .decodeHex())
689
- }
690
-
691
- @Test fun `decode printable string` () {
692
- val string = Adapters .PRINTABLE_STRING .fromDer(" 13026869" .decodeHex())
693
- assertThat(string).isEqualTo(" hi" )
694
- }
695
-
696
- @Test fun `encode printable string` () {
697
- val byteString = Adapters .PRINTABLE_STRING .toDer(" hi" )
698
- assertThat(byteString).isEqualTo(" 13026869" .decodeHex())
699
- }
700
-
701
- @Test fun `decode utc time` () {
702
- val time = Adapters .UTC_TIME .fromDer(" 17113139313231353139303231302d30383030" .decodeHex())
703
- assertThat(time).isEqualTo(date(" 2019-12-16T03:02:10.000+0000" ).time)
688
+ @Test fun `cannot decode utc time with offset` () {
689
+ try {
690
+ Adapters .UTC_TIME .fromDer(" 17113139313231353139303231302d30383030" .decodeHex())
691
+ fail()
692
+ } catch (expected: ParseException ) {
693
+ }
704
694
}
705
695
706
696
@Test fun `encode utc time` () {
707
697
val byteString = Adapters .UTC_TIME .toDer(date(" 2019-12-16T03:02:10.000+0000" ).time)
708
698
assertThat(byteString).isEqualTo(" 170d3139313231363033303231305a" .decodeHex())
709
699
}
710
700
711
- @Test fun `decode generalized time` () {
712
- val time = Adapters .GENERALIZED_TIME
713
- .fromDer(" 181332303139313231353139303231302d30383030" .decodeHex())
714
- assertThat(time).isEqualTo(date(" 2019-12-16T03:02:10.000+0000" ).time)
701
+ @Test fun `cannot decode malformed utc time` () {
702
+ val bytes = " 170d3139313231362333303231305a" .decodeHex()
703
+ try {
704
+ Adapters .UTC_TIME .fromDer(bytes)
705
+ fail()
706
+ } catch (expected: ParseException ) {
707
+ }
708
+ }
709
+
710
+ @Test fun `cannot decode generalized time with offset` () {
711
+ try {
712
+ Adapters .GENERALIZED_TIME .fromDer(" 181332303139313231353139303231302d30383030" .decodeHex())
713
+ fail()
714
+ } catch (expected: ParseException ) {
715
+ }
715
716
}
716
717
717
718
@Test fun `encode generalized time` () {
718
719
val byteString = Adapters .GENERALIZED_TIME .toDer(date(" 2019-12-16T03:02:10.000+0000" ).time)
719
720
assertThat(byteString).isEqualTo(" 180f32303139313231363033303231305a" .decodeHex())
720
721
}
721
722
723
+ @Test fun `parse utc time` () {
724
+ assertThat(Adapters .parseUtcTime(" 920521000000Z" ))
725
+ .isEqualTo(date(" 1992-05-21T00:00:00.000+0000" ).time)
726
+ assertThat(Adapters .parseUtcTime(" 920622123421Z" ))
727
+ .isEqualTo(date(" 1992-06-22T12:34:21.000+0000" ).time)
728
+ assertThat(Adapters .parseUtcTime(" 920722132100Z" ))
729
+ .isEqualTo(date(" 1992-07-22T13:21:00.000+0000" ).time)
730
+ }
731
+
722
732
@Test fun `decode utc time two digit year cutoff is 1950` () {
723
- assertThat(Adapters .parseUtcTime(" 500101000000-0000 " ))
733
+ assertThat(Adapters .parseUtcTime(" 500101000000Z " ))
724
734
.isEqualTo(date(" 1950-01-01T00:00:00.000+0000" ).time)
725
- assertThat(Adapters .parseUtcTime(" 500101000000-0100 " ))
735
+ assertThat(Adapters .parseUtcTime(" 500101010000Z " ))
726
736
.isEqualTo(date(" 1950-01-01T01:00:00.000+0000" ).time)
727
737
728
- assertThat(Adapters .parseUtcTime(" 491231235959+0100 " ))
738
+ assertThat(Adapters .parseUtcTime(" 491231225959Z " ))
729
739
.isEqualTo(date(" 2049-12-31T22:59:59.000+0000" ).time)
730
- assertThat(Adapters .parseUtcTime(" 491231235959-0000 " ))
740
+ assertThat(Adapters .parseUtcTime(" 491231235959Z " ))
731
741
.isEqualTo(date(" 2049-12-31T23:59:59.000+0000" ).time)
732
-
733
- // Note that time zone offsets aren't honored by Java's two-digit offset boundary! A savvy time
734
- // traveler could exploit this to get a certificate that expires 100 years later than expected.
735
- assertThat(Adapters .parseUtcTime(" 500101000000+0100" ))
736
- .isEqualTo(date(" 2049-12-31T23:00:00.000+0000" ).time)
737
- assertThat(Adapters .parseUtcTime(" 491231235959-0100" ))
738
- .isEqualTo(date(" 2050-01-01T00:59:59.000+0000" ).time)
739
742
}
740
743
741
744
@Test fun `encode utc time two digit year cutoff is 1950` () {
@@ -746,14 +749,24 @@ internal class DerTest {
746
749
}
747
750
748
751
@Test fun `parse generalized time` () {
749
- assertThat(Adapters .parseGeneralizedTime(" 18990101000000-0000 " ))
752
+ assertThat(Adapters .parseGeneralizedTime(" 18990101000000Z " ))
750
753
.isEqualTo(date(" 1899-01-01T00:00:00.000+0000" ).time)
751
- assertThat(Adapters .parseGeneralizedTime(" 19500101000000-0000 " ))
754
+ assertThat(Adapters .parseGeneralizedTime(" 19500101000000Z " ))
752
755
.isEqualTo(date(" 1950-01-01T00:00:00.000+0000" ).time)
753
- assertThat(Adapters .parseGeneralizedTime(" 20500101000000-0000 " ))
756
+ assertThat(Adapters .parseGeneralizedTime(" 20500101000000Z " ))
754
757
.isEqualTo(date(" 2050-01-01T00:00:00.000+0000" ).time)
755
- assertThat(Adapters .parseGeneralizedTime(" 20990101000000-0000 " ))
758
+ assertThat(Adapters .parseGeneralizedTime(" 20990101000000Z " ))
756
759
.isEqualTo(date(" 2099-01-01T00:00:00.000+0000" ).time)
760
+ assertThat(Adapters .parseGeneralizedTime(" 19920521000000Z" ))
761
+ .isEqualTo(date(" 1992-05-21T00:00:00.000+0000" ).time)
762
+ assertThat(Adapters .parseGeneralizedTime(" 19920622123421Z" ))
763
+ .isEqualTo(date(" 1992-06-22T12:34:21.000+0000" ).time)
764
+ }
765
+
766
+ @Ignore(" fractional seconds are not implemented" )
767
+ @Test fun `parse generalized time with fractional seconds` () {
768
+ assertThat(Adapters .parseGeneralizedTime(" 19920722132100.3Z" ))
769
+ .isEqualTo(date(" 1992-07-22T13:21:00.300+0000" ).time)
757
770
}
758
771
759
772
@Test fun `format generalized time` () {
0 commit comments