Hi, everyone. "openssl ts -reply ..." command always uses SHA-1 for signing. This patch can specify the messege digest algorithm for signing;
> openssl ts -reply -queryfile req.bin -config tsa.cnf -sha256 > resp.bin Please merge it.
--- apps/ts.c.orig 2014-01-06 22:47:42.000000000 +0900 +++ apps/ts.c 2014-03-24 22:04:44.744166300 +0900 @@ -97,12 +97,13 @@ static int reply_command(CONF *conf, char *section, char *engine, char *queryfile, char *passin, char *inkey, char *signer, char *chain, const char *policy, - char *in, int token_in, char *out, int token_out, - int text); + const EVP_MD *md, char *in, int token_in, + char *out, int token_out, int text); static TS_RESP *read_PKCS7(BIO *in_bio); static TS_RESP *create_response(CONF *conf, const char *section, char *engine, char *queryfile, char *passin, char *inkey, - char *signer, char *chain, const char *policy); + char *signer, char *chain, const char *policy, + const EVP_MD *md); static ASN1_INTEGER * MS_CALLBACK serial_cb(TS_RESP_CTX *ctx, void *data); static ASN1_INTEGER *next_serial(const char *serialfile); static int save_ts_serial(const char *serialfile, ASN1_INTEGER *serial); @@ -349,7 +350,7 @@ ret = !reply_command(conf, section, engine, queryfile, password, inkey, signer, chain, policy, - in, token_in, out, token_out, text); + md, in, token_in, out, token_out, text); break; case CMD_VERIFY: ret = !(((queryfile && !data && !digest) @@ -377,6 +378,7 @@ "[-queryfile request.tsq] [-passin password] " "[-signer tsa_cert.pem] [-inkey private_key.pem] " "[-chain certs_file.pem] [-policy object_id] " + "[-md2|-md4|-md5|-sha|-sha1|-mdc2|-ripemd160] " "[-in response.tsr] [-token_in] " "[-out response.tsr] [-token_out] [-text] [-engine id]\n"); BIO_printf(bio_err, "or\n" @@ -673,7 +675,7 @@ static int reply_command(CONF *conf, char *section, char *engine, char *queryfile, char *passin, char *inkey, char *signer, char *chain, const char *policy, - char *in, int token_in, + const EVP_MD *md, char *in, int token_in, char *out, int token_out, int text) { int ret = 0; @@ -684,6 +686,9 @@ BIO *signer_bio = NULL; BIO *out_bio = NULL; + /* Setting default message digest. */ + if (!md && !(md = EVP_get_digestbyname("sha1"))) goto end; + /* Build response object either from response or query. */ if (in != NULL) { @@ -704,7 +709,7 @@ { response = create_response(conf, section, engine, queryfile, passin, inkey, signer, chain, - policy); + policy, md); if (response) BIO_printf(bio_err, "Response has been generated.\n"); else @@ -799,7 +804,8 @@ static TS_RESP *create_response(CONF *conf, const char *section, char *engine, char *queryfile, char *passin, char *inkey, - char *signer, char *chain, const char *policy) + char *signer, char *chain, const char *policy, + const EVP_MD *md) { int ret = 0; TS_RESP *response = NULL; @@ -858,6 +864,9 @@ /* Setting the ESS cert id chain flag if requested. */ if (!TS_CONF_set_ess_cert_id_chain(conf, section, resp_ctx)) goto end; + /* Setting the messege digest algorithm for signing. */ + resp_ctx->md=md; + /* Creating the response. */ if (!(response = TS_RESP_create_response(resp_ctx, query_bio))) goto end; --- crypto/ts/ts.h.orig 2014-01-06 22:47:42.000000000 +0900 +++ crypto/ts/ts.h 2014-03-23 23:40:47.743527800 +0900 @@ -526,6 +526,9 @@ TS_REQ *request; TS_RESP *response; TS_TST_INFO *tst_info; + + /* Message digest algorithm for signing. */ + const EVP_MD *md; } TS_RESP_CTX; DECLARE_STACK_OF(EVP_MD) --- crypto/ts/ts_rsp_sign.c.orig 2014-01-06 22:47:42.000000000 +0900 +++ crypto/ts/ts_rsp_sign.c 2014-03-23 23:45:14.353694900 +0900 @@ -749,7 +749,7 @@ /* Add a new signer info. */ if (!(si = PKCS7_add_signature(p7, ctx->signer_cert, - ctx->signer_key, EVP_sha1()))) + ctx->signer_key, ctx->md))) { TSerr(TS_F_TS_RESP_SIGN, TS_R_PKCS7_ADD_SIGNATURE_ERROR); goto err;