1e1051a39Sopenharmony_ci/*
2e1051a39Sopenharmony_ci * Copyright 1995-2022 The OpenSSL Project Authors. All Rights Reserved.
3e1051a39Sopenharmony_ci *
4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License").  You may not use
5e1051a39Sopenharmony_ci * this file except in compliance with the License.  You can obtain a copy
6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at
7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html
8e1051a39Sopenharmony_ci */
9e1051a39Sopenharmony_ci
10e1051a39Sopenharmony_ci#include <stdio.h>
11e1051a39Sopenharmony_ci#include "internal/cryptlib.h"
12e1051a39Sopenharmony_ci#include <openssl/crypto.h>
13e1051a39Sopenharmony_ci#include <openssl/x509.h>
14e1051a39Sopenharmony_ci
15e1051a39Sopenharmony_ciint X509_STORE_set_default_paths_ex(X509_STORE *ctx, OSSL_LIB_CTX *libctx,
16e1051a39Sopenharmony_ci                                    const char *propq)
17e1051a39Sopenharmony_ci{
18e1051a39Sopenharmony_ci    X509_LOOKUP *lookup;
19e1051a39Sopenharmony_ci
20e1051a39Sopenharmony_ci    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file());
21e1051a39Sopenharmony_ci    if (lookup == NULL)
22e1051a39Sopenharmony_ci        return 0;
23e1051a39Sopenharmony_ci    X509_LOOKUP_load_file_ex(lookup, NULL, X509_FILETYPE_DEFAULT, libctx, propq);
24e1051a39Sopenharmony_ci
25e1051a39Sopenharmony_ci    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir());
26e1051a39Sopenharmony_ci    if (lookup == NULL)
27e1051a39Sopenharmony_ci        return 0;
28e1051a39Sopenharmony_ci    X509_LOOKUP_add_dir(lookup, NULL, X509_FILETYPE_DEFAULT);
29e1051a39Sopenharmony_ci
30e1051a39Sopenharmony_ci    lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_store());
31e1051a39Sopenharmony_ci    if (lookup == NULL)
32e1051a39Sopenharmony_ci        return 0;
33e1051a39Sopenharmony_ci    X509_LOOKUP_add_store_ex(lookup, NULL, libctx, propq);
34e1051a39Sopenharmony_ci
35e1051a39Sopenharmony_ci    /* clear any errors */
36e1051a39Sopenharmony_ci    ERR_clear_error();
37e1051a39Sopenharmony_ci
38e1051a39Sopenharmony_ci    return 1;
39e1051a39Sopenharmony_ci}
40e1051a39Sopenharmony_ciint X509_STORE_set_default_paths(X509_STORE *ctx)
41e1051a39Sopenharmony_ci{
42e1051a39Sopenharmony_ci    return X509_STORE_set_default_paths_ex(ctx, NULL, NULL);
43e1051a39Sopenharmony_ci}
44e1051a39Sopenharmony_ci
45e1051a39Sopenharmony_ciint X509_STORE_load_file_ex(X509_STORE *ctx, const char *file,
46e1051a39Sopenharmony_ci                            OSSL_LIB_CTX *libctx, const char *propq)
47e1051a39Sopenharmony_ci{
48e1051a39Sopenharmony_ci    X509_LOOKUP *lookup;
49e1051a39Sopenharmony_ci
50e1051a39Sopenharmony_ci    if (file == NULL
51e1051a39Sopenharmony_ci        || (lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_file())) == NULL
52e1051a39Sopenharmony_ci        || X509_LOOKUP_load_file_ex(lookup, file, X509_FILETYPE_PEM, libctx,
53e1051a39Sopenharmony_ci                                    propq) <= 0)
54e1051a39Sopenharmony_ci        return 0;
55e1051a39Sopenharmony_ci
56e1051a39Sopenharmony_ci    return 1;
57e1051a39Sopenharmony_ci}
58e1051a39Sopenharmony_ci
59e1051a39Sopenharmony_ciint X509_STORE_load_file(X509_STORE *ctx, const char *file)
60e1051a39Sopenharmony_ci{
61e1051a39Sopenharmony_ci    return X509_STORE_load_file_ex(ctx, file, NULL, NULL);
62e1051a39Sopenharmony_ci}
63e1051a39Sopenharmony_ci
64e1051a39Sopenharmony_ciint X509_STORE_load_path(X509_STORE *ctx, const char *path)
65e1051a39Sopenharmony_ci{
66e1051a39Sopenharmony_ci    X509_LOOKUP *lookup;
67e1051a39Sopenharmony_ci
68e1051a39Sopenharmony_ci    if (path == NULL
69e1051a39Sopenharmony_ci        || (lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_hash_dir())) == NULL
70e1051a39Sopenharmony_ci        || X509_LOOKUP_add_dir(lookup, path, X509_FILETYPE_PEM) <= 0)
71e1051a39Sopenharmony_ci        return 0;
72e1051a39Sopenharmony_ci
73e1051a39Sopenharmony_ci    return 1;
74e1051a39Sopenharmony_ci}
75e1051a39Sopenharmony_ci
76e1051a39Sopenharmony_ciint X509_STORE_load_store_ex(X509_STORE *ctx, const char *uri,
77e1051a39Sopenharmony_ci                             OSSL_LIB_CTX *libctx, const char *propq)
78e1051a39Sopenharmony_ci{
79e1051a39Sopenharmony_ci    X509_LOOKUP *lookup;
80e1051a39Sopenharmony_ci
81e1051a39Sopenharmony_ci    if (uri == NULL
82e1051a39Sopenharmony_ci        || (lookup = X509_STORE_add_lookup(ctx, X509_LOOKUP_store())) == NULL
83e1051a39Sopenharmony_ci        || X509_LOOKUP_add_store_ex(lookup, uri, libctx, propq) == 0)
84e1051a39Sopenharmony_ci        return 0;
85e1051a39Sopenharmony_ci
86e1051a39Sopenharmony_ci    return 1;
87e1051a39Sopenharmony_ci}
88e1051a39Sopenharmony_ci
89e1051a39Sopenharmony_ciint X509_STORE_load_store(X509_STORE *ctx, const char *uri)
90e1051a39Sopenharmony_ci{
91e1051a39Sopenharmony_ci    return X509_STORE_load_store_ex(ctx, uri, NULL, NULL);
92e1051a39Sopenharmony_ci}
93e1051a39Sopenharmony_ci
94e1051a39Sopenharmony_ciint X509_STORE_load_locations_ex(X509_STORE *ctx, const char *file,
95e1051a39Sopenharmony_ci                                 const char *path, OSSL_LIB_CTX *libctx,
96e1051a39Sopenharmony_ci                                 const char *propq)
97e1051a39Sopenharmony_ci{
98e1051a39Sopenharmony_ci    if (file == NULL && path == NULL)
99e1051a39Sopenharmony_ci        return 0;
100e1051a39Sopenharmony_ci    if (file != NULL && !X509_STORE_load_file_ex(ctx, file, libctx, propq))
101e1051a39Sopenharmony_ci        return 0;
102e1051a39Sopenharmony_ci    if (path != NULL && !X509_STORE_load_path(ctx, path))
103e1051a39Sopenharmony_ci        return 0;
104e1051a39Sopenharmony_ci    return 1;
105e1051a39Sopenharmony_ci}
106e1051a39Sopenharmony_ci
107e1051a39Sopenharmony_ciint X509_STORE_load_locations(X509_STORE *ctx, const char *file,
108e1051a39Sopenharmony_ci                              const char *path)
109e1051a39Sopenharmony_ci{
110e1051a39Sopenharmony_ci    return X509_STORE_load_locations_ex(ctx, file, path, NULL, NULL);
111e1051a39Sopenharmony_ci}
112