1656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* apps/dgst.c */ 2656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 3656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * All rights reserved. 4656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 5656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This package is an SSL implementation written 6656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * by Eric Young (eay@cryptsoft.com). 7656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The implementation was written so as to conform with Netscapes SSL. 8656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 9656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This library is free for commercial and non-commercial use as long as 10656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the following conditions are aheared to. The following conditions 11656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * apply to all code found in this distribution, be it the RC4, RSA, 12656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * lhash, DES, etc., code; not just the SSL code. The SSL documentation 13656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * included with this distribution is covered by the same copyright terms 14656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * except that the holder is Tim Hudson (tjh@cryptsoft.com). 15656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 16656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Copyright remains Eric Young's, and as such any Copyright notices in 17656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the code are not to be removed. 18656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * If this package is used in a product, Eric Young should be given attribution 19656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * as the author of the parts of the library used. 20656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * This can be in the form of a textual message at program startup or 21656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * in documentation (online or textual) provided with the package. 22656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 23656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Redistribution and use in source and binary forms, with or without 24656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * modification, are permitted provided that the following conditions 25656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * are met: 26656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 1. Redistributions of source code must retain the copyright 27656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer. 28656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 29656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * notice, this list of conditions and the following disclaimer in the 30656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * documentation and/or other materials provided with the distribution. 31656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 3. All advertising materials mentioning features or use of this software 32656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * must display the following acknowledgement: 33656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes cryptographic software written by 34656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * Eric Young (eay@cryptsoft.com)" 35656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The word 'cryptographic' can be left out if the rouines from the library 36656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * being used are not cryptographic related :-). 37656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 4. If you include any Windows specific code (or a derivative thereof) from 38656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * the apps directory (application code) you must include an acknowledgement: 39656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 40656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 41656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 42656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 43656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 44656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 45656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 46656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 47656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 48656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 49656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 50656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 51656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * SUCH DAMAGE. 52656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * 53656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * The licence and distribution terms for any publically available version or 54656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * derivative of this code cannot be changed. i.e. this code cannot simply be 55656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * copied and put under another distribution licence 56656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project * [including the GNU Public Licence.] 57656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project */ 58656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 59656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdio.h> 60656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <string.h> 61656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <stdlib.h> 62656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include "apps.h" 63656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/bio.h> 64656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/err.h> 65656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/evp.h> 66656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/objects.h> 67656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/x509.h> 68656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/pem.h> 69656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#include <openssl/hmac.h> 70656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 71656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef BUFSIZE 72656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define BUFSIZE 1024*8 73656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 74656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#undef PROG 75656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG dgst_main 76656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 77656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, 78221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY *key, unsigned char *sigin, int siglen, 79221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *sig_name, const char *md_name, 80221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *file,BIO *bmd); 81221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 82221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstromstatic void list_md_fn(const EVP_MD *m, 83221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *from, const char *to, void *arg) 84221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 85221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *mname; 86221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Skip aliases */ 87221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!m) 88221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 89221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mname = OBJ_nid2ln(EVP_MD_type(m)); 90221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Skip shortnames */ 91221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (strcmp(from, mname)) 92221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 93221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* Skip clones */ 94221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_MD_flags(m) & EVP_MD_FLAG_PKEY_DIGEST) 95221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return; 96221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (strchr(mname, ' ')) 97221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mname= EVP_MD_name(m); 98221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(arg, "-%-14s to use the %s message digest algorithm\n", 99221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mname, mname); 100221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 101656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 102656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int, char **); 103656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 104656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint MAIN(int argc, char **argv) 105656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 106656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ENGINE *e = NULL; 107656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *buf=NULL; 108e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu int i,err=1; 109656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const EVP_MD *md=NULL,*m; 110656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *in=NULL,*inp; 111656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *bmd=NULL; 112656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *out = NULL; 113656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#define PROG_NAME_SIZE 39 114656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char pname[PROG_NAME_SIZE+1]; 115656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int separator=0; 116656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int debug=0; 117656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int keyform=FORMAT_PEM; 118656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *outfile = NULL, *keyfile = NULL; 119656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project const char *sigfile = NULL, *randfile = NULL; 120656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int out_bin = -1, want_pub = 0, do_verify = 0; 121656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY *sigkey = NULL; 122656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project unsigned char *sigbuf = NULL; 123656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int siglen = 0; 124656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *passargin = NULL, *passin = NULL; 125656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 126656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *engine=NULL; 127656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 128656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project char *hmac_key=NULL; 129221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *mac_name=NULL; 130392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom int non_fips_allow = 0; 131221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom STACK_OF(OPENSSL_STRING) *sigopts = NULL, *macopts = NULL; 132656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 133656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_startup(); 134221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 135656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((buf=(unsigned char *)OPENSSL_malloc(BUFSIZE)) == NULL) 136656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 137656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"out of memory\n"); 138656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 139656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 140656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bio_err == NULL) 141656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((bio_err=BIO_new(BIO_s_file())) != NULL) 142656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(bio_err,stderr,BIO_NOCLOSE|BIO_FP_TEXT); 143656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 144656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!load_config(bio_err, NULL)) 145656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 146656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 147656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* first check the program name */ 148656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project program_name(argv[0],pname,sizeof pname); 149656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 150656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project md=EVP_get_digestbyname(pname); 151656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 152656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 153656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 154656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project while (argc > 0) 155656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 156656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((*argv)[0] != '-') break; 157656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (strcmp(*argv,"-c") == 0) 158656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project separator=1; 159221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*argv,"-r") == 0) 160221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom separator=2; 161656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-rand") == 0) 162656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 163656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 164656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project randfile=*(++argv); 165656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 166656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-out") == 0) 167656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 168656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 169656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile=*(++argv); 170656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 171656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-sign") == 0) 172656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 173656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 174656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile=*(++argv); 175656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 176656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*argv,"-passin")) 177656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 178656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) 179656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 180656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project passargin=*++argv; 181656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 182656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-verify") == 0) 183656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 184656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 185656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile=*(++argv); 186656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project want_pub = 1; 187656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do_verify = 1; 188656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 189656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-prverify") == 0) 190656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 191656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 192656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyfile=*(++argv); 193656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project do_verify = 1; 194656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 195656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-signature") == 0) 196656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 197656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 198656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigfile=*(++argv); 199656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 200656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-keyform") == 0) 201656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 202656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 203656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project keyform=str2fmt(*(++argv)); 204656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 205656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 206656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-engine") == 0) 207656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 208656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) break; 209656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project engine= *(++argv); 210221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom e = setup_engine(bio_err, engine, 0); 211656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 212656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 213656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-hex") == 0) 214656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out_bin = 0; 215656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-binary") == 0) 216656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out_bin = 1; 217656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (strcmp(*argv,"-d") == 0) 218656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project debug=1; 219392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (strcmp(*argv,"-non-fips-allow") == 0) 220392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom non_fips_allow=1; 221392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom else if (!strcmp(*argv,"-fips-fingerprint")) 222392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom hmac_key = "etaonrishdlcupfm"; 223656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if (!strcmp(*argv,"-hmac")) 224656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 225656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (--argc < 1) 226656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 227656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project hmac_key=*++argv; 228656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 229221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (!strcmp(*argv,"-mac")) 230221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 231221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (--argc < 1) 232221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 233221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mac_name=*++argv; 234221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 235221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*argv,"-sigopt") == 0) 236221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 237221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (--argc < 1) 238221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 239221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sigopts) 240221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigopts = sk_OPENSSL_STRING_new_null(); 241221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sigopts || !sk_OPENSSL_STRING_push(sigopts, *(++argv))) 242221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 243221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 244221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (strcmp(*argv,"-macopt") == 0) 245221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 246221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (--argc < 1) 247221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 248221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!macopts) 249221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom macopts = sk_OPENSSL_STRING_new_null(); 250221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!macopts || !sk_OPENSSL_STRING_push(macopts, *(++argv))) 251221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom break; 252221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 253656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if ((m=EVP_get_digestbyname(&((*argv)[1]))) != NULL) 254656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project md=m; 255656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 256656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project break; 257656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argc--; 258656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project argv++; 259656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 260656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 261656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 262656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(do_verify && !sigfile) { 263656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "No signature to verify: use the -signature option\n"); 264656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 265656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 266656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 267656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((argc > 0) && (argv[0][0] == '-')) /* bad option */ 268656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 269656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"unknown option '%s'\n",*argv); 270656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"options are\n"); 271656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-c to output the digest with separating colons\n"); 272221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"-r to output the digest in coreutils format\n"); 273656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-d to output debug info\n"); 274656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-hex output as hex dump\n"); 275656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-binary output in binary form\n"); 276656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-sign file sign digest using private key in file\n"); 277656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-verify file verify a signature using public key in file\n"); 278656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-prverify file verify a signature using private key in file\n"); 279656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-keyform arg key file format (PEM or ENGINE)\n"); 280221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"-out filename output to filename rather than stdout\n"); 281656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-signature file signature to verify\n"); 282221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"-sigopt nm:v signature parameter\n"); 283656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-hmac key create hashed MAC with key\n"); 284221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"-mac algorithm create MAC (not neccessarily HMAC)\n"); 285221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err,"-macopt nm:v MAC algorithm parameters or key\n"); 286656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifndef OPENSSL_NO_ENGINE 287656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err,"-engine e use engine e, possibly a hardware device.\n"); 288656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 289656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 290221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_MD_do_all_sorted(list_md_fn, bio_err); 291656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 292656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 293656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 294656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project in=BIO_new(BIO_s_file()); 295656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project bmd=BIO_new(BIO_f_md()); 296656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (debug) 297656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 298656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback(in,BIO_debug_callback); 299656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* needed for windows 3.1 */ 300656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_callback_arg(in,(char *)bio_err); 301656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 302656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 303656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!app_passwd(bio_err, passargin, NULL, &passin, NULL)) 304656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 305656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error getting password\n"); 306656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 307656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 308656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 309656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if ((in == NULL) || (bmd == NULL)) 310656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 311656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 312656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 313656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 314656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 315656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(out_bin == -1) { 316221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(keyfile) 317221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out_bin = 1; 318221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 319221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom out_bin = 0; 320656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 321656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 322656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(randfile) 323656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project app_RAND_load_file(randfile, bio_err, 0); 324656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 325656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(outfile) { 326656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(out_bin) 327656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new_file(outfile, "wb"); 328656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else out = BIO_new_file(outfile, "w"); 329656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } else { 330656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_new_fp(stdout, BIO_NOCLOSE); 331656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#ifdef OPENSSL_SYS_VMS 332656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 333656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *tmpbio = BIO_new(BIO_f_linebuffer()); 334656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project out = BIO_push(tmpbio, out); 335656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 336656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project#endif 337656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 338656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 339656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!out) { 340656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error opening output file %s\n", 341656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project outfile ? outfile : "(stdout)"); 342656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 343656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 344656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 345221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((!!mac_name + !!keyfile + !!hmac_key) > 1) 346221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 347221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "MAC and Signing key cannot both be specified\n"); 348221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 349221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 350656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 351656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(keyfile) 352656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 353656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (want_pub) 354656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigkey = load_pubkey(bio_err, keyfile, keyform, 0, NULL, 355656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "key file"); 356656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 357656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigkey = load_key(bio_err, keyfile, keyform, 0, passin, 358656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project e, "key file"); 359656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (!sigkey) 360656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 361656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project /* load_[pub]key() has already printed an appropriate 362656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project message */ 363656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 364656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 365656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 366656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 367221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (mac_name) 368221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 369221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX *mac_ctx = NULL; 370221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int r = 0; 371221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!init_gen_str(bio_err, &mac_ctx, mac_name,e, 0)) 372221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto mac_end; 373221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (macopts) 374221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 375221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *macopt; 376221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(macopts); i++) 377221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 378221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom macopt = sk_OPENSSL_STRING_value(macopts, i); 379221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pkey_ctrl_string(mac_ctx, macopt) <= 0) 380221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 381221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, 382221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "MAC parameter error \"%s\"\n", 383221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom macopt); 384221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 385221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto mac_end; 386221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 387221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 388221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 389221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (EVP_PKEY_keygen(mac_ctx, &sigkey) <= 0) 390221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 391221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_puts(bio_err, "Error generating key\n"); 392221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 393221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto mac_end; 394221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 395221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r = 1; 396221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom mac_end: 397221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (mac_ctx) 398221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX_free(mac_ctx); 399221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (r == 0) 400221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 401221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 402221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 403392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom if (non_fips_allow) 404392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom { 405392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX *md_ctx; 406392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom BIO_get_md_ctx(bmd,&md_ctx); 407392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom EVP_MD_CTX_set_flags(md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW); 408392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom } 409392aa7cc7d2b122614c5393c3e357da07fd07af3Brian Carlstrom 410221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (hmac_key) 411221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 412221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigkey = EVP_PKEY_new_mac_key(EVP_PKEY_HMAC, e, 413221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom (unsigned char *)hmac_key, -1); 414221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!sigkey) 415221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 416221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 417221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 418221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sigkey) 419221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 420221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_MD_CTX *mctx = NULL; 421221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_CTX *pctx = NULL; 422221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom int r; 423221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!BIO_get_md_ctx(bmd, &mctx)) 424221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 425221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Error getting context\n"); 426221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 427221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 428221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 429221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (do_verify) 430221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r = EVP_DigestVerifyInit(mctx, &pctx, md, e, sigkey); 431221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 432221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom r = EVP_DigestSignInit(mctx, &pctx, md, e, sigkey); 433221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!r) 434221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 435221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Error setting context\n"); 436221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 437221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 438221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 439221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sigopts) 440221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 441221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom char *sigopt; 442221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i = 0; i < sk_OPENSSL_STRING_num(sigopts); i++) 443221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 444221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigopt = sk_OPENSSL_STRING_value(sigopts, i); 445221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (pkey_ctrl_string(pctx, sigopt) <= 0) 446221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 447221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, 448221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom "parameter error \"%s\"\n", 449221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sigopt); 450221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 451221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 452221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 453221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 454221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 455221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 456221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom /* we use md as a filter, reading from 'in' */ 457221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 458221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 459221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (md == NULL) 460221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom md = EVP_md5(); 461221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (!BIO_set_md(bmd,md)) 462221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 463221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(bio_err, "Error setting digest %s\n", pname); 464221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 465221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom goto end; 466221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 467221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 468221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom 469656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(sigfile && sigkey) { 470656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO *sigbio; 471656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigbio = BIO_new_file(sigfile, "rb"); 472656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project siglen = EVP_PKEY_size(sigkey); 473656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigbuf = OPENSSL_malloc(siglen); 474656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(!sigbio) { 475656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error opening signature file %s\n", 476656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigfile); 477656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 478656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 479656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 480656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project siglen = BIO_read(sigbio, sigbuf, siglen); 481656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free(sigbio); 482656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(siglen <= 0) { 483656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error reading signature file %s\n", 484656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project sigfile); 485656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 486656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project goto end; 487656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 488656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 489221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom inp=BIO_push(bmd,in); 490656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 491221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (md == NULL) 492e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu { 493221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_MD_CTX *tctx; 494221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_get_md_ctx(bmd, &tctx); 495221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom md = EVP_MD_CTX_md(tctx); 496e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu } 497656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 498656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (argc == 0) 499656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 500656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_set_fp(in,stdin,BIO_NOCLOSE); 501656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err=do_fp(out, buf,inp,separator, out_bin, sigkey, sigbuf, 502221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom siglen,NULL,NULL,"stdin",bmd); 503656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 504656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 505656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 506221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *md_name = NULL, *sig_name = NULL; 507221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(!out_bin) 508221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 509221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sigkey) 510221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 511221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const EVP_PKEY_ASN1_METHOD *ameth; 512221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ameth = EVP_PKEY_get0_asn1(sigkey); 513221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (ameth) 514221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY_asn1_get0_info(NULL, NULL, 515221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom NULL, NULL, &sig_name, ameth); 516221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 517221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom md_name = EVP_MD_name(md); 518221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 519e45f106cb6b47af1f21efe76e933bdea2f5dd1caNagendra Modadugu err = 0; 520656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<argc; i++) 521656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 522656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int r; 523656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (BIO_read_filename(in,argv[i]) <= 0) 524656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 525656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project perror(argv[i]); 526656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err++; 527656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project continue; 528656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 529656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 530656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project r=do_fp(out,buf,inp,separator,out_bin,sigkey,sigbuf, 531221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom siglen,sig_name,md_name, argv[i],bmd); 532656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(r) 533656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project err=r; 534656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project (void)BIO_reset(bmd); 535656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 536656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 537656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectend: 538656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (buf != NULL) 539656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 540656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_cleanse(buf,BUFSIZE); 541656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(buf); 542656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 543656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (in != NULL) BIO_free(in); 544656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (passin) 545656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_free(passin); 546656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_free_all(out); 547656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_PKEY_free(sigkey); 548221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sigopts) 549221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(sigopts); 550221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (macopts) 551221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom sk_OPENSSL_STRING_free(macopts); 552656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(sigbuf) OPENSSL_free(sigbuf); 553656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (bmd != NULL) BIO_free(bmd); 554656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project apps_shutdown(); 555656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project OPENSSL_EXIT(err); 556656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 557656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 558656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Projectint do_fp(BIO *out, unsigned char *buf, BIO *bp, int sep, int binout, 559221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom EVP_PKEY *key, unsigned char *sigin, int siglen, 560221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *sig_name, const char *md_name, 561221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom const char *file,BIO *bmd) 562656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 563221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom size_t len; 564656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project int i; 565656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 566656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (;;) 567656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 568656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project i=BIO_read(bp,(char *)buf,BUFSIZE); 569656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(i < 0) 570656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 571656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Read Error in %s\n",file); 572656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 573656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 574656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 575656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (i == 0) break; 576656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 577656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(sigin) 578656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 579656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX *ctx; 580656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_get_md_ctx(bp, &ctx); 581221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom i = EVP_DigestVerifyFinal(ctx, sigin, (unsigned int)siglen); 582656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(i > 0) 583656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "Verified OK\n"); 584656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else if(i == 0) 585656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 586656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "Verification Failure\n"); 587656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 588656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 589656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 590656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 591656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error Verifying Data\n"); 592656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 593656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 594656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 595656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 596656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 597656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(key) 598656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 599656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project EVP_MD_CTX *ctx; 600656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_get_md_ctx(bp, &ctx); 601221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom len = BUFSIZE; 602221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if(!EVP_DigestSignFinal(ctx, buf, &len)) 603656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 604656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(bio_err, "Error Signing Data\n"); 605656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project ERR_print_errors(bio_err); 606656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 1; 607656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 608656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 609656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 610221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 611656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project len=BIO_gets(bp,(char *)buf,BUFSIZE); 612221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if ((int)len <0) 613221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 614221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom ERR_print_errors(bio_err); 615221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom return 1; 616221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 617221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 618656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 619656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if(binout) BIO_write(out, buf, len); 620221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (sep == 2) 621221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom { 622221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom for (i=0; i<(int)len; i++) 623221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out, "%02x",buf[i]); 624221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out, " *%s\n", file); 625221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom } 626656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project else 627656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 628221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom if (sig_name) 629221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out, "%s-%s(%s)= ", sig_name, md_name, file); 630221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else if (md_name) 631221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out, "%s(%s)= ", md_name, file); 632221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom else 633221304ee937bc0910948a8be1320cb8cc4eb6d36Brian Carlstrom BIO_printf(out, "(%s)= ", file); 634656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project for (i=0; i<(int)len; i++) 635656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project { 636656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project if (sep && (i != 0)) 637656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, ":"); 638656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "%02x",buf[i]); 639656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 640656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project BIO_printf(out, "\n"); 641656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 642656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project return 0; 643656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project } 644656d9c7f52f88b3a3daccafa7655dec086c4756eThe Android Open Source Project 645