From 515aec93f3ab3da6298b0d895710202647de2ab1 Mon Sep 17 00:00:00 2001 From: Timothy Pearson Date: Tue, 6 Sep 2016 22:48:51 -0500 Subject: Parse GENERALIZEDTIME ASN structures This fixes certificate dates beyond year 2049. (cherry picked from commit 07dbb3b5c92ed22f71123eb84806d55f9962c60b) --- tdeio/kssl/ksslutils.cc | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'tdeio/kssl') diff --git a/tdeio/kssl/ksslutils.cc b/tdeio/kssl/ksslutils.cc index 444e5dd4a..2e4a95d75 100644 --- a/tdeio/kssl/ksslutils.cc +++ b/tdeio/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: -- cgit v1.2.1