1
- package pkgYkneoOath ;
1
+ package com . vivokey . otp ;
2
2
3
3
/*
4
4
* Copyright (c) 2013-2015 Yubico AB
23
23
import javacard .framework .ISOException ;
24
24
import javacard .framework .JCSystem ;
25
25
import javacard .framework .Util ;
26
+ import javacard .security .MessageDigest ;
26
27
import javacard .security .RandomData ;
27
28
28
29
public class YkneoOath extends Applet {
@@ -60,6 +61,10 @@ public class YkneoOath extends Applet {
60
61
private OathObj scratchAuth ;
61
62
private byte [] propBuf ;
62
63
64
+ private byte [] tar1 ;
65
+ private byte [] tar2 ;
66
+ private MessageDigest sha224 ;
67
+
63
68
private static final byte PROP_AUTH_OFFS = 0 ;
64
69
private static final byte PROP_SENT_DATA_OFFS = 1 ;
65
70
private static final byte PROP_REMAINING_DATA_LEN = 3 ;
@@ -79,6 +84,10 @@ public YkneoOath() {
79
84
sendBuffer = JCSystem .makeTransientByteArray (BUFSIZE , JCSystem .CLEAR_ON_DESELECT );
80
85
propBuf = JCSystem .makeTransientByteArray (PROP_BUF_SIZE , JCSystem .CLEAR_ON_DESELECT );
81
86
rng = RandomData .getInstance (RandomData .ALG_PSEUDO_RANDOM );
87
+
88
+ sha224 = MessageDigest .getInstance (MessageDigest .ALG_SHA_224 , false );
89
+ tar1 = JCSystem .makeTransientByteArray ((short ) 28 , JCSystem .CLEAR_ON_RESET );
90
+ tar2 = JCSystem .makeTransientByteArray ((short )28 , JCSystem .CLEAR_ON_RESET );
82
91
83
92
identity = new byte [CHALLENGE_LENGTH ];
84
93
rng .generateData (identity , _0 , CHALLENGE_LENGTH );
@@ -231,6 +240,10 @@ private short handleValidate(byte[] input, byte[] output) {
231
240
if (Util .arrayCompare (input , offs , tempBuf , _0 , len ) == 0 ) {
232
241
propBuf [PROP_AUTH_OFFS ] = 1 ;
233
242
} else {
243
+ rng .generateData (tar1 , (short )0 , (short )28 );
244
+ sha224 .doFinal (tar1 , (short )0 , (short )28 , tar2 , (short )0 );
245
+ sha224 .doFinal (tar2 , (short )0 , (short )28 , tar1 , (short )0 );
246
+ sha224 .doFinal (tar1 , (short )0 , (short )28 , tar2 , (short )0 );
234
247
ISOException .throwIt (ISO7816 .SW_WRONG_DATA );
235
248
}
236
249
offs += len ;
@@ -440,6 +453,7 @@ private void handlePut(byte[] buf) {
440
453
byte digits = buf [offs ++];
441
454
442
455
// protect against tearing (we want to do this as late as possible)
456
+
443
457
object .setActive (false );
444
458
object .setDigits (digits );
445
459
@@ -464,6 +478,7 @@ private void handlePut(byte[] buf) {
464
478
object .clearImf ();
465
479
}
466
480
object .setActive (true );
481
+
467
482
}
468
483
469
484
private short getLength (byte [] buf , short offs ) {
0 commit comments