diff options
author | Dr. Stephen Henson <steve@openssl.org> | 2012-11-19 15:12:07 +0000 |
---|---|---|
committer | Dr. Stephen Henson <steve@openssl.org> | 2012-11-19 15:12:07 +0000 |
commit | 1c455bc084837cd040f1b4877854c56f39ac70a1 (patch) | |
tree | e4f2011e1538148573bc520559be1eb804fb6824 /crypto/asn1/a_utctm.c | |
parent | 9f6b0635ad87845ddf9c88f0b17569e07c26c4b4 (diff) |
new function ASN1_TIME_diff to calculate difference between two ASN1_TIME structures
Diffstat (limited to 'crypto/asn1/a_utctm.c')
-rw-r--r-- | crypto/asn1/a_utctm.c | 53 |
1 files changed, 49 insertions, 4 deletions
diff --git a/crypto/asn1/a_utctm.c b/crypto/asn1/a_utctm.c index 75608df336..87a4b27567 100644 --- a/crypto/asn1/a_utctm.c +++ b/crypto/asn1/a_utctm.c @@ -61,6 +61,7 @@ #include "cryptlib.h" #include "o_time.h" #include <openssl/asn1.h> +#include "asn1_locl.h" #if 0 int i2d_ASN1_UTCTIME(ASN1_UTCTIME *a, unsigned char **pp) @@ -112,7 +113,7 @@ err: #endif -int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) +int asn1_utctime_to_tm(struct tm *tm, const ASN1_UTCTIME *d) { static const int min[8]={ 0, 1, 1, 0, 0, 0, 0, 0}; static const int max[8]={99,12,31,23,59,59,12,59}; @@ -129,7 +130,12 @@ int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) { if ((i == 5) && ((a[o] == 'Z') || (a[o] == '+') || (a[o] == '-'))) - { i++; break; } + { + i++; + if (tm) + tm->tm_sec = 0; + break; + } if ((a[o] < '0') || (a[o] > '9')) goto err; n= a[o]-'0'; if (++o > l) goto err; @@ -139,11 +145,36 @@ int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) if (++o > l) goto err; if ((n < min[i]) || (n > max[i])) goto err; + if (tm) + { + switch(i) + { + case 0: + tm->tm_year = n < 50 ? n + 100 : n; + break; + case 1: + tm->tm_mon = n - 1; + break; + case 2: + tm->tm_mday = n; + break; + case 3: + tm->tm_hour = n; + break; + case 4: + tm->tm_min = n; + break; + case 5: + tm->tm_sec = n; + break; + } + } } if (a[o] == 'Z') o++; else if ((a[o] == '+') || (a[o] == '-')) { + int offsign = a[o] == '-' ? -1 : 1, offset = 0; o++; if (o+4 > l) goto err; for (i=6; i<8; i++) @@ -154,12 +185,26 @@ int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) if ((a[o] < '0') || (a[o] > '9')) goto err; n=(n*10)+ a[o]-'0'; if ((n < min[i]) || (n > max[i])) goto err; + if (tm) + { + if (i == 6) + offset = n * 3600; + else if (i == 7) + offset += n * 60; + } o++; } + if (offset && !OPENSSL_gmtime_adj(tm, 0, offset * offsign)) + return 0; } - return(o == l); + return o == l; err: - return(0); + return 0; + } + +int ASN1_UTCTIME_check(const ASN1_UTCTIME *d) + { + return asn1_utctime_to_tm(NULL, d); } int ASN1_UTCTIME_set_string(ASN1_UTCTIME *s, const char *str) |