YubiRuby 1.0.0 → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/.hgignore +30 -0
- data/.hgtags +4 -0
- data/.rspec +2 -0
- data/CHANGELOG +3 -1
- data/Gemfile +4 -0
- data/LICENSE +1 -1
- data/README.developer.txt +17 -0
- data/README.md +43 -0
- data/Rakefile +64 -50
- data/YubiRuby.gemspec +31 -45
- data/bin/modhex +1 -1
- data/bin/yubikey +1 -1
- data/ext/libyubikey/libyubikey.c +14 -14
- data/ext/libyubikey/ykaes.c +101 -1
- data/ext/libyubikey/ykcrc.c +3 -3
- data/ext/libyubikey/ykhex.c +3 -5
- data/ext/libyubikey/ykmodhex.c +3 -5
- data/ext/libyubikey/ykparse.c +115 -9
- data/ext/libyubikey/yktoken.c +52 -0
- data/ext/libyubikey/yubikey.h +23 -8
- data/lib/fake_yubikey.rb +51 -55
- data/lib/hex.rb +10 -29
- data/lib/version.rb +3 -0
- data/lib/yubiruby.rb +2 -2
- data/test/fake_yubikey_spec.rb +1 -1
- data/test/hex_spec.rb +1 -1
- data/test/modhex_spec.rb +2 -2
- data/test/yubiruby_spec.rb +7 -0
- metadata +144 -143
- data/Manifest +0 -29
- data/README +0 -44
data/ext/libyubikey/ykaes.c
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
/* ykaes.c --- Implementation of AES-128.
|
2
2
|
*
|
3
|
-
* Copyright (c) 2006
|
3
|
+
* Copyright (c) 2006-2012 Yubico AB
|
4
4
|
* All rights reserved.
|
5
5
|
*
|
6
6
|
* Redistribution and use in source and binary forms, with or without
|
@@ -212,3 +212,103 @@ yubikey_aes_decrypt (uint8_t * state, const uint8_t * key)
|
|
212
212
|
|
213
213
|
}
|
214
214
|
}
|
215
|
+
|
216
|
+
|
217
|
+
/*******************************************************************
|
218
|
+
function aesEncrypt encrypts a single AES-128 block
|
219
|
+
|
220
|
+
void aesEncrypt(unsigned char *state, const unsigned char *key)
|
221
|
+
|
222
|
+
Where:
|
223
|
+
"state" is state buffer, i.e. plaintext in, ciphertext out
|
224
|
+
"key" is pointer to AES key
|
225
|
+
|
226
|
+
*************************************************************************/
|
227
|
+
|
228
|
+
void
|
229
|
+
yubikey_aes_encrypt (uint8_t *state, const uint8_t *key)
|
230
|
+
{
|
231
|
+
unsigned char i, j, k, tmp, round_key[0x10];
|
232
|
+
|
233
|
+
memcpy (round_key, key, sizeof (round_key));
|
234
|
+
|
235
|
+
for (i = 0; i < 16; i++)
|
236
|
+
state[i] ^= key[i];
|
237
|
+
|
238
|
+
for (i = 0; i < NUMBER_OF_ROUNDS; i++)
|
239
|
+
{
|
240
|
+
|
241
|
+
// byte_sub_shift_row(state);
|
242
|
+
|
243
|
+
/* First row: 0 shift, 0 4 8 12 */
|
244
|
+
state[0] = rijndael_sbox[state[0]];
|
245
|
+
state[4] = rijndael_sbox[state[4]];
|
246
|
+
state[8] = rijndael_sbox[state[8]];
|
247
|
+
state[12] = rijndael_sbox[state[12]];
|
248
|
+
|
249
|
+
/* Second row: 1 shift, 1 5 9 13 */
|
250
|
+
tmp = state[1];
|
251
|
+
state[1] = rijndael_sbox[state[5]];
|
252
|
+
state[5] = rijndael_sbox[state[9]];
|
253
|
+
state[9] = rijndael_sbox[state[13]];
|
254
|
+
state[13] = rijndael_sbox[tmp];
|
255
|
+
|
256
|
+
/* Third row: 2 shift, 2 6 10 14 */
|
257
|
+
tmp = state[2];
|
258
|
+
state[2] = rijndael_sbox[state[10]];
|
259
|
+
state[10] = rijndael_sbox[tmp];
|
260
|
+
tmp = state[6];
|
261
|
+
state[6] = rijndael_sbox[state[14]];
|
262
|
+
state[14] = rijndael_sbox[tmp];
|
263
|
+
|
264
|
+
/* Fourth row: 3 shift, 3 7 11 15 */
|
265
|
+
tmp = state[15];
|
266
|
+
state[15] = rijndael_sbox[state[11]];
|
267
|
+
state[11] = rijndael_sbox[state[7]];
|
268
|
+
state[7] = rijndael_sbox[state[3]];
|
269
|
+
state[3] = rijndael_sbox[tmp];
|
270
|
+
|
271
|
+
if (i != (NUMBER_OF_ROUNDS - 1))
|
272
|
+
{
|
273
|
+
|
274
|
+
// mix_column(state);
|
275
|
+
|
276
|
+
for (k = 0; k < 16; k += 4)
|
277
|
+
{
|
278
|
+
|
279
|
+
j = state[k] ^ state[k + 1];
|
280
|
+
tmp = j ^ state[k + 2] ^ state[k + 3];
|
281
|
+
|
282
|
+
j = xtime (j);
|
283
|
+
|
284
|
+
state[k] ^= (j ^ tmp);
|
285
|
+
|
286
|
+
j = state[k + 1] ^ state[k + 2];
|
287
|
+
j = xtime (j);
|
288
|
+
|
289
|
+
state[k + 1] ^= (j ^ tmp);
|
290
|
+
|
291
|
+
j = state[k + 2] ^ state[k + 3];
|
292
|
+
j = xtime (j);
|
293
|
+
|
294
|
+
state[k + 2] ^= (j ^ tmp);
|
295
|
+
state[k + 3] = state[k] ^ state[k + 1] ^ state[k + 2] ^ tmp;
|
296
|
+
}
|
297
|
+
}
|
298
|
+
|
299
|
+
round_key[0] ^= RC[i];
|
300
|
+
|
301
|
+
round_key[0] ^= rijndael_sbox[round_key[13]];
|
302
|
+
round_key[1] ^= rijndael_sbox[round_key[14]];
|
303
|
+
round_key[2] ^= rijndael_sbox[round_key[15]];
|
304
|
+
round_key[3] ^= rijndael_sbox[round_key[12]];
|
305
|
+
|
306
|
+
for (k = 4; k < 16; k++)
|
307
|
+
round_key[k] ^= round_key[k - 4];
|
308
|
+
|
309
|
+
// add_round_key(state, round_key);
|
310
|
+
|
311
|
+
for (j = 0; j < 16; j++)
|
312
|
+
state[j] ^= round_key[j];
|
313
|
+
}
|
314
|
+
}
|
data/ext/libyubikey/ykcrc.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
/* ykcrc.c --- Implementation of
|
1
|
+
/* ykcrc.c --- Implementation of YubiKey CRC-16 function.
|
2
2
|
*
|
3
3
|
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
-
* Copyright (c) 2006
|
4
|
+
* Copyright (c) 2006-2012 Yubico AB
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without
|
@@ -33,7 +33,7 @@
|
|
33
33
|
#include "yubikey.h"
|
34
34
|
|
35
35
|
uint16_t
|
36
|
-
yubikey_crc16 (const uint8_t *buf, size_t buf_size)
|
36
|
+
yubikey_crc16 (const uint8_t * buf, size_t buf_size)
|
37
37
|
{
|
38
38
|
uint16_t m_crc = 0xffff;
|
39
39
|
|
data/ext/libyubikey/ykhex.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* ykhex.c --- Implementation of hex encoding/decoding
|
2
2
|
*
|
3
3
|
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
-
* Copyright (c) 2006
|
4
|
+
* Copyright (c) 2006-2012 Yubico AB
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without
|
@@ -32,8 +32,6 @@
|
|
32
32
|
|
33
33
|
#include "yubikey.h"
|
34
34
|
|
35
|
-
#include <stdbool.h>
|
36
|
-
|
37
35
|
static const char trans[] = "0123456789abcdef";
|
38
36
|
|
39
37
|
void
|
@@ -52,8 +50,8 @@ void
|
|
52
50
|
yubikey_hex_decode (char *dst, const char *src, size_t dstSize)
|
53
51
|
{
|
54
52
|
char b;
|
55
|
-
|
56
|
-
char *p1;
|
53
|
+
int flag = 0;
|
54
|
+
const char *p1;
|
57
55
|
|
58
56
|
for (; *src && dstSize > 0; src++)
|
59
57
|
{
|
data/ext/libyubikey/ykmodhex.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
/* ykmodhex.c --- Implementation of modhex encoding/decoding
|
2
2
|
*
|
3
3
|
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
-
* Copyright (c) 2006
|
4
|
+
* Copyright (c) 2006-2012 Yubico AB
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without
|
@@ -32,8 +32,6 @@
|
|
32
32
|
|
33
33
|
#include "yubikey.h"
|
34
34
|
|
35
|
-
#include <stdbool.h>
|
36
|
-
|
37
35
|
static const char trans[] = YUBIKEY_MODHEX_MAP;
|
38
36
|
|
39
37
|
void
|
@@ -52,8 +50,8 @@ void
|
|
52
50
|
yubikey_modhex_decode (char *dst, const char *src, size_t dstSize)
|
53
51
|
{
|
54
52
|
char b;
|
55
|
-
|
56
|
-
char *p1;
|
53
|
+
int flag = 0;
|
54
|
+
const char *p1;
|
57
55
|
|
58
56
|
for (; *src && dstSize > 0; src++)
|
59
57
|
{
|
data/ext/libyubikey/ykparse.c
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
/* ykparse.c ---
|
1
|
+
/* ykparse.c --- Example command line interface for authentication token.
|
2
2
|
*
|
3
3
|
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
-
* Copyright (c) 2006
|
4
|
+
* Copyright (c) 2006-2012 Yubico AB
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without
|
@@ -32,14 +32,120 @@
|
|
32
32
|
|
33
33
|
#include "yubikey.h"
|
34
34
|
|
35
|
+
#include <stdio.h>
|
35
36
|
#include <stdlib.h>
|
36
|
-
#include <
|
37
|
+
#include <stdint.h>
|
38
|
+
#include <string.h>
|
37
39
|
|
38
|
-
|
39
|
-
|
40
|
-
const uint8_t key[16], yubikey_token_t out)
|
40
|
+
int
|
41
|
+
main (int argc, char *argv[])
|
41
42
|
{
|
42
|
-
|
43
|
-
|
44
|
-
|
43
|
+
uint8_t buf[128];
|
44
|
+
uint8_t key[YUBIKEY_KEY_SIZE];
|
45
|
+
char *aeskey, *token;
|
46
|
+
yubikey_token_st tok;
|
47
|
+
|
48
|
+
/* Parse command line parameters. */
|
49
|
+
if (argc < 2)
|
50
|
+
{
|
51
|
+
printf ("Usage: %s <aeskey> <token>\n", argv[0]);
|
52
|
+
printf (" AESKEY:\tHex encoded AES-key.\n");
|
53
|
+
printf (" TOKEN:\t\tModHex encoded token.\n");
|
54
|
+
return EXIT_FAILURE;
|
55
|
+
}
|
56
|
+
|
57
|
+
aeskey = argv[1];
|
58
|
+
token = argv[2];
|
59
|
+
|
60
|
+
if (strlen (aeskey) != 32)
|
61
|
+
{
|
62
|
+
printf ("error: Hex encoded AES-key must be 32 characters.\n");
|
63
|
+
return EXIT_FAILURE;
|
64
|
+
}
|
65
|
+
|
66
|
+
if (strlen (token) > 32)
|
67
|
+
{
|
68
|
+
printf ("warning: overlong token, ignoring prefix: %.*s\n",
|
69
|
+
(int) strlen (token) - 32, token);
|
70
|
+
token = token + (strlen (token) - 32);
|
71
|
+
}
|
72
|
+
|
73
|
+
if (strlen (token) != 32)
|
74
|
+
{
|
75
|
+
printf ("error: ModHex encoded token must be 32 characters.\n");
|
76
|
+
return EXIT_FAILURE;
|
77
|
+
}
|
78
|
+
|
79
|
+
/* Debug. */
|
80
|
+
printf ("Input:\n");
|
81
|
+
printf (" token: %s\n", token);
|
82
|
+
|
83
|
+
yubikey_modhex_decode ((char *) key, token, YUBIKEY_KEY_SIZE);
|
84
|
+
|
85
|
+
{
|
86
|
+
size_t i;
|
87
|
+
printf (" ");
|
88
|
+
for (i = 0; i < YUBIKEY_KEY_SIZE; i++)
|
89
|
+
printf ("%02x ", key[i] & 0xFF);
|
90
|
+
printf ("\n");
|
91
|
+
}
|
92
|
+
|
93
|
+
printf (" aeskey: %s\n", aeskey);
|
94
|
+
|
95
|
+
yubikey_hex_decode ((char *) key, aeskey, YUBIKEY_KEY_SIZE);
|
96
|
+
|
97
|
+
{
|
98
|
+
size_t i;
|
99
|
+
printf (" ");
|
100
|
+
for (i = 0; i < YUBIKEY_KEY_SIZE; i++)
|
101
|
+
printf ("%02x ", key[i] & 0xFF);
|
102
|
+
printf ("\n");
|
103
|
+
}
|
104
|
+
|
105
|
+
/* Pack up dynamic password, decrypt it and verify checksum */
|
106
|
+
yubikey_parse ((uint8_t *) token, key, &tok);
|
107
|
+
|
108
|
+
printf ("Output:\n");
|
109
|
+
{
|
110
|
+
size_t i;
|
111
|
+
printf (" ");
|
112
|
+
for (i = 0; i < YUBIKEY_BLOCK_SIZE; i++)
|
113
|
+
printf ("%02x ", ((uint8_t *) & tok)[i] & 0xFF);
|
114
|
+
printf ("\n");
|
115
|
+
}
|
116
|
+
|
117
|
+
printf ("\nStruct:\n");
|
118
|
+
/* Debug */
|
119
|
+
{
|
120
|
+
size_t i;
|
121
|
+
printf (" uid: ");
|
122
|
+
for (i = 0; i < YUBIKEY_UID_SIZE; i++)
|
123
|
+
printf ("%02x ", tok.uid[i] & 0xFF);
|
124
|
+
printf ("\n");
|
125
|
+
}
|
126
|
+
printf (" counter: %d (0x%04x)\n", tok.ctr, tok.ctr);
|
127
|
+
printf (" timestamp (low): %d (0x%04x)\n", tok.tstpl, tok.tstpl);
|
128
|
+
printf (" timestamp (high): %d (0x%02x)\n", tok.tstph, tok.tstph);
|
129
|
+
printf (" session use: %d (0x%02x)\n", tok.use, tok.use);
|
130
|
+
printf (" random: %d (0x%02x)\n", tok.rnd, tok.rnd);
|
131
|
+
printf (" crc: %d (0x%04x)\n", tok.crc, tok.crc);
|
132
|
+
|
133
|
+
printf ("\nDerived:\n");
|
134
|
+
printf (" cleaned counter: %d (0x%04x)\n",
|
135
|
+
yubikey_counter (tok.ctr), yubikey_counter (tok.ctr));
|
136
|
+
yubikey_modhex_encode ((char *) buf, (char *) tok.uid, YUBIKEY_UID_SIZE);
|
137
|
+
printf (" modhex uid: %s\n", buf);
|
138
|
+
printf (" triggered by caps lock: %s\n",
|
139
|
+
yubikey_capslock (tok.ctr) ? "yes" : "no");
|
140
|
+
printf (" crc: %04X\n", yubikey_crc16 ((void *) &tok, YUBIKEY_KEY_SIZE));
|
141
|
+
|
142
|
+
printf (" crc check: ");
|
143
|
+
if (yubikey_crc_ok_p ((uint8_t *) & tok))
|
144
|
+
{
|
145
|
+
printf ("ok\n");
|
146
|
+
return EXIT_SUCCESS;
|
147
|
+
}
|
148
|
+
|
149
|
+
printf ("fail\n");
|
150
|
+
return EXIT_FAILURE;
|
45
151
|
}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
/* ykparse.c --- Implementation of YubiKey token parser.
|
2
|
+
*
|
3
|
+
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
+
* Copyright (c) 2006-2012 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
|
+
|
37
|
+
void
|
38
|
+
yubikey_parse (const uint8_t token[32],
|
39
|
+
const uint8_t key[16], yubikey_token_t out)
|
40
|
+
{
|
41
|
+
memset (out, 0, sizeof (*out));
|
42
|
+
yubikey_modhex_decode ((char *) out, (const char *) token, sizeof (*out));
|
43
|
+
yubikey_aes_decrypt ((uint8_t *) out, key);
|
44
|
+
}
|
45
|
+
|
46
|
+
void
|
47
|
+
yubikey_generate (yubikey_token_t token,
|
48
|
+
const uint8_t key[YUBIKEY_KEY_SIZE], char out[32])
|
49
|
+
{
|
50
|
+
yubikey_aes_encrypt ((uint8_t *) token, key);
|
51
|
+
yubikey_modhex_encode (out, (const char *) token, YUBIKEY_KEY_SIZE);
|
52
|
+
}
|
data/ext/libyubikey/yubikey.h
CHANGED
@@ -1,7 +1,7 @@
|
|
1
|
-
/* yubikey.h --- Prototypes for low-level
|
1
|
+
/* yubikey.h --- Prototypes for low-level YubiKey OTP functions.
|
2
2
|
*
|
3
3
|
* Written by Simon Josefsson <simon@josefsson.org>.
|
4
|
-
* Copyright (c) 2006
|
4
|
+
* Copyright (c) 2006-2012 Yubico AB
|
5
5
|
* All rights reserved.
|
6
6
|
*
|
7
7
|
* Redistribution and use in source and binary forms, with or without
|
@@ -36,9 +36,15 @@
|
|
36
36
|
# include <stdint.h>
|
37
37
|
# include <string.h>
|
38
38
|
|
39
|
+
# ifdef __cplusplus
|
40
|
+
extern "C"
|
41
|
+
{
|
42
|
+
# endif
|
43
|
+
|
39
44
|
# define YUBIKEY_BLOCK_SIZE 16
|
40
45
|
# define YUBIKEY_KEY_SIZE 16
|
41
46
|
# define YUBIKEY_UID_SIZE 6
|
47
|
+
# define YUBIKEY_OTP_SIZE (2 * YUBIKEY_BLOCK_SIZE)
|
42
48
|
|
43
49
|
typedef struct
|
44
50
|
{
|
@@ -63,6 +69,7 @@ typedef yubikey_token_st *yubikey_token_t;
|
|
63
69
|
|
64
70
|
/* High-level functions. */
|
65
71
|
|
72
|
+
|
66
73
|
/* Decrypt TOKEN using KEY and store output in OUT structure. Note
|
67
74
|
that there is no error checking whether the output data is valid or
|
68
75
|
not, use yubikey_check_* for that. */
|
@@ -70,6 +77,11 @@ extern void yubikey_parse (const uint8_t token[YUBIKEY_BLOCK_SIZE],
|
|
70
77
|
const uint8_t key[YUBIKEY_KEY_SIZE],
|
71
78
|
yubikey_token_t out);
|
72
79
|
|
80
|
+
/* Generate OTP */
|
81
|
+
extern void yubikey_generate (yubikey_token_t token,
|
82
|
+
const uint8_t key[YUBIKEY_KEY_SIZE],
|
83
|
+
char out[YUBIKEY_OTP_SIZE]);
|
84
|
+
|
73
85
|
# define yubikey_counter(ctr) ((ctr) & 0x7FFF)
|
74
86
|
# define yubikey_capslock(ctr) ((ctr) & 0x8000)
|
75
87
|
# define yubikey_crc_ok_p(tok) \
|
@@ -86,15 +98,13 @@ extern void yubikey_parse (const uint8_t token[YUBIKEY_BLOCK_SIZE],
|
|
86
98
|
must be at least 2*SRCSIZE+1. The output string is always
|
87
99
|
2*SRCSIZE large plus the terminating zero. */
|
88
100
|
extern void yubikey_modhex_encode (char *dst,
|
89
|
-
const char *src,
|
90
|
-
size_t srcsize);
|
101
|
+
const char *src, size_t srcsize);
|
91
102
|
|
92
103
|
/* ModHex decode input string SRC of length DSTSIZE/2 into output
|
93
104
|
string DST. The output string DST is always DSTSIZE/2 large plus
|
94
105
|
the terminating zero. */
|
95
106
|
extern void yubikey_modhex_decode (char *dst,
|
96
|
-
const char *src,
|
97
|
-
size_t dstsize);
|
107
|
+
const char *src, size_t dstsize);
|
98
108
|
|
99
109
|
/* Hex encode/decode data, same interface as modhex functions. */
|
100
110
|
extern void yubikey_hex_encode (char *dst, const char *src, size_t srcsize);
|
@@ -114,8 +124,13 @@ extern uint16_t yubikey_crc16 (const uint8_t * buf, size_t buf_size);
|
|
114
124
|
|
115
125
|
/* Low-level functions; AES. */
|
116
126
|
|
117
|
-
/* AES-decrypt one 16-byte block STATE using the 128-bit KEY,
|
118
|
-
the decrypted output in the STATE buffer. */
|
127
|
+
/* AES-decrypt/encrypt one 16-byte block STATE using the 128-bit KEY,
|
128
|
+
leaving the decrypted/encrypted output in the STATE buffer. */
|
119
129
|
extern void yubikey_aes_decrypt (uint8_t * state, const uint8_t * key);
|
130
|
+
extern void yubikey_aes_encrypt (uint8_t * state, const uint8_t * key);
|
131
|
+
|
132
|
+
# ifdef __cplusplus
|
133
|
+
}
|
134
|
+
# endif
|
120
135
|
|
121
136
|
#endif
|