(root)/
Linux-PAM-1.5.3/
modules/
pam_timestamp/
hmacfile.c
       1  /*
       2   * Copyright 2003,2004 Red Hat, Inc.
       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   * 1. Redistributions of source code must retain the above copyright
       8   *    notice, and the entire permission notice in its entirety,
       9   *    including the disclaimer of warranties.
      10   * 2. Redistributions in binary form must reproduce the above copyright
      11   *    notice, this list of conditions and the following disclaimer in the
      12   *    documentation and/or other materials provided with the distribution.
      13   * 3. The name of the author may not be used to endorse or promote
      14   *    products derived from this software without specific prior
      15   *    written permission.
      16   *
      17   * ALTERNATIVELY, this product may be distributed under the terms of
      18   * the GNU Public License, in which case the provisions of the GPL are
      19   * required INSTEAD OF the above restrictions.  (This clause is
      20   * necessary due to a potential bad interaction between the GPL and
      21   * the restrictions contained in a BSD-style copyright.)
      22   *
      23   * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
      24   * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
      25   * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
      26   * DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
      27   * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
      28   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
      29   * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
      30   * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
      31   * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
      32   * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
      33   * OF THE POSSIBILITY OF SUCH DAMAGE.
      34   */
      35  
      36  #include "pam_inline.h"
      37  
      38  #include <sys/types.h>
      39  #include <sys/stat.h>
      40  #include <errno.h>
      41  #include <fcntl.h>
      42  #include <stdio.h>
      43  #include <stdlib.h>
      44  #include <string.h>
      45  #include <unistd.h>
      46  #include "hmacsha1.h"
      47  
      48  static void
      49  testvectors(void)
      50  {
      51  	void *hmac;
      52  	size_t hmac_len;
      53  	size_t i, j;
      54  	char hex[3];
      55  	struct vector {
      56  		const char *key;
      57  		int key_len;
      58  		const char *data;
      59  		int data_len;
      60  		const char *hmac;
      61  	} vectors[] = {
      62  		{
      63  		"\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b", 20,
      64  		"Hi There", 8,
      65  		"b617318655057264e28bc0b6fb378c8ef146be00",
      66  		},
      67  
      68  #ifdef HMAC_ALLOW_SHORT_KEYS
      69  		{
      70  		"Jefe", 4,
      71  		"what do ya want for nothing?", 28,
      72  		"effcdf6ae5eb2fa2d27416d5f184df9c259a7c79",
      73  		},
      74  #endif
      75  
      76  		{
      77  		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa", 20,
      78  		"\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd\xdd", 50,
      79  		"125d7342b9ac11cd91a39af48aa17b4f63f175d3",
      80  		},
      81  
      82  		{
      83  		"\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19", 25,
      84  		"\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd\xcd",
      85  		50,
      86  		"4c9007f4026250c6bc8414f9bf50c86c2d7235da",
      87  		},
      88  
      89  		{
      90  		"\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c\x0c", 20,
      91  		"Test With Truncation", 20,
      92  		"4c1a03424b55e07fe7f27be1d58bb9324a9a5a04",
      93  		},
      94  
      95  		{
      96  		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
      97  		80,
      98  		"Test Using Larger Than Block-Size Key - Hash Key First", 54,
      99  		"aa4ae5e15272d00e95705637ce8a3b55ed402112",
     100  		},
     101  
     102  		{
     103  		"\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa\xaa",
     104  		80,
     105  		"Test Using Larger Than Block-Size Key and Larger Than One Block-Size Data", 73,
     106  		"e8e99d0f45237d786d6bbaa7965c7808bbff1a91",
     107  		},
     108  	};
     109  	for (i = 0; i < PAM_ARRAY_SIZE(vectors); i++) {
     110  		hmac = NULL;
     111  		hmac_len = 0;
     112  		hmac_sha1_generate(&hmac, &hmac_len,
     113  				   vectors[i].key, vectors[i].key_len,
     114  				   vectors[i].data, vectors[i].data_len);
     115  		if (hmac != NULL) {
     116  			unsigned char *hmacc = hmac;
     117  			for (j = 0; j < hmac_len; j++) {
     118  				snprintf(hex, sizeof(hex), "%02x",
     119  					 hmacc[j] & 0xff);
     120  				if (strncasecmp(hex,
     121  						vectors[i].hmac + 2 * j,
     122  						2) != 0) {
     123  					printf("Incorrect result for vector %lu\n",
     124  					       (unsigned long) i + 1);
     125  					exit(1);
     126  
     127  				}
     128  			}
     129  			free(hmac);
     130  		} else {
     131  			printf("Error in vector %lu.\n",
     132  			       (unsigned long) i + 1);
     133  			exit(1);
     134  		}
     135  	}
     136  }
     137  
     138  int
     139  main(int argc, char **argv)
     140  {
     141  	void *hmac;
     142  	size_t maclen;
     143  	const char *keyfile;
     144  	int i;
     145  	size_t j;
     146  
     147  	testvectors();
     148  
     149  	keyfile = argv[1];
     150  	for (i = 2; i < argc; i++) {
     151  		hmac_sha1_generate_file(NULL, &hmac, &maclen, keyfile, -1, -1,
     152  					argv[i], strlen(argv[i]));
     153  		if (hmac != NULL) {
     154  			unsigned char *hmacc = hmac;
     155  			for (j = 0; j < maclen; j++) {
     156  				printf("%02x", hmacc[j] & 0xff);
     157  			}
     158  			printf("  %s\n", argv[i]);
     159  			free(hmac);
     160  		}
     161  	}
     162  	return 0;
     163  }