1*3b7446eeStb.\" $OpenBSD: X509_STORE_CTX_set_verify.3,v 1.8 2024/06/07 05:51:39 tb Exp $ 2491f2bffSschwarze.\" 3e38e0490Sschwarze.\" Copyright (c) 2021, 2022 Ingo Schwarze <schwarze@openbsd.org> 42c347fa6Sschwarze.\" Copyright (c) 2023 Job Snijders <job@openbsd.org> 5491f2bffSschwarze.\" 6491f2bffSschwarze.\" Permission to use, copy, modify, and distribute this software for any 7491f2bffSschwarze.\" purpose with or without fee is hereby granted, provided that the above 8491f2bffSschwarze.\" copyright notice and this permission notice appear in all copies. 9491f2bffSschwarze.\" 10491f2bffSschwarze.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11491f2bffSschwarze.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12491f2bffSschwarze.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13491f2bffSschwarze.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14491f2bffSschwarze.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15491f2bffSschwarze.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16491f2bffSschwarze.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17491f2bffSschwarze.\" 18*3b7446eeStb.Dd $Mdocdate: June 7 2024 $ 19491f2bffSschwarze.Dt X509_STORE_CTX_SET_VERIFY 3 20491f2bffSschwarze.Os 21491f2bffSschwarze.Sh NAME 22491f2bffSschwarze.Nm X509_STORE_CTX_verify_fn , 23491f2bffSschwarze.Nm X509_STORE_CTX_set_verify , 24491f2bffSschwarze.Nm X509_STORE_CTX_get_verify , 25491f2bffSschwarze.Nm X509_STORE_set_verify , 26e38e0490Sschwarze.Nm X509_STORE_set_verify_func , 27efc80f80Sjob.Nm X509_STORE_get_verify , 282c347fa6Sschwarze.Nm X509_STORE_CTX_check_issued_fn , 29efc80f80Sjob.Nm X509_STORE_set_check_issued , 30efc80f80Sjob.Nm X509_STORE_get_check_issued , 31efc80f80Sjob.Nm X509_STORE_CTX_get_check_issued 32491f2bffSschwarze.Nd user-defined certificate chain verification function 33491f2bffSschwarze.Sh SYNOPSIS 34491f2bffSschwarze.In openssl/x509_vfy.h 35491f2bffSschwarze.Ft typedef int 3619a92ca5Sjsg.Fo (*X509_STORE_CTX_verify_fn) 37491f2bffSschwarze.Fa "X509_STORE_CTX *ctx" 38491f2bffSschwarze.Fc 39491f2bffSschwarze.Ft void 40491f2bffSschwarze.Fo X509_STORE_CTX_set_verify 41491f2bffSschwarze.Fa "X509_STORE_CTX *ctx" 42491f2bffSschwarze.Fa "X509_STORE_CTX_verify_fn verify" 43491f2bffSschwarze.Fc 44491f2bffSschwarze.Ft X509_STORE_CTX_verify_fn 45491f2bffSschwarze.Fo X509_STORE_CTX_get_verify 46491f2bffSschwarze.Fa "X509_STORE_CTX *ctx" 47491f2bffSschwarze.Fc 48491f2bffSschwarze.Ft void 49491f2bffSschwarze.Fo X509_STORE_set_verify 50491f2bffSschwarze.Fa "X509_STORE *store" 51491f2bffSschwarze.Fa "X509_STORE_CTX_verify_fn verify" 52491f2bffSschwarze.Fc 53491f2bffSschwarze.Ft void 54491f2bffSschwarze.Fo X509_STORE_set_verify_func 55491f2bffSschwarze.Fa "X509_STORE *store" 56491f2bffSschwarze.Fa "X509_STORE_CTX_verify_fn verify" 57491f2bffSschwarze.Fc 58e38e0490Sschwarze.Ft X509_STORE_CTX_verify_fn 59e38e0490Sschwarze.Fo X509_STORE_get_verify 60e38e0490Sschwarze.Fa "X509_STORE_CTX *ctx" 61e38e0490Sschwarze.Fc 62efc80f80Sjob.Ft typedef int 6319a92ca5Sjsg.Fo (*X509_STORE_CTX_check_issued_fn) 64efc80f80Sjob.Fa "X509_STORE_CTX *ctx" 65efc80f80Sjob.Fa "X509 *subject" 66efc80f80Sjob.Fa "X509 *issuer" 67efc80f80Sjob.Fc 68efc80f80Sjob.Ft void 69efc80f80Sjob.Fo X509_STORE_set_check_issued 70efc80f80Sjob.Fa "X509_STORE *store" 71efc80f80Sjob.Fa "X509_STORE_CTX_check_issued_fn check_issued" 72efc80f80Sjob.Fc 73efc80f80Sjob.Ft X509_STORE_CTX_check_issued_fn 74efc80f80Sjob.Fo X509_STORE_get_check_issued 75efc80f80Sjob.Fa "X509_STORE *store" 76efc80f80Sjob.Fc 77efc80f80Sjob.Ft X509_STORE_CTX_check_issued_fn 78efc80f80Sjob.Fo X509_STORE_CTX_get_check_issued 79efc80f80Sjob.Fa "X509_STORE_CTX *ctx" 80efc80f80Sjob.Fc 81491f2bffSschwarze.Sh DESCRIPTION 82491f2bffSschwarze.Fn X509_STORE_CTX_set_verify 83491f2bffSschwarzeconfigures 84491f2bffSschwarze.Fa ctx 85491f2bffSschwarzeto use the 86491f2bffSschwarze.Fa verify 87491f2bffSschwarzeargument as the X.509 certificate chain verification function instead 88491f2bffSschwarzeof the default verification function built into the library when 89491f2bffSschwarze.Xr X509_verify_cert 3 90491f2bffSschwarzeis called. 91491f2bffSschwarze.Pp 92491f2bffSschwarzeThe 93491f2bffSschwarze.Fa verify 94491f2bffSschwarzefunction provided by the user is only called if the 95491f2bffSschwarze.Dv X509_V_FLAG_LEGACY_VERIFY 96491f2bffSschwarzeor 97491f2bffSschwarze.Dv X509_V_FLAG_NO_ALT_CHAINS 98491f2bffSschwarzeflag was set on 99491f2bffSschwarze.Fa ctx 100491f2bffSschwarzeusing 101491f2bffSschwarze.Xr X509_STORE_CTX_set_flags 3 102491f2bffSschwarzeor 103491f2bffSschwarze.Xr X509_VERIFY_PARAM_set_flags 3 . 104491f2bffSschwarzeOtherwise, it is ignored and a different algorithm is used that does 105491f2bffSschwarzenot support replacing the verification function. 106491f2bffSschwarze.Pp 107491f2bffSschwarze.Fn X509_STORE_set_verify 108491f2bffSschwarzesaves the function pointer 109491f2bffSschwarze.Fa verify 110491f2bffSschwarzein the given 111491f2bffSschwarze.Fa store 112491f2bffSschwarzeobject. 113491f2bffSschwarzeThat pointer will be copied to an 114491f2bffSschwarze.Vt X509_STORE_CTX 115491f2bffSschwarzeobject when 116491f2bffSschwarze.Fa store 117491f2bffSschwarzeis later passed as an argument to 118491f2bffSschwarze.Xr X509_STORE_CTX_init 3 . 119491f2bffSschwarze.Pp 120491f2bffSschwarze.Fn X509_STORE_set_verify_func 121491f2bffSschwarzeis an alias for 122491f2bffSschwarze.Fn X509_STORE_set_verify 123491f2bffSschwarzeimplemented as a macro. 124efc80f80Sjob.Pp 125efc80f80Sjob.Fn X509_STORE_set_check_issued 126efc80f80Sjobsaves the function pointer 127efc80f80Sjob.Fa check_issued 128efc80f80Sjobin the given 129efc80f80Sjob.Fa store 130efc80f80Sjobobject. 131efc80f80SjobThat pointer will be copied to an 132efc80f80Sjob.Vt X509_STORE_CTX 133efc80f80Sjobobject when 134efc80f80Sjob.Fa store 135efc80f80Sjobis later passed as an argument to 136efc80f80Sjob.Fn X509_STORE_CTX_init 3 . 137efc80f80Sjob.Pp 138efc80f80SjobThe 139efc80f80Sjob.Fa check_issued 140efc80f80Sjobfunction provided by the user should check whether a given certificate 141efc80f80Sjob.Fa subject 142efc80f80Sjobwas issued using the CA certificate 143efc80f80Sjob.Fa issuer , 144efc80f80Sjoband must return 0 on failure and 1 on success. 145*3b7446eeStbThe default implementation ignores the 146*3b7446eeStb.Fa ctx 147*3b7446eeStbargument and returns success if and only if 148*3b7446eeStb.Xr X509_check_issued 3 149*3b7446eeStbreturns 150*3b7446eeStb.Dv X509_V_OK . 151*3b7446eeStbIt is important to pay close attention to the order of the 152*3b7446eeStb.Fa issuer 153*3b7446eeStband 154*3b7446eeStb.Fa subject 155*3b7446eeStbarguments. 156*3b7446eeStbIn 157*3b7446eeStb.Xr X509_check_issued 3 158*3b7446eeStbthe 159*3b7446eeStb.Fa issuer 160*3b7446eeStbprecedes the 161*3b7446eeStb.Fa subject 162*3b7446eeStbwhile in 163*3b7446eeStb.Fn check_issued 164*3b7446eeStbthe 165*3b7446eeStb.Fa subject 166*3b7446eeStbcomes first. 167491f2bffSschwarze.Sh RETURN VALUES 168491f2bffSschwarze.Fn X509_STORE_CTX_verify_fn 169491f2bffSschwarzeis supposed to return 1 to indicate that the chain is valid 170491f2bffSschwarzeor 0 if it is not or if an error occurred. 171491f2bffSschwarze.Pp 172491f2bffSschwarze.Fn X509_STORE_CTX_get_verify 173e38e0490Sschwarzereturns a function pointer previously set with 174491f2bffSschwarze.Fn X509_STORE_CTX_set_verify 175491f2bffSschwarzeor 176491f2bffSschwarze.Xr X509_STORE_CTX_init 3 , 177491f2bffSschwarzeor 178491f2bffSschwarze.Dv NULL 179491f2bffSschwarzeif 180491f2bffSschwarze.Fa ctx 181491f2bffSschwarzeis uninitialized. 182e38e0490Sschwarze.Pp 183e38e0490Sschwarze.Fn X509_STORE_get_verify 184e38e0490Sschwarzereturns the function pointer previously set with 185e38e0490Sschwarze.Fn X509_STORE_set_verify , 186e38e0490Sschwarzeor 187e38e0490Sschwarze.Dv NULL 188e38e0490Sschwarzeif that function was not called on the 189e38e0490Sschwarze.Fa store . 190efc80f80Sjob.Pp 191efc80f80Sjob.Fn X509_STORE_get_check_issued 192efc80f80Sjobreturns the function pointer previously set with 193efc80f80Sjob.Fn X509_STORE_set_check_issued , 194efc80f80Sjobor 195efc80f80Sjob.Dv NULL 196efc80f80Sjobif that function was not called on the 197efc80f80Sjob.Fa store . 198efc80f80Sjob.Pp 199efc80f80Sjob.Fn X509_STORE_CTX_get_check_issued 200efc80f80Sjobreturns the 201efc80f80Sjob.Fn check_issued 2023d9f13a7Sjobfunction pointer set on the 203efc80f80Sjob.Vt X509_STORE_CTX . 204efc80f80SjobThis is either the 205efc80f80Sjob.Fn check_issued 206efc80f80Sjobfunction inherited from the 207efc80f80Sjob.Fa store 208efc80f80Sjobused in 209efc80f80Sjob.Xr X509_STORE_CTX_init 3 210efc80f80Sjobor the library's default implementation. 211491f2bffSschwarze.Sh SEE ALSO 21219a92ca5Sjsg.Xr X509_check_issued 3 , 213491f2bffSschwarze.Xr X509_STORE_CTX_init 3 , 214491f2bffSschwarze.Xr X509_STORE_CTX_set_error 3 , 215491f2bffSschwarze.Xr X509_STORE_CTX_set_flags 3 , 216491f2bffSschwarze.Xr X509_STORE_CTX_set_verify_cb 3 , 217491f2bffSschwarze.Xr X509_STORE_new 3 , 218491f2bffSschwarze.Xr X509_STORE_set_flags 3 , 219491f2bffSschwarze.Xr X509_STORE_set_verify_cb 3 , 220491f2bffSschwarze.Xr X509_verify_cert 3 , 221491f2bffSschwarze.Xr X509_VERIFY_PARAM_set_flags 3 222491f2bffSschwarze.Sh HISTORY 223491f2bffSschwarze.Fn X509_STORE_set_verify_func 224491f2bffSschwarzefirst appeared in SSLeay 0.8.0 and has been available since 225491f2bffSschwarze.Ox 2.4 . 226491f2bffSschwarze.Pp 227491f2bffSschwarze.Fn X509_STORE_CTX_set_verify 228491f2bffSschwarzeand 229491f2bffSschwarze.Fn X509_STORE_CTX_get_verify 230491f2bffSschwarzefirst appeared in OpenSSL 1.1.0 and have been available since 231491f2bffSschwarze.Ox 7.1 . 232491f2bffSschwarze.Pp 233e38e0490Sschwarze.Fn X509_STORE_CTX_verify_fn , 234e38e0490Sschwarze.Fn X509_STORE_set_verify , 235491f2bffSschwarzeand 236e38e0490Sschwarze.Fn X509_STORE_get_verify 237491f2bffSschwarzefirst appeared in OpenSSL 1.1.0 and have been available since 238e38e0490Sschwarze.Ox 7.2 . 239efc80f80Sjob.Pp 240efc80f80Sjob.Fn X509_STORE_set_check_issued , 241efc80f80Sjob.Fn X509_STORE_get_check_issued , 242efc80f80Sjoband 243efc80f80Sjob.Fn X509_STORE_CTX_get_check_issued 244efc80f80Sjobfirst appeared in OpenSSL 1.1.0 and have been available since 245efc80f80Sjob.Ox 7.3 . 246*3b7446eeStb.Sh BUGS 247*3b7446eeStbThe reversal of order of 248*3b7446eeStb.Fa subject 249*3b7446eeStband 250*3b7446eeStb.Fa issuer 251*3b7446eeStbbetween 252*3b7446eeStb.Fn check_issued 253*3b7446eeStband 254*3b7446eeStb.Xr X509_check_issued 3 255*3b7446eeStbis very confusing. 256*3b7446eeStbIt has led to bugs and will cause many more. 257