radsecproxy-hash.c 1.95 KB
Newer Older
Linus Nordberg's avatar
Linus Nordberg committed
1
/*
2
 * Copyright (C) 2011,2013 NORDUnet A/S
Linus Nordberg's avatar
Linus Nordberg committed
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
 *
 * Permission to use, copy, modify, and distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 */

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#include "radsecproxy.h"
#include "fticks_hashmac.h"

void
usage()
{
  fprintf(stderr,
	  "usage: radsecproxy-hash [-h] [-k key] [-t type]\n"
#if defined (READ_CONFIG)
	  "   -c configfile\tuse configuration from CONFIGFILE\n"
#endif
	  "   -h\t\t\tdisplay this help and exit\n"
	  "   -k key\t\tuse KEY for HMAC\n"
26
	  "   -t type\t\tprint digest of type TYPE [hash|hmac]\n");
Linus Nordberg's avatar
Linus Nordberg committed
27
28
29
30
31
32
33
34
35
36
37
38
  exit(1);
}

#define MYNAME "radsecproxy-hash"

int
main(int argc, char *argv[])
{
  int opt;
#if defined(READ_CONFIG)
  char *config = NULL;
#endif
39
  uint8_t buf[64+1];
Linus Nordberg's avatar
Linus Nordberg committed
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
  char mac[80+1];
  uint8_t *key = NULL;
  enum { TYPE_HASH, TYPE_HMAC } type = TYPE_HASH;

  while ((opt = getopt(argc, argv, "hk:t:")) != -1) {
    switch (opt) {
#if defined(READ_CONFIG)
    case 'c':
      config = optarg;
      break;
#endif
    case 'h':
      usage();
    case 'k':
      key = (uint8_t *) optarg;
      break;
    case 't':
      if (strcmp(optarg, "hash") == 0)
	type = TYPE_HASH;
      else if (strcmp(optarg, "hmac") == 0)
	type = TYPE_HMAC;
      else
	usage();
      break;
    default:
      usage();
    }
  }

  while (fgets(mac, sizeof(mac), stdin) != NULL) {
    if (type == TYPE_HASH) {
      if (fticks_hashmac((uint8_t *) mac, NULL, sizeof(buf), buf) != 0) {
	fprintf(stderr, "%s: out of memory\n", MYNAME);
	return 3;
      }
    }
    else if (type == TYPE_HMAC) {
      if (key == NULL) {
	fprintf(stderr, "%s: generating HMAC requires a key, use `-k'\n",
		MYNAME);
	return 2;
      }
      if (fticks_hashmac((uint8_t *) mac, key, sizeof(buf), buf) != 0) {
	fprintf(stderr, "%s: out of memory\n", MYNAME);
	return 3;
      }
    }
    puts((const char *) buf);
  }

  return 0;
}