x509_cmp.c
Go to the documentation of this file.
1 /* crypto/x509/x509_cmp.c */
2 /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young (eay@cryptsoft.com).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to. The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson (tjh@cryptsoft.com).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  * notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  * notice, this list of conditions and the following disclaimer in the
30  * documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  * must display the following acknowledgement:
33  * "This product includes cryptographic software written by
34  * Eric Young (eay@cryptsoft.com)"
35  * The word 'cryptographic' can be left out if the rouines from the library
36  * being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  * the apps directory (application code) you must include an acknowledgement:
39  * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed. i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.] */
57 
58 #include <string.h>
59 
60 #include <openssl/asn1.h>
61 #include <openssl/digest.h>
62 #include <openssl/err.h>
63 #include <openssl/mem.h>
64 #include <openssl/obj.h>
65 #include <openssl/stack.h>
66 #include <openssl/x509.h>
67 #include <openssl/x509v3.h>
68 
69 #include "../internal.h"
70 #include "../x509v3/internal.h"
71 #include "internal.h"
72 
73 
74 int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b)
75 {
76  int i;
77  X509_CINF *ai, *bi;
78 
79  ai = a->cert_info;
80  bi = b->cert_info;
81  i = ASN1_INTEGER_cmp(ai->serialNumber, bi->serialNumber);
82  if (i)
83  return (i);
84  return (X509_NAME_cmp(ai->issuer, bi->issuer));
85 }
86 
87 int X509_issuer_name_cmp(const X509 *a, const X509 *b)
88 {
89  return (X509_NAME_cmp(a->cert_info->issuer, b->cert_info->issuer));
90 }
91 
92 int X509_subject_name_cmp(const X509 *a, const X509 *b)
93 {
94  return (X509_NAME_cmp(a->cert_info->subject, b->cert_info->subject));
95 }
96 
97 int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b)
98 {
99  return (X509_NAME_cmp(a->crl->issuer, b->crl->issuer));
100 }
101 
102 int X509_CRL_match(const X509_CRL *a, const X509_CRL *b)
103 {
104  return OPENSSL_memcmp(a->sha1_hash, b->sha1_hash, 20);
105 }
106 
108 {
109  return (a->cert_info->issuer);
110 }
111 
112 unsigned long X509_issuer_name_hash(X509 *x)
113 {
114  return (X509_NAME_hash(x->cert_info->issuer));
115 }
116 
118 {
119  return (X509_NAME_hash_old(x->cert_info->issuer));
120 }
121 
123 {
124  return (a->cert_info->subject);
125 }
126 
128 {
129  return (a->cert_info->serialNumber);
130 }
131 
133 {
134  return x509->cert_info->serialNumber;
135 }
136 
138 {
139  return (X509_NAME_hash(x->cert_info->subject));
140 }
141 
143 {
144  return (X509_NAME_hash_old(x->cert_info->subject));
145 }
146 
147 /*
148  * Compare two certificates: they must be identical for this to work. NB:
149  * Although "cmp" operations are generally prototyped to take "const"
150  * arguments (eg. for use in STACKs), the way X509 handling is - these
151  * operations may involve ensuring the hashes are up-to-date and ensuring
152  * certain cert information is cached. So this is the point where the
153  * "depth-first" constification tree has to halt with an evil cast.
154  */
155 int X509_cmp(const X509 *a, const X509 *b)
156 {
157  /* Fill in the |sha1_hash| fields.
158  *
159  * TODO(davidben): This may fail, in which case the the hash will be all
160  * zeros. This produces a consistent comparison (failures are sticky), but
161  * not a good one. OpenSSL now returns -2, but this is not a consistent
162  * comparison and may cause misbehaving sorts by transitivity. For now, we
163  * retain the old OpenSSL behavior, which was to ignore the error. See
164  * https://crbug.com/boringssl/355. */
167 
168  int rv = OPENSSL_memcmp(a->sha1_hash, b->sha1_hash, SHA_DIGEST_LENGTH);
169  if (rv)
170  return rv;
171  /* Check for match against stored encoding too */
172  if (!a->cert_info->enc.modified && !b->cert_info->enc.modified) {
173  rv = (int)(a->cert_info->enc.len - b->cert_info->enc.len);
174  if (rv)
175  return rv;
176  return OPENSSL_memcmp(a->cert_info->enc.enc, b->cert_info->enc.enc,
177  a->cert_info->enc.len);
178  }
179  return rv;
180 }
181 
182 int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
183 {
184  int ret;
185 
186  /* Ensure canonical encoding is present and up to date */
187 
188  if (!a->canon_enc || a->modified) {
189  ret = i2d_X509_NAME((X509_NAME *)a, NULL);
190  if (ret < 0)
191  return -2;
192  }
193 
194  if (!b->canon_enc || b->modified) {
195  ret = i2d_X509_NAME((X509_NAME *)b, NULL);
196  if (ret < 0)
197  return -2;
198  }
199 
200  ret = a->canon_enclen - b->canon_enclen;
201 
202  if (ret)
203  return ret;
204 
205  return OPENSSL_memcmp(a->canon_enc, b->canon_enc, a->canon_enclen);
206 
207 }
208 
209 unsigned long X509_NAME_hash(X509_NAME *x)
210 {
211  unsigned long ret = 0;
212  unsigned char md[SHA_DIGEST_LENGTH];
213 
214  /* Make sure X509_NAME structure contains valid cached encoding */
215  i2d_X509_NAME(x, NULL);
216  if (!EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, EVP_sha1(),
217  NULL))
218  return 0;
219 
220  ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
221  ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
222  ) & 0xffffffffL;
223  return (ret);
224 }
225 
226 /*
227  * I now DER encode the name and hash it. Since I cache the DER encoding,
228  * this is reasonably efficient.
229  */
230 
232 {
233  EVP_MD_CTX md_ctx;
234  unsigned long ret = 0;
235  unsigned char md[16];
236 
237  /* Make sure X509_NAME structure contains valid cached encoding */
238  i2d_X509_NAME(x, NULL);
239  EVP_MD_CTX_init(&md_ctx);
240  /* EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); */
241  if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL)
242  && EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length)
243  && EVP_DigestFinal_ex(&md_ctx, md, NULL))
244  ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |
245  ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)
246  ) & 0xffffffffL;
247  EVP_MD_CTX_cleanup(&md_ctx);
248 
249  return (ret);
250 }
251 
252 /* Search a stack of X509 for a match */
254  ASN1_INTEGER *serial)
255 {
256  size_t i;
257  X509_CINF cinf;
258  X509 x, *x509 = NULL;
259 
260  if (!sk)
261  return NULL;
262 
263  x.cert_info = &cinf;
264  cinf.serialNumber = serial;
265  cinf.issuer = name;
266 
267  for (i = 0; i < sk_X509_num(sk); i++) {
268  x509 = sk_X509_value(sk, i);
269  if (X509_issuer_and_serial_cmp(x509, &x) == 0)
270  return (x509);
271  }
272  return (NULL);
273 }
274 
276 {
277  X509 *x509;
278  size_t i;
279 
280  for (i = 0; i < sk_X509_num(sk); i++) {
281  x509 = sk_X509_value(sk, i);
282  if (X509_NAME_cmp(X509_get_subject_name(x509), name) == 0)
283  return (x509);
284  }
285  return (NULL);
286 }
287 
289 {
290  if ((x == NULL) || (x->cert_info == NULL))
291  return (NULL);
292  return (X509_PUBKEY_get(x->cert_info->key));
293 }
294 
296 {
297  if (!x)
298  return NULL;
299  return x->cert_info->key->public_key;
300 }
301 
303 {
304  EVP_PKEY *xk;
305  int ret;
306 
307  xk = X509_get_pubkey(x);
308 
309  if (xk)
310  ret = EVP_PKEY_cmp(xk, k);
311  else
312  ret = -2;
313 
314  switch (ret) {
315  case 1:
316  break;
317  case 0:
319  break;
320  case -1:
322  break;
323  case -2:
325  }
326  if (xk)
327  EVP_PKEY_free(xk);
328  if (ret > 0)
329  return 1;
330  return 0;
331 }
332 
333 /*
334  * Check a suite B algorithm is permitted: pass in a public key and the NID
335  * of its signature (or 0 if no signature). The pflags is a pointer to a
336  * flags field which must contain the suite B verification flags.
337  */
338 
339 static int check_suite_b(EVP_PKEY *pkey, int sign_nid, unsigned long *pflags)
340 {
341  const EC_GROUP *grp = NULL;
342  int curve_nid;
343  if (pkey && pkey->type == EVP_PKEY_EC)
344  grp = EC_KEY_get0_group(pkey->pkey.ec);
345  if (!grp)
347  curve_nid = EC_GROUP_get_curve_name(grp);
348  /* Check curve is consistent with LOS */
349  if (curve_nid == NID_secp384r1) { /* P-384 */
350  /*
351  * Check signature algorithm is consistent with curve.
352  */
353  if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA384)
355  if (!(*pflags & X509_V_FLAG_SUITEB_192_LOS))
357  /* If we encounter P-384 we cannot use P-256 later */
359  } else if (curve_nid == NID_X9_62_prime256v1) { /* P-256 */
360  if (sign_nid != -1 && sign_nid != NID_ecdsa_with_SHA256)
362  if (!(*pflags & X509_V_FLAG_SUITEB_128_LOS_ONLY))
364  } else
366 
367  return X509_V_OK;
368 }
369 
370 int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain,
371  unsigned long flags)
372 {
373  int rv, sign_nid;
374  size_t i;
375  EVP_PKEY *pk = NULL;
376  unsigned long tflags;
378  return X509_V_OK;
379  tflags = flags;
380  /* If no EE certificate passed in must be first in chain */
381  if (x == NULL) {
382  x = sk_X509_value(chain, 0);
383  i = 1;
384  } else
385  i = 0;
386 
389  /* Correct error depth */
390  i = 0;
391  goto end;
392  }
393 
394  pk = X509_get_pubkey(x);
395  /* Check EE key only */
396  rv = check_suite_b(pk, -1, &tflags);
397  if (rv != X509_V_OK) {
398  /* Correct error depth */
399  i = 0;
400  goto end;
401  }
402  for (; i < sk_X509_num(chain); i++) {
403  sign_nid = X509_get_signature_nid(x);
404  x = sk_X509_value(chain, i);
407  goto end;
408  }
409  EVP_PKEY_free(pk);
410  pk = X509_get_pubkey(x);
411  rv = check_suite_b(pk, sign_nid, &tflags);
412  if (rv != X509_V_OK)
413  goto end;
414  }
415 
416  /* Final check: root CA signature */
417  rv = check_suite_b(pk, X509_get_signature_nid(x), &tflags);
418  end:
419  if (pk)
420  EVP_PKEY_free(pk);
421  if (rv != X509_V_OK) {
422  /* Invalid signature or LOS errors are for previous cert */
425  i--;
426  /*
427  * If we have LOS error and flags changed then we are signing P-384
428  * with P-256. Use more meaninggul error.
429  */
430  if (rv == X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED && flags != tflags)
432  if (perror_depth)
433  *perror_depth = i;
434  }
435  return rv;
436 }
437 
438 int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags)
439 {
440  int sign_nid;
442  return X509_V_OK;
443  sign_nid = OBJ_obj2nid(crl->crl->sig_alg->algorithm);
444  return check_suite_b(pk, sign_nid, &flags);
445 }
446 
447 /*
448  * Not strictly speaking an "up_ref" as a STACK doesn't have a reference
449  * count but it has the same effect by duping the STACK and upping the ref of
450  * each X509 structure.
451  */
453 {
454  STACK_OF(X509) *ret;
455  size_t i;
456  ret = sk_X509_dup(chain);
457  for (i = 0; i < sk_X509_num(ret); i++) {
459  }
460  return ret;
461 }
EVP_PKEY_EC
#define EVP_PKEY_EC
Definition: evp.h:178
OPENSSL_memcmp
static int OPENSSL_memcmp(const void *s1, const void *s2, size_t n)
Definition: third_party/boringssl-with-bazel/src/crypto/internal.h:811
X509_subject_name_hash_old
unsigned long X509_subject_name_hash_old(X509 *x)
Definition: x509_cmp.c:142
x509_st::cert_info
X509_CINF * cert_info
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:140
X509_get_issuer_name
X509_NAME * X509_get_issuer_name(const X509 *a)
Definition: x509_cmp.c:107
NID_X9_62_prime256v1
#define NID_X9_62_prime256v1
Definition: nid.h:1914
X509_V_FLAG_SUITEB_192_LOS
#define X509_V_FLAG_SUITEB_192_LOS
Definition: x509.h:2037
evp_pkey_st::ec
EC_KEY * ec
Definition: evp.h:1058
X509_get0_pubkey_bitstr
ASN1_BIT_STRING * X509_get0_pubkey_bitstr(const X509 *x)
Definition: x509_cmp.c:295
X509_V_ERR_SUITE_B_INVALID_CURVE
#define X509_V_ERR_SUITE_B_INVALID_CURVE
Definition: x509.h:1983
X509_algor_st::algorithm
ASN1_OBJECT * algorithm
Definition: x509.h:114
absl::base_internal
Definition: abseil-cpp/absl/base/call_once.h:48
OPENSSL_PUT_ERROR
#define OPENSSL_PUT_ERROR(library, reason)
Definition: err.h:423
internal.h
X509_get_pubkey
EVP_PKEY * X509_get_pubkey(X509 *x)
Definition: x509_cmp.c:288
string.h
sk_X509_num
#define sk_X509_num
Definition: boringssl_prefix_symbols.h:587
X509_V_ERR_SUITE_B_INVALID_VERSION
#define X509_V_ERR_SUITE_B_INVALID_VERSION
Definition: x509.h:1981
X509_get_serialNumber
ASN1_INTEGER * X509_get_serialNumber(X509 *a)
Definition: x509_cmp.c:127
x509v3.h
X509_CRL_INFO::sig_alg
X509_ALGOR * sig_alg
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:184
EVP_DigestUpdate
#define EVP_DigestUpdate
Definition: boringssl_prefix_symbols.h:1516
X509_V_ERR_SUITE_B_INVALID_ALGORITHM
#define X509_V_ERR_SUITE_B_INVALID_ALGORITHM
Definition: x509.h:1982
setup.name
name
Definition: setup.py:542
a
int a
Definition: abseil-cpp/absl/container/internal/hash_policy_traits_test.cc:88
EVP_DigestInit_ex
#define EVP_DigestInit_ex
Definition: boringssl_prefix_symbols.h:1511
X509_V_OK
#define X509_V_OK
Definition: x509.h:1918
X509_chain_up_ref
#define X509_chain_up_ref
Definition: boringssl_prefix_symbols.h:2612
EC_KEY_get0_group
#define EC_KEY_get0_group
Definition: boringssl_prefix_symbols.h:1344
setup.k
k
Definition: third_party/bloaty/third_party/capstone/bindings/python/setup.py:42
X509_PUBKEY_get
#define X509_PUBKEY_get
Definition: boringssl_prefix_symbols.h:2408
X509_issuer_name_hash
unsigned long X509_issuer_name_hash(X509 *x)
Definition: x509_cmp.c:112
X509_R_KEY_TYPE_MISMATCH
#define X509_R_KEY_TYPE_MISMATCH
Definition: x509.h:2392
env_md_ctx_st
Definition: digest.h:306
NID_ecdsa_with_SHA384
#define NID_ecdsa_with_SHA384
Definition: nid.h:3505
X509_NAME_hash_old
unsigned long X509_NAME_hash_old(X509_NAME *x)
Definition: x509_cmp.c:231
X509_get_subject_name
X509_NAME * X509_get_subject_name(const X509 *a)
Definition: x509_cmp.c:122
NID_ecdsa_with_SHA256
#define NID_ecdsa_with_SHA256
Definition: nid.h:3501
check_suite_b
static int check_suite_b(EVP_PKEY *pkey, int sign_nid, unsigned long *pflags)
Definition: x509_cmp.c:339
X509_CINF::serialNumber
ASN1_INTEGER * serialNumber
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:125
OBJ_obj2nid
#define OBJ_obj2nid
Definition: boringssl_prefix_symbols.h:1857
evp_pkey_st
Definition: evp.h:1046
xds_interop_client.int
int
Definition: xds_interop_client.py:113
end
char * end
Definition: abseil-cpp/absl/strings/internal/str_format/float_conversion.cc:1008
x509v3_cache_extensions
#define x509v3_cache_extensions
Definition: boringssl_prefix_symbols.h:3459
X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED
#define X509_V_ERR_SUITE_B_LOS_NOT_ALLOWED
Definition: x509.h:1985
X509_find_by_subject
X509 * X509_find_by_subject(STACK_OF(X509) *sk, X509_NAME *name)
Definition: x509_cmp.c:275
EC_GROUP_get_curve_name
#define EC_GROUP_get_curve_name
Definition: boringssl_prefix_symbols.h:1327
EVP_PKEY_free
#define EVP_PKEY_free
Definition: boringssl_prefix_symbols.h:1625
X509_crl_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:195
err.h
X509_up_ref
OPENSSL_EXPORT int X509_up_ref(X509 *x509)
EVP_MD_CTX_init
#define EVP_MD_CTX_init
Definition: boringssl_prefix_symbols.h:1567
x
int x
Definition: bloaty/third_party/googletest/googlemock/test/gmock-matchers_test.cc:3610
X509_find_by_issuer_and_serial
X509 * X509_find_by_issuer_and_serial(STACK_OF(X509) *sk, X509_NAME *name, ASN1_INTEGER *serial)
Definition: x509_cmp.c:253
X509_CRL_check_suiteb
int X509_CRL_check_suiteb(X509_CRL *crl, EVP_PKEY *pk, unsigned long flags)
Definition: x509_cmp.c:438
EVP_PKEY_cmp
#define EVP_PKEY_cmp
Definition: boringssl_prefix_symbols.h:1615
b
uint64_t b
Definition: abseil-cpp/absl/container/internal/layout_test.cc:53
X509_get_signature_nid
OPENSSL_EXPORT int X509_get_signature_nid(const X509 *x509)
i2d_X509_NAME
#define i2d_X509_NAME
Definition: boringssl_prefix_symbols.h:3288
evp_pkey_st::type
int type
Definition: evp.h:1051
X509_subject_name_cmp
int X509_subject_name_cmp(const X509 *a, const X509 *b)
Definition: x509_cmp.c:92
X509_get0_serialNumber
const ASN1_INTEGER * X509_get0_serialNumber(const X509 *x509)
Definition: x509_cmp.c:132
X509_CINF
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:123
X509_chain_check_suiteb
int X509_chain_check_suiteb(int *perror_depth, X509 *x, STACK_OF(X509) *chain, unsigned long flags)
Definition: x509_cmp.c:370
X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256
#define X509_V_ERR_SUITE_B_CANNOT_SIGN_P_384_WITH_P_256
Definition: x509.h:1986
evp_pkey_st::pkey
union evp_pkey_st::@364 pkey
benchmark.md
md
Definition: benchmark.py:86
X509_V_FLAG_SUITEB_128_LOS
#define X509_V_FLAG_SUITEB_128_LOS
Definition: x509.h:2039
digest.h
EVP_Digest
#define EVP_Digest
Definition: boringssl_prefix_symbols.h:1506
EVP_DigestFinal_ex
#define EVP_DigestFinal_ex
Definition: boringssl_prefix_symbols.h:1509
x509_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:139
X509_issuer_name_hash_old
unsigned long X509_issuer_name_hash_old(X509 *x)
Definition: x509_cmp.c:117
absl::flags_internal
Definition: abseil-cpp/absl/flags/commandlineflag.h:40
STACK_OF
STACK_OF(X509)
Definition: x509_cmp.c:452
X509_NAME_hash
unsigned long X509_NAME_hash(X509_NAME *x)
Definition: x509_cmp.c:209
ret
UniquePtr< SSL_SESSION > ret
Definition: ssl_x509.cc:1029
ec_group_st
Definition: third_party/boringssl-with-bazel/src/crypto/fipsmodule/ec/internal.h:573
sk_X509_value
#define sk_X509_value
Definition: boringssl_prefix_symbols.h:590
L
lua_State * L
Definition: upb/upb/bindings/lua/main.c:35
X509_get_version
#define X509_get_version
Definition: boringssl_prefix_symbols.h:2673
X509_CRL_match
int X509_CRL_match(const X509_CRL *a, const X509_CRL *b)
Definition: x509_cmp.c:102
EVP_sha1
const OPENSSL_EXPORT EVP_MD * EVP_sha1(void)
SHA_DIGEST_LENGTH
#define SHA_DIGEST_LENGTH
Definition: sha.h:74
obj.h
flags
uint32_t flags
Definition: retry_filter.cc:632
mem.h
X509_cmp
int X509_cmp(const X509 *a, const X509 *b)
Definition: x509_cmp.c:155
X509_CRL_cmp
int X509_CRL_cmp(const X509_CRL *a, const X509_CRL *b)
Definition: x509_cmp.c:97
EVP_md5
const OPENSSL_EXPORT EVP_MD * EVP_md5(void)
NID_secp384r1
#define NID_secp384r1
Definition: nid.h:3168
X509_issuer_and_serial_cmp
int X509_issuer_and_serial_cmp(const X509 *a, const X509 *b)
Definition: x509_cmp.c:74
X509_R_KEY_VALUES_MISMATCH
#define X509_R_KEY_VALUES_MISMATCH
Definition: x509.h:2393
X509_VERSION_3
#define X509_VERSION_3
Definition: x509.h:323
ASN1_INTEGER_cmp
#define ASN1_INTEGER_cmp
Definition: boringssl_prefix_symbols.h:642
EVP_MD_CTX_cleanup
#define EVP_MD_CTX_cleanup
Definition: boringssl_prefix_symbols.h:1561
X509_subject_name_hash
unsigned long X509_subject_name_hash(X509 *x)
Definition: x509_cmp.c:137
X509_issuer_name_cmp
int X509_issuer_name_cmp(const X509 *a, const X509 *b)
Definition: x509_cmp.c:87
X509_R_UNKNOWN_KEY_TYPE
#define X509_R_UNKNOWN_KEY_TYPE
Definition: x509.h:2405
X509_check_private_key
int X509_check_private_key(X509 *x, const EVP_PKEY *k)
Definition: x509_cmp.c:302
X509_name_st
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:95
X509_CINF::issuer
X509_NAME * issuer
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:127
X509_crl_st::crl
X509_CRL_INFO * crl
Definition: third_party/boringssl-with-bazel/src/crypto/x509/internal.h:197
asn1_string_st
Definition: asn1.h:543
i
uint64_t i
Definition: abseil-cpp/absl/container/btree_benchmark.cc:230
asn1.h
X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM
#define X509_V_ERR_SUITE_B_INVALID_SIGNATURE_ALGORITHM
Definition: x509.h:1984
X509_NAME_cmp
int X509_NAME_cmp(const X509_NAME *a, const X509_NAME *b)
Definition: x509_cmp.c:182
X509_V_FLAG_SUITEB_128_LOS_ONLY
#define X509_V_FLAG_SUITEB_128_LOS_ONLY
Definition: x509.h:2035
stack.h
x509.h
google::protobuf.internal.decoder.long
long
Definition: bloaty/third_party/protobuf/python/google/protobuf/internal/decoder.py:89


grpc
Author(s):
autogenerated on Fri May 16 2025 03:00:55