Smart Card Solution
User Manual
- R502 Manual
JavaCard API Samples
- Algorithm
Java Card Specification
Knowledge Sharing
Smart Card Solution
User Manual
JavaCard API Samples
Java Card Specification
Knowledge Sharing
This is an old revision of the document!
Download Sample Code Discussion
/* * @file HashSample.java * @version v1.0 * Package AID: 4A617661436172644F53 * Applet AID: 4A617661436172644F5305 * @brief The ALgorithm of Hash Sample Code in JavaCard API Specification * @comment The purpose of this example is only used to show the usage of API functions and there is no practical significance. * @copyright Copyright(C) 2016 JavaCardOS Technologies Co., Ltd. All rights reserved. */ package JavaCardOS.Sample.Algorithm; import javacard.framework.*; import javacard.security.*; import javacardx.crypto.*; public class HashSample extends Applet { private static final byte INS_GEN_HASH = (byte)0x50; private byte[] flags; private static final short OFF_INS = (short)0; private static final short OFF_P1 = (short)1; private static final short OFF_P2 = (short)2; private static final short OFF_LEN = (short)3; private static final short FLAGS_SIZE = (short)5; private InitializedMessageDigest sha1; private InitializedMessageDigest sha256; private InitializedMessageDigest sha512; public HashSample() { flags = JCSystem.makeTransientByteArray(FLAGS_SIZE, JCSystem.CLEAR_ON_DESELECT); //Creates a InitializedMessageDigest object instance of the ALG_SHA algorithm. sha1 = MessageDigest.getInitializedMessageDigestInstance(MessageDigest.ALG_SHA, false); //Creates a InitializedMessageDigest object instance of the ALG_SHA_256 algorithm. sha256 = MessageDigest.getInitializedMessageDigestInstance(MessageDigest.ALG_SHA_256, false); //Creates a InitializedMessageDigest object instance of the ALG_SHA_512 algorithm. sha512 = MessageDigest.getInitializedMessageDigestInstance(MessageDigest.ALG_SHA_512, false); JCSystem.requestObjectDeletion(); } public static void install(byte[] bArray, short bOffset, byte bLength) { new HashSample().register(bArray, (short) (bOffset + 1), bArray[bOffset]); } public void process(APDU apdu) { if (selectingApplet()) { return; } byte[] buf = apdu.getBuffer(); short len = apdu.setIncomingAndReceive(); switch (buf[ISO7816.OFFSET_INS]) { case (byte)INS_GEN_HASH: generateHash(apdu, len); break; default: ISOException.throwIt(ISO7816.SW_INS_NOT_SUPPORTED); } } //Generate Hash private void generateHash(APDU apdu, short len) { byte[] buffer = apdu.getBuffer(); boolean hasMoreCmd = (buffer[ISO7816.OFFSET_P1] & 0x80) != 0; InitializedMessageDigest hash = null; short resultLen = 0; short offset = ISO7816.OFFSET_CDATA; switch (buffer[ISO7816.OFFSET_P1] & 0x7f) { case 0: hash = sha1; resultLen = MessageDigest.LENGTH_SHA; break; case 1: hash = sha256; resultLen = MessageDigest.LENGTH_SHA_256; break; case 2: hash = sha512; resultLen = MessageDigest.LENGTH_SHA_512; if (hash == null) { ISOException.throwIt(ISO7816.SW_CONDITIONS_NOT_SATISFIED); } break; default: ISOException.throwIt(ISO7816.SW_INCORRECT_P1P2); break; } if (buffer[ISO7816.OFFSET_P2] == 0) //first block { //Reset the MessageDigest object to the initial state. hash.reset(); } if (hasMoreCmd) { //Accumulate a hash of the input data. hash.update(buffer, offset, len); } else { //Generate a hash of all the input data. short ret = hash.doFinal(buffer, offset, len, buffer, (short)0); Util.arrayFillNonAtomic(flags, (short)0, (short)flags.length, (byte)0); apdu.setOutgoingAndSend((short)0, ret); } } }
The test script of Hash is as follows: Download Test Script
//The test script of Hash //Copyright(C) JavaCardOS Technologies Co., Ltd. All rights reserved. //Hash Select Applet 00A404000B4A617661436172644F530500; //SHA1 //expect:44ABF22AF275548BCE3639C5FE3CDFCFFFF305AA9000 80500000A36713E26AA669E98027D9FE54B457551A40599E921D39DB8970DA6FA2E18E785697375F3A63ADAE803B6021C1EB3FFFFA07D8AAD424C075284735B7C29E021E656EA345104DAA8880916117F608B1493AEA4233E00BE47ACA552E65EE76643659D69EBB74CC2720871124077B7576DAE4D0E1603F3C6D8F77810CA2AFD17E6B3BB672E9EF48EE1D9DA3F01AD998565CFFA3FB5A781D235E38B319958B17166212F565F8; //SHA256 80508100C8ECE47FD746C16AD454D0D509979BF65DB051109F815EACBC8F3F2636AA956CD1D1780390500D4BDF2B5B0312BF5A0F0EA74D7946DD52B7EA21382C5A9F90F1E1CC07D4A091F3A1C8AB2BA10D521C61571819B4BA15F3FBA841CAA4652122F1BCA639FBF15299F6F69CE9B6E19608729ECD5DC9E17068025FB59D983E7973F6CA27B87F69DA27D1D1C63C4B78D447CD4C8CC0BEA538DA5478465A0FCDEFAA8773162968F273C6BBC1F0CD67B95300F7CA1EEA9DEDB3707759BCA912FACAF02D1F3C37BF73639E3B2E; 80508101C8E444128C5D5C797F4B846EA02B53F56CDF31A8AD546C6E3662888BD3F3D6D980684854D93883DCD2DA3637A8E6AA5618779BD9CED347D5204EC4D4FC6B961D1F458136882D9CA82D95A702EC2D9E20C44B8EAD4590A8E745C994A2D5130890744398BF8284D063F74280D6544757DDDA24B32DFAD3B82E0E9AA0FE463251B9E52935F8AD85469797AA68BCC87EFC14C1CAB260D6E49E31E18B8FEF37129C20DBC1FFE7F27827CB779508BA3018B64EE105324FBF0A83782762097E90F90F4EBFD19F963AA49A88FE; //expect:959727571EE31D59A2F504A90B38B0103F350BAD27100844381C4B77609635789000 805001023CCB08DB745EAC12A29DDB009E8E8F8C49E8B8B23930D2CAF722BC0D6B52C85594130F247D9807E86C59577D5CB8E9F4ADE541931BFF0E1CED7CFF536E; Follow us