Latest update.
This commit is contained in:
@@ -59,6 +59,9 @@ struct async_wait_ctx_st {
|
||||
struct fd_lookup_st *fds;
|
||||
size_t numadd;
|
||||
size_t numdel;
|
||||
ASYNC_callback_fn callback;
|
||||
void *callback_arg;
|
||||
int status;
|
||||
};
|
||||
|
||||
DEFINE_STACK_OF(ASYNC_JOB)
|
||||
|
||||
@@ -182,6 +182,41 @@ int ASYNC_WAIT_CTX_clear_fd(ASYNC_WAIT_CTX *ctx, const void *key)
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ASYNC_WAIT_CTX_set_callback(ASYNC_WAIT_CTX *ctx,
|
||||
ASYNC_callback_fn callback,
|
||||
void *callback_arg)
|
||||
{
|
||||
if (ctx == NULL)
|
||||
return 0;
|
||||
|
||||
ctx->callback = callback;
|
||||
ctx->callback_arg = callback_arg;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ASYNC_WAIT_CTX_get_callback(ASYNC_WAIT_CTX *ctx,
|
||||
ASYNC_callback_fn *callback,
|
||||
void **callback_arg)
|
||||
{
|
||||
if (ctx->callback == NULL)
|
||||
return 0;
|
||||
|
||||
*callback = ctx->callback;
|
||||
*callback_arg = ctx->callback_arg;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ASYNC_WAIT_CTX_set_status(ASYNC_WAIT_CTX *ctx, int status)
|
||||
{
|
||||
ctx->status = status;
|
||||
return 1;
|
||||
}
|
||||
|
||||
int ASYNC_WAIT_CTX_get_status(ASYNC_WAIT_CTX *ctx)
|
||||
{
|
||||
return ctx->status;
|
||||
}
|
||||
|
||||
void async_wait_ctx_reset_counts(ASYNC_WAIT_CTX *ctx)
|
||||
{
|
||||
struct fd_lookup_st *curr, *prev = NULL;
|
||||
|
||||
@@ -782,7 +782,12 @@ int BIO_lookup_ex(const char *host, const char *service, int lookup_type,
|
||||
* anyway [above getaddrinfo/gai_strerror is]. We just let
|
||||
* system administrator figure this out...
|
||||
*/
|
||||
# if defined(OPENSSL_SYS_VXWORKS)
|
||||
/* h_errno doesn't exist on VxWorks */
|
||||
SYSerr(SYS_F_GETHOSTBYNAME, 1000 );
|
||||
# else
|
||||
SYSerr(SYS_F_GETHOSTBYNAME, 1000 + h_errno);
|
||||
# endif
|
||||
#else
|
||||
SYSerr(SYS_F_GETHOSTBYNAME, WSAGetLastError());
|
||||
#endif
|
||||
|
||||
+14
-10
@@ -20,7 +20,7 @@ static long mem_ctrl(BIO *h, int cmd, long arg1, void *arg2);
|
||||
static int mem_new(BIO *h);
|
||||
static int secmem_new(BIO *h);
|
||||
static int mem_free(BIO *data);
|
||||
static int mem_buf_free(BIO *data, int free_all);
|
||||
static int mem_buf_free(BIO *data);
|
||||
static int mem_buf_sync(BIO *h);
|
||||
|
||||
static const BIO_METHOD mem_method = {
|
||||
@@ -140,10 +140,20 @@ static int secmem_new(BIO *bi)
|
||||
|
||||
static int mem_free(BIO *a)
|
||||
{
|
||||
return mem_buf_free(a, 1);
|
||||
BIO_BUF_MEM *bb;
|
||||
|
||||
if (a == NULL)
|
||||
return 0;
|
||||
|
||||
bb = (BIO_BUF_MEM *)a->ptr;
|
||||
if (!mem_buf_free(a))
|
||||
return 0;
|
||||
OPENSSL_free(bb->readp);
|
||||
OPENSSL_free(bb);
|
||||
return 1;
|
||||
}
|
||||
|
||||
static int mem_buf_free(BIO *a, int free_all)
|
||||
static int mem_buf_free(BIO *a)
|
||||
{
|
||||
if (a == NULL)
|
||||
return 0;
|
||||
@@ -155,11 +165,6 @@ static int mem_buf_free(BIO *a, int free_all)
|
||||
if (a->flags & BIO_FLAGS_MEM_RDONLY)
|
||||
b->data = NULL;
|
||||
BUF_MEM_free(b);
|
||||
if (free_all) {
|
||||
OPENSSL_free(bb->readp);
|
||||
OPENSSL_free(bb);
|
||||
}
|
||||
a->ptr = NULL;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
@@ -266,11 +271,10 @@ static long mem_ctrl(BIO *b, int cmd, long num, void *ptr)
|
||||
}
|
||||
break;
|
||||
case BIO_C_SET_BUF_MEM:
|
||||
mem_buf_free(b, 0);
|
||||
mem_buf_free(b);
|
||||
b->shutdown = (int)num;
|
||||
bbm->buf = ptr;
|
||||
*bbm->readp = *bbm->buf;
|
||||
b->ptr = bbm;
|
||||
break;
|
||||
case BIO_C_GET_BUF_MEM_PTR:
|
||||
if (ptr != NULL) {
|
||||
|
||||
+1
-1
@@ -40,7 +40,7 @@ BIGNUM *BN_generate_prime(BIGNUM *ret, int bits, int safe,
|
||||
goto err;
|
||||
|
||||
/* we have a prime :-) */
|
||||
return ret;
|
||||
return rnd;
|
||||
err:
|
||||
BN_free(rnd);
|
||||
return NULL;
|
||||
|
||||
+1
-1
@@ -5,7 +5,7 @@ SUBDIRS=objects buffer bio stack lhash rand evp asn1 pem x509 x509v3 conf \
|
||||
md2 md4 md5 sha mdc2 gmac hmac ripemd whrlpool poly1305 blake2 \
|
||||
siphash sm3 des aes rc2 rc4 rc5 idea aria bf cast camellia \
|
||||
seed sm4 chacha modes bn ec rsa dsa dh sm2 dso engine \
|
||||
err comp ocsp cms ts srp cmac ct async kmac
|
||||
err comp ocsp cms ts srp cmac ct async kmac ess
|
||||
|
||||
LIBS=../libcrypto
|
||||
SOURCE[../libcrypto]=\
|
||||
|
||||
@@ -27,6 +27,10 @@ static const ERR_STRING_DATA CMS_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNER, 0), "CMS_add1_signer"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNINGTIME, 0),
|
||||
"cms_add1_signingTime"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNING_CERT, 0),
|
||||
"CMS_add1_signing_cert"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_ADD1_SIGNING_CERT_V2, 0),
|
||||
"CMS_add1_signing_cert_v2"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_COMPRESS, 0), "CMS_compress"},
|
||||
{ERR_PACK(ERR_LIB_CMS, CMS_F_CMS_COMPRESSEDDATA_CREATE, 0),
|
||||
"cms_CompressedData_create"},
|
||||
|
||||
+71
-2
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2008-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2008-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -14,11 +14,13 @@
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/cms.h>
|
||||
#include <openssl/ess.h>
|
||||
#include "cms_lcl.h"
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS(CMS_ReceiptRequest)
|
||||
|
||||
/* ESS services: for now just Signed Receipt related */
|
||||
/* ESS services */
|
||||
|
||||
int CMS_get1_ReceiptRequest(CMS_SignerInfo *si, CMS_ReceiptRequest **prr)
|
||||
{
|
||||
@@ -335,3 +337,70 @@ ASN1_OCTET_STRING *cms_encode_Receipt(CMS_SignerInfo *si)
|
||||
CMS_ReceiptRequest_free(rr);
|
||||
return os;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add signer certificate's V2 digest to a SignerInfo
|
||||
* structure
|
||||
*/
|
||||
|
||||
int CMS_add1_signing_cert_v2(CMS_SignerInfo *si,
|
||||
ESS_SIGNING_CERT_V2 *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp;
|
||||
int len;
|
||||
|
||||
/* Add SigningCertificateV2 signed attribute to the signer info. */
|
||||
len = i2d_ESS_SIGNING_CERT_V2(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL)
|
||||
goto err;
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT_V2(sc, &p);
|
||||
if (!(seq = ASN1_STRING_new()) || !ASN1_STRING_set(seq, pp, len))
|
||||
goto err;
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_signingCertificateV2,
|
||||
V_ASN1_SEQUENCE, seq, -1))
|
||||
goto err;
|
||||
ASN1_STRING_free(seq);
|
||||
return 1;
|
||||
err:
|
||||
CMSerr(CMS_F_CMS_ADD1_SIGNING_CERT_V2, ERR_R_MALLOC_FAILURE);
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Add signer certificate's digest to a SignerInfo
|
||||
* structure
|
||||
*/
|
||||
|
||||
int CMS_add1_signing_cert(CMS_SignerInfo *si, ESS_SIGNING_CERT *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp;
|
||||
int len;
|
||||
|
||||
/* Add SigningCertificate signed attribute to the signer info. */
|
||||
len = i2d_ESS_SIGNING_CERT(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL)
|
||||
goto err;
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT(sc, &p);
|
||||
if (!(seq = ASN1_STRING_new()) || !ASN1_STRING_set(seq, pp, len))
|
||||
goto err;
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
if (!CMS_signed_add1_attr_by_NID(si, NID_id_smime_aa_signingCertificate,
|
||||
V_ASN1_SEQUENCE, seq, -1))
|
||||
goto err;
|
||||
ASN1_STRING_free(seq);
|
||||
return 1;
|
||||
err:
|
||||
CMSerr(CMS_F_CMS_ADD1_SIGNING_CERT, ERR_R_MALLOC_FAILURE);
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
@@ -332,6 +332,27 @@ CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
|
||||
!CMS_SignerInfo_sign(si))
|
||||
goto err;
|
||||
}
|
||||
if (flags & CMS_CADES) {
|
||||
ESS_SIGNING_CERT *sc = NULL;
|
||||
ESS_SIGNING_CERT_V2 *sc2 = NULL;
|
||||
int add_sc;
|
||||
|
||||
if (md == EVP_sha1() || md == NULL) {
|
||||
if ((sc = ESS_SIGNING_CERT_new_init(signer,
|
||||
NULL, 1)) == NULL)
|
||||
goto err;
|
||||
add_sc = CMS_add1_signing_cert(si, sc);
|
||||
ESS_SIGNING_CERT_free(sc);
|
||||
} else {
|
||||
if ((sc2 = ESS_SIGNING_CERT_V2_new_init(md, signer,
|
||||
NULL, 1)) == NULL)
|
||||
goto err;
|
||||
add_sc = CMS_add1_signing_cert_v2(si, sc2);
|
||||
ESS_SIGNING_CERT_V2_free(sc2);
|
||||
}
|
||||
if (!add_sc)
|
||||
goto err;
|
||||
}
|
||||
}
|
||||
|
||||
if (!(flags & CMS_NOCERTS)) {
|
||||
|
||||
@@ -460,4 +460,14 @@ uint32_t OPENSSL_rdtsc(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t OPENSSL_instrument_bus(unsigned int *out, size_t cnt)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t OPENSSL_instrument_bus2(unsigned int *out, size_t cnt, size_t max)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
+16
-3
@@ -64,6 +64,7 @@ static ERR_STRING_DATA ERR_str_libraries[] = {
|
||||
{ERR_PACK(ERR_LIB_KDF, 0, 0), "KDF routines"},
|
||||
{ERR_PACK(ERR_LIB_OSSL_STORE, 0, 0), "STORE routines"},
|
||||
{ERR_PACK(ERR_LIB_SM2, 0, 0), "SM2 routines"},
|
||||
{ERR_PACK(ERR_LIB_ESS, 0, 0), "ESS routines"},
|
||||
{0, NULL},
|
||||
};
|
||||
|
||||
@@ -790,20 +791,31 @@ int ERR_get_next_error_library(void)
|
||||
return ret;
|
||||
}
|
||||
|
||||
void ERR_set_error_data(char *data, int flags)
|
||||
static int err_set_error_data_int(char *data, int flags)
|
||||
{
|
||||
ERR_STATE *es;
|
||||
int i;
|
||||
|
||||
es = ERR_get_state();
|
||||
if (es == NULL)
|
||||
return;
|
||||
return 0;
|
||||
|
||||
i = es->top;
|
||||
|
||||
err_clear_data(es, i);
|
||||
es->err_data[i] = data;
|
||||
es->err_data_flags[i] = flags;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
void ERR_set_error_data(char *data, int flags)
|
||||
{
|
||||
/*
|
||||
* This function is void so we cannot propagate the error return. Since it
|
||||
* is also in the public API we can't change the return type.
|
||||
*/
|
||||
err_set_error_data_int(data, flags);
|
||||
}
|
||||
|
||||
void ERR_add_error_data(int num, ...)
|
||||
@@ -843,7 +855,8 @@ void ERR_add_error_vdata(int num, va_list args)
|
||||
}
|
||||
OPENSSL_strlcat(str, a, (size_t)s + 1);
|
||||
}
|
||||
ERR_set_error_data(str, ERR_TXT_MALLOCED | ERR_TXT_STRING);
|
||||
if (!err_set_error_data_int(str, ERR_TXT_MALLOCED | ERR_TXT_STRING))
|
||||
OPENSSL_free(str);
|
||||
}
|
||||
|
||||
int ERR_set_mark(void)
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
#include <openssl/asyncerr.h>
|
||||
#include <openssl/kdferr.h>
|
||||
#include <openssl/storeerr.h>
|
||||
#include <openssl/esserr.h>
|
||||
|
||||
int err_load_crypto_strings_int(void)
|
||||
{
|
||||
@@ -91,6 +92,7 @@ int err_load_crypto_strings_int(void)
|
||||
# ifndef OPENSSL_NO_CT
|
||||
ERR_load_CT_strings() == 0 ||
|
||||
# endif
|
||||
ERR_load_ESS_strings() == 0 ||
|
||||
ERR_load_ASYNC_strings() == 0 ||
|
||||
#endif
|
||||
ERR_load_KDF_strings() == 0 ||
|
||||
|
||||
@@ -34,6 +34,7 @@ L ASYNC include/openssl/async.h crypto/async/async_err.c
|
||||
L KDF include/openssl/kdf.h crypto/kdf/kdf_err.c
|
||||
L SM2 crypto/include/internal/sm2.h crypto/sm2/sm2_err.c
|
||||
L OSSL_STORE include/openssl/store.h crypto/store/store_err.c
|
||||
L ESS include/openssl/ess.h crypto/ess/ess_err.c
|
||||
|
||||
# additional header files to be scanned for function names
|
||||
L NONE include/openssl/x509_vfy.h NONE
|
||||
|
||||
+12
-7
@@ -1,4 +1,4 @@
|
||||
# Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
# Copyright 1999-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
#
|
||||
# Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
# this file except in compliance with the License. You can obtain a copy
|
||||
@@ -242,6 +242,8 @@ CMS_F_CMS_ADD1_RECEIPTREQUEST:158:CMS_add1_ReceiptRequest
|
||||
CMS_F_CMS_ADD1_RECIPIENT_CERT:101:CMS_add1_recipient_cert
|
||||
CMS_F_CMS_ADD1_SIGNER:102:CMS_add1_signer
|
||||
CMS_F_CMS_ADD1_SIGNINGTIME:103:cms_add1_signingTime
|
||||
CMS_F_CMS_ADD1_SIGNING_CERT:181:CMS_add1_signing_cert
|
||||
CMS_F_CMS_ADD1_SIGNING_CERT_V2:182:CMS_add1_signing_cert_v2
|
||||
CMS_F_CMS_COMPRESS:104:CMS_compress
|
||||
CMS_F_CMS_COMPRESSEDDATA_CREATE:105:cms_CompressedData_create
|
||||
CMS_F_CMS_COMPRESSEDDATA_INIT_BIO:106:cms_CompressedData_init_bio
|
||||
@@ -709,6 +711,12 @@ ENGINE_F_INT_CTRL_HELPER:172:int_ctrl_helper
|
||||
ENGINE_F_INT_ENGINE_CONFIGURE:188:int_engine_configure
|
||||
ENGINE_F_INT_ENGINE_MODULE_INIT:187:int_engine_module_init
|
||||
ENGINE_F_OSSL_HMAC_INIT:200:ossl_hmac_init
|
||||
ESS_F_ESS_CERT_ID_NEW_INIT:100:ESS_CERT_ID_new_init
|
||||
ESS_F_ESS_CERT_ID_V2_NEW_INIT:101:ESS_CERT_ID_V2_new_init
|
||||
ESS_F_ESS_SIGNING_CERT_ADD:104:ESS_SIGNING_CERT_add
|
||||
ESS_F_ESS_SIGNING_CERT_NEW_INIT:102:ESS_SIGNING_CERT_new_init
|
||||
ESS_F_ESS_SIGNING_CERT_V2_ADD:105:ESS_SIGNING_CERT_V2_add
|
||||
ESS_F_ESS_SIGNING_CERT_V2_NEW_INIT:103:ESS_SIGNING_CERT_V2_new_init
|
||||
EVP_F_AESNI_INIT_KEY:165:aesni_init_key
|
||||
EVP_F_AES_GCM_CTRL:196:aes_gcm_ctrl
|
||||
EVP_F_AES_GCM_TLS_CIPHER:207:aes_gcm_tls_cipher
|
||||
@@ -1558,12 +1566,6 @@ SSL_F_WPACKET_START_SUB_PACKET_LEN__:634:WPACKET_start_sub_packet_len__
|
||||
SSL_F_WRITE_STATE_MACHINE:586:write_state_machine
|
||||
TS_F_DEF_SERIAL_CB:110:def_serial_cb
|
||||
TS_F_DEF_TIME_CB:111:def_time_cb
|
||||
TS_F_ESS_ADD_SIGNING_CERT:112:ess_add_signing_cert
|
||||
TS_F_ESS_ADD_SIGNING_CERT_V2:147:ess_add_signing_cert_v2
|
||||
TS_F_ESS_CERT_ID_NEW_INIT:113:ess_CERT_ID_new_init
|
||||
TS_F_ESS_CERT_ID_V2_NEW_INIT:156:ess_cert_id_v2_new_init
|
||||
TS_F_ESS_SIGNING_CERT_NEW_INIT:114:ess_SIGNING_CERT_new_init
|
||||
TS_F_ESS_SIGNING_CERT_V2_NEW_INIT:157:ess_signing_cert_v2_new_init
|
||||
TS_F_INT_TS_RESP_VERIFY_TOKEN:149:int_ts_RESP_verify_token
|
||||
TS_F_PKCS7_TO_TS_TST_INFO:148:PKCS7_to_TS_TST_INFO
|
||||
TS_F_TS_ACCURACY_SET_MICROS:115:TS_ACCURACY_set_micros
|
||||
@@ -2223,6 +2225,9 @@ ENGINE_R_UNIMPLEMENTED_CIPHER:146:unimplemented cipher
|
||||
ENGINE_R_UNIMPLEMENTED_DIGEST:147:unimplemented digest
|
||||
ENGINE_R_UNIMPLEMENTED_PUBLIC_KEY_METHOD:101:unimplemented public key method
|
||||
ENGINE_R_VERSION_INCOMPATIBILITY:145:version incompatibility
|
||||
ESS_R_ESS_SIGNING_CERTIFICATE_ERROR:102:ess signing certificate error
|
||||
ESS_R_ESS_SIGNING_CERT_ADD_ERROR:100:ess signing cert add error
|
||||
ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR:101:ess signing cert v2 add error
|
||||
EVP_R_AES_KEY_SETUP_FAILED:143:aes key setup failed
|
||||
EVP_R_ARIA_KEY_SETUP_FAILED:176:aria key setup failed
|
||||
EVP_R_BAD_DECRYPT:100:bad decrypt
|
||||
|
||||
@@ -0,0 +1,3 @@
|
||||
LIBS=../../libcrypto
|
||||
SOURCE[../../libcrypto]= \
|
||||
ess_lib.c ess_asn1.c ess_err.c
|
||||
@@ -0,0 +1,57 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/asn1t.h>
|
||||
#include <openssl/ess.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
/* ASN1 stuff for ESS Structure */
|
||||
|
||||
ASN1_SEQUENCE(ESS_ISSUER_SERIAL) = {
|
||||
ASN1_SEQUENCE_OF(ESS_ISSUER_SERIAL, issuer, GENERAL_NAME),
|
||||
ASN1_SIMPLE(ESS_ISSUER_SERIAL, serial, ASN1_INTEGER)
|
||||
} static_ASN1_SEQUENCE_END(ESS_ISSUER_SERIAL)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_ISSUER_SERIAL)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_ISSUER_SERIAL)
|
||||
|
||||
ASN1_SEQUENCE(ESS_CERT_ID) = {
|
||||
ASN1_SIMPLE(ESS_CERT_ID, hash, ASN1_OCTET_STRING),
|
||||
ASN1_OPT(ESS_CERT_ID, issuer_serial, ESS_ISSUER_SERIAL)
|
||||
} static_ASN1_SEQUENCE_END(ESS_CERT_ID)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_CERT_ID)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_CERT_ID)
|
||||
|
||||
ASN1_SEQUENCE(ESS_SIGNING_CERT) = {
|
||||
ASN1_SEQUENCE_OF(ESS_SIGNING_CERT, cert_ids, ESS_CERT_ID),
|
||||
ASN1_SEQUENCE_OF_OPT(ESS_SIGNING_CERT, policy_info, POLICYINFO)
|
||||
} static_ASN1_SEQUENCE_END(ESS_SIGNING_CERT)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_SIGNING_CERT)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT)
|
||||
|
||||
ASN1_SEQUENCE(ESS_CERT_ID_V2) = {
|
||||
ASN1_OPT(ESS_CERT_ID_V2, hash_alg, X509_ALGOR),
|
||||
ASN1_SIMPLE(ESS_CERT_ID_V2, hash, ASN1_OCTET_STRING),
|
||||
ASN1_OPT(ESS_CERT_ID_V2, issuer_serial, ESS_ISSUER_SERIAL)
|
||||
} static_ASN1_SEQUENCE_END(ESS_CERT_ID_V2)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_CERT_ID_V2)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2)
|
||||
|
||||
ASN1_SEQUENCE(ESS_SIGNING_CERT_V2) = {
|
||||
ASN1_SEQUENCE_OF(ESS_SIGNING_CERT_V2, cert_ids, ESS_CERT_ID_V2),
|
||||
ASN1_SEQUENCE_OF_OPT(ESS_SIGNING_CERT_V2, policy_info, POLICYINFO)
|
||||
} static_ASN1_SEQUENCE_END(ESS_SIGNING_CERT_V2)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_SIGNING_CERT_V2)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2)
|
||||
@@ -0,0 +1,53 @@
|
||||
/*
|
||||
* Generated by util/mkerr.pl DO NOT EDIT
|
||||
* Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/esserr.h>
|
||||
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
|
||||
static const ERR_STRING_DATA ESS_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_CERT_ID_NEW_INIT, 0),
|
||||
"ESS_CERT_ID_new_init"},
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_CERT_ID_V2_NEW_INIT, 0),
|
||||
"ESS_CERT_ID_V2_new_init"},
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_SIGNING_CERT_ADD, 0),
|
||||
"ESS_SIGNING_CERT_add"},
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_SIGNING_CERT_NEW_INIT, 0),
|
||||
"ESS_SIGNING_CERT_new_init"},
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_SIGNING_CERT_V2_ADD, 0),
|
||||
"ESS_SIGNING_CERT_V2_add"},
|
||||
{ERR_PACK(ERR_LIB_ESS, ESS_F_ESS_SIGNING_CERT_V2_NEW_INIT, 0),
|
||||
"ESS_SIGNING_CERT_V2_new_init"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
static const ERR_STRING_DATA ESS_str_reasons[] = {
|
||||
{ERR_PACK(ERR_LIB_ESS, 0, ESS_R_ESS_SIGNING_CERTIFICATE_ERROR),
|
||||
"ess signing certificate error"},
|
||||
{ERR_PACK(ERR_LIB_ESS, 0, ESS_R_ESS_SIGNING_CERT_ADD_ERROR),
|
||||
"ess signing cert add error"},
|
||||
{ERR_PACK(ERR_LIB_ESS, 0, ESS_R_ESS_SIGNING_CERT_V2_ADD_ERROR),
|
||||
"ess signing cert v2 add error"},
|
||||
{0, NULL}
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
int ERR_load_ESS_strings(void)
|
||||
{
|
||||
#ifndef OPENSSL_NO_ERR
|
||||
if (ERR_func_error_string(ESS_str_functs[0].error) == NULL) {
|
||||
ERR_load_strings_const(ESS_str_functs);
|
||||
ERR_load_strings_const(ESS_str_reasons);
|
||||
}
|
||||
#endif
|
||||
return 1;
|
||||
}
|
||||
@@ -0,0 +1,269 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
#include <string.h>
|
||||
#include <openssl/x509v3.h>
|
||||
#include <openssl/err.h>
|
||||
#include <openssl/ess.h>
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
static ESS_CERT_ID *ESS_CERT_ID_new_init(X509 *cert, int issuer_needed);
|
||||
static ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *cert, int issuer_needed);
|
||||
|
||||
ESS_SIGNING_CERT *ESS_SIGNING_CERT_new_init(X509 *signcert,
|
||||
STACK_OF(X509) *certs,
|
||||
int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID *cid = NULL;
|
||||
ESS_SIGNING_CERT *sc;
|
||||
int i;
|
||||
|
||||
if ((sc = ESS_SIGNING_CERT_new()) == NULL)
|
||||
goto err;
|
||||
if (sc->cert_ids == NULL
|
||||
&& (sc->cert_ids = sk_ESS_CERT_ID_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if ((cid = ESS_CERT_ID_new_init(signcert, issuer_needed)) == NULL
|
||||
|| !sk_ESS_CERT_ID_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
for (i = 0; i < sk_X509_num(certs); ++i) {
|
||||
X509 *cert = sk_X509_value(certs, i);
|
||||
if ((cid = ESS_CERT_ID_new_init(cert, 1)) == NULL
|
||||
|| !sk_ESS_CERT_ID_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
}
|
||||
|
||||
return sc;
|
||||
err:
|
||||
ESS_SIGNING_CERT_free(sc);
|
||||
ESS_CERT_ID_free(cid);
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ESS_CERT_ID *ESS_CERT_ID_new_init(X509 *cert, int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID *cid = NULL;
|
||||
GENERAL_NAME *name = NULL;
|
||||
unsigned char cert_sha1[SHA_DIGEST_LENGTH];
|
||||
|
||||
/* Call for side-effect of computing hash and caching extensions */
|
||||
X509_check_purpose(cert, -1, 0);
|
||||
if ((cid = ESS_CERT_ID_new()) == NULL)
|
||||
goto err;
|
||||
X509_digest(cert, EVP_sha1(), cert_sha1, NULL);
|
||||
if (!ASN1_OCTET_STRING_set(cid->hash, cert_sha1, SHA_DIGEST_LENGTH))
|
||||
goto err;
|
||||
|
||||
/* Setting the issuer/serial if requested. */
|
||||
if (!issuer_needed)
|
||||
return cid;
|
||||
|
||||
if (cid->issuer_serial == NULL
|
||||
&& (cid->issuer_serial = ESS_ISSUER_SERIAL_new()) == NULL)
|
||||
goto err;
|
||||
if ((name = GENERAL_NAME_new()) == NULL)
|
||||
goto err;
|
||||
name->type = GEN_DIRNAME;
|
||||
if ((name->d.dirn = X509_NAME_dup(X509_get_issuer_name(cert))) == NULL)
|
||||
goto err;
|
||||
if (!sk_GENERAL_NAME_push(cid->issuer_serial->issuer, name))
|
||||
goto err;
|
||||
name = NULL; /* Ownership is lost. */
|
||||
ASN1_INTEGER_free(cid->issuer_serial->serial);
|
||||
if (!(cid->issuer_serial->serial =
|
||||
ASN1_INTEGER_dup(X509_get_serialNumber(cert))))
|
||||
goto err;
|
||||
|
||||
return cid;
|
||||
err:
|
||||
GENERAL_NAME_free(name);
|
||||
ESS_CERT_ID_free(cid);
|
||||
ESSerr(ESS_F_ESS_CERT_ID_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *signcert,
|
||||
STACK_OF(X509) *certs,
|
||||
int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID_V2 *cid = NULL;
|
||||
ESS_SIGNING_CERT_V2 *sc;
|
||||
int i;
|
||||
|
||||
if ((sc = ESS_SIGNING_CERT_V2_new()) == NULL)
|
||||
goto err;
|
||||
if ((cid = ESS_CERT_ID_V2_new_init(hash_alg, signcert, issuer_needed)) == NULL)
|
||||
goto err;
|
||||
if (!sk_ESS_CERT_ID_V2_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
cid = NULL;
|
||||
|
||||
for (i = 0; i < sk_X509_num(certs); ++i) {
|
||||
X509 *cert = sk_X509_value(certs, i);
|
||||
|
||||
if ((cid = ESS_CERT_ID_V2_new_init(hash_alg, cert, 1)) == NULL)
|
||||
goto err;
|
||||
if (!sk_ESS_CERT_ID_V2_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
cid = NULL;
|
||||
}
|
||||
|
||||
return sc;
|
||||
err:
|
||||
ESS_SIGNING_CERT_V2_free(sc);
|
||||
ESS_CERT_ID_V2_free(cid);
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_V2_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ESS_CERT_ID_V2 *ESS_CERT_ID_V2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *cert, int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID_V2 *cid;
|
||||
GENERAL_NAME *name = NULL;
|
||||
unsigned char hash[EVP_MAX_MD_SIZE];
|
||||
unsigned int hash_len = sizeof(hash);
|
||||
X509_ALGOR *alg = NULL;
|
||||
|
||||
memset(hash, 0, sizeof(hash));
|
||||
|
||||
if ((cid = ESS_CERT_ID_V2_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
if (hash_alg != EVP_sha256()) {
|
||||
alg = X509_ALGOR_new();
|
||||
if (alg == NULL)
|
||||
goto err;
|
||||
X509_ALGOR_set_md(alg, hash_alg);
|
||||
if (alg->algorithm == NULL)
|
||||
goto err;
|
||||
cid->hash_alg = alg;
|
||||
alg = NULL;
|
||||
} else {
|
||||
cid->hash_alg = NULL;
|
||||
}
|
||||
|
||||
if (!X509_digest(cert, hash_alg, hash, &hash_len))
|
||||
goto err;
|
||||
|
||||
if (!ASN1_OCTET_STRING_set(cid->hash, hash, hash_len))
|
||||
goto err;
|
||||
|
||||
if (!issuer_needed)
|
||||
return cid;
|
||||
|
||||
if ((cid->issuer_serial = ESS_ISSUER_SERIAL_new()) == NULL)
|
||||
goto err;
|
||||
if ((name = GENERAL_NAME_new()) == NULL)
|
||||
goto err;
|
||||
name->type = GEN_DIRNAME;
|
||||
if ((name->d.dirn = X509_NAME_dup(X509_get_issuer_name(cert))) == NULL)
|
||||
goto err;
|
||||
if (!sk_GENERAL_NAME_push(cid->issuer_serial->issuer, name))
|
||||
goto err;
|
||||
name = NULL; /* Ownership is lost. */
|
||||
ASN1_INTEGER_free(cid->issuer_serial->serial);
|
||||
cid->issuer_serial->serial = ASN1_INTEGER_dup(X509_get_serialNumber(cert));
|
||||
if (cid->issuer_serial->serial == NULL)
|
||||
goto err;
|
||||
|
||||
return cid;
|
||||
err:
|
||||
X509_ALGOR_free(alg);
|
||||
GENERAL_NAME_free(name);
|
||||
ESS_CERT_ID_V2_free(cid);
|
||||
ESSerr(ESS_F_ESS_CERT_ID_V2_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ESS_SIGNING_CERT *ESS_SIGNING_CERT_get(PKCS7_SIGNER_INFO *si)
|
||||
{
|
||||
ASN1_TYPE *attr;
|
||||
const unsigned char *p;
|
||||
attr = PKCS7_get_signed_attribute(si, NID_id_smime_aa_signingCertificate);
|
||||
if (!attr)
|
||||
return NULL;
|
||||
p = attr->value.sequence->data;
|
||||
return d2i_ESS_SIGNING_CERT(NULL, &p, attr->value.sequence->length);
|
||||
}
|
||||
|
||||
ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_get(PKCS7_SIGNER_INFO *si)
|
||||
{
|
||||
ASN1_TYPE *attr;
|
||||
const unsigned char *p;
|
||||
|
||||
attr = PKCS7_get_signed_attribute(si, NID_id_smime_aa_signingCertificateV2);
|
||||
if (attr == NULL)
|
||||
return NULL;
|
||||
p = attr->value.sequence->data;
|
||||
return d2i_ESS_SIGNING_CERT_V2(NULL, &p, attr->value.sequence->length);
|
||||
}
|
||||
|
||||
int ESS_SIGNING_CERT_add(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp = NULL;
|
||||
int len;
|
||||
|
||||
len = i2d_ESS_SIGNING_CERT(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL) {
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_ADD, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT(sc, &p);
|
||||
if ((seq = ASN1_STRING_new()) == NULL || !ASN1_STRING_set(seq, pp, len)) {
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_ADD, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
return PKCS7_add_signed_attribute(si,
|
||||
NID_id_smime_aa_signingCertificate,
|
||||
V_ASN1_SEQUENCE, seq);
|
||||
err:
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int ESS_SIGNING_CERT_V2_add(PKCS7_SIGNER_INFO *si,
|
||||
ESS_SIGNING_CERT_V2 *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp = NULL;
|
||||
int len = i2d_ESS_SIGNING_CERT_V2(sc, NULL);
|
||||
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL) {
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_V2_ADD, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT_V2(sc, &p);
|
||||
if ((seq = ASN1_STRING_new()) == NULL || !ASN1_STRING_set(seq, pp, len)) {
|
||||
ESSerr(ESS_F_ESS_SIGNING_CERT_V2_ADD, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
return PKCS7_add_signed_attribute(si,
|
||||
NID_id_smime_aa_signingCertificateV2,
|
||||
V_ASN1_SEQUENCE, seq);
|
||||
err:
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
@@ -25,6 +25,6 @@
|
||||
@macros = ( "DSO_DLFCN" );
|
||||
}
|
||||
join("\n", map { "# define $_" } @macros); -}
|
||||
# define DSO_EXTENSION "{- $target{dso_extension} -}"
|
||||
# define DSO_EXTENSION "{- platform->dsoext() -}"
|
||||
{- output_on() if $disabled{dso} -}
|
||||
#endif
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
* Copyright 2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
* in the file LICENSE in the source distribution or at
|
||||
* https://www.openssl.org/source/license.html
|
||||
*/
|
||||
|
||||
/* internal ESS related stuff */
|
||||
|
||||
ESS_SIGNING_CERT *ESS_SIGNING_CERT_get(PKCS7_SIGNER_INFO *si);
|
||||
int ESS_SIGNING_CERT_add(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc);
|
||||
|
||||
ESS_SIGNING_CERT_V2 *ESS_SIGNING_CERT_V2_get(PKCS7_SIGNER_INFO *si);
|
||||
int ESS_SIGNING_CERT_V2_add(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT_V2 *sc);
|
||||
|
||||
/*-
|
||||
* IssuerSerial ::= SEQUENCE {
|
||||
* issuer GeneralNames,
|
||||
* serialNumber CertificateSerialNumber
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_issuer_serial {
|
||||
STACK_OF(GENERAL_NAME) *issuer;
|
||||
ASN1_INTEGER *serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* ESSCertID ::= SEQUENCE {
|
||||
* certHash Hash,
|
||||
* issuerSerial IssuerSerial OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_cert_id {
|
||||
ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */
|
||||
ESS_ISSUER_SERIAL *issuer_serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* SigningCertificate ::= SEQUENCE {
|
||||
* certs SEQUENCE OF ESSCertID,
|
||||
* policies SEQUENCE OF PolicyInformation OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_signing_cert {
|
||||
STACK_OF(ESS_CERT_ID) *cert_ids;
|
||||
STACK_OF(POLICYINFO) *policy_info;
|
||||
};
|
||||
|
||||
/*-
|
||||
* ESSCertIDv2 ::= SEQUENCE {
|
||||
* hashAlgorithm AlgorithmIdentifier DEFAULT id-sha256,
|
||||
* certHash Hash,
|
||||
* issuerSerial IssuerSerial OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_cert_id_v2_st {
|
||||
X509_ALGOR *hash_alg; /* Default: SHA-256 */
|
||||
ASN1_OCTET_STRING *hash;
|
||||
ESS_ISSUER_SERIAL *issuer_serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* SigningCertificateV2 ::= SEQUENCE {
|
||||
* certs SEQUENCE OF ESSCertIDv2,
|
||||
* policies SEQUENCE OF PolicyInformation OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_signing_cert_v2_st {
|
||||
STACK_OF(ESS_CERT_ID_V2) *cert_ids;
|
||||
STACK_OF(POLICYINFO) *policy_info;
|
||||
};
|
||||
@@ -22,5 +22,7 @@ extern unsigned int OPENSSL_ppccap_P;
|
||||
# define PPC_CRYPTO207 (1<<2)
|
||||
# define PPC_FPU (1<<3)
|
||||
# define PPC_MADD300 (1<<4)
|
||||
# define PPC_MFTB (1<<5)
|
||||
# define PPC_MFSPR268 (1<<6)
|
||||
|
||||
#endif
|
||||
+51
-4
@@ -168,6 +168,45 @@ void OPENSSL_altivec_probe(void);
|
||||
void OPENSSL_crypto207_probe(void);
|
||||
void OPENSSL_madd300_probe(void);
|
||||
|
||||
long OPENSSL_rdtsc_mftb(void);
|
||||
long OPENSSL_rdtsc_mfspr268(void);
|
||||
|
||||
uint32_t OPENSSL_rdtsc(void)
|
||||
{
|
||||
if (OPENSSL_ppccap_P & PPC_MFTB)
|
||||
return OPENSSL_rdtsc_mftb();
|
||||
else if (OPENSSL_ppccap_P & PPC_MFSPR268)
|
||||
return OPENSSL_rdtsc_mfspr268();
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t OPENSSL_instrument_bus_mftb(unsigned int *, size_t);
|
||||
size_t OPENSSL_instrument_bus_mfspr268(unsigned int *, size_t);
|
||||
|
||||
size_t OPENSSL_instrument_bus(unsigned int *out, size_t cnt)
|
||||
{
|
||||
if (OPENSSL_ppccap_P & PPC_MFTB)
|
||||
return OPENSSL_instrument_bus_mftb(out, cnt);
|
||||
else if (OPENSSL_ppccap_P & PPC_MFSPR268)
|
||||
return OPENSSL_instrument_bus_mfspr268(out, cnt);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
size_t OPENSSL_instrument_bus2_mftb(unsigned int *, size_t, size_t);
|
||||
size_t OPENSSL_instrument_bus2_mfspr268(unsigned int *, size_t, size_t);
|
||||
|
||||
size_t OPENSSL_instrument_bus2(unsigned int *out, size_t cnt, size_t max)
|
||||
{
|
||||
if (OPENSSL_ppccap_P & PPC_MFTB)
|
||||
return OPENSSL_instrument_bus2_mftb(out, cnt, max);
|
||||
else if (OPENSSL_ppccap_P & PPC_MFSPR268)
|
||||
return OPENSSL_instrument_bus2_mfspr268(out, cnt, max);
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
#if defined(__GLIBC__) && defined(__GLIBC_PREREQ)
|
||||
# if __GLIBC_PREREQ(2, 16)
|
||||
# include <sys/auxv.h>
|
||||
@@ -300,8 +339,6 @@ void OPENSSL_cpuid_setup(void)
|
||||
if (hwcap & HWCAP_ARCH_3_00) {
|
||||
OPENSSL_ppccap_P |= PPC_MADD300;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -322,15 +359,16 @@ void OPENSSL_cpuid_setup(void)
|
||||
sigprocmask(SIG_SETMASK, &ill_act.sa_mask, &oset);
|
||||
sigaction(SIGILL, &ill_act, &ill_oact);
|
||||
|
||||
#ifndef OSSL_IMPLEMENT_GETAUXVAL
|
||||
if (sigsetjmp(ill_jmp,1) == 0) {
|
||||
OPENSSL_fpu_probe();
|
||||
OPENSSL_ppccap_P |= PPC_FPU;
|
||||
|
||||
if (sizeof(size_t) == 4) {
|
||||
#ifdef __linux
|
||||
# ifdef __linux
|
||||
struct utsname uts;
|
||||
if (uname(&uts) == 0 && strcmp(uts.machine, "ppc64") == 0)
|
||||
#endif
|
||||
# endif
|
||||
if (sigsetjmp(ill_jmp, 1) == 0) {
|
||||
OPENSSL_ppc64_probe();
|
||||
OPENSSL_ppccap_P |= PPC_FPU64;
|
||||
@@ -355,6 +393,15 @@ void OPENSSL_cpuid_setup(void)
|
||||
OPENSSL_madd300_probe();
|
||||
OPENSSL_ppccap_P |= PPC_MADD300;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (sigsetjmp(ill_jmp, 1) == 0) {
|
||||
OPENSSL_rdtsc_mftb();
|
||||
OPENSSL_ppccap_P |= PPC_MFTB;
|
||||
} else if (sigsetjmp(ill_jmp, 1) == 0) {
|
||||
OPENSSL_rdtsc_mfspr268();
|
||||
OPENSSL_ppccap_P |= PPC_MFSPR268;
|
||||
}
|
||||
|
||||
sigaction(SIGILL, &ill_oact, NULL);
|
||||
sigprocmask(SIG_SETMASK, &oset, NULL);
|
||||
|
||||
+102
-21
@@ -124,26 +124,23 @@ Ladd: lwarx r5,0,r3
|
||||
.long 0
|
||||
.size .OPENSSL_atomic_add,.-.OPENSSL_atomic_add
|
||||
|
||||
.globl .OPENSSL_rdtsc
|
||||
.globl .OPENSSL_rdtsc_mftb
|
||||
.align 4
|
||||
.OPENSSL_rdtsc:
|
||||
___
|
||||
$code.=<<___ if ($flavour =~ /64/);
|
||||
.OPENSSL_rdtsc_mftb:
|
||||
mftb r3
|
||||
___
|
||||
$code.=<<___ if ($flavour !~ /64/);
|
||||
Loop_rdtsc:
|
||||
mftbu r5
|
||||
mftb r3
|
||||
mftbu r4
|
||||
cmplw r4,r5
|
||||
bne Loop_rdtsc
|
||||
___
|
||||
$code.=<<___;
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,0,0
|
||||
.size .OPENSSL_rdtsc,.-.OPENSSL_rdtsc
|
||||
.size .OPENSSL_rdtsc_mftb,.-.OPENSSL_rdtsc_mftb
|
||||
|
||||
.globl .OPENSSL_rdtsc_mfspr268
|
||||
.align 4
|
||||
.OPENSSL_rdtsc_mfspr268:
|
||||
mfspr r3,268
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,0,0
|
||||
.size .OPENSSL_rdtsc_mfspr268,.-.OPENSSL_rdtsc_mfspr268
|
||||
|
||||
.globl .OPENSSL_cleanse
|
||||
.align 4
|
||||
@@ -210,9 +207,9 @@ my ($tick,$lasttick)=("r6","r7");
|
||||
my ($diff,$lastdiff)=("r8","r9");
|
||||
|
||||
$code.=<<___;
|
||||
.globl .OPENSSL_instrument_bus
|
||||
.globl .OPENSSL_instrument_bus_mftb
|
||||
.align 4
|
||||
.OPENSSL_instrument_bus:
|
||||
.OPENSSL_instrument_bus_mftb:
|
||||
mtctr $cnt
|
||||
|
||||
mftb $lasttick # collect 1st tick
|
||||
@@ -240,11 +237,11 @@ Loop: mftb $tick
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,2,0
|
||||
.long 0
|
||||
.size .OPENSSL_instrument_bus,.-.OPENSSL_instrument_bus
|
||||
.size .OPENSSL_instrument_bus_mftb,.-.OPENSSL_instrument_bus_mftb
|
||||
|
||||
.globl .OPENSSL_instrument_bus2
|
||||
.globl .OPENSSL_instrument_bus2_mftb
|
||||
.align 4
|
||||
.OPENSSL_instrument_bus2:
|
||||
.OPENSSL_instrument_bus2_mftb:
|
||||
mr r0,$cnt
|
||||
slwi $cnt,$cnt,2
|
||||
|
||||
@@ -292,7 +289,91 @@ Ldone2:
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,3,0
|
||||
.long 0
|
||||
.size .OPENSSL_instrument_bus2,.-.OPENSSL_instrument_bus2
|
||||
.size .OPENSSL_instrument_bus2_mftb,.-.OPENSSL_instrument_bus2_mftb
|
||||
|
||||
.globl .OPENSSL_instrument_bus_mfspr268
|
||||
.align 4
|
||||
.OPENSSL_instrument_bus_mfspr268:
|
||||
mtctr $cnt
|
||||
|
||||
mfspr $lasttick,268 # collect 1st tick
|
||||
li $diff,0
|
||||
|
||||
dcbf 0,$out # flush cache line
|
||||
lwarx $tick,0,$out # load and lock
|
||||
add $tick,$tick,$diff
|
||||
stwcx. $tick,0,$out
|
||||
stwx $tick,0,$out
|
||||
|
||||
Loop3: mfspr $tick,268
|
||||
sub $diff,$tick,$lasttick
|
||||
mr $lasttick,$tick
|
||||
dcbf 0,$out # flush cache line
|
||||
lwarx $tick,0,$out # load and lock
|
||||
add $tick,$tick,$diff
|
||||
stwcx. $tick,0,$out
|
||||
stwx $tick,0,$out
|
||||
addi $out,$out,4 # ++$out
|
||||
bdnz Loop3
|
||||
|
||||
mr r3,$cnt
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,2,0
|
||||
.long 0
|
||||
.size .OPENSSL_instrument_bus_mfspr268,.-.OPENSSL_instrument_bus_mfspr268
|
||||
|
||||
.globl .OPENSSL_instrument_bus2_mfspr268
|
||||
.align 4
|
||||
.OPENSSL_instrument_bus2_mfspr268:
|
||||
mr r0,$cnt
|
||||
slwi $cnt,$cnt,2
|
||||
|
||||
mfspr $lasttick,268 # collect 1st tick
|
||||
li $diff,0
|
||||
|
||||
dcbf 0,$out # flush cache line
|
||||
lwarx $tick,0,$out # load and lock
|
||||
add $tick,$tick,$diff
|
||||
stwcx. $tick,0,$out
|
||||
stwx $tick,0,$out
|
||||
|
||||
mfspr $tick,268 # collect 1st diff
|
||||
sub $diff,$tick,$lasttick
|
||||
mr $lasttick,$tick
|
||||
mr $lastdiff,$diff
|
||||
Loop4:
|
||||
dcbf 0,$out # flush cache line
|
||||
lwarx $tick,0,$out # load and lock
|
||||
add $tick,$tick,$diff
|
||||
stwcx. $tick,0,$out
|
||||
stwx $tick,0,$out
|
||||
|
||||
addic. $max,$max,-1
|
||||
beq Ldone4
|
||||
|
||||
mfspr $tick,268
|
||||
sub $diff,$tick,$lasttick
|
||||
mr $lasttick,$tick
|
||||
cmplw 7,$diff,$lastdiff
|
||||
mr $lastdiff,$diff
|
||||
|
||||
mfcr $tick # pull cr
|
||||
not $tick,$tick # flip bits
|
||||
rlwinm $tick,$tick,1,29,29 # isolate flipped eq bit and scale
|
||||
|
||||
sub. $cnt,$cnt,$tick # conditional --$cnt
|
||||
add $out,$out,$tick # conditional ++$out
|
||||
bne Loop4
|
||||
|
||||
Ldone4:
|
||||
srwi $cnt,$cnt,2
|
||||
sub r3,r0,$cnt
|
||||
blr
|
||||
.long 0
|
||||
.byte 0,12,0x14,0,0,0,3,0
|
||||
.long 0
|
||||
.size .OPENSSL_instrument_bus2_mfspr268,.-.OPENSSL_instrument_bus2_mfspr268
|
||||
___
|
||||
}
|
||||
|
||||
|
||||
@@ -93,6 +93,27 @@ static uint64_t get_timer_bits(void);
|
||||
# error "UEFI and VXWorks only support seeding NONE"
|
||||
#endif
|
||||
|
||||
#if defined(OPENSSL_SYS_VXWORKS)
|
||||
/* empty implementation */
|
||||
int rand_pool_init(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
void rand_pool_cleanup(void)
|
||||
{
|
||||
}
|
||||
|
||||
void rand_pool_keep_random_devices_open(int keep)
|
||||
{
|
||||
}
|
||||
|
||||
size_t rand_pool_acquire_entropy(RAND_POOL *pool)
|
||||
{
|
||||
return rand_pool_entropy_available(pool);
|
||||
}
|
||||
#endif
|
||||
|
||||
#if !(defined(OPENSSL_SYS_WINDOWS) || defined(OPENSSL_SYS_WIN32) \
|
||||
|| defined(OPENSSL_SYS_VMS) || defined(OPENSSL_SYS_VXWORKS) \
|
||||
|| defined(OPENSSL_SYS_UEFI))
|
||||
|
||||
@@ -201,47 +201,6 @@ int i2d_TS_RESP_fp(FILE *fp, TS_RESP *a)
|
||||
}
|
||||
#endif
|
||||
|
||||
ASN1_SEQUENCE(ESS_ISSUER_SERIAL) = {
|
||||
ASN1_SEQUENCE_OF(ESS_ISSUER_SERIAL, issuer, GENERAL_NAME),
|
||||
ASN1_SIMPLE(ESS_ISSUER_SERIAL, serial, ASN1_INTEGER)
|
||||
} static_ASN1_SEQUENCE_END(ESS_ISSUER_SERIAL)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_ISSUER_SERIAL)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_ISSUER_SERIAL)
|
||||
|
||||
ASN1_SEQUENCE(ESS_CERT_ID) = {
|
||||
ASN1_SIMPLE(ESS_CERT_ID, hash, ASN1_OCTET_STRING),
|
||||
ASN1_OPT(ESS_CERT_ID, issuer_serial, ESS_ISSUER_SERIAL)
|
||||
} static_ASN1_SEQUENCE_END(ESS_CERT_ID)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_CERT_ID)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_CERT_ID)
|
||||
|
||||
ASN1_SEQUENCE(ESS_SIGNING_CERT) = {
|
||||
ASN1_SEQUENCE_OF(ESS_SIGNING_CERT, cert_ids, ESS_CERT_ID),
|
||||
ASN1_SEQUENCE_OF_OPT(ESS_SIGNING_CERT, policy_info, POLICYINFO)
|
||||
} static_ASN1_SEQUENCE_END(ESS_SIGNING_CERT)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_SIGNING_CERT)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT)
|
||||
|
||||
ASN1_SEQUENCE(ESS_CERT_ID_V2) = {
|
||||
ASN1_OPT(ESS_CERT_ID_V2, hash_alg, X509_ALGOR),
|
||||
ASN1_SIMPLE(ESS_CERT_ID_V2, hash, ASN1_OCTET_STRING),
|
||||
ASN1_OPT(ESS_CERT_ID_V2, issuer_serial, ESS_ISSUER_SERIAL)
|
||||
} static_ASN1_SEQUENCE_END(ESS_CERT_ID_V2)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_CERT_ID_V2)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_CERT_ID_V2)
|
||||
|
||||
ASN1_SEQUENCE(ESS_SIGNING_CERT_V2) = {
|
||||
ASN1_SEQUENCE_OF(ESS_SIGNING_CERT_V2, cert_ids, ESS_CERT_ID_V2),
|
||||
ASN1_SEQUENCE_OF_OPT(ESS_SIGNING_CERT_V2, policy_info, POLICYINFO)
|
||||
} static_ASN1_SEQUENCE_END(ESS_SIGNING_CERT_V2)
|
||||
|
||||
IMPLEMENT_ASN1_FUNCTIONS_const(ESS_SIGNING_CERT_V2)
|
||||
IMPLEMENT_ASN1_DUP_FUNCTION(ESS_SIGNING_CERT_V2)
|
||||
|
||||
/* Getting encapsulated TS_TST_INFO object from PKCS7. */
|
||||
TS_TST_INFO *PKCS7_to_TS_TST_INFO(PKCS7 *token)
|
||||
{
|
||||
|
||||
+1
-13
@@ -1,6 +1,6 @@
|
||||
/*
|
||||
* Generated by util/mkerr.pl DO NOT EDIT
|
||||
* Copyright 1995-2017 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 1995-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -16,18 +16,6 @@
|
||||
static const ERR_STRING_DATA TS_str_functs[] = {
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_DEF_SERIAL_CB, 0), "def_serial_cb"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_DEF_TIME_CB, 0), "def_time_cb"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_ADD_SIGNING_CERT, 0),
|
||||
"ess_add_signing_cert"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_ADD_SIGNING_CERT_V2, 0),
|
||||
"ess_add_signing_cert_v2"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_CERT_ID_NEW_INIT, 0),
|
||||
"ess_CERT_ID_new_init"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_CERT_ID_V2_NEW_INIT, 0),
|
||||
"ess_cert_id_v2_new_init"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_SIGNING_CERT_NEW_INIT, 0),
|
||||
"ess_SIGNING_CERT_new_init"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_ESS_SIGNING_CERT_V2_NEW_INIT, 0),
|
||||
"ess_signing_cert_v2_new_init"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_INT_TS_RESP_VERIFY_TOKEN, 0),
|
||||
"int_ts_RESP_verify_token"},
|
||||
{ERR_PACK(ERR_LIB_TS, TS_F_PKCS7_TO_TS_TST_INFO, 0),
|
||||
|
||||
@@ -98,67 +98,6 @@ struct TS_status_info_st {
|
||||
ASN1_BIT_STRING *failure_info;
|
||||
};
|
||||
|
||||
/*-
|
||||
* IssuerSerial ::= SEQUENCE {
|
||||
* issuer GeneralNames,
|
||||
* serialNumber CertificateSerialNumber
|
||||
* }
|
||||
*/
|
||||
struct ESS_issuer_serial {
|
||||
STACK_OF(GENERAL_NAME) *issuer;
|
||||
ASN1_INTEGER *serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* ESSCertID ::= SEQUENCE {
|
||||
* certHash Hash,
|
||||
* issuerSerial IssuerSerial OPTIONAL
|
||||
* }
|
||||
*/
|
||||
struct ESS_cert_id {
|
||||
ASN1_OCTET_STRING *hash; /* Always SHA-1 digest. */
|
||||
ESS_ISSUER_SERIAL *issuer_serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* SigningCertificate ::= SEQUENCE {
|
||||
* certs SEQUENCE OF ESSCertID,
|
||||
* policies SEQUENCE OF PolicyInformation OPTIONAL
|
||||
* }
|
||||
*/
|
||||
struct ESS_signing_cert {
|
||||
STACK_OF(ESS_CERT_ID) *cert_ids;
|
||||
STACK_OF(POLICYINFO) *policy_info;
|
||||
};
|
||||
|
||||
/*-
|
||||
* ESSCertIDv2 ::= SEQUENCE {
|
||||
* hashAlgorithm AlgorithmIdentifier
|
||||
* DEFAULT {algorithm id-sha256},
|
||||
* certHash Hash,
|
||||
* issuerSerial IssuerSerial OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_cert_id_v2_st {
|
||||
X509_ALGOR *hash_alg; /* Default: SHA-256 */
|
||||
ASN1_OCTET_STRING *hash;
|
||||
ESS_ISSUER_SERIAL *issuer_serial;
|
||||
};
|
||||
|
||||
/*-
|
||||
* SigningCertificateV2 ::= SEQUENCE {
|
||||
* certs SEQUENCE OF ESSCertIDv2,
|
||||
* policies SEQUENCE OF PolicyInformation OPTIONAL
|
||||
* }
|
||||
*/
|
||||
|
||||
struct ESS_signing_cert_v2_st {
|
||||
STACK_OF(ESS_CERT_ID_V2) *cert_ids;
|
||||
STACK_OF(POLICYINFO) *policy_info;
|
||||
};
|
||||
|
||||
|
||||
struct TS_resp_ctx {
|
||||
X509 *signer_cert;
|
||||
EVP_PKEY *signer_key;
|
||||
|
||||
+7
-243
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2018 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2006-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -15,6 +15,7 @@
|
||||
#include <openssl/pkcs7.h>
|
||||
#include <openssl/crypto.h>
|
||||
#include "ts_lcl.h"
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
static ASN1_INTEGER *def_serial_cb(struct TS_resp_ctx *, void *);
|
||||
static int def_time_cb(struct TS_resp_ctx *, void *, long *sec, long *usec);
|
||||
@@ -29,20 +30,7 @@ static TS_TST_INFO *ts_RESP_create_tst_info(TS_RESP_CTX *ctx,
|
||||
static int ts_RESP_process_extensions(TS_RESP_CTX *ctx);
|
||||
static int ts_RESP_sign(TS_RESP_CTX *ctx);
|
||||
|
||||
static ESS_SIGNING_CERT *ess_SIGNING_CERT_new_init(X509 *signcert,
|
||||
STACK_OF(X509) *certs);
|
||||
static ESS_CERT_ID *ess_CERT_ID_new_init(X509 *cert, int issuer_needed);
|
||||
static int ts_TST_INFO_content_new(PKCS7 *p7);
|
||||
static int ess_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc);
|
||||
|
||||
static ESS_SIGNING_CERT_V2 *ess_signing_cert_v2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *signcert,
|
||||
STACK_OF(X509)
|
||||
*certs);
|
||||
static ESS_CERT_ID_V2 *ess_cert_id_v2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *cert, int issuer_needed);
|
||||
static int ess_add_signing_cert_v2(PKCS7_SIGNER_INFO *si,
|
||||
ESS_SIGNING_CERT_V2 *sc);
|
||||
|
||||
static ASN1_GENERALIZEDTIME
|
||||
*TS_RESP_set_genTime_with_precision(ASN1_GENERALIZEDTIME *, long, long,
|
||||
@@ -681,20 +669,20 @@ static int ts_RESP_sign(TS_RESP_CTX *ctx)
|
||||
certs = ctx->flags & TS_ESS_CERT_ID_CHAIN ? ctx->certs : NULL;
|
||||
if (ctx->ess_cert_id_digest == NULL
|
||||
|| ctx->ess_cert_id_digest == EVP_sha1()) {
|
||||
if ((sc = ess_SIGNING_CERT_new_init(ctx->signer_cert, certs)) == NULL)
|
||||
if ((sc = ESS_SIGNING_CERT_new_init(ctx->signer_cert, certs, 0)) == NULL)
|
||||
goto err;
|
||||
|
||||
if (!ess_add_signing_cert(si, sc)) {
|
||||
if (!ESS_SIGNING_CERT_add(si, sc)) {
|
||||
TSerr(TS_F_TS_RESP_SIGN, TS_R_ESS_ADD_SIGNING_CERT_ERROR);
|
||||
goto err;
|
||||
}
|
||||
} else {
|
||||
sc2 = ess_signing_cert_v2_new_init(ctx->ess_cert_id_digest,
|
||||
ctx->signer_cert, certs);
|
||||
sc2 = ESS_SIGNING_CERT_V2_new_init(ctx->ess_cert_id_digest,
|
||||
ctx->signer_cert, certs, 0);
|
||||
if (sc2 == NULL)
|
||||
goto err;
|
||||
|
||||
if (!ess_add_signing_cert_v2(si, sc2)) {
|
||||
if (!ESS_SIGNING_CERT_V2_add(si, sc2)) {
|
||||
TSerr(TS_F_TS_RESP_SIGN, TS_R_ESS_ADD_SIGNING_CERT_V2_ERROR);
|
||||
goto err;
|
||||
}
|
||||
@@ -731,77 +719,6 @@ static int ts_RESP_sign(TS_RESP_CTX *ctx)
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ESS_SIGNING_CERT *ess_SIGNING_CERT_new_init(X509 *signcert,
|
||||
STACK_OF(X509) *certs)
|
||||
{
|
||||
ESS_CERT_ID *cid;
|
||||
ESS_SIGNING_CERT *sc = NULL;
|
||||
int i;
|
||||
|
||||
if ((sc = ESS_SIGNING_CERT_new()) == NULL)
|
||||
goto err;
|
||||
if (sc->cert_ids == NULL
|
||||
&& (sc->cert_ids = sk_ESS_CERT_ID_new_null()) == NULL)
|
||||
goto err;
|
||||
|
||||
if ((cid = ess_CERT_ID_new_init(signcert, 0)) == NULL
|
||||
|| !sk_ESS_CERT_ID_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
for (i = 0; i < sk_X509_num(certs); ++i) {
|
||||
X509 *cert = sk_X509_value(certs, i);
|
||||
if ((cid = ess_CERT_ID_new_init(cert, 1)) == NULL
|
||||
|| !sk_ESS_CERT_ID_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
}
|
||||
|
||||
return sc;
|
||||
err:
|
||||
ESS_SIGNING_CERT_free(sc);
|
||||
TSerr(TS_F_ESS_SIGNING_CERT_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ESS_CERT_ID *ess_CERT_ID_new_init(X509 *cert, int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID *cid = NULL;
|
||||
GENERAL_NAME *name = NULL;
|
||||
unsigned char cert_sha1[SHA_DIGEST_LENGTH];
|
||||
|
||||
/* Call for side-effect of computing hash and caching extensions */
|
||||
X509_check_purpose(cert, -1, 0);
|
||||
if ((cid = ESS_CERT_ID_new()) == NULL)
|
||||
goto err;
|
||||
X509_digest(cert, EVP_sha1(), cert_sha1, NULL);
|
||||
if (!ASN1_OCTET_STRING_set(cid->hash, cert_sha1, SHA_DIGEST_LENGTH))
|
||||
goto err;
|
||||
|
||||
/* Setting the issuer/serial if requested. */
|
||||
if (issuer_needed) {
|
||||
if (cid->issuer_serial == NULL
|
||||
&& (cid->issuer_serial = ESS_ISSUER_SERIAL_new()) == NULL)
|
||||
goto err;
|
||||
if ((name = GENERAL_NAME_new()) == NULL)
|
||||
goto err;
|
||||
name->type = GEN_DIRNAME;
|
||||
if ((name->d.dirn = X509_NAME_dup(X509_get_issuer_name(cert))) == NULL)
|
||||
goto err;
|
||||
if (!sk_GENERAL_NAME_push(cid->issuer_serial->issuer, name))
|
||||
goto err;
|
||||
name = NULL; /* Ownership is lost. */
|
||||
ASN1_INTEGER_free(cid->issuer_serial->serial);
|
||||
if (!(cid->issuer_serial->serial =
|
||||
ASN1_INTEGER_dup(X509_get_serialNumber(cert))))
|
||||
goto err;
|
||||
}
|
||||
|
||||
return cid;
|
||||
err:
|
||||
GENERAL_NAME_free(name);
|
||||
ESS_CERT_ID_free(cid);
|
||||
TSerr(TS_F_ESS_CERT_ID_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ts_TST_INFO_content_new(PKCS7 *p7)
|
||||
{
|
||||
PKCS7 *ret = NULL;
|
||||
@@ -829,159 +746,6 @@ static int ts_TST_INFO_content_new(PKCS7 *p7)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ess_add_signing_cert(PKCS7_SIGNER_INFO *si, ESS_SIGNING_CERT *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp = NULL;
|
||||
int len;
|
||||
|
||||
len = i2d_ESS_SIGNING_CERT(sc, NULL);
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL) {
|
||||
TSerr(TS_F_ESS_ADD_SIGNING_CERT, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT(sc, &p);
|
||||
if ((seq = ASN1_STRING_new()) == NULL || !ASN1_STRING_set(seq, pp, len)) {
|
||||
TSerr(TS_F_ESS_ADD_SIGNING_CERT, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
return PKCS7_add_signed_attribute(si,
|
||||
NID_id_smime_aa_signingCertificate,
|
||||
V_ASN1_SEQUENCE, seq);
|
||||
err:
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ESS_SIGNING_CERT_V2 *ess_signing_cert_v2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *signcert,
|
||||
STACK_OF(X509) *certs)
|
||||
{
|
||||
ESS_CERT_ID_V2 *cid = NULL;
|
||||
ESS_SIGNING_CERT_V2 *sc = NULL;
|
||||
int i;
|
||||
|
||||
if ((sc = ESS_SIGNING_CERT_V2_new()) == NULL)
|
||||
goto err;
|
||||
if ((cid = ess_cert_id_v2_new_init(hash_alg, signcert, 0)) == NULL)
|
||||
goto err;
|
||||
if (!sk_ESS_CERT_ID_V2_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
cid = NULL;
|
||||
|
||||
for (i = 0; i < sk_X509_num(certs); ++i) {
|
||||
X509 *cert = sk_X509_value(certs, i);
|
||||
|
||||
if ((cid = ess_cert_id_v2_new_init(hash_alg, cert, 1)) == NULL)
|
||||
goto err;
|
||||
if (!sk_ESS_CERT_ID_V2_push(sc->cert_ids, cid))
|
||||
goto err;
|
||||
cid = NULL;
|
||||
}
|
||||
|
||||
return sc;
|
||||
err:
|
||||
ESS_SIGNING_CERT_V2_free(sc);
|
||||
ESS_CERT_ID_V2_free(cid);
|
||||
TSerr(TS_F_ESS_SIGNING_CERT_V2_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static ESS_CERT_ID_V2 *ess_cert_id_v2_new_init(const EVP_MD *hash_alg,
|
||||
X509 *cert, int issuer_needed)
|
||||
{
|
||||
ESS_CERT_ID_V2 *cid = NULL;
|
||||
GENERAL_NAME *name = NULL;
|
||||
unsigned char hash[EVP_MAX_MD_SIZE];
|
||||
unsigned int hash_len = sizeof(hash);
|
||||
X509_ALGOR *alg = NULL;
|
||||
|
||||
memset(hash, 0, sizeof(hash));
|
||||
|
||||
if ((cid = ESS_CERT_ID_V2_new()) == NULL)
|
||||
goto err;
|
||||
|
||||
if (hash_alg != EVP_sha256()) {
|
||||
alg = X509_ALGOR_new();
|
||||
if (alg == NULL)
|
||||
goto err;
|
||||
X509_ALGOR_set_md(alg, hash_alg);
|
||||
if (alg->algorithm == NULL)
|
||||
goto err;
|
||||
cid->hash_alg = alg;
|
||||
alg = NULL;
|
||||
} else {
|
||||
cid->hash_alg = NULL;
|
||||
}
|
||||
|
||||
if (!X509_digest(cert, hash_alg, hash, &hash_len))
|
||||
goto err;
|
||||
|
||||
if (!ASN1_OCTET_STRING_set(cid->hash, hash, hash_len))
|
||||
goto err;
|
||||
|
||||
if (issuer_needed) {
|
||||
if ((cid->issuer_serial = ESS_ISSUER_SERIAL_new()) == NULL)
|
||||
goto err;
|
||||
if ((name = GENERAL_NAME_new()) == NULL)
|
||||
goto err;
|
||||
name->type = GEN_DIRNAME;
|
||||
if ((name->d.dirn = X509_NAME_dup(X509_get_issuer_name(cert))) == NULL)
|
||||
goto err;
|
||||
if (!sk_GENERAL_NAME_push(cid->issuer_serial->issuer, name))
|
||||
goto err;
|
||||
name = NULL; /* Ownership is lost. */
|
||||
ASN1_INTEGER_free(cid->issuer_serial->serial);
|
||||
cid->issuer_serial->serial =
|
||||
ASN1_INTEGER_dup(X509_get_serialNumber(cert));
|
||||
if (cid->issuer_serial->serial == NULL)
|
||||
goto err;
|
||||
}
|
||||
|
||||
return cid;
|
||||
err:
|
||||
X509_ALGOR_free(alg);
|
||||
GENERAL_NAME_free(name);
|
||||
ESS_CERT_ID_V2_free(cid);
|
||||
TSerr(TS_F_ESS_CERT_ID_V2_NEW_INIT, ERR_R_MALLOC_FAILURE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static int ess_add_signing_cert_v2(PKCS7_SIGNER_INFO *si,
|
||||
ESS_SIGNING_CERT_V2 *sc)
|
||||
{
|
||||
ASN1_STRING *seq = NULL;
|
||||
unsigned char *p, *pp = NULL;
|
||||
int len = i2d_ESS_SIGNING_CERT_V2(sc, NULL);
|
||||
|
||||
if ((pp = OPENSSL_malloc(len)) == NULL) {
|
||||
TSerr(TS_F_ESS_ADD_SIGNING_CERT_V2, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
p = pp;
|
||||
i2d_ESS_SIGNING_CERT_V2(sc, &p);
|
||||
if ((seq = ASN1_STRING_new()) == NULL || !ASN1_STRING_set(seq, pp, len)) {
|
||||
TSerr(TS_F_ESS_ADD_SIGNING_CERT_V2, ERR_R_MALLOC_FAILURE);
|
||||
goto err;
|
||||
}
|
||||
|
||||
OPENSSL_free(pp);
|
||||
pp = NULL;
|
||||
return PKCS7_add_signed_attribute(si,
|
||||
NID_id_smime_aa_signingCertificateV2,
|
||||
V_ASN1_SEQUENCE, seq);
|
||||
err:
|
||||
ASN1_STRING_free(seq);
|
||||
OPENSSL_free(pp);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static ASN1_GENERALIZEDTIME *TS_RESP_set_genTime_with_precision(
|
||||
ASN1_GENERALIZEDTIME *asn1_time, long sec, long usec,
|
||||
unsigned precision)
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/*
|
||||
* Copyright 2006-2016 The OpenSSL Project Authors. All Rights Reserved.
|
||||
* Copyright 2006-2019 The OpenSSL Project Authors. All Rights Reserved.
|
||||
*
|
||||
* Licensed under the Apache License 2.0 (the "License"). You may not use
|
||||
* this file except in compliance with the License. You can obtain a copy
|
||||
@@ -13,12 +13,12 @@
|
||||
#include <openssl/ts.h>
|
||||
#include <openssl/pkcs7.h>
|
||||
#include "ts_lcl.h"
|
||||
#include "internal/ess_int.h"
|
||||
|
||||
static int ts_verify_cert(X509_STORE *store, STACK_OF(X509) *untrusted,
|
||||
X509 *signer, STACK_OF(X509) **chain);
|
||||
static int ts_check_signing_certs(PKCS7_SIGNER_INFO *si,
|
||||
STACK_OF(X509) *chain);
|
||||
static ESS_SIGNING_CERT *ess_get_signing_cert(PKCS7_SIGNER_INFO *si);
|
||||
static int ts_find_cert(STACK_OF(ESS_CERT_ID) *cert_ids, X509 *cert);
|
||||
static int ts_issuer_serial_cmp(ESS_ISSUER_SERIAL *is, X509 *cert);
|
||||
static int int_ts_RESP_verify_token(TS_VERIFY_CTX *ctx,
|
||||
@@ -38,7 +38,6 @@ static int ts_check_signer_name(GENERAL_NAME *tsa_name, X509 *signer);
|
||||
static int ts_find_name(STACK_OF(GENERAL_NAME) *gen_names,
|
||||
GENERAL_NAME *name);
|
||||
static int ts_find_cert_v2(STACK_OF(ESS_CERT_ID_V2) *cert_ids, X509 *cert);
|
||||
static ESS_SIGNING_CERT_V2 *ess_get_signing_cert_v2(PKCS7_SIGNER_INFO *si);
|
||||
|
||||
/*
|
||||
* This must be large enough to hold all values in ts_status_text (with
|
||||
@@ -201,9 +200,9 @@ end:
|
||||
static int ts_check_signing_certs(PKCS7_SIGNER_INFO *si,
|
||||
STACK_OF(X509) *chain)
|
||||
{
|
||||
ESS_SIGNING_CERT *ss = ess_get_signing_cert(si);
|
||||
ESS_SIGNING_CERT *ss = ESS_SIGNING_CERT_get(si);
|
||||
STACK_OF(ESS_CERT_ID) *cert_ids = NULL;
|
||||
ESS_SIGNING_CERT_V2 *ssv2 = ess_get_signing_cert_v2(si);
|
||||
ESS_SIGNING_CERT_V2 *ssv2 = ESS_SIGNING_CERT_V2_get(si);
|
||||
STACK_OF(ESS_CERT_ID_V2) *cert_ids_v2 = NULL;
|
||||
X509 *cert;
|
||||
int i = 0;
|
||||
@@ -257,29 +256,6 @@ static int ts_check_signing_certs(PKCS7_SIGNER_INFO *si,
|
||||
return ret;
|
||||
}
|
||||
|
||||
static ESS_SIGNING_CERT *ess_get_signing_cert(PKCS7_SIGNER_INFO *si)
|
||||
{
|
||||
ASN1_TYPE *attr;
|
||||
const unsigned char *p;
|
||||
attr = PKCS7_get_signed_attribute(si, NID_id_smime_aa_signingCertificate);
|
||||
if (!attr)
|
||||
return NULL;
|
||||
p = attr->value.sequence->data;
|
||||
return d2i_ESS_SIGNING_CERT(NULL, &p, attr->value.sequence->length);
|
||||
}
|
||||
|
||||
static ESS_SIGNING_CERT_V2 *ess_get_signing_cert_v2(PKCS7_SIGNER_INFO *si)
|
||||
{
|
||||
ASN1_TYPE *attr;
|
||||
const unsigned char *p;
|
||||
|
||||
attr = PKCS7_get_signed_attribute(si, NID_id_smime_aa_signingCertificateV2);
|
||||
if (attr == NULL)
|
||||
return NULL;
|
||||
p = attr->value.sequence->data;
|
||||
return d2i_ESS_SIGNING_CERT_V2(NULL, &p, attr->value.sequence->length);
|
||||
}
|
||||
|
||||
/* Returns < 0 if certificate is not found, certificate index otherwise. */
|
||||
static int ts_find_cert(STACK_OF(ESS_CERT_ID) *cert_ids, X509 *cert)
|
||||
{
|
||||
|
||||
@@ -101,6 +101,12 @@
|
||||
|
||||
# endif
|
||||
|
||||
# if defined(OPENSSL_SYS_VXWORKS)
|
||||
# undef TERMIOS
|
||||
# undef TERMIO
|
||||
# undef SGTTY
|
||||
# endif
|
||||
|
||||
# ifdef TERMIOS
|
||||
# include <termios.h>
|
||||
# define TTY_STRUCT struct termios
|
||||
|
||||
Reference in New Issue
Block a user