File: frame.c

package info (click to toggle)
ekeyd 1.1.5-4
  • links: PTS
  • area: main
  • in suites: wheezy
  • size: 752 kB
  • sloc: ansic: 5,259; sh: 337; makefile: 262; perl: 150
file content (102 lines) | stat: -rw-r--r-- 2,186 bytes parent folder | download | duplicates (5)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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
92
93
94
95
96
97
98
99
100
101
102
/* frames/frame.c
 *
 * Framing information for eKey protocol
 *
 * Copyright 2009 Simtec Electronics
 *
 * For licence terms refer to the COPYING file.
 */

#include "frame.h"
#include "../skeinwrap.h"
#include "pem.h"

static EKeySkein framer_mac_base;
static EKeySkein framer_mac;

extern unsigned char *_serial_no;

extern void *memcpy(void*,const void*,size_t);

void
framer_prepare_mac(const unsigned char *sharedkey)
{
  PrepareSkein(&framer_mac_base, _serial_no, sharedkey, EKEY_SKEIN_PERSONALISATION_PMS);
}

void
framer_compute_mac(const char *frame, char *mactarget)
{
  unsigned char macbuf[32];
  memcpy(&framer_mac, &framer_mac_base, sizeof(framer_mac));
  Skein_256_Update(&framer_mac, frame, 52);
  Skein_256_Final_Pad(&framer_mac, macbuf);
  pem64_encode_bytes(macbuf, 3, mactarget);
  pem64_encode_bytes(macbuf + 29, 3, mactarget + 4);
}

void
framer_fill_frame(char *frame, char ft1, char ft2, char *payload)
{
  char *fr = frame + 2;
  int payload_left = 50;
  *fr++ = ft1;
  *fr++ = ft2;
  while ((payload_left > 0) && (*payload != 0)) {
    *fr++ = *payload++;
    payload_left--;
  }
  while (payload_left-- > 0)
    *fr++ = ' ';
  framer_compute_mac(frame + 2, fr);
}


#ifdef FRAMER_TEST

unsigned char *_serial_no = "\x00\x01\x02\x03\x10\x11\x12\x13\xab\xac\xad\xae";

#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>
#include <string.h>

static unsigned char nullkey[32];

int
main(int argc, char **argv)
{
  char message[64];
  char frame[64];
  int counter = 0;
  int max = 50;
  frame[0] = '*';
  frame[1] = ' ';
  frame[62] = '\r';
  frame[63] = '\n';
  
  memset(&(nullkey[0]), 0, 32);
  
  framer_prepare_mac(&(nullkey[0]));
  
  message[0] = message[1] = ' ';
  message[2 + pem64_encode_bytes(_serial_no, 12, &(message[2]))] = '\0';
  
  framer_fill_frame(frame, 'S', '!', message);
  write(1, frame, 64);
  
  if (argc > 1) {
    if (atoi(argv[1]) > 0)
      max = atoi(argv[1]);
  }
  
  for (counter = 0; counter < max; ++counter) {
    snprintf(message, 64, "Frame number %d from pid %d (parent %d)", counter, getpid(), getppid());
    framer_fill_frame(frame, 'I', '>', message);
    write(1, frame, 64);
  }
  
  return 0;
}

#endif