fips_standalone_sha1.c revision 194206
1/* ==================================================================== 2 * Copyright (c) 2003 The OpenSSL Project. All rights reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in 13 * the documentation and/or other materials provided with the 14 * distribution. 15 * 16 * 3. All advertising materials mentioning features or use of this 17 * software must display the following acknowledgment: 18 * "This product includes software developed by the OpenSSL Project 19 * for use in the OpenSSL Toolkit. (http://www.openssl.org/)" 20 * 21 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to 22 * endorse or promote products derived from this software without 23 * prior written permission. For written permission, please contact 24 * openssl-core@openssl.org. 25 * 26 * 5. Products derived from this software may not be called "OpenSSL" 27 * nor may "OpenSSL" appear in their names without prior written 28 * permission of the OpenSSL Project. 29 * 30 * 6. Redistributions of any form whatsoever must retain the following 31 * acknowledgment: 32 * "This product includes software developed by the OpenSSL Project 33 * for use in the OpenSSL Toolkit (http://www.openssl.org/)" 34 * 35 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY 36 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 37 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 38 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR 39 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 40 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 41 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 42 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 43 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 44 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 45 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED 46 * OF THE POSSIBILITY OF SUCH DAMAGE. 47 * 48 */ 49 50#include <stdio.h> 51#include <stdlib.h> 52#include <string.h> 53#include <openssl/opensslconf.h> 54#include <openssl/sha.h> 55#include <openssl/hmac.h> 56 57#ifndef FIPSCANISTER_O 58int FIPS_selftest_failed() { return 0; } 59void FIPS_selftest_check() {} 60void OPENSSL_cleanse(void *p,size_t len) {} 61#endif 62 63#ifdef OPENSSL_FIPS 64 65static void hmac_init(SHA_CTX *md_ctx,SHA_CTX *o_ctx, 66 const char *key) 67 { 68 size_t len=strlen(key); 69 int i; 70 unsigned char keymd[HMAC_MAX_MD_CBLOCK]; 71 unsigned char pad[HMAC_MAX_MD_CBLOCK]; 72 73 if (len > SHA_CBLOCK) 74 { 75 SHA1_Init(md_ctx); 76 SHA1_Update(md_ctx,key,len); 77 SHA1_Final(keymd,md_ctx); 78 len=20; 79 } 80 else 81 memcpy(keymd,key,len); 82 memset(&keymd[len],'\0',HMAC_MAX_MD_CBLOCK-len); 83 84 for(i=0 ; i < HMAC_MAX_MD_CBLOCK ; i++) 85 pad[i]=0x36^keymd[i]; 86 SHA1_Init(md_ctx); 87 SHA1_Update(md_ctx,pad,SHA_CBLOCK); 88 89 for(i=0 ; i < HMAC_MAX_MD_CBLOCK ; i++) 90 pad[i]=0x5c^keymd[i]; 91 SHA1_Init(o_ctx); 92 SHA1_Update(o_ctx,pad,SHA_CBLOCK); 93 } 94 95static void hmac_final(unsigned char *md,SHA_CTX *md_ctx,SHA_CTX *o_ctx) 96 { 97 unsigned char buf[20]; 98 99 SHA1_Final(buf,md_ctx); 100 SHA1_Update(o_ctx,buf,sizeof buf); 101 SHA1_Final(md,o_ctx); 102 } 103 104#endif 105 106int main(int argc,char **argv) 107 { 108#ifdef OPENSSL_FIPS 109 static char key[]="etaonrishdlcupfm"; 110 int n,binary=0; 111 112 if(argc < 2) 113 { 114 fprintf(stderr,"%s [<file>]+\n",argv[0]); 115 exit(1); 116 } 117 118 n=1; 119 if (!strcmp(argv[n],"-binary")) 120 { 121 n++; 122 binary=1; /* emit binary fingerprint... */ 123 } 124 125 for(; n < argc ; ++n) 126 { 127 FILE *f=fopen(argv[n],"rb"); 128 SHA_CTX md_ctx,o_ctx; 129 unsigned char md[20]; 130 int i; 131 132 if(!f) 133 { 134 perror(argv[n]); 135 exit(2); 136 } 137 138 hmac_init(&md_ctx,&o_ctx,key); 139 for( ; ; ) 140 { 141 char buf[1024]; 142 size_t l=fread(buf,1,sizeof buf,f); 143 144 if(l == 0) 145 { 146 if(ferror(f)) 147 { 148 perror(argv[n]); 149 exit(3); 150 } 151 else 152 break; 153 } 154 SHA1_Update(&md_ctx,buf,l); 155 } 156 hmac_final(md,&md_ctx,&o_ctx); 157 158 if (binary) 159 { 160 fwrite(md,20,1,stdout); 161 break; /* ... for single(!) file */ 162 } 163 164 printf("HMAC-SHA1(%s)= ",argv[n]); 165 for(i=0 ; i < 20 ; ++i) 166 printf("%02x",md[i]); 167 printf("\n"); 168 } 169#endif 170 return 0; 171 } 172 173 174