YubiRuby 0.0.1

Sign up to get free protection for your applications and to get access to all the features.
data/ext/ykaes.c ADDED
@@ -0,0 +1,214 @@
1
+ /* ykaes.c --- Implementation of AES-128.
2
+ *
3
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
4
+ * All rights reserved.
5
+ *
6
+ * Redistribution and use in source and binary forms, with or without
7
+ * modification, are permitted provided that the following conditions are
8
+ * met:
9
+ *
10
+ * * Redistributions of source code must retain the above copyright
11
+ * notice, this list of conditions and the following disclaimer.
12
+ *
13
+ * * Redistributions in binary form must reproduce the above
14
+ * copyright notice, this list of conditions and the following
15
+ * disclaimer in the documentation and/or other materials provided
16
+ * with the distribution.
17
+ *
18
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+ *
30
+ */
31
+
32
+ #include "yubikey.h"
33
+
34
+ #define NUMBER_OF_ROUNDS 10
35
+
36
+ static const uint8_t RC[] =
37
+ { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36 };
38
+
39
+ static const uint8_t rijndael_sbox[] = {
40
+ 0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5,
41
+ 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
42
+ 0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0,
43
+ 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
44
+ 0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC,
45
+ 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
46
+ 0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A,
47
+ 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
48
+ 0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0,
49
+ 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
50
+ 0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B,
51
+ 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
52
+ 0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85,
53
+ 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
54
+ 0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5,
55
+ 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
56
+ 0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17,
57
+ 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
58
+ 0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88,
59
+ 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
60
+ 0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C,
61
+ 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
62
+ 0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9,
63
+ 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
64
+ 0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6,
65
+ 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
66
+ 0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E,
67
+ 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
68
+ 0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94,
69
+ 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
70
+ 0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68,
71
+ 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
72
+ };
73
+
74
+ static const uint8_t rijndael_inv_sbox[] = {
75
+ 0x52, 0x09, 0x6A, 0xD5, 0x30, 0x36, 0xA5, 0x38,
76
+ 0xBF, 0x40, 0xA3, 0x9E, 0x81, 0xF3, 0xD7, 0xFB,
77
+ 0x7C, 0xE3, 0x39, 0x82, 0x9B, 0x2F, 0xFF, 0x87,
78
+ 0x34, 0x8E, 0x43, 0x44, 0xC4, 0xDE, 0xE9, 0xCB,
79
+ 0x54, 0x7B, 0x94, 0x32, 0xA6, 0xC2, 0x23, 0x3D,
80
+ 0xEE, 0x4C, 0x95, 0x0B, 0x42, 0xFA, 0xC3, 0x4E,
81
+ 0x08, 0x2E, 0xA1, 0x66, 0x28, 0xD9, 0x24, 0xB2,
82
+ 0x76, 0x5B, 0xA2, 0x49, 0x6D, 0x8B, 0xD1, 0x25,
83
+ 0x72, 0xF8, 0xF6, 0x64, 0x86, 0x68, 0x98, 0x16,
84
+ 0xD4, 0xA4, 0x5C, 0xCC, 0x5D, 0x65, 0xB6, 0x92,
85
+ 0x6C, 0x70, 0x48, 0x50, 0xFD, 0xED, 0xB9, 0xDA,
86
+ 0x5E, 0x15, 0x46, 0x57, 0xA7, 0x8D, 0x9D, 0x84,
87
+ 0x90, 0xD8, 0xAB, 0x00, 0x8C, 0xBC, 0xD3, 0x0A,
88
+ 0xF7, 0xE4, 0x58, 0x05, 0xB8, 0xB3, 0x45, 0x06,
89
+ 0xD0, 0x2C, 0x1E, 0x8F, 0xCA, 0x3F, 0x0F, 0x02,
90
+ 0xC1, 0xAF, 0xBD, 0x03, 0x01, 0x13, 0x8A, 0x6B,
91
+ 0x3A, 0x91, 0x11, 0x41, 0x4F, 0x67, 0xDC, 0xEA,
92
+ 0x97, 0xF2, 0xCF, 0xCE, 0xF0, 0xB4, 0xE6, 0x73,
93
+ 0x96, 0xAC, 0x74, 0x22, 0xE7, 0xAD, 0x35, 0x85,
94
+ 0xE2, 0xF9, 0x37, 0xE8, 0x1C, 0x75, 0xDF, 0x6E,
95
+ 0x47, 0xF1, 0x1A, 0x71, 0x1D, 0x29, 0xC5, 0x89,
96
+ 0x6F, 0xB7, 0x62, 0x0E, 0xAA, 0x18, 0xBE, 0x1B,
97
+ 0xFC, 0x56, 0x3E, 0x4B, 0xC6, 0xD2, 0x79, 0x20,
98
+ 0x9A, 0xDB, 0xC0, 0xFE, 0x78, 0xCD, 0x5A, 0xF4,
99
+ 0x1F, 0xDD, 0xA8, 0x33, 0x88, 0x07, 0xC7, 0x31,
100
+ 0xB1, 0x12, 0x10, 0x59, 0x27, 0x80, 0xEC, 0x5F,
101
+ 0x60, 0x51, 0x7F, 0xA9, 0x19, 0xB5, 0x4A, 0x0D,
102
+ 0x2D, 0xE5, 0x7A, 0x9F, 0x93, 0xC9, 0x9C, 0xEF,
103
+ 0xA0, 0xE0, 0x3B, 0x4D, 0xAE, 0x2A, 0xF5, 0xB0,
104
+ 0xC8, 0xEB, 0xBB, 0x3C, 0x83, 0x53, 0x99, 0x61,
105
+ 0x17, 0x2B, 0x04, 0x7E, 0xBA, 0x77, 0xD6, 0x26,
106
+ 0xE1, 0x69, 0x14, 0x63, 0x55, 0x21, 0x0C, 0x7D
107
+ };
108
+
109
+ static inline uint8_t
110
+ xtime (uint8_t b)
111
+ {
112
+ return (b & 0x80) ? ((b << 1) ^ 0x1b) : (b << 1);
113
+ }
114
+
115
+ void
116
+ yubikey_aes_decrypt (uint8_t * state, const uint8_t * key)
117
+ {
118
+ uint8_t i, j, round_key[0x10];
119
+ uint8_t a02x, a13x;
120
+ uint8_t a02xx, a13xx;
121
+ uint8_t k1, k2;
122
+
123
+ memcpy (round_key, key, sizeof (round_key));
124
+ for (i = 0; i < NUMBER_OF_ROUNDS; i++)
125
+ {
126
+ round_key[0] ^= RC[i];
127
+
128
+ round_key[0] ^= rijndael_sbox[round_key[13]];
129
+ round_key[1] ^= rijndael_sbox[round_key[14]];
130
+ round_key[2] ^= rijndael_sbox[round_key[15]];
131
+ round_key[3] ^= rijndael_sbox[round_key[12]];
132
+
133
+ for (j = 4; j < 16; j++)
134
+ round_key[j] ^= round_key[j - 4];
135
+ }
136
+ for (i = 0; i < 0x10; i++)
137
+ state[i] ^= round_key[i];
138
+
139
+ for (i = 1; i <= NUMBER_OF_ROUNDS; i++)
140
+ {
141
+ // inv_byte_sub_shift_row();
142
+
143
+ /* First row: 0 shift, 0 4 8 12 */
144
+ state[0] = rijndael_inv_sbox[state[0]];
145
+ state[4] = rijndael_inv_sbox[state[4]];
146
+ state[8] = rijndael_inv_sbox[state[8]];
147
+ state[12] = rijndael_inv_sbox[state[12]];
148
+
149
+ /* Second row: -1 shift, 1 5 9 13 */
150
+ j = state[13];
151
+ state[13] = rijndael_inv_sbox[state[9]];
152
+ state[9] = rijndael_inv_sbox[state[5]];
153
+ state[5] = rijndael_inv_sbox[state[1]];
154
+ state[1] = rijndael_inv_sbox[j];
155
+
156
+ /* Third row: -2 shift, 2 6 10 14 */
157
+ j = state[2];
158
+ state[2] = rijndael_inv_sbox[state[10]];
159
+ state[10] = rijndael_inv_sbox[j];
160
+ j = state[6];
161
+ state[6] = rijndael_inv_sbox[state[14]];
162
+ state[14] = rijndael_inv_sbox[j];
163
+
164
+ /* Fourth row: -3 shift, 3 7 11 15 */
165
+ j = state[3];
166
+ state[3] = rijndael_inv_sbox[state[7]];
167
+ state[7] = rijndael_inv_sbox[state[11]];
168
+ state[11] = rijndael_inv_sbox[state[15]];
169
+ state[15] = rijndael_inv_sbox[j];
170
+
171
+ // get_inv_round_key(i);
172
+
173
+ for (j = 15; j > 3; j--)
174
+ round_key[j] ^= round_key[j - 4];
175
+
176
+ round_key[0] ^=
177
+ (RC[NUMBER_OF_ROUNDS - i] ^ rijndael_sbox[round_key[13]]);
178
+
179
+ round_key[1] ^= rijndael_sbox[round_key[14]];
180
+ round_key[2] ^= rijndael_sbox[round_key[15]];
181
+ round_key[3] ^= rijndael_sbox[round_key[12]];
182
+
183
+ for (j = 0; j < 16; j++)
184
+ state[j] ^= round_key[j];
185
+ if (i != NUMBER_OF_ROUNDS)
186
+ {
187
+
188
+ //inv_mix_column();
189
+
190
+ for (j = 0; j < 16; j += 4)
191
+ {
192
+ k1 = state[j] ^ state[j + 2];
193
+ a02x = xtime (k1);
194
+ k2 = state[j + 1] ^ state[j + 3];
195
+ a13x = xtime (k2);
196
+
197
+ k1 ^= (k2 ^ xtime (state[j + 1] ^ state[j + 2]));
198
+ k2 = k1;
199
+
200
+ a02xx = xtime (a02x);
201
+ a13xx = xtime (a13x);
202
+
203
+ k1 ^= (xtime (a02xx ^ a13xx) ^ a02xx);
204
+ k2 ^= (xtime (a02xx ^ a13xx) ^ a13xx);
205
+
206
+ state[j] ^= (k1 ^ a02x);
207
+ state[j + 1] ^= k2;
208
+ state[j + 2] ^= (k1 ^ a13x);
209
+ state[j + 3] ^= (k2 ^ a02x ^ a13x);
210
+ }
211
+ }
212
+
213
+ }
214
+ }
data/ext/ykcrc.c ADDED
@@ -0,0 +1,54 @@
1
+ /* ykcrc.c --- Implementation of Yubikey CRC-16 function.
2
+ *
3
+ * Written by Simon Josefsson <simon@josefsson.org>.
4
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #include "yubikey.h"
34
+
35
+ uint16_t
36
+ yubikey_crc16 (const uint8_t *buf, size_t buf_size)
37
+ {
38
+ uint16_t m_crc = 0xffff;
39
+
40
+ while (buf_size--)
41
+ {
42
+ int i, j;
43
+ m_crc ^= (uint8_t) * buf++ & 0xFF;
44
+ for (i = 0; i < 8; i++)
45
+ {
46
+ j = m_crc & 1;
47
+ m_crc >>= 1;
48
+ if (j)
49
+ m_crc ^= 0x8408;
50
+ }
51
+ }
52
+
53
+ return m_crc;
54
+ }
data/ext/ykhex.c ADDED
@@ -0,0 +1,86 @@
1
+ /* ykhex.c --- Implementation of hex encoding/decoding
2
+ *
3
+ * Written by Simon Josefsson <simon@josefsson.org>.
4
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #include "yubikey.h"
34
+
35
+ #include <stdbool.h>
36
+
37
+ static const char trans[] = "0123456789abcdef";
38
+
39
+ void
40
+ yubikey_hex_encode (char *dst, const char *src, size_t srcSize)
41
+ {
42
+ while (srcSize--)
43
+ {
44
+ *dst++ = trans[(*src >> 4) & 0xf];
45
+ *dst++ = trans[*src++ & 0xf];
46
+ }
47
+
48
+ *dst = '\0';
49
+ }
50
+
51
+ void
52
+ yubikey_hex_decode (char *dst, const char *src, size_t dstSize)
53
+ {
54
+ char b;
55
+ bool flag = false;
56
+ char *p1;
57
+
58
+ for (; *src && dstSize > 0; src++)
59
+ {
60
+ if ((p1 = strchr (trans, *src)) == NULL)
61
+ b = 0;
62
+ else
63
+ b = (char) (p1 - trans);
64
+
65
+ if ((flag = !flag))
66
+ *dst = b;
67
+ else
68
+ {
69
+ *dst = (*dst << 4) | b;
70
+ dst++;
71
+ dstSize--;
72
+ }
73
+ }
74
+ while (dstSize--)
75
+ *dst++ = 0;
76
+ }
77
+
78
+ int
79
+ yubikey_hex_p (const char *str)
80
+ {
81
+ for (; *str; str++)
82
+ if (strchr (trans, *str) == NULL)
83
+ return 0;
84
+
85
+ return 1;
86
+ }
data/ext/ykmodhex.c ADDED
@@ -0,0 +1,86 @@
1
+ /* ykmodhex.c --- Implementation of modhex encoding/decoding
2
+ *
3
+ * Written by Simon Josefsson <simon@josefsson.org>.
4
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #include "yubikey.h"
34
+
35
+ #include <stdbool.h>
36
+
37
+ static const char trans[] = YUBIKEY_MODHEX_MAP;
38
+
39
+ void
40
+ yubikey_modhex_encode (char *dst, const char *src, size_t srcSize)
41
+ {
42
+ while (srcSize--)
43
+ {
44
+ *dst++ = trans[(*src >> 4) & 0xf];
45
+ *dst++ = trans[*src++ & 0xf];
46
+ }
47
+
48
+ *dst = '\0';
49
+ }
50
+
51
+ void
52
+ yubikey_modhex_decode (char *dst, const char *src, size_t dstSize)
53
+ {
54
+ char b;
55
+ bool flag = false;
56
+ char *p1;
57
+
58
+ for (; *src && dstSize > 0; src++)
59
+ {
60
+ if ((p1 = strchr (trans, *src)) == NULL)
61
+ b = 0;
62
+ else
63
+ b = (char) (p1 - trans);
64
+
65
+ if ((flag = !flag))
66
+ *dst = b;
67
+ else
68
+ {
69
+ *dst = (*dst << 4) | b;
70
+ dst++;
71
+ dstSize--;
72
+ }
73
+ }
74
+ while (dstSize--)
75
+ *dst++ = 0;
76
+ }
77
+
78
+ int
79
+ yubikey_modhex_p (const char *str)
80
+ {
81
+ for (; *str; str++)
82
+ if (strchr (trans, *str) == NULL)
83
+ return 0;
84
+
85
+ return 1;
86
+ }
data/ext/ykparse.c ADDED
@@ -0,0 +1,45 @@
1
+ /* ykparse.c --- Implementation of Yubikey token parser.
2
+ *
3
+ * Written by Simon Josefsson <simon@josefsson.org>.
4
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #include "yubikey.h"
34
+
35
+ #include <stdlib.h>
36
+ #include <stdbool.h>
37
+
38
+ void
39
+ yubikey_parse (const uint8_t token[32],
40
+ const uint8_t key[16], yubikey_token_t out)
41
+ {
42
+ memset (out, 0, sizeof (*out));
43
+ yubikey_modhex_decode ((void *) out, (char *) token, sizeof (*out));
44
+ yubikey_aes_decrypt ((void *) out, key);
45
+ }
data/ext/yubikey.h ADDED
@@ -0,0 +1,121 @@
1
+ /* yubikey.h --- Prototypes for low-level Yubikey OTP functions.
2
+ *
3
+ * Written by Simon Josefsson <simon@josefsson.org>.
4
+ * Copyright (c) 2006, 2007, 2008, 2009 Yubico AB
5
+ * All rights reserved.
6
+ *
7
+ * Redistribution and use in source and binary forms, with or without
8
+ * modification, are permitted provided that the following conditions are
9
+ * met:
10
+ *
11
+ * * Redistributions of source code must retain the above copyright
12
+ * notice, this list of conditions and the following disclaimer.
13
+ *
14
+ * * Redistributions in binary form must reproduce the above
15
+ * copyright notice, this list of conditions and the following
16
+ * disclaimer in the documentation and/or other materials provided
17
+ * with the distribution.
18
+ *
19
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
20
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
21
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
22
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
23
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
24
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
25
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
26
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
27
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
28
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
29
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30
+ *
31
+ */
32
+
33
+ #ifndef YUBIKEY_H
34
+ # define YUBIKEY_H
35
+
36
+ # include <stdint.h>
37
+ # include <string.h>
38
+
39
+ # define YUBIKEY_BLOCK_SIZE 16
40
+ # define YUBIKEY_KEY_SIZE 16
41
+ # define YUBIKEY_UID_SIZE 6
42
+
43
+ typedef struct
44
+ {
45
+ /* Unique (secret) ID. */
46
+ uint8_t uid[YUBIKEY_UID_SIZE];
47
+ /* Session counter (incremented by 1 at each startup). High bit
48
+ indicates whether caps-lock triggered the token. */
49
+ uint16_t ctr;
50
+ /* Timestamp incremented by approx 8Hz (low part). */
51
+ uint16_t tstpl;
52
+ /* Timestamp (high part). */
53
+ uint8_t tstph;
54
+ /* Number of times used within session + activation flags. */
55
+ uint8_t use;
56
+ /* Pseudo-random value. */
57
+ uint16_t rnd;
58
+ /* CRC16 value of all fields. */
59
+ uint16_t crc;
60
+ } yubikey_token_st;
61
+
62
+ typedef yubikey_token_st *yubikey_token_t;
63
+
64
+ /* High-level functions. */
65
+
66
+ /* Decrypt TOKEN using KEY and store output in OUT structure. Note
67
+ that there is no error checking whether the output data is valid or
68
+ not, use yubikey_check_* for that. */
69
+ extern void yubikey_parse (const uint8_t token[YUBIKEY_BLOCK_SIZE],
70
+ const uint8_t key[YUBIKEY_KEY_SIZE],
71
+ yubikey_token_t out);
72
+
73
+ # define yubikey_counter(ctr) ((ctr) & 0x7FFF)
74
+ # define yubikey_capslock(ctr) ((ctr) & 0x8000)
75
+ # define yubikey_crc_ok_p(tok) \
76
+ (yubikey_crc16 ((tok), YUBIKEY_BLOCK_SIZE) == YUBIKEY_CRC_OK_RESIDUE)
77
+
78
+ /*
79
+ * Low-level functions; ModHex.
80
+ */
81
+
82
+ # define YUBIKEY_MODHEX_MAP "cbdefghijklnrtuv"
83
+
84
+ /* ModHex encode input string SRC of length SRCSIZE and put the zero
85
+ terminated output string in DST. The size of the output string DST
86
+ must be at least 2*SRCSIZE+1. The output string is always
87
+ 2*SRCSIZE large plus the terminating zero. */
88
+ extern void yubikey_modhex_encode (char *dst,
89
+ const char *src,
90
+ size_t srcsize);
91
+
92
+ /* ModHex decode input string SRC of length DSTSIZE/2 into output
93
+ string DST. The output string DST is always DSTSIZE/2 large plus
94
+ the terminating zero. */
95
+ extern void yubikey_modhex_decode (char *dst,
96
+ const char *src,
97
+ size_t dstsize);
98
+
99
+ /* Hex encode/decode data, same interface as modhex functions. */
100
+ extern void yubikey_hex_encode (char *dst, const char *src, size_t srcsize);
101
+ extern void yubikey_hex_decode (char *dst, const char *src, size_t dstsize);
102
+
103
+ /* Return non-zero if zero-terminated input STR is a valid (mod)hex
104
+ string, and zero if any non-alphabetic characters are found. */
105
+ extern int yubikey_modhex_p (const char *str);
106
+ extern int yubikey_hex_p (const char *str);
107
+
108
+ /*
109
+ * Low-level functions; CRC.
110
+ */
111
+
112
+ # define YUBIKEY_CRC_OK_RESIDUE 0xf0b8
113
+ extern uint16_t yubikey_crc16 (const uint8_t * buf, size_t buf_size);
114
+
115
+ /* Low-level functions; AES. */
116
+
117
+ /* AES-decrypt one 16-byte block STATE using the 128-bit KEY, leaving
118
+ the decrypted output in the STATE buffer. */
119
+ extern void yubikey_aes_decrypt (uint8_t * state, const uint8_t * key);
120
+
121
+ #endif
data/lib/hex.rb ADDED
@@ -0,0 +1,86 @@
1
+ # Author:: Alessio Caiazza (mailto:nolith@abisso.org)
2
+ # Copyright:: Copyright (c) 2010 Alessio Caiazza
3
+ # License:: New BSD License - http://www.opensource.org/licenses/bsd-license.php
4
+ # All rights reserved.
5
+ #
6
+ # Redistribution and use in source and binary forms, with or without
7
+ # modification, are permitted provided that the following conditions are
8
+ # met:
9
+ #
10
+ # * Redistributions of source code must retain the above copyright
11
+ # notice, this list of conditions and the following disclaimer.
12
+ #
13
+ # * Redistributions in binary form must reproduce the above
14
+ # copyright notice, this list of conditions and the following
15
+ # disclaimer in the documentation and/or other materials provided
16
+ # with the distribution.
17
+ #
18
+ # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19
+ # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20
+ # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21
+ # A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22
+ # OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23
+ # SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24
+ # LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25
+ # DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26
+ # THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27
+ # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28
+ # OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29
+
30
+
31
+ module YubiRuby
32
+ # Hex string encoder/decoder
33
+ #
34
+ # You may consider extending String with YubiRuby::HEX
35
+ # class String
36
+ # include YubiRuby::HEX
37
+ # end
38
+ #
39
+ # "foo bar".hex_encode #=> "666f6f20626172"
40
+ # "666f6f20626172".hex_decode #=> "foo bar"
41
+ module HEX
42
+
43
+ # call-seq:
44
+ # YubiRuby::HEX.encode("string") -> "hex string"
45
+ #
46
+ # Encodes <tt>obj.to_str</tt> into an <tt>hex string</tt>.
47
+ #
48
+ def self.encode( obj )
49
+ s = obj.to_str
50
+ s.unpack('U'*s.length).collect {|x| x.to_s 16}.join
51
+ end
52
+
53
+ # call-seq:
54
+ # hex_encode -> "hex string"
55
+ #
56
+ # Invokes YubiRuby::HEX.encode on +self+.
57
+ def hex_encode
58
+ HEX.encode(self)
59
+ end
60
+
61
+ # call-seq:
62
+ # YubiRuby::HEX.decode("hex string") -> "string" or ""
63
+ #
64
+ # Decodes <tt>obj.to_str</tt> into a <tt>string</tt>.
65
+ #
66
+ # An <tt>hex string</tt> length must be pair, if not an
67
+ # empty string is returned.
68
+ def self.decode( obj )
69
+ s = obj.to_str
70
+ dec = ""
71
+ if (s.length % 2 == 0)
72
+ (s.length/2).times { |i| dec << s[i*2,2].hex.chr }
73
+ end
74
+
75
+ return dec
76
+ end
77
+
78
+ # call-seq:
79
+ # hex_decode -> "string"
80
+ #
81
+ # Invokes YubiRuby::HEX.decode on +self+.
82
+ def hex_decode
83
+ HEX.decode(self)
84
+ end
85
+ end
86
+ end