/* * JBoss, Home of Professional Open Source. * Copyright 2008, Red Hat Middleware LLC, and individual contributors * as indicated by the @author tags. See the copyright.txt file in the * distribution for a full listing of individual contributors. * * This is free software; you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as * published by the Free Software Foundation; either version 2.1 of * the License, or (at your option) any later version. * * This software is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this software; if not, write to the Free * Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA * 02110-1301 USA, or see the FSF site: http://www.fsf.org. */ package org.jboss.test.security.otp; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.util.Locale; import org.jboss.security.otp.TimeBasedOTP; import org.jboss.security.otp.TimeBasedOTPUtil; import org.junit.Test; /** * Unit test the {@code TimeBasedOTP} utility * @author Anil.Saldhana@redhat.com * @since Sep 20, 2010 */ public class TimeBasedOTPUnitTestCase { /** | Time (sec) | UTC Time | Value of T (hex) | TOTP | Mode | +------------+---------------+------------------+----------+--------+ | 59 | 1970-01-01 | 0000000000000001 | 94287082 | SHA1 | | | 00:00:59 | | | | | 59 | 1970-01-01 | 0000000000000001 | 32247374 | SHA256 | | | 00:00:59 | | | | | 59 | 1970-01-01 | 0000000000000001 | 69342147 | SHA512 | | | 00:00:59 | | | | | 1111111109 | 2005-03-18 | 00000000023523EC | 07081804 | SHA1 | | | 01:58:29 | | | | | 1111111109 | 2005-03-18 | 00000000023523EC | 34756375 | SHA256 | | | 01:58:29 | | | | | 1111111109 | 2005-03-18 | 00000000023523EC | 63049338 | SHA512 | | | 01:58:29 | | | | | 1111111111 | 2005-03-18 | 00000000023523ED | 14050471 | SHA1 | | | 01:58:31 | | | | | 1111111111 | 2005-03-18 | 00000000023523ED | 74584430 | SHA256 | | | 01:58:31 | | | | | 1111111111 | 2005-03-18 | 00000000023523ED | 54380122 | SHA512 | | | 01:58:31 | | | | | 1234567890 | 2009-02-13 | 000000000273EF07 | 89005924 | SHA1 | | | 23:31:30 | | | | | 1234567890 | 2009-02-13 | 000000000273EF07 | 42829826 | SHA256 | | | 23:31:30 | | | | | 1234567890 | 2009-02-13 | 000000000273EF07 | 76671578 | SHA512 | | | 23:31:30 | | | | | 2000000000 | 2033-05-18 | 0000000003F940AA | 69279037 | SHA1 | | | 03:33:20 | | | | | 2000000000 | 2033-05-18 | 0000000003F940AA | 78428693 | SHA256 | | | 03:33:20 | | | | | 2000000000 | 2033-05-18 | 0000000003F940AA | 56464532 | SHA512 | | | 03:33:20 | | | | +------------+---------------+------------------+----------+--------+ */ String seed = "3132333435363738393031323334353637383930"; long T0 = 0; long X = 30; long testTime[] = { 59, 1111111109, 1111111111, 1234567890, 2000000000 }; String steps = "0"; String[] totp = new String[] { "94287082", "32247374", "69342147", "07081804", "34756375", "63049338", "14050471", "74584430", "54380122", "89005924", "42829826", "76671578", "69279037", "78428693", "56464532" }; int NUMBER_OF_DIGITS = 8; int SLEEP_TIME = 2; @Test public void testTOTP() throws Exception { int totpIndex = -1; for(int i=0; i< testTime.length; i++) { long T = ( testTime[i] - T0 ) / X; steps = Long.toHexString( T ).toUpperCase(Locale.ENGLISH); // Just get a 16 digit string while(steps.length() < 16) steps = "0" + steps; assertEquals( totp[ ++totpIndex ], TimeBasedOTP.generateTOTP( seed, steps, NUMBER_OF_DIGITS , "HmacSHA1" ) ); assertEquals( totp[ ++totpIndex ], TimeBasedOTP.generateTOTP( seed, steps, NUMBER_OF_DIGITS , "HmacSHA256" ) ); assertEquals( totp[ ++totpIndex ], TimeBasedOTP.generateTOTP( seed, steps, NUMBER_OF_DIGITS , "HmacSHA512" ) ); } } @Test public void testTOTPValidity() throws Exception { String totp = TimeBasedOTP.generateTOTP( seed, NUMBER_OF_DIGITS ); System.out.println( "We are going to sleep for " + SLEEP_TIME + " secs" ); Thread.sleep( SLEEP_TIME * 1000 ); //10 secs assertTrue( "TOTP validated", TimeBasedOTPUtil.validate( totp, seed.getBytes() , 8 )); } }