• Re: pki::x509::verify_cert not working?

    From Jerry O.@jerry@thselucreh.com to comp.lang.tcl on Fri Mar 20 03:19:53 2026
    From Newsgroup: comp.lang.tcl

    On Tue, 17 Mar 2026 02:22:23 -0000 (UTC), Jerry O. wrote:

    Hello everyone,

    I have a question for those who have written code using pki: have any of you had pki::x509::verify_cert suddenly begin failing certs, even when the trust has indeed been established, the certs are current, and-- most importantly-- an independent check using "openssl verify -CAfile..." (or some other similar utility) shows that the cert _is_ valid?

    Hello again,

    I've been studying the pki.tcl module source code and I believe I may have found the
    reason for why verify_cert is not passing an otherwise trusted cert chain: a missing case
    in a switch statement in the proc ::pki::x509::validate_cert. I believe this to be so
    based on the following reasoning (see the code excerpts below):

    1) ::pki::x509::verify_cert invokes ::pki::x509::validate_cert on the supplicant cert
    first, and then on the trusted cert(s).

    2) The supplicant cert passes ::pki::x509::validate_cert.

    3) The trusted cert fails ::pki::x509::validate_cert.

    4) Therefore, ::pki::x509::verify_cert fails.

    5) The CA cert (the trusted cert) generated by ::pki::x509::create_cert includes the
    extension "id-ce-basicConstraints". The ::pki::x509::validate_cert code doesn't
    recognize this extension-- it only recognizes "basicConstraints"-- and so returns
    false as the default response.

    6) It looks like "id-ce-basicConstraints" and "basicConstraints" are otherwise treated
    equivalently elsewhere in pki.tcl. See the code for ::pki::x509::create_cert, and
    the code (and comments) for ::pki::x509::_parse_extensions as comparison.

    7) It appears to me that the switch statement in ::pki::x509::validate_cert is simply
    missing the "id-ce-basicConstraints" case that would fix the issue.

    I humbly ask that those readers who are, or who are in contact with, code maintainers
    please review what I have submitted here, and if it is confirmed, that a correction to
    pki.tcl be proposed.

    With Gratitude,
    -Jerry O.
    Please first reverse the letters in my address domain when replying direct.

    modules/pki/pki.tcl as retrieved on March 19th, 2026:


    In the proc ::pki::x509::validate_cert (starting at line 2222):

    2294 # Check for extensions and process them. However v1 certs have no extensions
    2295 if {$cert_arr(version) == 0} {
    2296 # Do not permit V1 certificates for signing.
    2297 set CA 0
    2298 } else {
    2299 ## Critical extensions must be understood, non-critical extensions may be ignored if not understood
    2300 set CA 0
    2301 set CAdepth -1
    2302 foreach {ext_id ext_val} $cert_arr(extensions) {
    2303 set critical [lindex $ext_val 0]
    2304
    2305 switch -- $ext_id {
    2306 ------> basicConstraints {
    2307 set CA [lindex $ext_val 1 0]
    2308 set CAdepth [lindex $ext_val 1 1]
    2309 }
    2310 default {
    2311 ### If this extensions is critical and not understood, we must reject it
    2312 if {$critical} {
    2313 return false
    2314 }
    2315 }
    2316 }
    2317 }
    2318 }

    Shouldn't "id-ce-basicConstraints" be included, as follows:

    switch -- $ext_id {
    ---ADD?---> id-ce-basicConstraints -
    basicConstraints {
    set CA [lindex $ext_val 1 0]
    set CAdepth [lindex $ext_val 1 1]
    }

    ...etc...

    Compare to the code of proc ::pki::x509::create_cert (starting at line 2584):

    2686 ## Insert extensions
    2687 if {[array get extensions] ne {}} {
    2688 set extensionslist [list]
    2689
    2690 foreach {extension extvalue} [array get extensions] {
    2691 set critical 0
    2692
    2693 switch -- $extension {
    2694 ------> id-ce-basicConstraints -
    2695 basicConstraints {
    2696 set critical [lindex $extvalue 0]
    2697 set allowCA [lindex $extvalue 1]
    2698 set caDepth [lindex $extvalue 2]
    2699
    2700 if {$caDepth < 0} {
    2701 set extvalue [::asn::asnSequence [::asn::asnBoolean $allowCA]]
    2702 } else {
    2703 set extvalue [::asn::asnSequence [
    2704 ::asn::asnBoolean $allowCA
    2705 ] [
    2706 ::asn::asnInteger $caDepth
    2707 ]]
    2708 }
    2709 }


    Look at proc ::pki::x509::_parse_extensions (starting at line 2010), lines 2089 thru 2098,
    where accommodation was made for both forms "basicConstraints" and "id-ce-basicConstraints"
    --
    Please first reverse the letters in my address domain when replying direct.
    --- Synchronet 3.21e-Linux NewsLink 1.2
  • From Ashok@apnmbx-public@yahoo.com to comp.lang.tcl on Thu Jun 25 22:25:26 2026
    From Newsgroup: comp.lang.tcl

    Jerry,

    Fixed now in the repository commit https://core.tcl-lang.org/tcllib/info/71ee2640ea.

    Corresponding ticket with explanation is https://core.tcl-lang.org/tcllib/tktview/7778a629

    Thanks very much for pursuing and detailed diagnosis (which was mostly
    correct except that id-ce-basicConstraints has non-standard syntax for compatibility reasons with older releases.)

    /Ashok


    On 6/11/2026 9:32 AM, Jerry O. wrote:
    Ashok,

    Thanks so much for following up. I've pasted my original posts below.
    On my own systems I went ahead and modified the code as I proposed to make it work. I've
    not checked to see if the ::pki:: package has been updated since.



    --- Synchronet 3.22a-Linux NewsLink 1.2