YubiRuby 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README +0 -0
- data/bin/modhex +48 -0
- data/ext/extconf.rb +14 -0
- data/ext/libyubikey.c +534 -0
- data/ext/ykaes.c +214 -0
- data/ext/ykcrc.c +54 -0
- data/ext/ykhex.c +86 -0
- data/ext/ykmodhex.c +86 -0
- data/ext/ykparse.c +45 -0
- data/ext/yubikey.h +121 -0
- data/lib/hex.rb +86 -0
- data/lib/yubiruby.rb +36 -0
- data/tests/tc_modhex.rb +13 -0
- data/tests/ts_yubiruby.rb +6 -0
- metadata +100 -0
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
|