diff options
author | Timothy Pearson <kb9vqf@pearsoncomputing.net> | 2016-09-06 22:48:51 -0500 |
---|---|---|
committer | Slávek Banko <slavek.banko@axis.cz> | 2017-07-22 15:56:45 +0200 |
commit | af445343bde717615fbd38d06641f3bd31cb245a (patch) | |
tree | c7b1b67a8fae8689bdcf166d82999e03e7ab5d0d | |
parent | a5a389936c791fa4b464b84d8ebed972a7ebe8aa (diff) | |
download | tdelibs-af445343bde717615fbd38d06641f3bd31cb245a.tar.gz tdelibs-af445343bde717615fbd38d06641f3bd31cb245a.zip |
Parse GENERALIZEDTIME ASN structures
This fixes certificate dates beyond year 2049.
(cherry picked from commit 07dbb3b5c92ed22f71123eb84806d55f9962c60b)
-rw-r--r-- | kio/kssl/ksslutils.cc | 33 |
1 files changed, 21 insertions, 12 deletions
diff --git a/kio/kssl/ksslutils.cc b/kio/kssl/ksslutils.cc index cf024347c..7f254f49b 100644 --- a/kio/kssl/ksslutils.cc +++ b/kio/kssl/ksslutils.cc @@ -35,6 +35,9 @@ TQDateTime ASN1_UTCTIME_QDateTime(ASN1_UTCTIME *tm, int *isGmt) { TQDateTime qdt; char *v; int gmt=0; +int gentime=0; +int yoffset=0; +int yearbase=1900; int i; int y=0,M=0,d=0,h=0,m=0,s=0; TQDate qdate; @@ -42,24 +45,30 @@ TQTime qtime; i = tm->length; v = (char *)tm->data; - + if ((i == 15) || (i == 21)) { + gentime=1; + yoffset=2; + yearbase=0; + } if (i < 10) goto auq_err; if (v[i-1] == 'Z') gmt=1; - for (i=0; i<10; i++) + for (i=0; i<10+yoffset; i++) if ((v[i] > '9') || (v[i] < '0')) goto auq_err; - y = (v[0]-'0')*10+(v[1]-'0'); + y = (v[0+yoffset]-'0')*10+(v[1+yoffset]-'0'); + if (gentime) + y += (v[0]-'0')*1000+(v[1]-'0')*100; if (y < 50) y+=100; - M = (v[2]-'0')*10+(v[3]-'0'); + M = (v[2+yoffset]-'0')*10+(v[3+yoffset]-'0'); if ((M > 12) || (M < 1)) goto auq_err; - d = (v[4]-'0')*10+(v[5]-'0'); - h = (v[6]-'0')*10+(v[7]-'0'); - m = (v[8]-'0')*10+(v[9]-'0'); - if ( (v[10] >= '0') && (v[10] <= '9') && - (v[11] >= '0') && (v[11] <= '9')) - s = (v[10]-'0')*10+(v[11]-'0'); - + d = (v[4+yoffset]-'0')*10+(v[5+yoffset]-'0'); + h = (v[6+yoffset]-'0')*10+(v[7+yoffset]-'0'); + m = (v[8+yoffset]-'0')*10+(v[9+yoffset]-'0'); + if ( (v[10+yoffset] >= '0') && (v[10+yoffset] <= '9') && + (v[11+yoffset] >= '0') && (v[11+yoffset] <= '9')) + s = (v[10+yoffset]-'0')*10+(v[11+yoffset]-'0'); + // localize the date and display it. - qdate.setYMD(y+1900, M, d); + qdate.setYMD(y+yearbase, M, d); qtime.setHMS(h,m,s); qdt.setDate(qdate); qdt.setTime(qtime); auq_err: |