package org.jboss.totp; import junit.framework.TestCase; import org.bouncycastle.crypto.digests.SHA1Digest; import org.bouncycastle.crypto.digests.SHA256Digest; import org.bouncycastle.crypto.digests.SHA512Digest; import org.bouncycastle.crypto.macs.HMac; import org.bouncycastle.crypto.params.KeyParameter; /** * JUnit test for the TOTP generator. Based on <a * href="http://tools.ietf.org/html/rfc6238#appendix-B">test vectors from the * RFC 6238</a>. * * @author Josef Cacek */ public class TOTPMIDletTest extends TestCase { private static final int TIMESTEP = 30; private static final int DIGITS = 8; // Seed for HMAC-SHA1 - 20 bytes private static final byte[] seed20 = "12345678901234567890".getBytes(); // Seed for HMAC-SHA256 - 32 bytes private static final byte[] seed32 = "12345678901234567890123456789012".getBytes(); // Seed for HMAC-SHA512 - 64 bytes private static final byte[] seed64 = "1234567890123456789012345678901234567890123456789012345678901234".getBytes(); private static final long[] TEST_TIME = { 59L, 1111111109L, 1111111111L, 1234567890L, 2000000000L, 20000000000L }; private static final String[] SHA1_VALUES = { "94287082", "07081804", "14050471", "89005924", "69279037", "65353130" }; private static final String[] SHA256_VALUES = { "46119246", "68084774", "67062674", "91819424", "90698825", "77737706" }; private static final String[] SHA512_VALUES = { "90693936", "25091201", "99943326", "93441116", "38618901", "47863826" }; public void testTOTP() { HMac sha1Hmac = new HMac(new SHA1Digest()); sha1Hmac.init(new KeyParameter(seed20)); HMac sha256Hmac = new HMac(new SHA256Digest()); sha256Hmac.init(new KeyParameter(seed32)); HMac sha512Hmac = new HMac(new SHA512Digest()); sha512Hmac.init(new KeyParameter(seed64)); for (int i = 0; i < TEST_TIME.length; i++) { long counter = TOTPMIDlet.getCounter(TEST_TIME[i], TIMESTEP); assertEquals(SHA1_VALUES[i], TOTPMIDlet.genToken(counter, sha1Hmac, DIGITS)); assertEquals(SHA256_VALUES[i], TOTPMIDlet.genToken(counter, sha256Hmac, DIGITS)); assertEquals(SHA512_VALUES[i], TOTPMIDlet.genToken(counter, sha512Hmac, DIGITS)); } } }