You've already forked linux-packaging-mono
Imported Upstream version 4.8.0.309
Former-commit-id: 5f9c6ae75f295e057a7d2971f3a6df4656fa8850
This commit is contained in:
parent
ee1447783b
commit
94b2861243
81
external/boringssl/crypto/x509/CMakeLists.txt
vendored
Normal file
81
external/boringssl/crypto/x509/CMakeLists.txt
vendored
Normal file
@@ -0,0 +1,81 @@
|
||||
include_directories(../../include)
|
||||
|
||||
add_library(
|
||||
x509
|
||||
|
||||
OBJECT
|
||||
|
||||
a_digest.c
|
||||
a_sign.c
|
||||
a_strex.c
|
||||
a_verify.c
|
||||
algorithm.c
|
||||
asn1_gen.c
|
||||
by_dir.c
|
||||
by_file.c
|
||||
i2d_pr.c
|
||||
pkcs7.c
|
||||
rsa_pss.c
|
||||
t_crl.c
|
||||
t_req.c
|
||||
t_x509.c
|
||||
t_x509a.c
|
||||
x509.c
|
||||
x509_att.c
|
||||
x509_cmp.c
|
||||
x509_d2.c
|
||||
x509_def.c
|
||||
x509_ext.c
|
||||
x509_lu.c
|
||||
x509_obj.c
|
||||
x509_r2x.c
|
||||
x509_req.c
|
||||
x509_set.c
|
||||
x509_trs.c
|
||||
x509_txt.c
|
||||
x509_v3.c
|
||||
x509_vfy.c
|
||||
x509_vpm.c
|
||||
x509cset.c
|
||||
x509name.c
|
||||
x509rset.c
|
||||
x509spki.c
|
||||
x509type.c
|
||||
x_algor.c
|
||||
x_all.c
|
||||
x_attrib.c
|
||||
x_crl.c
|
||||
x_exten.c
|
||||
x_info.c
|
||||
x_name.c
|
||||
x_pkey.c
|
||||
x_pubkey.c
|
||||
x_req.c
|
||||
x_sig.c
|
||||
x_spki.c
|
||||
x_val.c
|
||||
x_x509.c
|
||||
x_x509a.c
|
||||
)
|
||||
|
||||
if(ENABLE_TESTS)
|
||||
add_executable(
|
||||
pkcs7_test
|
||||
|
||||
pkcs7_test.c
|
||||
|
||||
$<TARGET_OBJECTS:test_support>
|
||||
)
|
||||
|
||||
add_executable(
|
||||
x509_test
|
||||
|
||||
x509_test.cc
|
||||
|
||||
$<TARGET_OBJECTS:test_support>
|
||||
)
|
||||
|
||||
target_link_libraries(pkcs7_test crypto)
|
||||
target_link_libraries(x509_test crypto)
|
||||
add_dependencies(all_tests pkcs7_test x509_test)
|
||||
endif()
|
96
external/boringssl/crypto/x509/a_digest.c
vendored
Normal file
96
external/boringssl/crypto/x509/a_digest.c
vendored
Normal file
@@ -0,0 +1,96 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/digest.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/mem.h>
|
||||
|
||||
int ASN1_digest(i2d_of_void *i2d, const EVP_MD *type, char *data,
|
||||
unsigned char *md, unsigned int *len)
|
||||
{
|
||||
int i, ret;
|
||||
unsigned char *str, *p;
|
||||
|
||||
i = i2d(data, NULL);
|
||||
if ((str = (unsigned char *)OPENSSL_malloc(i)) == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
|
||||
return (0);
|
||||
}
|
||||
p = str;
|
||||
i2d(data, &p);
|
||||
|
||||
ret = EVP_Digest(str, i, md, len, type, NULL);
|
||||
OPENSSL_free(str);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int ASN1_item_digest(const ASN1_ITEM *it, const EVP_MD *type, void *asn,
|
||||
unsigned char *md, unsigned int *len)
|
||||
{
|
||||
int i, ret;
|
||||
unsigned char *str = NULL;
|
||||
|
||||
i = ASN1_item_i2d(asn, &str, it);
|
||||
if (!str)
|
||||
return (0);
|
||||
|
||||
ret = EVP_Digest(str, i, md, len, type, NULL);
|
||||
OPENSSL_free(str);
|
||||
return ret;
|
||||
}
|
135
external/boringssl/crypto/x509/a_sign.c
vendored
Normal file
135
external/boringssl/crypto/x509/a_sign.c
vendored
Normal file
@@ -0,0 +1,135 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/digest.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/obj.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
int ASN1_item_sign(const ASN1_ITEM *it, X509_ALGOR *algor1,
|
||||
X509_ALGOR *algor2, ASN1_BIT_STRING *signature, void *asn,
|
||||
EVP_PKEY *pkey, const EVP_MD *type)
|
||||
{
|
||||
EVP_MD_CTX ctx;
|
||||
EVP_MD_CTX_init(&ctx);
|
||||
if (!EVP_DigestSignInit(&ctx, NULL, type, NULL, pkey)) {
|
||||
EVP_MD_CTX_cleanup(&ctx);
|
||||
return 0;
|
||||
}
|
||||
return ASN1_item_sign_ctx(it, algor1, algor2, signature, asn, &ctx);
|
||||
}
|
||||
|
||||
int ASN1_item_sign_ctx(const ASN1_ITEM *it,
|
||||
X509_ALGOR *algor1, X509_ALGOR *algor2,
|
||||
ASN1_BIT_STRING *signature, void *asn, EVP_MD_CTX *ctx)
|
||||
{
|
||||
EVP_PKEY *pkey;
|
||||
unsigned char *buf_in = NULL, *buf_out = NULL;
|
||||
size_t inl = 0, outl = 0, outll = 0;
|
||||
|
||||
pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
|
||||
|
||||
/* Write out the requested copies of the AlgorithmIdentifier. */
|
||||
if (algor1 && !x509_digest_sign_algorithm(ctx, algor1)) {
|
||||
goto err;
|
||||
}
|
||||
if (algor2 && !x509_digest_sign_algorithm(ctx, algor2)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
inl = ASN1_item_i2d(asn, &buf_in, it);
|
||||
outll = outl = EVP_PKEY_size(pkey);
|
||||
buf_out = OPENSSL_malloc((unsigned int)outl);
|
||||
if ((buf_in == NULL) || (buf_out == NULL)) {
|
||||
outl = 0;
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EVP_DigestSignUpdate(ctx, buf_in, inl)
|
||||
|| !EVP_DigestSignFinal(ctx, buf_out, &outl)) {
|
||||
outl = 0;
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
if (signature->data != NULL)
|
||||
OPENSSL_free(signature->data);
|
||||
signature->data = buf_out;
|
||||
buf_out = NULL;
|
||||
signature->length = outl;
|
||||
/*
|
||||
* In the interests of compatibility, I'll make sure that the bit string
|
||||
* has a 'not-used bits' value of 0
|
||||
*/
|
||||
signature->flags &= ~(ASN1_STRING_FLAG_BITS_LEFT | 0x07);
|
||||
signature->flags |= ASN1_STRING_FLAG_BITS_LEFT;
|
||||
err:
|
||||
EVP_MD_CTX_cleanup(ctx);
|
||||
if (buf_in != NULL) {
|
||||
OPENSSL_cleanse((char *)buf_in, (unsigned int)inl);
|
||||
OPENSSL_free(buf_in);
|
||||
}
|
||||
if (buf_out != NULL) {
|
||||
OPENSSL_cleanse((char *)buf_out, outll);
|
||||
OPENSSL_free(buf_out);
|
||||
}
|
||||
return (outl);
|
||||
}
|
633
external/boringssl/crypto/x509/a_strex.c
vendored
Normal file
633
external/boringssl/crypto/x509/a_strex.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
127
external/boringssl/crypto/x509/a_verify.c
vendored
Normal file
127
external/boringssl/crypto/x509/a_verify.c
vendored
Normal file
@@ -0,0 +1,127 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include <stdio.h>
|
||||
#include <time.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/buf.h>
|
||||
#include <openssl/digest.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/obj.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
int ASN1_item_verify(const ASN1_ITEM *it, X509_ALGOR *a,
|
||||
ASN1_BIT_STRING *signature, void *asn, EVP_PKEY *pkey)
|
||||
{
|
||||
EVP_MD_CTX ctx;
|
||||
uint8_t *buf_in = NULL;
|
||||
int ret = 0, inl;
|
||||
|
||||
if (!pkey) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_PASSED_NULL_PARAMETER);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (signature->type == V_ASN1_BIT_STRING && signature->flags & 0x7) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_BIT_STRING_BITS_LEFT);
|
||||
return 0;
|
||||
}
|
||||
|
||||
EVP_MD_CTX_init(&ctx);
|
||||
|
||||
if (!x509_digest_verify_init(&ctx, a, pkey)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
inl = ASN1_item_i2d(asn, &buf_in, it);
|
||||
|
||||
if (buf_in == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!EVP_DigestVerifyUpdate(&ctx, buf_in, inl)) {
|
||||
OPENSSL_cleanse(buf_in, (unsigned int)inl);
|
||||
OPENSSL_free(buf_in);
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
OPENSSL_cleanse(buf_in, (unsigned int)inl);
|
||||
OPENSSL_free(buf_in);
|
||||
|
||||
if (EVP_DigestVerifyFinal(&ctx, signature->data,
|
||||
(size_t)signature->length) <= 0) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_EVP_LIB);
|
||||
goto err;
|
||||
}
|
||||
/*
|
||||
* we don't need to zero the 'ctx' because we just checked public
|
||||
* information
|
||||
*/
|
||||
/* memset(&ctx,0,sizeof(ctx)); */
|
||||
ret = 1;
|
||||
err:
|
||||
EVP_MD_CTX_cleanup(&ctx);
|
||||
return ret;
|
||||
}
|
137
external/boringssl/crypto/x509/algorithm.c
vendored
Normal file
137
external/boringssl/crypto/x509/algorithm.c
vendored
Normal file
@@ -0,0 +1,137 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/digest.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/obj.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor) {
|
||||
const EVP_MD *digest = EVP_MD_CTX_md(ctx);
|
||||
EVP_PKEY *pkey = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
|
||||
if (digest == NULL || pkey == NULL) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_CONTEXT_NOT_INITIALISED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (EVP_PKEY_id(pkey) == EVP_PKEY_RSA) {
|
||||
int pad_mode;
|
||||
if (!EVP_PKEY_CTX_get_rsa_padding(ctx->pctx, &pad_mode)) {
|
||||
return 0;
|
||||
}
|
||||
/* RSA-PSS has special signature algorithm logic. */
|
||||
if (pad_mode == RSA_PKCS1_PSS_PADDING) {
|
||||
return x509_rsa_ctx_to_pss(ctx, algor);
|
||||
}
|
||||
}
|
||||
|
||||
/* Default behavior: look up the OID for the algorithm/hash pair and encode
|
||||
* that. */
|
||||
int sign_nid;
|
||||
if (!OBJ_find_sigid_by_algs(&sign_nid, EVP_MD_type(digest),
|
||||
EVP_PKEY_id(pkey))) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_DIGEST_AND_KEY_TYPE_NOT_SUPPORTED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* RSA signature algorithms include an explicit NULL parameter. Others omit
|
||||
* it. */
|
||||
int paramtype =
|
||||
(EVP_PKEY_id(pkey) == EVP_PKEY_RSA) ? V_ASN1_NULL : V_ASN1_UNDEF;
|
||||
X509_ALGOR_set0(algor, OBJ_nid2obj(sign_nid), paramtype, NULL);
|
||||
return 1;
|
||||
}
|
||||
|
||||
int x509_digest_verify_init(EVP_MD_CTX *ctx, X509_ALGOR *sigalg,
|
||||
EVP_PKEY *pkey) {
|
||||
/* Convert the signature OID into digest and public key OIDs. */
|
||||
int sigalg_nid = OBJ_obj2nid(sigalg->algorithm);
|
||||
int digest_nid, pkey_nid;
|
||||
if (!OBJ_find_sigid_algs(sigalg_nid, &digest_nid, &pkey_nid)) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Check the public key OID matches the public key type. */
|
||||
if (pkey_nid != EVP_PKEY_id(pkey)) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_WRONG_PUBLIC_KEY_TYPE);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* NID_undef signals that there are custom parameters to set. */
|
||||
if (digest_nid == NID_undef) {
|
||||
if (sigalg_nid != NID_rsassaPss) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_SIGNATURE_ALGORITHM);
|
||||
return 0;
|
||||
}
|
||||
return x509_rsa_pss_to_ctx(ctx, sigalg, pkey);
|
||||
}
|
||||
|
||||
/* Otherwise, initialize with the digest from the OID. */
|
||||
const EVP_MD *digest = EVP_get_digestbynid(digest_nid);
|
||||
if (digest == NULL) {
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNKNOWN_MESSAGE_DIGEST_ALGORITHM);
|
||||
return 0;
|
||||
}
|
||||
|
||||
return EVP_DigestVerifyInit(ctx, NULL, digest, NULL, pkey);
|
||||
}
|
818
external/boringssl/crypto/x509/asn1_gen.c
vendored
Normal file
818
external/boringssl/crypto/x509/asn1_gen.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
453
external/boringssl/crypto/x509/by_dir.c
vendored
Normal file
453
external/boringssl/crypto/x509/by_dir.c
vendored
Normal file
@@ -0,0 +1,453 @@
|
||||
/* crypto/x509/by_dir.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <string.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <openssl/buf.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/thread.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include "../internal.h"
|
||||
|
||||
typedef struct lookup_dir_hashes_st {
|
||||
unsigned long hash;
|
||||
int suffix;
|
||||
} BY_DIR_HASH;
|
||||
|
||||
typedef struct lookup_dir_entry_st {
|
||||
char *dir;
|
||||
int dir_type;
|
||||
STACK_OF(BY_DIR_HASH) *hashes;
|
||||
} BY_DIR_ENTRY;
|
||||
|
||||
typedef struct lookup_dir_st {
|
||||
BUF_MEM *buffer;
|
||||
STACK_OF(BY_DIR_ENTRY) *dirs;
|
||||
} BY_DIR;
|
||||
|
||||
DECLARE_STACK_OF(BY_DIR_HASH)
|
||||
DECLARE_STACK_OF(BY_DIR_ENTRY)
|
||||
|
||||
static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
|
||||
char **ret);
|
||||
static int new_dir(X509_LOOKUP *lu);
|
||||
static void free_dir(X509_LOOKUP *lu);
|
||||
static int add_cert_dir(BY_DIR *ctx, const char *dir, int type);
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret);
|
||||
static X509_LOOKUP_METHOD x509_dir_lookup = {
|
||||
"Load certs from files in a directory",
|
||||
new_dir, /* new */
|
||||
free_dir, /* free */
|
||||
NULL, /* init */
|
||||
NULL, /* shutdown */
|
||||
dir_ctrl, /* ctrl */
|
||||
get_cert_by_subject, /* get_by_subject */
|
||||
NULL, /* get_by_issuer_serial */
|
||||
NULL, /* get_by_fingerprint */
|
||||
NULL, /* get_by_alias */
|
||||
};
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_hash_dir(void)
|
||||
{
|
||||
return (&x509_dir_lookup);
|
||||
}
|
||||
|
||||
static int dir_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp, long argl,
|
||||
char **retp)
|
||||
{
|
||||
int ret = 0;
|
||||
BY_DIR *ld;
|
||||
char *dir = NULL;
|
||||
|
||||
ld = (BY_DIR *)ctx->method_data;
|
||||
|
||||
switch (cmd) {
|
||||
case X509_L_ADD_DIR:
|
||||
if (argl == X509_FILETYPE_DEFAULT) {
|
||||
dir = (char *)getenv(X509_get_default_cert_dir_env());
|
||||
if (dir)
|
||||
ret = add_cert_dir(ld, dir, X509_FILETYPE_PEM);
|
||||
else
|
||||
ret = add_cert_dir(ld, X509_get_default_cert_dir(),
|
||||
X509_FILETYPE_PEM);
|
||||
if (!ret) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_LOADING_CERT_DIR);
|
||||
}
|
||||
} else
|
||||
ret = add_cert_dir(ld, argp, (int)argl);
|
||||
break;
|
||||
}
|
||||
return (ret);
|
||||
}
|
||||
|
||||
static int new_dir(X509_LOOKUP *lu)
|
||||
{
|
||||
BY_DIR *a;
|
||||
|
||||
if ((a = (BY_DIR *)OPENSSL_malloc(sizeof(BY_DIR))) == NULL)
|
||||
return (0);
|
||||
if ((a->buffer = BUF_MEM_new()) == NULL) {
|
||||
OPENSSL_free(a);
|
||||
return (0);
|
||||
}
|
||||
a->dirs = NULL;
|
||||
lu->method_data = (char *)a;
|
||||
return (1);
|
||||
}
|
||||
|
||||
static void by_dir_hash_free(BY_DIR_HASH *hash)
|
||||
{
|
||||
OPENSSL_free(hash);
|
||||
}
|
||||
|
||||
static int by_dir_hash_cmp(const BY_DIR_HASH **a, const BY_DIR_HASH **b)
|
||||
{
|
||||
if ((*a)->hash > (*b)->hash)
|
||||
return 1;
|
||||
if ((*a)->hash < (*b)->hash)
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void by_dir_entry_free(BY_DIR_ENTRY *ent)
|
||||
{
|
||||
if (ent->dir)
|
||||
OPENSSL_free(ent->dir);
|
||||
if (ent->hashes)
|
||||
sk_BY_DIR_HASH_pop_free(ent->hashes, by_dir_hash_free);
|
||||
OPENSSL_free(ent);
|
||||
}
|
||||
|
||||
static void free_dir(X509_LOOKUP *lu)
|
||||
{
|
||||
BY_DIR *a;
|
||||
|
||||
a = (BY_DIR *)lu->method_data;
|
||||
if (a->dirs != NULL)
|
||||
sk_BY_DIR_ENTRY_pop_free(a->dirs, by_dir_entry_free);
|
||||
if (a->buffer != NULL)
|
||||
BUF_MEM_free(a->buffer);
|
||||
OPENSSL_free(a);
|
||||
}
|
||||
|
||||
static int add_cert_dir(BY_DIR *ctx, const char *dir, int type)
|
||||
{
|
||||
size_t j, len;
|
||||
const char *s, *ss, *p;
|
||||
|
||||
if (dir == NULL || !*dir) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_DIRECTORY);
|
||||
return 0;
|
||||
}
|
||||
|
||||
s = dir;
|
||||
p = s;
|
||||
do {
|
||||
if ((*p == ':') || (*p == '\0')) {
|
||||
BY_DIR_ENTRY *ent;
|
||||
ss = s;
|
||||
s = p + 1;
|
||||
len = p - ss;
|
||||
if (len == 0)
|
||||
continue;
|
||||
for (j = 0; j < sk_BY_DIR_ENTRY_num(ctx->dirs); j++) {
|
||||
ent = sk_BY_DIR_ENTRY_value(ctx->dirs, j);
|
||||
if (strlen(ent->dir) == len &&
|
||||
strncmp(ent->dir, ss, len) == 0)
|
||||
break;
|
||||
}
|
||||
if (j < sk_BY_DIR_ENTRY_num(ctx->dirs))
|
||||
continue;
|
||||
if (ctx->dirs == NULL) {
|
||||
ctx->dirs = sk_BY_DIR_ENTRY_new_null();
|
||||
if (!ctx->dirs) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
ent = OPENSSL_malloc(sizeof(BY_DIR_ENTRY));
|
||||
if (!ent)
|
||||
return 0;
|
||||
ent->dir_type = type;
|
||||
ent->hashes = sk_BY_DIR_HASH_new(by_dir_hash_cmp);
|
||||
ent->dir = OPENSSL_malloc(len + 1);
|
||||
if (!ent->dir || !ent->hashes) {
|
||||
by_dir_entry_free(ent);
|
||||
return 0;
|
||||
}
|
||||
strncpy(ent->dir, ss, len);
|
||||
ent->dir[len] = '\0';
|
||||
if (!sk_BY_DIR_ENTRY_push(ctx->dirs, ent)) {
|
||||
by_dir_entry_free(ent);
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
} while (*p++ != '\0');
|
||||
return 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* g_ent_hashes_lock protects the |hashes| member of all |BY_DIR_ENTRY|
|
||||
* objects.
|
||||
*/
|
||||
static struct CRYPTO_STATIC_MUTEX g_ent_hashes_lock =
|
||||
CRYPTO_STATIC_MUTEX_INIT;
|
||||
|
||||
static int get_cert_by_subject(X509_LOOKUP *xl, int type, X509_NAME *name,
|
||||
X509_OBJECT *ret)
|
||||
{
|
||||
BY_DIR *ctx;
|
||||
union {
|
||||
struct {
|
||||
X509 st_x509;
|
||||
X509_CINF st_x509_cinf;
|
||||
} x509;
|
||||
struct {
|
||||
X509_CRL st_crl;
|
||||
X509_CRL_INFO st_crl_info;
|
||||
} crl;
|
||||
} data;
|
||||
int ok = 0;
|
||||
size_t i;
|
||||
int j, k;
|
||||
unsigned long h;
|
||||
unsigned long hash_array[2];
|
||||
int hash_index;
|
||||
BUF_MEM *b = NULL;
|
||||
X509_OBJECT stmp, *tmp;
|
||||
const char *postfix = "";
|
||||
|
||||
if (name == NULL)
|
||||
return (0);
|
||||
|
||||
stmp.type = type;
|
||||
if (type == X509_LU_X509) {
|
||||
data.x509.st_x509.cert_info = &data.x509.st_x509_cinf;
|
||||
data.x509.st_x509_cinf.subject = name;
|
||||
stmp.data.x509 = &data.x509.st_x509;
|
||||
postfix = "";
|
||||
} else if (type == X509_LU_CRL) {
|
||||
data.crl.st_crl.crl = &data.crl.st_crl_info;
|
||||
data.crl.st_crl_info.issuer = name;
|
||||
stmp.data.crl = &data.crl.st_crl;
|
||||
postfix = "r";
|
||||
} else {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_WRONG_LOOKUP_TYPE);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
if ((b = BUF_MEM_new()) == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
|
||||
goto finish;
|
||||
}
|
||||
|
||||
ctx = (BY_DIR *)xl->method_data;
|
||||
|
||||
hash_array[0] = X509_NAME_hash(name);
|
||||
hash_array[1] = X509_NAME_hash_old(name);
|
||||
for (hash_index = 0; hash_index < 2; ++hash_index) {
|
||||
h = hash_array[hash_index];
|
||||
for (i = 0; i < sk_BY_DIR_ENTRY_num(ctx->dirs); i++) {
|
||||
BY_DIR_ENTRY *ent;
|
||||
size_t idx;
|
||||
BY_DIR_HASH htmp, *hent;
|
||||
ent = sk_BY_DIR_ENTRY_value(ctx->dirs, i);
|
||||
j = strlen(ent->dir) + 1 + 8 + 6 + 1 + 1;
|
||||
if (!BUF_MEM_grow(b, j)) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_MALLOC_FAILURE);
|
||||
goto finish;
|
||||
}
|
||||
if (type == X509_LU_CRL && ent->hashes) {
|
||||
htmp.hash = h;
|
||||
CRYPTO_STATIC_MUTEX_lock_read(&g_ent_hashes_lock);
|
||||
if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp)) {
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
k = hent->suffix;
|
||||
} else {
|
||||
hent = NULL;
|
||||
k = 0;
|
||||
}
|
||||
CRYPTO_STATIC_MUTEX_unlock_read(&g_ent_hashes_lock);
|
||||
} else {
|
||||
k = 0;
|
||||
hent = NULL;
|
||||
}
|
||||
for (;;) {
|
||||
char c = '/';
|
||||
#ifdef OPENSSL_SYS_VMS
|
||||
c = ent->dir[strlen(ent->dir) - 1];
|
||||
if (c != ':' && c != '>' && c != ']') {
|
||||
/*
|
||||
* If no separator is present, we assume the directory
|
||||
* specifier is a logical name, and add a colon. We
|
||||
* really should use better VMS routines for merging
|
||||
* things like this, but this will do for now... --
|
||||
* Richard Levitte
|
||||
*/
|
||||
c = ':';
|
||||
} else {
|
||||
c = '\0';
|
||||
}
|
||||
#endif
|
||||
if (c == '\0') {
|
||||
/*
|
||||
* This is special. When c == '\0', no directory
|
||||
* separator should be added.
|
||||
*/
|
||||
BIO_snprintf(b->data, b->max,
|
||||
"%s%08lx.%s%d", ent->dir, h, postfix, k);
|
||||
} else {
|
||||
BIO_snprintf(b->data, b->max,
|
||||
"%s%c%08lx.%s%d", ent->dir, c, h,
|
||||
postfix, k);
|
||||
}
|
||||
#ifndef OPENSSL_NO_POSIX_IO
|
||||
# ifdef _WIN32
|
||||
# define stat _stat
|
||||
# endif
|
||||
{
|
||||
struct stat st;
|
||||
if (stat(b->data, &st) < 0)
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
/* found one. */
|
||||
if (type == X509_LU_X509) {
|
||||
if ((X509_load_cert_file(xl, b->data,
|
||||
ent->dir_type)) == 0)
|
||||
break;
|
||||
} else if (type == X509_LU_CRL) {
|
||||
if ((X509_load_crl_file(xl, b->data, ent->dir_type)) == 0)
|
||||
break;
|
||||
}
|
||||
/* else case will caught higher up */
|
||||
k++;
|
||||
}
|
||||
|
||||
/*
|
||||
* we have added it to the cache so now pull it out again
|
||||
*/
|
||||
CRYPTO_MUTEX_lock_write(&xl->store_ctx->objs_lock);
|
||||
tmp = NULL;
|
||||
if (sk_X509_OBJECT_find(xl->store_ctx->objs, &idx, &stmp)) {
|
||||
tmp = sk_X509_OBJECT_value(xl->store_ctx->objs, idx);
|
||||
}
|
||||
CRYPTO_MUTEX_unlock_write(&xl->store_ctx->objs_lock);
|
||||
|
||||
/*
|
||||
* If a CRL, update the last file suffix added for this
|
||||
*/
|
||||
|
||||
if (type == X509_LU_CRL) {
|
||||
CRYPTO_STATIC_MUTEX_lock_write(&g_ent_hashes_lock);
|
||||
/*
|
||||
* Look for entry again in case another thread added an entry
|
||||
* first.
|
||||
*/
|
||||
if (!hent) {
|
||||
htmp.hash = h;
|
||||
if (sk_BY_DIR_HASH_find(ent->hashes, &idx, &htmp))
|
||||
hent = sk_BY_DIR_HASH_value(ent->hashes, idx);
|
||||
}
|
||||
if (!hent) {
|
||||
hent = OPENSSL_malloc(sizeof(BY_DIR_HASH));
|
||||
if (hent == NULL) {
|
||||
CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
}
|
||||
hent->hash = h;
|
||||
hent->suffix = k;
|
||||
if (!sk_BY_DIR_HASH_push(ent->hashes, hent)) {
|
||||
CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
|
||||
OPENSSL_free(hent);
|
||||
ok = 0;
|
||||
goto finish;
|
||||
}
|
||||
} else if (hent->suffix < k)
|
||||
hent->suffix = k;
|
||||
|
||||
CRYPTO_STATIC_MUTEX_unlock_write(&g_ent_hashes_lock);
|
||||
}
|
||||
|
||||
if (tmp != NULL) {
|
||||
ok = 1;
|
||||
ret->type = tmp->type;
|
||||
memcpy(&ret->data, &tmp->data, sizeof(ret->data));
|
||||
/*
|
||||
* If we were going to up the reference count, we would need
|
||||
* to do it on a perl 'type' basis
|
||||
*/
|
||||
/*
|
||||
* CRYPTO_add(&tmp->data.x509->references,1,
|
||||
* CRYPTO_LOCK_X509);
|
||||
*/
|
||||
goto finish;
|
||||
}
|
||||
}
|
||||
}
|
||||
finish:
|
||||
if (b != NULL)
|
||||
BUF_MEM_free(b);
|
||||
return (ok);
|
||||
}
|
275
external/boringssl/crypto/x509/by_file.c
vendored
Normal file
275
external/boringssl/crypto/x509/by_file.c
vendored
Normal file
@@ -0,0 +1,275 @@
|
||||
/* crypto/x509/by_file.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include <openssl/buf.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/lhash.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/thread.h>
|
||||
|
||||
#ifndef OPENSSL_NO_STDIO
|
||||
|
||||
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argc,
|
||||
long argl, char **ret);
|
||||
static X509_LOOKUP_METHOD x509_file_lookup = {
|
||||
"Load file into cache",
|
||||
NULL, /* new */
|
||||
NULL, /* free */
|
||||
NULL, /* init */
|
||||
NULL, /* shutdown */
|
||||
by_file_ctrl, /* ctrl */
|
||||
NULL, /* get_by_subject */
|
||||
NULL, /* get_by_issuer_serial */
|
||||
NULL, /* get_by_fingerprint */
|
||||
NULL, /* get_by_alias */
|
||||
};
|
||||
|
||||
X509_LOOKUP_METHOD *X509_LOOKUP_file(void)
|
||||
{
|
||||
return (&x509_file_lookup);
|
||||
}
|
||||
|
||||
static int by_file_ctrl(X509_LOOKUP *ctx, int cmd, const char *argp,
|
||||
long argl, char **ret)
|
||||
{
|
||||
int ok = 0;
|
||||
char *file;
|
||||
|
||||
switch (cmd) {
|
||||
case X509_L_FILE_LOAD:
|
||||
if (argl == X509_FILETYPE_DEFAULT) {
|
||||
file = (char *)getenv(X509_get_default_cert_file_env());
|
||||
if (file)
|
||||
ok = (X509_load_cert_crl_file(ctx, file,
|
||||
X509_FILETYPE_PEM) != 0);
|
||||
|
||||
else
|
||||
ok = (X509_load_cert_crl_file
|
||||
(ctx, X509_get_default_cert_file(),
|
||||
X509_FILETYPE_PEM) != 0);
|
||||
|
||||
if (!ok) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_LOADING_DEFAULTS);
|
||||
}
|
||||
} else {
|
||||
if (argl == X509_FILETYPE_PEM)
|
||||
ok = (X509_load_cert_crl_file(ctx, argp,
|
||||
X509_FILETYPE_PEM) != 0);
|
||||
else
|
||||
ok = (X509_load_cert_file(ctx, argp, (int)argl) != 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
return (ok);
|
||||
}
|
||||
|
||||
int X509_load_cert_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
{
|
||||
int ret = 0;
|
||||
BIO *in = NULL;
|
||||
int i, count = 0;
|
||||
X509 *x = NULL;
|
||||
|
||||
if (file == NULL)
|
||||
return (1);
|
||||
in = BIO_new(BIO_s_file());
|
||||
|
||||
if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (type == X509_FILETYPE_PEM) {
|
||||
for (;;) {
|
||||
x = PEM_read_bio_X509_AUX(in, NULL, NULL, NULL);
|
||||
if (x == NULL) {
|
||||
if ((ERR_GET_REASON(ERR_peek_last_error()) ==
|
||||
PEM_R_NO_START_LINE) && (count > 0)) {
|
||||
ERR_clear_error();
|
||||
break;
|
||||
} else {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
i = X509_STORE_add_cert(ctx->store_ctx, x);
|
||||
if (!i)
|
||||
goto err;
|
||||
count++;
|
||||
X509_free(x);
|
||||
x = NULL;
|
||||
}
|
||||
ret = count;
|
||||
} else if (type == X509_FILETYPE_ASN1) {
|
||||
x = d2i_X509_bio(in, NULL);
|
||||
if (x == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
|
||||
goto err;
|
||||
}
|
||||
i = X509_STORE_add_cert(ctx->store_ctx, x);
|
||||
if (!i)
|
||||
goto err;
|
||||
ret = i;
|
||||
} else {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
|
||||
goto err;
|
||||
}
|
||||
err:
|
||||
if (x != NULL)
|
||||
X509_free(x);
|
||||
if (in != NULL)
|
||||
BIO_free(in);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int X509_load_crl_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
{
|
||||
int ret = 0;
|
||||
BIO *in = NULL;
|
||||
int i, count = 0;
|
||||
X509_CRL *x = NULL;
|
||||
|
||||
if (file == NULL)
|
||||
return (1);
|
||||
in = BIO_new(BIO_s_file());
|
||||
|
||||
if ((in == NULL) || (BIO_read_filename(in, file) <= 0)) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (type == X509_FILETYPE_PEM) {
|
||||
for (;;) {
|
||||
x = PEM_read_bio_X509_CRL(in, NULL, NULL, NULL);
|
||||
if (x == NULL) {
|
||||
if ((ERR_GET_REASON(ERR_peek_last_error()) ==
|
||||
PEM_R_NO_START_LINE) && (count > 0)) {
|
||||
ERR_clear_error();
|
||||
break;
|
||||
} else {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
i = X509_STORE_add_crl(ctx->store_ctx, x);
|
||||
if (!i)
|
||||
goto err;
|
||||
count++;
|
||||
X509_CRL_free(x);
|
||||
x = NULL;
|
||||
}
|
||||
ret = count;
|
||||
} else if (type == X509_FILETYPE_ASN1) {
|
||||
x = d2i_X509_CRL_bio(in, NULL);
|
||||
if (x == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_ASN1_LIB);
|
||||
goto err;
|
||||
}
|
||||
i = X509_STORE_add_crl(ctx->store_ctx, x);
|
||||
if (!i)
|
||||
goto err;
|
||||
ret = i;
|
||||
} else {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_BAD_X509_FILETYPE);
|
||||
goto err;
|
||||
}
|
||||
err:
|
||||
if (x != NULL)
|
||||
X509_CRL_free(x);
|
||||
if (in != NULL)
|
||||
BIO_free(in);
|
||||
return (ret);
|
||||
}
|
||||
|
||||
int X509_load_cert_crl_file(X509_LOOKUP *ctx, const char *file, int type)
|
||||
{
|
||||
STACK_OF(X509_INFO) *inf;
|
||||
X509_INFO *itmp;
|
||||
BIO *in;
|
||||
size_t i;
|
||||
int count = 0;
|
||||
if (type != X509_FILETYPE_PEM)
|
||||
return X509_load_cert_file(ctx, file, type);
|
||||
in = BIO_new_file(file, "r");
|
||||
if (!in) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_SYS_LIB);
|
||||
return 0;
|
||||
}
|
||||
inf = PEM_X509_INFO_read_bio(in, NULL, NULL, NULL);
|
||||
BIO_free(in);
|
||||
if (!inf) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_PEM_LIB);
|
||||
return 0;
|
||||
}
|
||||
for (i = 0; i < sk_X509_INFO_num(inf); i++) {
|
||||
itmp = sk_X509_INFO_value(inf, i);
|
||||
if (itmp->x509) {
|
||||
X509_STORE_add_cert(ctx->store_ctx, itmp->x509);
|
||||
count++;
|
||||
}
|
||||
if (itmp->crl) {
|
||||
X509_STORE_add_crl(ctx->store_ctx, itmp->crl);
|
||||
count++;
|
||||
}
|
||||
}
|
||||
sk_X509_INFO_pop_free(inf, X509_INFO_free);
|
||||
return count;
|
||||
}
|
||||
|
||||
#endif /* OPENSSL_NO_STDIO */
|
15
external/boringssl/crypto/x509/charmap.h
vendored
Normal file
15
external/boringssl/crypto/x509/charmap.h
vendored
Normal file
@@ -0,0 +1,15 @@
|
||||
/*
|
||||
* Auto generated with chartype.pl script. Mask of various character
|
||||
* properties
|
||||
*/
|
||||
|
||||
static const unsigned char char_type[] = {
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
|
||||
120, 0, 1, 40, 0, 0, 0, 16, 16, 16, 0, 25, 25, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 9, 9, 16, 9, 16,
|
||||
0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 1, 0, 0, 0,
|
||||
0, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
|
||||
16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 0, 0, 0, 0, 2
|
||||
};
|
83
external/boringssl/crypto/x509/i2d_pr.c
vendored
Normal file
83
external/boringssl/crypto/x509/i2d_pr.c
vendored
Normal file
@@ -0,0 +1,83 @@
|
||||
/* crypto/asn1/i2d_pr.c */
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/ec_key.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/rsa.h>
|
||||
#include <openssl/dsa.h>
|
||||
|
||||
|
||||
int i2d_PrivateKey(const EVP_PKEY *a, uint8_t **pp)
|
||||
{
|
||||
switch (EVP_PKEY_id(a)) {
|
||||
case EVP_PKEY_RSA:
|
||||
return i2d_RSAPrivateKey(a->pkey.rsa, pp);
|
||||
case EVP_PKEY_EC:
|
||||
return i2d_ECPrivateKey(a->pkey.ec, pp);
|
||||
case EVP_PKEY_DSA:
|
||||
return i2d_DSAPrivateKey(a->pkey.dsa, pp);
|
||||
default:
|
||||
/*
|
||||
* Although this file is in crypto/x509 for layering reasons, it emits
|
||||
* an error code from ASN1 for OpenSSL compatibility.
|
||||
*/
|
||||
OPENSSL_PUT_ERROR(ASN1, ASN1_R_UNSUPPORTED_PUBLIC_KEY_TYPE);
|
||||
return -1;
|
||||
}
|
||||
}
|
66
external/boringssl/crypto/x509/internal.h
vendored
Normal file
66
external/boringssl/crypto/x509/internal.h
vendored
Normal file
@@ -0,0 +1,66 @@
|
||||
/* Copyright (c) 2016, Google Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
||||
|
||||
#ifndef OPENSSL_HEADER_X509_INTERNAL_H
|
||||
#define OPENSSL_HEADER_X509_INTERNAL_H
|
||||
|
||||
#include <openssl/base.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#if defined(__cplusplus)
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
|
||||
/* RSA-PSS functions. */
|
||||
|
||||
/* x509_rsa_pss_to_ctx configures |ctx| for an RSA-PSS operation based on
|
||||
* signature algorithm parameters in |sigalg| (which must have type
|
||||
* |NID_rsassaPss|) and key |pkey|. It returns one on success and zero on
|
||||
* error. */
|
||||
int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, X509_ALGOR *sigalg, EVP_PKEY *pkey);
|
||||
|
||||
/* x509_rsa_pss_to_ctx sets |algor| to the signature algorithm parameters for
|
||||
* |ctx|, which must have been configured for an RSA-PSS signing operation. It
|
||||
* returns one on success and zero on error. */
|
||||
int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor);
|
||||
|
||||
/* x509_print_rsa_pss_params prints a human-readable representation of RSA-PSS
|
||||
* parameters in |sigalg| to |bp|. It returns one on success and zero on
|
||||
* error. */
|
||||
int x509_print_rsa_pss_params(BIO *bp, const X509_ALGOR *sigalg, int indent,
|
||||
ASN1_PCTX *pctx);
|
||||
|
||||
|
||||
/* Signature algorithm functions. */
|
||||
|
||||
/* x509_digest_sign_algorithm encodes the signing parameters of |ctx| as an
|
||||
* AlgorithmIdentifer and saves the result in |algor|. It returns one on
|
||||
* success, or zero on error. */
|
||||
int x509_digest_sign_algorithm(EVP_MD_CTX *ctx, X509_ALGOR *algor);
|
||||
|
||||
/* x509_digest_verify_init sets up |ctx| for a signature verification operation
|
||||
* with public key |pkey| and parameters from |algor|. The |ctx| argument must
|
||||
* have been initialised with |EVP_MD_CTX_init|. It returns one on success, or
|
||||
* zero on error. */
|
||||
int x509_digest_verify_init(EVP_MD_CTX *ctx, X509_ALGOR *sigalg,
|
||||
EVP_PKEY *pkey);
|
||||
|
||||
|
||||
#if defined(__cplusplus)
|
||||
} /* extern C */
|
||||
#endif
|
||||
|
||||
#endif /* OPENSSL_HEADER_X509_INTERNAL_H */
|
353
external/boringssl/crypto/x509/pkcs7.c
vendored
Normal file
353
external/boringssl/crypto/x509/pkcs7.c
vendored
Normal file
@@ -0,0 +1,353 @@
|
||||
/* Copyright (c) 2014, Google Inc.
|
||||
*
|
||||
* Permission to use, copy, modify, and/or distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
|
||||
* SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
||||
* OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
||||
* CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */
|
||||
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include <assert.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include <openssl/bytestring.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/obj.h>
|
||||
#include <openssl/pem.h>
|
||||
#include <openssl/stack.h>
|
||||
|
||||
#include "../bytestring/internal.h"
|
||||
|
||||
|
||||
/* pkcs7_parse_header reads the non-certificate/non-CRL prefix of a PKCS#7
|
||||
* SignedData blob from |cbs| and sets |*out| to point to the rest of the
|
||||
* input. If the input is in BER format, then |*der_bytes| will be set to a
|
||||
* pointer that needs to be freed by the caller once they have finished
|
||||
* processing |*out| (which will be pointing into |*der_bytes|).
|
||||
*
|
||||
* It returns one on success or zero on error. On error, |*der_bytes| is
|
||||
* NULL. */
|
||||
static int pkcs7_parse_header(uint8_t **der_bytes, CBS *out, CBS *cbs) {
|
||||
size_t der_len;
|
||||
CBS in, content_info, content_type, wrapped_signed_data, signed_data;
|
||||
uint64_t version;
|
||||
|
||||
/* The input may be in BER format. */
|
||||
*der_bytes = NULL;
|
||||
if (!CBS_asn1_ber_to_der(cbs, der_bytes, &der_len)) {
|
||||
return 0;
|
||||
}
|
||||
if (*der_bytes != NULL) {
|
||||
CBS_init(&in, *der_bytes, der_len);
|
||||
} else {
|
||||
CBS_init(&in, CBS_data(cbs), CBS_len(cbs));
|
||||
}
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-7 */
|
||||
if (!CBS_get_asn1(&in, &content_info, CBS_ASN1_SEQUENCE) ||
|
||||
!CBS_get_asn1(&content_info, &content_type, CBS_ASN1_OBJECT)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (OBJ_cbs2nid(&content_type) != NID_pkcs7_signed) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_NOT_PKCS7_SIGNED_DATA);
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
if (!CBS_get_asn1(&content_info, &wrapped_signed_data,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) ||
|
||||
!CBS_get_asn1(&wrapped_signed_data, &signed_data, CBS_ASN1_SEQUENCE) ||
|
||||
!CBS_get_asn1_uint64(&signed_data, &version) ||
|
||||
!CBS_get_asn1(&signed_data, NULL /* digests */, CBS_ASN1_SET) ||
|
||||
!CBS_get_asn1(&signed_data, NULL /* content */, CBS_ASN1_SEQUENCE)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (version < 1) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_BAD_PKCS7_VERSION);
|
||||
goto err;
|
||||
}
|
||||
|
||||
CBS_init(out, CBS_data(&signed_data), CBS_len(&signed_data));
|
||||
return 1;
|
||||
|
||||
err:
|
||||
if (*der_bytes) {
|
||||
OPENSSL_free(*der_bytes);
|
||||
*der_bytes = NULL;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int PKCS7_get_certificates(STACK_OF(X509) *out_certs, CBS *cbs) {
|
||||
CBS signed_data, certificates;
|
||||
uint8_t *der_bytes = NULL;
|
||||
int ret = 0;
|
||||
const size_t initial_certs_len = sk_X509_num(out_certs);
|
||||
|
||||
if (!pkcs7_parse_header(&der_bytes, &signed_data, cbs)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
if (!CBS_get_asn1(&signed_data, &certificates,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_NO_CERTIFICATES_INCLUDED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
while (CBS_len(&certificates) > 0) {
|
||||
CBS cert;
|
||||
X509 *x509;
|
||||
const uint8_t *inp;
|
||||
|
||||
if (!CBS_get_asn1_element(&certificates, &cert, CBS_ASN1_SEQUENCE)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (CBS_len(&cert) > LONG_MAX) {
|
||||
goto err;
|
||||
}
|
||||
inp = CBS_data(&cert);
|
||||
x509 = d2i_X509(NULL, &inp, (long)CBS_len(&cert));
|
||||
if (!x509) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
assert(inp == CBS_data(&cert) + CBS_len(&cert));
|
||||
|
||||
if (sk_X509_push(out_certs, x509) == 0) {
|
||||
X509_free(x509);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (der_bytes) {
|
||||
OPENSSL_free(der_bytes);
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
while (sk_X509_num(out_certs) != initial_certs_len) {
|
||||
X509 *x509 = sk_X509_pop(out_certs);
|
||||
X509_free(x509);
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs) {
|
||||
CBS signed_data, crls;
|
||||
uint8_t *der_bytes = NULL;
|
||||
int ret = 0;
|
||||
const size_t initial_crls_len = sk_X509_CRL_num(out_crls);
|
||||
|
||||
if (!pkcs7_parse_header(&der_bytes, &signed_data, cbs)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
|
||||
/* Even if only CRLs are included, there may be an empty certificates block.
|
||||
* OpenSSL does this, for example. */
|
||||
if (CBS_peek_asn1_tag(&signed_data,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) &&
|
||||
!CBS_get_asn1(&signed_data, NULL /* certificates */,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (!CBS_get_asn1(&signed_data, &crls,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 1)) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_NO_CRLS_INCLUDED);
|
||||
goto err;
|
||||
}
|
||||
|
||||
while (CBS_len(&crls) > 0) {
|
||||
CBS crl_data;
|
||||
X509_CRL *crl;
|
||||
const uint8_t *inp;
|
||||
|
||||
if (!CBS_get_asn1_element(&crls, &crl_data, CBS_ASN1_SEQUENCE)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (CBS_len(&crl_data) > LONG_MAX) {
|
||||
goto err;
|
||||
}
|
||||
inp = CBS_data(&crl_data);
|
||||
crl = d2i_X509_CRL(NULL, &inp, (long)CBS_len(&crl_data));
|
||||
if (!crl) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
assert(inp == CBS_data(&crl_data) + CBS_len(&crl_data));
|
||||
|
||||
if (sk_X509_CRL_push(out_crls, crl) == 0) {
|
||||
X509_CRL_free(crl);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
if (der_bytes) {
|
||||
OPENSSL_free(der_bytes);
|
||||
}
|
||||
|
||||
if (!ret) {
|
||||
while (sk_X509_CRL_num(out_crls) != initial_crls_len) {
|
||||
X509_CRL_free(sk_X509_CRL_pop(out_crls));
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PKCS7_get_PEM_certificates(STACK_OF(X509) *out_certs, BIO *pem_bio) {
|
||||
uint8_t *data;
|
||||
long len;
|
||||
int ret;
|
||||
|
||||
/* Even though we pass PEM_STRING_PKCS7 as the expected PEM type here, PEM
|
||||
* internally will actually allow several other values too, including
|
||||
* "CERTIFICATE". */
|
||||
if (!PEM_bytes_read_bio(&data, &len, NULL /* PEM type output */,
|
||||
PEM_STRING_PKCS7, pem_bio,
|
||||
NULL /* password callback */,
|
||||
NULL /* password callback argument */)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
CBS cbs;
|
||||
CBS_init(&cbs, data, len);
|
||||
ret = PKCS7_get_certificates(out_certs, &cbs);
|
||||
OPENSSL_free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int PKCS7_get_PEM_CRLs(STACK_OF(X509_CRL) *out_crls, BIO *pem_bio) {
|
||||
uint8_t *data;
|
||||
long len;
|
||||
int ret;
|
||||
|
||||
/* Even though we pass PEM_STRING_PKCS7 as the expected PEM type here, PEM
|
||||
* internally will actually allow several other values too, including
|
||||
* "CERTIFICATE". */
|
||||
if (!PEM_bytes_read_bio(&data, &len, NULL /* PEM type output */,
|
||||
PEM_STRING_PKCS7, pem_bio,
|
||||
NULL /* password callback */,
|
||||
NULL /* password callback argument */)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
CBS cbs;
|
||||
CBS_init(&cbs, data, len);
|
||||
ret = PKCS7_get_CRLs(out_crls, &cbs);
|
||||
OPENSSL_free(data);
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* pkcs7_bundle writes a PKCS#7, SignedData structure to |out| and then calls
|
||||
* |cb| with a CBB to which certificate or CRL data can be written, and the
|
||||
* opaque context pointer, |arg|. The callback can return zero to indicate an
|
||||
* error.
|
||||
*
|
||||
* pkcs7_bundle returns one on success or zero on error. */
|
||||
static int pkcs7_bundle(CBB *out, int (*cb)(CBB *out, const void *arg),
|
||||
const void *arg) {
|
||||
CBB outer_seq, wrapped_seq, seq, version_bytes, digest_algos_set,
|
||||
content_info;
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-7 */
|
||||
if (!CBB_add_asn1(out, &outer_seq, CBS_ASN1_SEQUENCE) ||
|
||||
!OBJ_nid2cbb(&outer_seq, NID_pkcs7_signed) ||
|
||||
!CBB_add_asn1(&outer_seq, &wrapped_seq,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0) ||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
!CBB_add_asn1(&wrapped_seq, &seq, CBS_ASN1_SEQUENCE) ||
|
||||
!CBB_add_asn1(&seq, &version_bytes, CBS_ASN1_INTEGER) ||
|
||||
!CBB_add_u8(&version_bytes, 1) ||
|
||||
!CBB_add_asn1(&seq, &digest_algos_set, CBS_ASN1_SET) ||
|
||||
!CBB_add_asn1(&seq, &content_info, CBS_ASN1_SEQUENCE) ||
|
||||
!OBJ_nid2cbb(&content_info, NID_pkcs7_data) ||
|
||||
!cb(&seq, arg)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
return CBB_flush(out);
|
||||
}
|
||||
|
||||
static int pkcs7_bundle_certificates_cb(CBB *out, const void *arg) {
|
||||
const STACK_OF(X509) *certs = arg;
|
||||
size_t i;
|
||||
CBB certificates;
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
if (!CBB_add_asn1(out, &certificates,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 0)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_X509_num(certs); i++) {
|
||||
X509 *x509 = sk_X509_value(certs, i);
|
||||
uint8_t *buf;
|
||||
int len = i2d_X509(x509, NULL);
|
||||
|
||||
if (len < 0 ||
|
||||
!CBB_add_space(&certificates, &buf, len) ||
|
||||
i2d_X509(x509, &buf) < 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return CBB_flush(out);
|
||||
}
|
||||
|
||||
int PKCS7_bundle_certificates(CBB *out, const STACK_OF(X509) *certs) {
|
||||
return pkcs7_bundle(out, pkcs7_bundle_certificates_cb, certs);
|
||||
}
|
||||
|
||||
static int pkcs7_bundle_crls_cb(CBB *out, const void *arg) {
|
||||
const STACK_OF(X509_CRL) *crls = arg;
|
||||
size_t i;
|
||||
CBB crl_data;
|
||||
|
||||
/* See https://tools.ietf.org/html/rfc2315#section-9.1 */
|
||||
if (!CBB_add_asn1(out, &crl_data,
|
||||
CBS_ASN1_CONTEXT_SPECIFIC | CBS_ASN1_CONSTRUCTED | 1)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (i = 0; i < sk_X509_CRL_num(crls); i++) {
|
||||
X509_CRL *crl = sk_X509_CRL_value(crls, i);
|
||||
uint8_t *buf;
|
||||
int len = i2d_X509_CRL(crl, NULL);
|
||||
|
||||
if (len < 0 ||
|
||||
!CBB_add_space(&crl_data, &buf, len) ||
|
||||
i2d_X509_CRL(crl, &buf) < 0) {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
return CBB_flush(out);
|
||||
}
|
||||
|
||||
int PKCS7_bundle_CRLs(CBB *out, const STACK_OF(X509_CRL) *crls) {
|
||||
return pkcs7_bundle(out, pkcs7_bundle_crls_cb, crls);
|
||||
}
|
656
external/boringssl/crypto/x509/pkcs7_test.c
vendored
Normal file
656
external/boringssl/crypto/x509/pkcs7_test.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
385
external/boringssl/crypto/x509/rsa_pss.c
vendored
Normal file
385
external/boringssl/crypto/x509/rsa_pss.c
vendored
Normal file
@@ -0,0 +1,385 @@
|
||||
/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
|
||||
* project 2006.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2006 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com). */
|
||||
|
||||
#include <openssl/x509.h>
|
||||
|
||||
#include <assert.h>
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/evp.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/obj.h>
|
||||
|
||||
#include "internal.h"
|
||||
|
||||
|
||||
ASN1_SEQUENCE(RSA_PSS_PARAMS) = {
|
||||
ASN1_EXP_OPT(RSA_PSS_PARAMS, hashAlgorithm, X509_ALGOR,0),
|
||||
ASN1_EXP_OPT(RSA_PSS_PARAMS, maskGenAlgorithm, X509_ALGOR,1),
|
||||
ASN1_EXP_OPT(RSA_PSS_PARAMS, saltLength, ASN1_INTEGER,2),
|
||||
ASN1_EXP_OPT(RSA_PSS_PARAMS, trailerField, ASN1_INTEGER,3),
|
||||
} ASN1_SEQUENCE_END(RSA_PSS_PARAMS);
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(RSA_PSS_PARAMS);
|
||||
|
||||
|
||||
/* Given an MGF1 Algorithm ID decode to an Algorithm Identifier */
|
||||
static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg) {
|
||||
if (alg == NULL || alg->parameter == NULL ||
|
||||
OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
|
||||
alg->parameter->type != V_ASN1_SEQUENCE) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const uint8_t *p = alg->parameter->value.sequence->data;
|
||||
int plen = alg->parameter->value.sequence->length;
|
||||
return d2i_X509_ALGOR(NULL, &p, plen);
|
||||
}
|
||||
|
||||
static RSA_PSS_PARAMS *rsa_pss_decode(const X509_ALGOR *alg,
|
||||
X509_ALGOR **pmaskHash) {
|
||||
*pmaskHash = NULL;
|
||||
|
||||
if (alg->parameter == NULL || alg->parameter->type != V_ASN1_SEQUENCE) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
const uint8_t *p = alg->parameter->value.sequence->data;
|
||||
int plen = alg->parameter->value.sequence->length;
|
||||
RSA_PSS_PARAMS *pss = d2i_RSA_PSS_PARAMS(NULL, &p, plen);
|
||||
if (pss == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
*pmaskHash = rsa_mgf1_decode(pss->maskGenAlgorithm);
|
||||
return pss;
|
||||
}
|
||||
|
||||
/* allocate and set algorithm ID from EVP_MD, default SHA1 */
|
||||
static int rsa_md_to_algor(X509_ALGOR **palg, const EVP_MD *md) {
|
||||
if (EVP_MD_type(md) == NID_sha1) {
|
||||
return 1;
|
||||
}
|
||||
*palg = X509_ALGOR_new();
|
||||
if (*palg == NULL) {
|
||||
return 0;
|
||||
}
|
||||
X509_ALGOR_set_md(*palg, md);
|
||||
return 1;
|
||||
}
|
||||
|
||||
/* Allocate and set MGF1 algorithm ID from EVP_MD */
|
||||
static int rsa_md_to_mgf1(X509_ALGOR **palg, const EVP_MD *mgf1md) {
|
||||
X509_ALGOR *algtmp = NULL;
|
||||
ASN1_STRING *stmp = NULL;
|
||||
*palg = NULL;
|
||||
|
||||
if (EVP_MD_type(mgf1md) == NID_sha1) {
|
||||
return 1;
|
||||
}
|
||||
/* need to embed algorithm ID inside another */
|
||||
if (!rsa_md_to_algor(&algtmp, mgf1md) ||
|
||||
!ASN1_item_pack(algtmp, ASN1_ITEM_rptr(X509_ALGOR), &stmp)) {
|
||||
goto err;
|
||||
}
|
||||
*palg = X509_ALGOR_new();
|
||||
if (!*palg) {
|
||||
goto err;
|
||||
}
|
||||
X509_ALGOR_set0(*palg, OBJ_nid2obj(NID_mgf1), V_ASN1_SEQUENCE, stmp);
|
||||
stmp = NULL;
|
||||
|
||||
err:
|
||||
ASN1_STRING_free(stmp);
|
||||
X509_ALGOR_free(algtmp);
|
||||
if (*palg) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* convert algorithm ID to EVP_MD, default SHA1 */
|
||||
static const EVP_MD *rsa_algor_to_md(X509_ALGOR *alg) {
|
||||
const EVP_MD *md;
|
||||
if (!alg) {
|
||||
return EVP_sha1();
|
||||
}
|
||||
md = EVP_get_digestbyobj(alg->algorithm);
|
||||
if (md == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
}
|
||||
return md;
|
||||
}
|
||||
|
||||
/* convert MGF1 algorithm ID to EVP_MD, default SHA1 */
|
||||
static const EVP_MD *rsa_mgf1_to_md(X509_ALGOR *alg, X509_ALGOR *maskHash) {
|
||||
const EVP_MD *md;
|
||||
if (!alg) {
|
||||
return EVP_sha1();
|
||||
}
|
||||
/* Check mask and lookup mask hash algorithm */
|
||||
if (OBJ_obj2nid(alg->algorithm) != NID_mgf1 ||
|
||||
maskHash == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
return NULL;
|
||||
}
|
||||
md = EVP_get_digestbyobj(maskHash->algorithm);
|
||||
if (md == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
return NULL;
|
||||
}
|
||||
return md;
|
||||
}
|
||||
|
||||
int x509_rsa_ctx_to_pss(EVP_MD_CTX *ctx, X509_ALGOR *algor) {
|
||||
const EVP_MD *sigmd, *mgf1md;
|
||||
int saltlen;
|
||||
if (!EVP_PKEY_CTX_get_signature_md(ctx->pctx, &sigmd) ||
|
||||
!EVP_PKEY_CTX_get_rsa_mgf1_md(ctx->pctx, &mgf1md) ||
|
||||
!EVP_PKEY_CTX_get_rsa_pss_saltlen(ctx->pctx, &saltlen)) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
EVP_PKEY *pk = EVP_PKEY_CTX_get0_pkey(ctx->pctx);
|
||||
if (saltlen == -1) {
|
||||
saltlen = EVP_MD_size(sigmd);
|
||||
} else if (saltlen == -2) {
|
||||
saltlen = EVP_PKEY_size(pk) - EVP_MD_size(sigmd) - 2;
|
||||
if (((EVP_PKEY_bits(pk) - 1) & 0x7) == 0) {
|
||||
saltlen--;
|
||||
}
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ret = 0;
|
||||
ASN1_STRING *os = NULL;
|
||||
RSA_PSS_PARAMS *pss = RSA_PSS_PARAMS_new();
|
||||
if (!pss) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (saltlen != 20) {
|
||||
pss->saltLength = ASN1_INTEGER_new();
|
||||
if (!pss->saltLength ||
|
||||
!ASN1_INTEGER_set(pss->saltLength, saltlen)) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!rsa_md_to_algor(&pss->hashAlgorithm, sigmd) ||
|
||||
!rsa_md_to_mgf1(&pss->maskGenAlgorithm, mgf1md)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
/* Finally create string with pss parameter encoding. */
|
||||
if (!ASN1_item_pack(pss, ASN1_ITEM_rptr(RSA_PSS_PARAMS), &os)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
X509_ALGOR_set0(algor, OBJ_nid2obj(NID_rsassaPss), V_ASN1_SEQUENCE, os);
|
||||
os = NULL;
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
RSA_PSS_PARAMS_free(pss);
|
||||
ASN1_STRING_free(os);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int x509_rsa_pss_to_ctx(EVP_MD_CTX *ctx, X509_ALGOR *sigalg, EVP_PKEY *pkey) {
|
||||
assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
|
||||
|
||||
/* Decode PSS parameters */
|
||||
int ret = 0;
|
||||
X509_ALGOR *maskHash;
|
||||
RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg, &maskHash);
|
||||
if (pss == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
goto err;
|
||||
}
|
||||
|
||||
const EVP_MD *mgf1md = rsa_mgf1_to_md(pss->maskGenAlgorithm, maskHash);
|
||||
const EVP_MD *md = rsa_algor_to_md(pss->hashAlgorithm);
|
||||
if (mgf1md == NULL || md == NULL) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
int saltlen = 20;
|
||||
if (pss->saltLength != NULL) {
|
||||
saltlen = ASN1_INTEGER_get(pss->saltLength);
|
||||
|
||||
/* Could perform more salt length sanity checks but the main
|
||||
* RSA routines will trap other invalid values anyway. */
|
||||
if (saltlen < 0) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
/* low-level routines support only trailer field 0xbc (value 1)
|
||||
* and PKCS#1 says we should reject any other value anyway. */
|
||||
if (pss->trailerField != NULL && ASN1_INTEGER_get(pss->trailerField) != 1) {
|
||||
OPENSSL_PUT_ERROR(X509, X509_R_INVALID_PSS_PARAMETERS);
|
||||
goto err;
|
||||
}
|
||||
|
||||
EVP_PKEY_CTX *pkctx;
|
||||
if (!EVP_DigestVerifyInit(ctx, &pkctx, md, NULL, pkey) ||
|
||||
!EVP_PKEY_CTX_set_rsa_padding(pkctx, RSA_PKCS1_PSS_PADDING) ||
|
||||
!EVP_PKEY_CTX_set_rsa_pss_saltlen(pkctx, saltlen) ||
|
||||
!EVP_PKEY_CTX_set_rsa_mgf1_md(pkctx, mgf1md)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
ret = 1;
|
||||
|
||||
err:
|
||||
RSA_PSS_PARAMS_free(pss);
|
||||
X509_ALGOR_free(maskHash);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int x509_print_rsa_pss_params(BIO *bp, const X509_ALGOR *sigalg, int indent,
|
||||
ASN1_PCTX *pctx) {
|
||||
assert(OBJ_obj2nid(sigalg->algorithm) == NID_rsassaPss);
|
||||
|
||||
int rv = 0;
|
||||
X509_ALGOR *maskHash;
|
||||
RSA_PSS_PARAMS *pss = rsa_pss_decode(sigalg, &maskHash);
|
||||
if (!pss) {
|
||||
if (BIO_puts(bp, " (INVALID PSS PARAMETERS)\n") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
rv = 1;
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (BIO_puts(bp, "\n") <= 0 ||
|
||||
!BIO_indent(bp, indent, 128) ||
|
||||
BIO_puts(bp, "Hash Algorithm: ") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pss->hashAlgorithm) {
|
||||
if (i2a_ASN1_OBJECT(bp, pss->hashAlgorithm->algorithm) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else if (BIO_puts(bp, "sha1 (default)") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (BIO_puts(bp, "\n") <= 0 ||
|
||||
!BIO_indent(bp, indent, 128) ||
|
||||
BIO_puts(bp, "Mask Algorithm: ") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pss->maskGenAlgorithm) {
|
||||
if (i2a_ASN1_OBJECT(bp, pss->maskGenAlgorithm->algorithm) <= 0 ||
|
||||
BIO_puts(bp, " with ") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (maskHash) {
|
||||
if (i2a_ASN1_OBJECT(bp, maskHash->algorithm) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else if (BIO_puts(bp, "INVALID") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else if (BIO_puts(bp, "mgf1 with sha1 (default)") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
BIO_puts(bp, "\n");
|
||||
|
||||
if (!BIO_indent(bp, indent, 128) ||
|
||||
BIO_puts(bp, "Salt Length: 0x") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pss->saltLength) {
|
||||
if (i2a_ASN1_INTEGER(bp, pss->saltLength) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else if (BIO_puts(bp, "14 (default)") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
BIO_puts(bp, "\n");
|
||||
|
||||
if (!BIO_indent(bp, indent, 128) ||
|
||||
BIO_puts(bp, "Trailer Field: 0x") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (pss->trailerField) {
|
||||
if (i2a_ASN1_INTEGER(bp, pss->trailerField) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else if (BIO_puts(bp, "BC (default)") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
BIO_puts(bp, "\n");
|
||||
|
||||
rv = 1;
|
||||
|
||||
err:
|
||||
RSA_PSS_PARAMS_free(pss);
|
||||
X509_ALGOR_free(maskHash);
|
||||
return rv;
|
||||
}
|
128
external/boringssl/crypto/x509/t_crl.c
vendored
Normal file
128
external/boringssl/crypto/x509/t_crl.c
vendored
Normal file
@@ -0,0 +1,128 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/obj.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
#ifndef OPENSSL_NO_FP_API
|
||||
int X509_CRL_print_fp(FILE *fp, X509_CRL *x)
|
||||
{
|
||||
BIO *b;
|
||||
int ret;
|
||||
|
||||
if ((b = BIO_new(BIO_s_file())) == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
|
||||
return (0);
|
||||
}
|
||||
BIO_set_fp(b, fp, BIO_NOCLOSE);
|
||||
ret = X509_CRL_print(b, x);
|
||||
BIO_free(b);
|
||||
return (ret);
|
||||
}
|
||||
#endif
|
||||
|
||||
int X509_CRL_print(BIO *out, X509_CRL *x)
|
||||
{
|
||||
STACK_OF(X509_REVOKED) *rev;
|
||||
X509_REVOKED *r;
|
||||
long l;
|
||||
size_t i;
|
||||
char *p;
|
||||
|
||||
BIO_printf(out, "Certificate Revocation List (CRL):\n");
|
||||
l = X509_CRL_get_version(x);
|
||||
BIO_printf(out, "%8sVersion %lu (0x%lx)\n", "", l + 1, l);
|
||||
X509_signature_print(out, x->sig_alg, NULL);
|
||||
p = X509_NAME_oneline(X509_CRL_get_issuer(x), NULL, 0);
|
||||
BIO_printf(out, "%8sIssuer: %s\n", "", p);
|
||||
OPENSSL_free(p);
|
||||
BIO_printf(out, "%8sLast Update: ", "");
|
||||
ASN1_TIME_print(out, X509_CRL_get_lastUpdate(x));
|
||||
BIO_printf(out, "\n%8sNext Update: ", "");
|
||||
if (X509_CRL_get_nextUpdate(x))
|
||||
ASN1_TIME_print(out, X509_CRL_get_nextUpdate(x));
|
||||
else
|
||||
BIO_printf(out, "NONE");
|
||||
BIO_printf(out, "\n");
|
||||
|
||||
X509V3_extensions_print(out, "CRL extensions", x->crl->extensions, 0, 8);
|
||||
|
||||
rev = X509_CRL_get_REVOKED(x);
|
||||
|
||||
if (sk_X509_REVOKED_num(rev) > 0)
|
||||
BIO_printf(out, "Revoked Certificates:\n");
|
||||
else
|
||||
BIO_printf(out, "No Revoked Certificates.\n");
|
||||
|
||||
for (i = 0; i < sk_X509_REVOKED_num(rev); i++) {
|
||||
r = sk_X509_REVOKED_value(rev, i);
|
||||
BIO_printf(out, " Serial Number: ");
|
||||
i2a_ASN1_INTEGER(out, r->serialNumber);
|
||||
BIO_printf(out, "\n Revocation Date: ");
|
||||
ASN1_TIME_print(out, r->revocationDate);
|
||||
BIO_printf(out, "\n");
|
||||
X509V3_extensions_print(out, "CRL entry extensions",
|
||||
r->extensions, 0, 8);
|
||||
}
|
||||
X509_signature_print(out, x->sig_alg, x->signature);
|
||||
|
||||
return 1;
|
||||
|
||||
}
|
246
external/boringssl/crypto/x509/t_req.c
vendored
Normal file
246
external/boringssl/crypto/x509/t_req.c
vendored
Normal file
@@ -0,0 +1,246 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#include <openssl/bn.h>
|
||||
#include <openssl/buffer.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/objects.h>
|
||||
#include <openssl/x509.h>
|
||||
#include <openssl/x509v3.h>
|
||||
|
||||
|
||||
int X509_REQ_print_fp(FILE *fp, X509_REQ *x) {
|
||||
BIO *bio = BIO_new(BIO_s_file());
|
||||
if (bio == NULL) {
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
|
||||
return 0;
|
||||
}
|
||||
|
||||
BIO_set_fp(bio, fp, BIO_NOCLOSE);
|
||||
int ret = X509_REQ_print(bio, x);
|
||||
BIO_free(bio);
|
||||
return ret;
|
||||
}
|
||||
|
||||
int X509_REQ_print_ex(BIO *bio, X509_REQ *x, unsigned long nmflags,
|
||||
unsigned long cflag) {
|
||||
long l;
|
||||
EVP_PKEY *pkey;
|
||||
STACK_OF(X509_ATTRIBUTE) * sk;
|
||||
char mlch = ' ';
|
||||
|
||||
int nmindent = 0;
|
||||
|
||||
if ((nmflags & XN_FLAG_SEP_MASK) == XN_FLAG_SEP_MULTILINE) {
|
||||
mlch = '\n';
|
||||
nmindent = 12;
|
||||
}
|
||||
|
||||
if (nmflags == X509_FLAG_COMPAT) {
|
||||
nmindent = 16;
|
||||
}
|
||||
|
||||
X509_REQ_INFO *ri = x->req_info;
|
||||
if (!(cflag & X509_FLAG_NO_HEADER)) {
|
||||
if (BIO_write(bio, "Certificate Request:\n", 21) <= 0 ||
|
||||
BIO_write(bio, " Data:\n", 10) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_VERSION)) {
|
||||
l = X509_REQ_get_version(x);
|
||||
if (BIO_printf(bio, "%8sVersion: %ld (0x%lx)\n", "", l + 1, l) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_SUBJECT)) {
|
||||
if (BIO_printf(bio, " Subject:%c", mlch) <= 0 ||
|
||||
X509_NAME_print_ex(bio, ri->subject, nmindent, nmflags) < 0 ||
|
||||
BIO_write(bio, "\n", 1) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
if (!(cflag & X509_FLAG_NO_PUBKEY)) {
|
||||
if (BIO_write(bio, " Subject Public Key Info:\n", 33) <= 0 ||
|
||||
BIO_printf(bio, "%12sPublic Key Algorithm: ", "") <= 0 ||
|
||||
i2a_ASN1_OBJECT(bio, ri->pubkey->algor->algorithm) <= 0 ||
|
||||
BIO_puts(bio, "\n") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
pkey = X509_REQ_get_pubkey(x);
|
||||
if (pkey == NULL) {
|
||||
BIO_printf(bio, "%12sUnable to load Public Key\n", "");
|
||||
ERR_print_errors(bio);
|
||||
} else {
|
||||
EVP_PKEY_print_public(bio, pkey, 16, NULL);
|
||||
EVP_PKEY_free(pkey);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_ATTRIBUTES)) {
|
||||
if (BIO_printf(bio, "%8sAttributes:\n", "") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
sk = x->req_info->attributes;
|
||||
if (sk_X509_ATTRIBUTE_num(sk) == 0) {
|
||||
if (BIO_printf(bio, "%12sa0:00\n", "") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
size_t i;
|
||||
for (i = 0; i < sk_X509_ATTRIBUTE_num(sk); i++) {
|
||||
X509_ATTRIBUTE *a = sk_X509_ATTRIBUTE_value(sk, i);
|
||||
ASN1_OBJECT *aobj = X509_ATTRIBUTE_get0_object(a);
|
||||
|
||||
if (X509_REQ_extension_nid(OBJ_obj2nid(aobj))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (BIO_printf(bio, "%12s", "") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
const int num_attrs = X509_ATTRIBUTE_count(a);
|
||||
const int obj_str_len = i2a_ASN1_OBJECT(bio, aobj);
|
||||
if (obj_str_len <= 0) {
|
||||
if (BIO_puts(bio, "(Unable to print attribute ID.)\n") < 0) {
|
||||
goto err;
|
||||
} else {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
int j;
|
||||
for (j = 0; j < num_attrs; j++) {
|
||||
const ASN1_TYPE *at = X509_ATTRIBUTE_get0_type(a, j);
|
||||
const int type = at->type;
|
||||
ASN1_BIT_STRING *bs = at->value.asn1_string;
|
||||
|
||||
int k;
|
||||
for (k = 25 - obj_str_len; k > 0; k--) {
|
||||
if (BIO_write(bio, " ", 1) != 1) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (BIO_puts(bio, ":") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
if (type == V_ASN1_PRINTABLESTRING ||
|
||||
type == V_ASN1_UTF8STRING ||
|
||||
type == V_ASN1_IA5STRING ||
|
||||
type == V_ASN1_T61STRING) {
|
||||
if (BIO_write(bio, (char *)bs->data, bs->length) != bs->length) {
|
||||
goto err;
|
||||
}
|
||||
BIO_puts(bio, "\n");
|
||||
} else {
|
||||
BIO_puts(bio, "unable to print attribute\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_EXTENSIONS)) {
|
||||
STACK_OF(X509_EXTENSION) *exts = X509_REQ_get_extensions(x);
|
||||
if (exts) {
|
||||
BIO_printf(bio, "%8sRequested Extensions:\n", "");
|
||||
|
||||
size_t i;
|
||||
for (i = 0; i < sk_X509_EXTENSION_num(exts); i++) {
|
||||
X509_EXTENSION *ex = sk_X509_EXTENSION_value(exts, i);
|
||||
if (BIO_printf(bio, "%12s", "") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
ASN1_OBJECT *obj = X509_EXTENSION_get_object(ex);
|
||||
i2a_ASN1_OBJECT(bio, obj);
|
||||
const int is_critical = X509_EXTENSION_get_critical(ex);
|
||||
if (BIO_printf(bio, ": %s\n", is_critical ? "critical" : "") <= 0) {
|
||||
goto err;
|
||||
}
|
||||
if (!X509V3_EXT_print(bio, ex, cflag, 16)) {
|
||||
BIO_printf(bio, "%16s", "");
|
||||
ASN1_STRING_print(bio, X509_EXTENSION_get_data(ex));
|
||||
}
|
||||
if (BIO_write(bio, "\n", 1) <= 0) {
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
sk_X509_EXTENSION_pop_free(exts, X509_EXTENSION_free);
|
||||
}
|
||||
}
|
||||
|
||||
if (!(cflag & X509_FLAG_NO_SIGDUMP) &&
|
||||
!X509_signature_print(bio, x->sig_alg, x->signature)) {
|
||||
goto err;
|
||||
}
|
||||
|
||||
return 1;
|
||||
|
||||
err:
|
||||
OPENSSL_PUT_ERROR(X509, ERR_R_BUF_LIB);
|
||||
return 0;
|
||||
}
|
||||
|
||||
int X509_REQ_print(BIO *bio, X509_REQ *req) {
|
||||
return X509_REQ_print_ex(bio, req, XN_FLAG_COMPAT, X509_FLAG_COMPAT);
|
||||
}
|
506
external/boringssl/crypto/x509/t_x509.c
vendored
Normal file
506
external/boringssl/crypto/x509/t_x509.c
vendored
Normal file
File diff suppressed because it is too large
Load Diff
111
external/boringssl/crypto/x509/t_x509a.c
vendored
Normal file
111
external/boringssl/crypto/x509/t_x509a.c
vendored
Normal file
@@ -0,0 +1,111 @@
|
||||
/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com)
|
||||
* All rights reserved.
|
||||
*
|
||||
* This package is an SSL implementation written
|
||||
* by Eric Young (eay@cryptsoft.com).
|
||||
* The implementation was written so as to conform with Netscapes SSL.
|
||||
*
|
||||
* This library is free for commercial and non-commercial use as long as
|
||||
* the following conditions are aheared to. The following conditions
|
||||
* apply to all code found in this distribution, be it the RC4, RSA,
|
||||
* lhash, DES, etc., code; not just the SSL code. The SSL documentation
|
||||
* included with this distribution is covered by the same copyright terms
|
||||
* except that the holder is Tim Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
* Copyright remains Eric Young's, and as such any Copyright notices in
|
||||
* the code are not to be removed.
|
||||
* If this package is used in a product, Eric Young should be given attribution
|
||||
* as the author of the parts of the library used.
|
||||
* This can be in the form of a textual message at program startup or
|
||||
* in documentation (online or textual) provided with the package.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* "This product includes cryptographic software written by
|
||||
* Eric Young (eay@cryptsoft.com)"
|
||||
* The word 'cryptographic' can be left out if the rouines from the library
|
||||
* being used are not cryptographic related :-).
|
||||
* 4. If you include any Windows specific code (or a derivative thereof) from
|
||||
* the apps directory (application code) you must include an acknowledgement:
|
||||
* "This product includes software written by Tim Hudson (tjh@cryptsoft.com)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* The licence and distribution terms for any publically available version or
|
||||
* derivative of this code cannot be changed. i.e. this code cannot simply be
|
||||
* copied and put under another distribution licence
|
||||
* [including the GNU Public Licence.] */
|
||||
|
||||
#include <openssl/asn1.h>
|
||||
#include <openssl/bio.h>
|
||||
#include <openssl/mem.h>
|
||||
#include <openssl/obj.h>
|
||||
#include <openssl/x509.h>
|
||||
|
||||
/* X509_CERT_AUX and string set routines */
|
||||
|
||||
int X509_CERT_AUX_print(BIO *out, X509_CERT_AUX *aux, int indent)
|
||||
{
|
||||
char oidstr[80], first;
|
||||
size_t i;
|
||||
int j;
|
||||
if (!aux)
|
||||
return 1;
|
||||
if (aux->trust) {
|
||||
first = 1;
|
||||
BIO_printf(out, "%*sTrusted Uses:\n%*s", indent, "", indent + 2, "");
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(aux->trust); i++) {
|
||||
if (!first)
|
||||
BIO_puts(out, ", ");
|
||||
else
|
||||
first = 0;
|
||||
OBJ_obj2txt(oidstr, sizeof oidstr,
|
||||
sk_ASN1_OBJECT_value(aux->trust, i), 0);
|
||||
BIO_puts(out, oidstr);
|
||||
}
|
||||
BIO_puts(out, "\n");
|
||||
} else
|
||||
BIO_printf(out, "%*sNo Trusted Uses.\n", indent, "");
|
||||
if (aux->reject) {
|
||||
first = 1;
|
||||
BIO_printf(out, "%*sRejected Uses:\n%*s", indent, "", indent + 2, "");
|
||||
for (i = 0; i < sk_ASN1_OBJECT_num(aux->reject); i++) {
|
||||
if (!first)
|
||||
BIO_puts(out, ", ");
|
||||
else
|
||||
first = 0;
|
||||
OBJ_obj2txt(oidstr, sizeof oidstr,
|
||||
sk_ASN1_OBJECT_value(aux->reject, i), 0);
|
||||
BIO_puts(out, oidstr);
|
||||
}
|
||||
BIO_puts(out, "\n");
|
||||
} else
|
||||
BIO_printf(out, "%*sNo Rejected Uses.\n", indent, "");
|
||||
if (aux->alias)
|
||||
BIO_printf(out, "%*sAlias: %s\n", indent, "", aux->alias->data);
|
||||
if (aux->keyid) {
|
||||
BIO_printf(out, "%*sKey Id: ", indent, "");
|
||||
for (j = 0; j < aux->keyid->length; j++)
|
||||
BIO_printf(out, "%s%02X", j ? ":" : "", aux->keyid->data[j]);
|
||||
BIO_write(out, "\n", 1);
|
||||
}
|
||||
return 1;
|
||||
}
|
70
external/boringssl/crypto/x509/vpm_int.h
vendored
Normal file
70
external/boringssl/crypto/x509/vpm_int.h
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
/* vpm_int.h */
|
||||
/*
|
||||
* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL project
|
||||
* 2013.
|
||||
*/
|
||||
/* ====================================================================
|
||||
* Copyright (c) 2013 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* licensing@OpenSSL.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
|
||||
/* internal only structure to hold additional X509_VERIFY_PARAM data */
|
||||
|
||||
struct X509_VERIFY_PARAM_ID_st {
|
||||
STACK_OF(OPENSSL_STRING) *hosts; /* Set of acceptable names */
|
||||
unsigned int hostflags; /* Flags to control matching features */
|
||||
char *peername; /* Matching hostname in peer certificate */
|
||||
char *email; /* If not NULL email address to match */
|
||||
size_t emaillen;
|
||||
unsigned char *ip; /* If not NULL IP address to match */
|
||||
size_t iplen; /* Length of IP address */
|
||||
};
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user