32bit time issues with gnutls_x509_crt_[get,set]-*-time
Description of problem:
Originally a bug against the guile bindings (#32 (closed)) but i think it might be an issue with gnutls.
The functions gnutls_x509_crt_get_expiration_time, gnutls_x509_crt_set_expiration_time, gnutls_x509_crt_get_activation_time, gnutls_x509_crt_set_activation_time seem to have troubles using time values greater than 32 bits. Trying to get a time value results in an overflow/underflow, trying to set a value in an error.
I am using a 64bit system.
Version of gnutls used:
3.8.9
Distributor of gnutls (e.g., Ubuntu, Fedora, RHEL)
Verified this on Fedora 41, Debian 13 and others (on x86_64)
How reproducible:
Always
Steps to Reproduce:
I am using my scheme examples from the other bug report, but I verified that this is not an issue with the bindings as the value is already negative before it gets converted to a scheme value
Setting a value:
(use-modules (gnutls))
(let ((cert (make-x509-certificate))
(expiration (expt 2 31)))
(set-x509-certificate-expiration-time! cert expiration))
Getting:
The file cert.pem has an expiry date in 2055
(use-modules (gnutls)
(ice-9 binary-ports))
(let* ((data (call-with-input-file "cert.pem" get-bytevector-all))
(cert (import-x509-certificate data x509-certificate-format/pem)))
(format #t "Activation: ~a~%Expiration: ~a~%"
(strftime "%c" (gmtime (x509-certificate-activation-time cert)))
(strftime "%c" (gmtime (x509-certificate-expiration-time cert)))))
Similar issues with the activation time
Actual results:
Setting:
An error:
In procedure raise exception:
Value out of range -2147483648 to< 2147483647: 2147483648
Getting
Activation: Fri Feb 21 18:31:34 2025
Expiration: Thu Jan 16 12:03:18 1919
Expected results:
Set the date to the correct time.
Get the correct timestamp for expiration/activation.
Interestingly when I use gnutls_x509_crt_print the dates are correct:
Validity:
Not Before: Fri Feb 21 18:31:34 UTC 2025
Not After: Sun Feb 21 18:31:34 UTC 2055