Loading CHANGES +5 −0 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,11 @@ Changes between 1.0.0 and 1.1.0 [xx XXX xxxx] Changes between 1.0.0 and 1.1.0 [xx XXX xxxx] *) New function OPENSSL_gmtime_diff to find the difference in days and seconds between two tm structures. This will be used to provide additional functionality for ASN1_TIME. [Steve Henson] *) New -sigopt option to the ca, req and x509 utilities. Additional *) New -sigopt option to the ca, req and x509 utilities. Additional signature parameters can be passed using this option and in signature parameters can be passed using this option and in particular PSS. particular PSS. Loading crypto/o_time.c +98 −35 Original line number Original line Diff line number Diff line Loading @@ -228,9 +228,73 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) static long date_to_julian(int y, int m, int d); static long date_to_julian(int y, int m, int d); static void julian_to_date(long jd, int *y, int *m, int *d); static void julian_to_date(long jd, int *y, int *m, int *d); static int julian_adj(struct tm *tm, int off_day, long offset_sec, long *pday, int *psec); int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) { { int time_sec, time_year, time_month, time_day; long time_jd; /* Convert time and offset into julian day and seconds */ if (!julian_adj(tm, off_day, offset_sec, &time_jd, &time_sec)) return 0; /* Convert Julian day back to date */ julian_to_date(time_jd, &time_year, &time_month, &time_day); if (time_year < 1900 || time_year > 9999) return 0; /* Update tm structure */ tm->tm_year = time_year - 1900; tm->tm_mon = time_month - 1; tm->tm_mday = time_day; tm->tm_hour = time_sec / 3600; tm->tm_min = (time_sec / 60) % 60; tm->tm_sec = time_sec % 60; return 1; } int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec) { int from_sec, to_sec, diff_sec; long from_jd, to_jd, diff_day; if (!julian_adj(from, 0, 0, &from_jd, &from_sec)) return 0; if (!julian_adj(to, 0, 0, &to_jd, &to_sec)) return 0; diff_day = to_jd - from_jd; diff_sec = to_sec - from_sec; /* Adjust differences so both positive or both negative */ if (diff_day > 0 && diff_sec < 0) { diff_day--; diff_sec += SECS_PER_DAY; } if (diff_day < 0 && diff_sec > 0) { diff_day++; diff_sec -= SECS_PER_DAY; } *pday = (int)diff_day; *psec = diff_sec; return 1; } /* Convert tm structure and offset into julian day and seconds */ static int julian_adj(struct tm *tm, int off_day, long offset_sec, long *pday, int *psec) { int offset_hms, offset_day; int offset_hms, offset_day; long time_jd; long time_jd; int time_year, time_month, time_day; int time_year, time_month, time_day; Loading Loading @@ -268,27 +332,12 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) if (time_jd < 0) if (time_jd < 0) return 0; return 0; /* Convert Julian day back to date */ *pday = time_jd; *psec = offset_hms; julian_to_date(time_jd, &time_year, &time_month, &time_day); if (time_year < 1900 || time_year > 9999) return 0; /* Update tm structure */ tm->tm_year = time_year - 1900; tm->tm_mon = time_month - 1; tm->tm_mday = time_day; tm->tm_hour = offset_hms / 3600; tm->tm_min = (offset_hms / 60) % 60; tm->tm_sec = offset_hms % 60; return 1; return 1; } } /* Convert date to and from julian day /* Convert date to and from julian day * Uses Fliegel & Van Flandern algorithm * Uses Fliegel & Van Flandern algorithm */ */ Loading Loading @@ -339,20 +388,23 @@ int main(int argc, char **argv) int check_time(long offset) int check_time(long offset) { { struct tm tm1, tm2; struct tm tm1, tm2, o1; int off_day, off_sec; long toffset; time_t t1, t2; time_t t1, t2; time(&t1); time(&t1); t2 = t1 + offset; t2 = t1 + offset; OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t1, &tm1); OPENSSL_gmtime(&t1, &tm1); o1 = tm1; OPENSSL_gmtime_adj(&tm1, 0, offset); OPENSSL_gmtime_adj(&tm1, 0, offset); if ((tm1.tm_year == tm2.tm_year) && if ((tm1.tm_year != tm2.tm_year) || (tm1.tm_mon == tm2.tm_mon) && (tm1.tm_mon != tm2.tm_mon) || (tm1.tm_mday == tm2.tm_mday) && (tm1.tm_mday != tm2.tm_mday) || (tm1.tm_hour == tm2.tm_hour) && (tm1.tm_hour != tm2.tm_hour) || (tm1.tm_min == tm2.tm_min) && (tm1.tm_min != tm2.tm_min) || (tm1.tm_sec == tm2.tm_sec)) (tm1.tm_sec != tm2.tm_sec)) return 1; { fprintf(stderr, "TIME ERROR!!\n"); fprintf(stderr, "TIME ERROR!!\n"); fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, Loading @@ -362,5 +414,16 @@ int check_time(long offset) tm1.tm_hour, tm1.tm_min, tm1.tm_sec); tm1.tm_hour, tm1.tm_min, tm1.tm_sec); return 0; return 0; } } OPENSSL_gmtime_diff(&o1, &tm1, &off_day, &off_sec); toffset = (long)off_day * SECS_PER_DAY + off_sec; if (offset != toffset) { fprintf(stderr, "TIME OFFSET ERROR!!\n"); fprintf(stderr, "Expected %ld, Got %ld (%d:%d)\n", offset, toffset, off_day, off_sec); return 0; } return 1; } #endif #endif crypto/o_time.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -63,5 +63,6 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec); #endif #endif Loading
CHANGES +5 −0 Original line number Original line Diff line number Diff line Loading @@ -4,6 +4,11 @@ Changes between 1.0.0 and 1.1.0 [xx XXX xxxx] Changes between 1.0.0 and 1.1.0 [xx XXX xxxx] *) New function OPENSSL_gmtime_diff to find the difference in days and seconds between two tm structures. This will be used to provide additional functionality for ASN1_TIME. [Steve Henson] *) New -sigopt option to the ca, req and x509 utilities. Additional *) New -sigopt option to the ca, req and x509 utilities. Additional signature parameters can be passed using this option and in signature parameters can be passed using this option and in particular PSS. particular PSS. Loading
crypto/o_time.c +98 −35 Original line number Original line Diff line number Diff line Loading @@ -228,9 +228,73 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result) static long date_to_julian(int y, int m, int d); static long date_to_julian(int y, int m, int d); static void julian_to_date(long jd, int *y, int *m, int *d); static void julian_to_date(long jd, int *y, int *m, int *d); static int julian_adj(struct tm *tm, int off_day, long offset_sec, long *pday, int *psec); int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) { { int time_sec, time_year, time_month, time_day; long time_jd; /* Convert time and offset into julian day and seconds */ if (!julian_adj(tm, off_day, offset_sec, &time_jd, &time_sec)) return 0; /* Convert Julian day back to date */ julian_to_date(time_jd, &time_year, &time_month, &time_day); if (time_year < 1900 || time_year > 9999) return 0; /* Update tm structure */ tm->tm_year = time_year - 1900; tm->tm_mon = time_month - 1; tm->tm_mday = time_day; tm->tm_hour = time_sec / 3600; tm->tm_min = (time_sec / 60) % 60; tm->tm_sec = time_sec % 60; return 1; } int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec) { int from_sec, to_sec, diff_sec; long from_jd, to_jd, diff_day; if (!julian_adj(from, 0, 0, &from_jd, &from_sec)) return 0; if (!julian_adj(to, 0, 0, &to_jd, &to_sec)) return 0; diff_day = to_jd - from_jd; diff_sec = to_sec - from_sec; /* Adjust differences so both positive or both negative */ if (diff_day > 0 && diff_sec < 0) { diff_day--; diff_sec += SECS_PER_DAY; } if (diff_day < 0 && diff_sec > 0) { diff_day++; diff_sec -= SECS_PER_DAY; } *pday = (int)diff_day; *psec = diff_sec; return 1; } /* Convert tm structure and offset into julian day and seconds */ static int julian_adj(struct tm *tm, int off_day, long offset_sec, long *pday, int *psec) { int offset_hms, offset_day; int offset_hms, offset_day; long time_jd; long time_jd; int time_year, time_month, time_day; int time_year, time_month, time_day; Loading Loading @@ -268,27 +332,12 @@ int OPENSSL_gmtime_adj(struct tm *tm, int off_day, long offset_sec) if (time_jd < 0) if (time_jd < 0) return 0; return 0; /* Convert Julian day back to date */ *pday = time_jd; *psec = offset_hms; julian_to_date(time_jd, &time_year, &time_month, &time_day); if (time_year < 1900 || time_year > 9999) return 0; /* Update tm structure */ tm->tm_year = time_year - 1900; tm->tm_mon = time_month - 1; tm->tm_mday = time_day; tm->tm_hour = offset_hms / 3600; tm->tm_min = (offset_hms / 60) % 60; tm->tm_sec = offset_hms % 60; return 1; return 1; } } /* Convert date to and from julian day /* Convert date to and from julian day * Uses Fliegel & Van Flandern algorithm * Uses Fliegel & Van Flandern algorithm */ */ Loading Loading @@ -339,20 +388,23 @@ int main(int argc, char **argv) int check_time(long offset) int check_time(long offset) { { struct tm tm1, tm2; struct tm tm1, tm2, o1; int off_day, off_sec; long toffset; time_t t1, t2; time_t t1, t2; time(&t1); time(&t1); t2 = t1 + offset; t2 = t1 + offset; OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t2, &tm2); OPENSSL_gmtime(&t1, &tm1); OPENSSL_gmtime(&t1, &tm1); o1 = tm1; OPENSSL_gmtime_adj(&tm1, 0, offset); OPENSSL_gmtime_adj(&tm1, 0, offset); if ((tm1.tm_year == tm2.tm_year) && if ((tm1.tm_year != tm2.tm_year) || (tm1.tm_mon == tm2.tm_mon) && (tm1.tm_mon != tm2.tm_mon) || (tm1.tm_mday == tm2.tm_mday) && (tm1.tm_mday != tm2.tm_mday) || (tm1.tm_hour == tm2.tm_hour) && (tm1.tm_hour != tm2.tm_hour) || (tm1.tm_min == tm2.tm_min) && (tm1.tm_min != tm2.tm_min) || (tm1.tm_sec == tm2.tm_sec)) (tm1.tm_sec != tm2.tm_sec)) return 1; { fprintf(stderr, "TIME ERROR!!\n"); fprintf(stderr, "TIME ERROR!!\n"); fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", fprintf(stderr, "Time1: %d/%d/%d, %d:%02d:%02d\n", tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, tm2.tm_mday, tm2.tm_mon + 1, tm2.tm_year + 1900, Loading @@ -362,5 +414,16 @@ int check_time(long offset) tm1.tm_hour, tm1.tm_min, tm1.tm_sec); tm1.tm_hour, tm1.tm_min, tm1.tm_sec); return 0; return 0; } } OPENSSL_gmtime_diff(&o1, &tm1, &off_day, &off_sec); toffset = (long)off_day * SECS_PER_DAY + off_sec; if (offset != toffset) { fprintf(stderr, "TIME OFFSET ERROR!!\n"); fprintf(stderr, "Expected %ld, Got %ld (%d:%d)\n", offset, toffset, off_day, off_sec); return 0; } return 1; } #endif #endif
crypto/o_time.h +1 −0 Original line number Original line Diff line number Diff line Loading @@ -63,5 +63,6 @@ struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); struct tm *OPENSSL_gmtime(const time_t *timer, struct tm *result); int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); int OPENSSL_gmtime_adj(struct tm *tm, int offset_day, long offset_sec); int OPENSSL_gmtime_diff(struct tm *from, struct tm *to, int *pday, int *psec); #endif #endif