All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.jpos.security.SMAdapter Maven / Gradle / Ivy

Go to download

jPOS is an ISO-8583 based financial transaction library/framework that can be customized and extended in order to implement financial interchanges.

There is a newer version: 2.1.9
Show newest version
/*
 * jPOS Project [http://jpos.org]
 * Copyright (C) 2000-2016 Alejandro P. Revilla
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU Affero General Public License as
 * published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program 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 Affero General Public License for more details.
 *
 * You should have received a copy of the GNU Affero General Public License
 * along with this program.  If not, see .
 */

package  org.jpos.security;

import org.javatuples.Pair;

import java.security.MessageDigest;
import java.security.PublicKey;
import java.security.spec.AlgorithmParameterSpec;
import java.util.Date;
import java.util.List;
import java.util.Map;


/**
 * A class that implements the SMAdapter interface would act as an
 * adapter to the real security module device (by communicating with it using
 * its proprietary protocol).
 *
 * But application programmers will be communicating
 * with the security module using this simple interface.
 *
 * TODO: support for EMV card/issuer RSA generation API's
 *
 * @author Hani S. Kirollos
 * @author Robert Demski
 * @version $Revision$ $Date$
 */
public interface SMAdapter {
    /**
     * DES Key Length LENGTH_DES = 64.
     */
    short LENGTH_DES = 64;
    /**
     * Triple DES (2 keys) LENGTH_DES3_2KEY = 128.
     */
    short LENGTH_DES3_2KEY = 128;
    /**
     * Triple DES (3 keys) LENGTH_DES3_3KEY = 192.
     */
    short LENGTH_DES3_3KEY = 192;
    /**
     * ZMK: Zone Master Key is a DES (or Triple-DES) key-encryption key which is distributed
     * manually in order that further keys can be exchanged automatically.
     */
    String TYPE_ZMK = "ZMK";

    /**
     * ZPK: Zone PIN Key.
     *
     * is a DES (or Triple-DES) data-encrypting key which is distributed
     * automatically and is used to encrypt PINs for transfer between
     * communicating parties (e.g. between acquirers and issuers).
     */
    String TYPE_ZPK = "ZPK";

    /**
     * TMK: Terminal Master Key.
     *
     * is a  DES (or Triple-DES) key-encrypting key which is distributed
     * manually, or automatically under a previously installed TMK. It is
     * used to distribute data-encrypting keys, whithin a local network,
     * to an ATM or POS terminal or similar.
     */
    String TYPE_TMK = "TMK";

    /**
     * TPK: Terminal PIN Key.
     *
     * is a  DES (or Triple-DES) data-encrypting key which is used
     * to encrypt PINs for transmission, within a local network,
     * between the terminal and the terminal data acquirer.
     */
    String TYPE_TPK = "TPK";

    /**
     * TAK: Terminal Authentication Key.
     *
     * is a  DES (or Triple-DES) data-encrypting key which is used to
     * generate and verify a Message Authentication Code (MAC) when data
     * is transmitted, within a local network, between the terminal and
     * the terminal data acquirer.
     */
    String TYPE_TAK = "TAK";

    /**
     * PVK: PIN Verification Key.
     * is a  DES (or Triple-DES) data-encrypting key which is used to
     * generate and verify PIN verification data and thus verify the
     * authenticity of a PIN.
     */
    String TYPE_PVK = "PVK";

    /**
     * CVK: Card Verification Key.
     *
     * is similar for PVK but for card information instead of PIN
     */
    String TYPE_CVK = "CVK";

    /**
     * BDK: Base Derivation Key.
     * is a  Triple-DES key-encryption key used to derive transaction
     * keys in DUKPT (see ANSI X9.24)
     */
    String TYPE_BDK = "BDK";

    /**
     * ZAK: Zone Authentication Key.
     *
     * a  DES (or Triple-DES) data-encrypting key that is distributed
     * automatically, and is used to generate and verify a Message
     * Authentication Code (MAC) when data is transmitted between
     * communicating parties (e.g. between acquirers and issuers)
     */
    String TYPE_ZAK = "ZAK";

    /**
     * MK-AC: Issuer Master Key for generating and verifying
     * Application Cryptograms.
     */
    String TYPE_MK_AC = "MK-AC";

    /**
     * MK-SMI: Issuer Master Key for Secure Messaging Integrity.
     *
     * is a Triple-DES key which is used to generating Message
     * Authrntication Codes (MAC) for scripts send to EMV chip cards.
     */
    String TYPE_MK_SMI = "MK-SMI";

    /**
     * MK-SMC: Issuer Master Key for Secure Messaging Confidentiality.
     *
     * is a Triple-DES data-encrypting key which is used to encrypt
     * data (e.g. PIN block) in scripts send to EMV chip cards.
     */
    String TYPE_MK_SMC = "MK-SMC";

    /**
     * MK-CVC3: Issuer Master Key for generating and verifying
     * Card Verification Code 3 (CVC3).
     */
    String TYPE_MK_CVC3 = "MK-CVC3";

    /**
     * MK-DAC Issuer Master Key for generating and verifying
     * Data Authentication Codes.
     */
    String TYPE_MK_DAC = "MK-DAC";

    /**
     * MK-DN: Issuer Master Key for generating and verifying
     * Dynamic Numbers.
     */
    String TYPE_MK_DN = "MK-DN";

    /**
     * ZEK: Zone Encryption Key.
     */
    String TYPE_ZEK = "ZEK";

    /**
     * DEK: Data Encryption Key.
     */
    String TYPE_DEK = "DEK";

    /**
     * RSA: Private Key.
     */
    String TYPE_RSA_SK = "RSA_SK";

    /**
     * HMAC: Hash Message Authentication Code (with key usage).
     */
    String TYPE_HMAC   = "HMAC";

    /**
     * RSA: Public Key.
     */
    String TYPE_RSA_PK = "RSA_PK";

    /**
     * PIN Block Format adopted by ANSI (ANSI X9.8) and is one of
     * two formats supported by the ISO (ISO 95641 - format 0).
     */
    byte FORMAT01 = (byte)01;

    /**
     * PIN Block Format 02 supports Douctel ATMs.
     */
    byte FORMAT02 = (byte)02;

    /**
         * PIN Block Format 03 is the Diabold Pin Block format.
         */
    byte FORMAT03 = (byte)03;

    /**
     * PIN Block Format 04 is the PIN block format adopted
     * by the PLUS network.
     */
    byte FORMAT04 = (byte)04;

    /**
     * PIN Block Format 05 is the ISO 9564-1 Format 1 PIN Block.
     */
    byte FORMAT05 = (byte)05;

    /**
     * PIN Block Format 34 is the standard EMV PIN block format.
     * Is only avaliable as output of EMV PIN change commands.
     */
    byte FORMAT34 = (byte)34;

    /**
     * PIN Block Format 35 is the required by Europay/MasterCard
     * for their Pay Now & Pay Later products.
     */
    byte FORMAT35 = (byte)35;

    /**
     * PIN Block Format 41 is the Visa format for PIN change
     * without using the current PIN.
     */
    byte FORMAT41 = (byte)41;

    /**
     * PIN Block Format 42 is the Visa format for PIN change
     * using the current (old) PIN.
     */
    byte FORMAT42 = (byte)42;

    /**
     * Proprietary PIN Block format.
     * 

* Most Security Modules use a proprietary PIN Block format * when encrypting the PIN under the LMK of the Security Module * hence this format (FORMAT00). * *

* This is not a standard format, every Security Module would * interpret FORMAT00 differently. * * So, no interchange would accept PIN Blocks from other interchanges * using this format. It is useful only when working with PIN's inside * your own interchange. *

*/ byte FORMAT00 = (byte)00; /** * Generates a random DES Key. * * @param keyType type of the key to be generated (TYPE_ZMK, TYPE_TMK...etc) * @param keyLength bit length of the key to be generated (LENGTH_DES, LENGTH_DES3_2KEY...) * @return the random key secured by the security module
* @throws SMException */ SecureDESKey generateKey(short keyLength, String keyType) throws SMException; /** * Generates key check value. * * @param kd SecureDESKey with untrusted or fake Key Check Value * @return key check value bytes * @throws SMException */ byte[] generateKeyCheckValue(SecureDESKey kd) throws SMException; /** * Translate Key Scheme to more secure encription. *

* Converts an DES key encrypted using X9.17 methods to a more secure * key using the variant method. * * @param key key to be translated to {@code destKeyScheme} scheme * @param keyScheme destination key scheme * @return translated key with {@code destKeyScheme} scheme * @throws SMException */ SecureDESKey translateKeyScheme(SecureDESKey key, KeyScheme keyScheme) throws SMException; /** * Imports a key from encryption under a KEK (Key-Encrypting Key) * to protection under the security module. * * @param keyLength bit length of the key to be imported (LENGTH_DES, LENGTH_DES3_2KEY...etc) * @param keyType type of the key to be imported (TYPE_ZMK, TYPE_TMK...etc) * @param encryptedKey key to be imported encrypted under KEK * @param kek the key-encrypting key * @param checkParity if true, the key is not imported unless it has adjusted parity * @return imported key secured by the security module * @throws SMException if the parity of the imported key is not adjusted AND checkParity = true */ SecureDESKey importKey(short keyLength, String keyType, byte[] encryptedKey, SecureDESKey kek, boolean checkParity) throws SMException; /** * Exports secure key to encryption under a KEK (Key-Encrypting Key). * @param key the secure key to be exported * @param kek the key-encrypting key * @return the exported key (key encrypted under kek) * @throws SMException */ byte[] exportKey(SecureDESKey key, SecureDESKey kek) throws SMException; /** * Encrypts a clear pin under LMK. * *

CAUTION: The use of clear pin presents a significant security risk * @param pin clear pin as entered by card holder * @param accountNumber account number, including BIN and the check digit * @return PIN under LMK * @throws SMException */ EncryptedPIN encryptPIN(String pin, String accountNumber) throws SMException; /** * Encrypts a clear pin under LMK. * *

CAUTION: The use of clear pin presents a significant security risk * @param pin clear pin as entered by card holder * @param accountNumber if extract is false then account number, including BIN and the check digit * or if parameter extract is true then 12 right-most digits of the account number, excluding the check digit * @param extract true to extract 12 right-most digits off the account number * @return PIN under LMK * @throws SMException */ EncryptedPIN encryptPIN(String pin, String accountNumber, boolean extract) throws SMException; /** * Decrypts an Encrypted PIN (under LMK). *

CAUTION: The use of clear pin presents a significant security risk * @param pinUnderLmk * @return clear pin as entered by card holder * @throws SMException */ String decryptPIN(EncryptedPIN pinUnderLmk) throws SMException; /** * Imports a PIN from encryption under KD (Data Key) * to encryption under LMK. * * @param pinUnderKd1 the encrypted PIN * @param kd1 Data Key under which the pin is encrypted * @return pin encrypted under LMK * @throws SMException */ EncryptedPIN importPIN(EncryptedPIN pinUnderKd1, SecureDESKey kd1) throws SMException; /** * Translates a PIN from encrytion under KD1 to encryption under KD2. * * @param pinUnderKd1 pin encrypted under KD1 * @param kd1 Data Key (also called session key) under which the pin is encrypted * @param kd2 the destination Data Key 2 under which the pin will be encrypted * @param destinationPINBlockFormat the PIN Block Format of the exported encrypted PIN * @return pin encrypted under KD2 * @throws SMException */ EncryptedPIN translatePIN(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey kd2, byte destinationPINBlockFormat) throws SMException; /** * Imports a PIN from encryption under a transaction key to encryption * under LMK. * *

The transaction key is derived from the Key Serial Number and the Base Derivation Key using DUKPT (Derived Unique Key per Transaction). See ANSI X9.24 for more information. * @deprecated Use signature that specifies tdes flag. * @param pinUnderDuk pin encrypted under a transaction key * @param ksn Key Serial Number (also called Key Name, in ANSI X9.24) needed to derive the transaction key * @param bdk Base Derivation Key, used to derive the transaction key underwhich the pin is encrypted * @return pin encrypted under LMK * @throws SMException */ EncryptedPIN importPIN(EncryptedPIN pinUnderDuk, KeySerialNumber ksn, SecureDESKey bdk) throws SMException; /** * Imports a PIN from encryption under a transaction key to encryption * under LMK. * *

The transaction key is derived from the Key Serial Number and the Base Derivation Key using DUKPT (Derived Unique Key per Transaction). See ANSI X9.24 for more information. * @param pinUnderDuk pin encrypted under a transaction key * @param ksn Key Serial Number (also called Key Name, in ANSI X9.24) needed to derive the transaction key * @param bdk Base Derivation Key, used to derive the transaction key underwhich the pin is encrypted * @param tdes Use Triple DES to calculate derived transaction key. * @return pin encrypted under LMK * @throws SMException */ EncryptedPIN importPIN(EncryptedPIN pinUnderDuk, KeySerialNumber ksn, SecureDESKey bdk, boolean tdes) throws SMException; /** * Translates a PIN from encryption under a transaction key to * encryption under a KD (Data Key). * *

The transaction key is derived from the Key Serial Number and the Base Derivation Key using DUKPT (Derived Unique Key per Transaction). See ANSI X9.24 for more information. * @deprecated Use signature that specifies tdes flag. * @param pinUnderDuk pin encrypted under a DUKPT transaction key * @param ksn Key Serial Number (also called Key Name, in ANSI X9.24) needed to derive the transaction key * @param bdk Base Derivation Key, used to derive the transaction key underwhich the pin is encrypted * @param kd2 the destination Data Key (also called session key) under which the pin will be encrypted * @param destinationPINBlockFormat the PIN Block Format of the translated encrypted PIN * @return pin encrypted under kd2 * @throws SMException */ EncryptedPIN translatePIN(EncryptedPIN pinUnderDuk, KeySerialNumber ksn, SecureDESKey bdk, SecureDESKey kd2, byte destinationPINBlockFormat) throws SMException; /** * Translates a PIN from encryption under a transaction key to * encryption under a KD (Data Key). * *

The transaction key is derived from the Key Serial Number and the Base Derivation Key using DUKPT (Derived Unique Key per Transaction). See ANSI X9.24 for more information. * @param pinUnderDuk pin encrypted under a DUKPT transaction key * @param ksn Key Serial Number (also called Key Name, in ANSI X9.24) needed to derive the transaction key * @param bdk Base Derivation Key, used to derive the transaction key underwhich the pin is encrypted * @param kd2 the destination Data Key (also called session key) under which the pin will be encrypted * @param destinationPINBlockFormat the PIN Block Format of the translated encrypted PIN * @param tdes Use Triple DES to calculate derived transaction key. * @return pin encrypted under kd2 * @throws SMException */ EncryptedPIN translatePIN(EncryptedPIN pinUnderDuk, KeySerialNumber ksn, SecureDESKey bdk, SecureDESKey kd2, byte destinationPINBlockFormat, boolean tdes) throws SMException; /** * Exports a PIN from encryption under LMK to encryption under a KD * (Data Key). * * @param pinUnderLmk pin encrypted under LMK * @param kd2 the destination data key (also called session key) under which the pin will be encrypted * @param destinationPINBlockFormat the PIN Block Format of the exported encrypted PIN * @return pin encrypted under kd2 * @throws SMException */ EncryptedPIN exportPIN(EncryptedPIN pinUnderLmk, SecureDESKey kd2, byte destinationPINBlockFormat) throws SMException; /** * Generate random pin under LMK * * @param accountNumber The 12 right-most digits of the account number excluding the check digit * @param pinLen length of the pin, usually in range 4-12. * Value 0 means that default length is assumed by HSM (usually 4) * @return generated PIN under LMK * @throws SMException */ EncryptedPIN generatePIN(String accountNumber, int pinLen) throws SMException; /** * Generate random pin under LMK with exclude list * * @param accountNumber The 12 right-most digits of the account number excluding the check digit * @param pinLen length of the pin, usually in range 4-12. * Value 0 means that default length is assumed by HSM (usually 4) * @param excludes list of pins which won't be generated. * Each pin has to be pinLen length * @return generated PIN under LMK * @throws SMException */ EncryptedPIN generatePIN(String accountNumber, int pinLen, List excludes) throws SMException; /** * Print PIN or PIN and solicitation data to the HSM configured printer. *

If {@code kd1} includes an encrypted PIN block then is first imported, * Also template is updated if needed in HSM storage. Then the PIN and * solicitation data are included into the template and result are * printed to the HSM attached printer. * * @param accountNo The 12 right-most digits of the account number excluding the check digit. * @param pinUnderKd1 pin block under Key Data 1 * @param kd1 Data Key 1 ZPK, TPK may be null if {@code pinUnderKd1} contains PIN under LMK * @param template template text (PCL, PostScript or other) for PIN Mailer printer. * Its format depends on used HSM. This template should * includes placeholders tags (e.g. in format ${tag}) * indicationg place where coresponding value or PIN should * be inserted. Tags values are passed in {@code fields} * map argument except PIN which is passed in argument {@code pinUnderKd1}. * @param fields map of tags values representing solicitation data to include * in template. null if no solicitation data are passed * @throws SMException */ void printPIN(String accountNo, EncryptedPIN pinUnderKd1, SecureDESKey kd1 , String template, Map fields) throws SMException; /** * Calculate PVV (VISA PIN Verification Value of PIN under LMK) * with exclude list * *

NOTE: {@code pvkA} and {@code pvkB} should be single length keys * but at least one of them may be double length key * * @param pinUnderLmk PIN under LMK * @param pvkA first key PVK in PVK pair * @param pvkB second key PVK in PVK pair * @param pvkIdx index of the PVK, in range 0-6, if not present 0 is assumed * @return PVV (VISA PIN Verification Value) * @throws SMException if PIN is on exclude list {@link WeakPINException} is thrown */ String calculatePVV(EncryptedPIN pinUnderLmk, SecureDESKey pvkA, SecureDESKey pvkB, int pvkIdx) throws SMException; /** * Calculate PVV (VISA PIN Verification Value of PIN under LMK) * *

NOTE: {@code pvkA} and {@code pvkB} should be single length keys * but at least one of them may be double length key * * @param pinUnderLmk PIN under LMK * @param pvkA first key PVK in PVK pair * @param pvkB second key PVK in PVK pair * @param pvkIdx index of the PVK, in range 0-6, if not present 0 is assumed * @param excludes list of pins which won't be generated. * Each pin has to be pinLen length * @return PVV (VISA PIN Verification Value) * @throws SMException */ String calculatePVV(EncryptedPIN pinUnderLmk, SecureDESKey pvkA, SecureDESKey pvkB, int pvkIdx, List excludes) throws SMException; /** * Calculate PVV (VISA PIN Verification Value of customer selected PIN) * *

NOTE: {@code pvkA} and {@code pvkB} should be single length keys * but at least one of them may be double length key * * @param pinUnderKd1 the encrypted PIN * @param kd1 Data Key under which the pin is encrypted * @param pvkA first key PVK in PVK pair * @param pvkB second key PVK in PVK pair * @param pvkIdx index of the PVK, in range 0-6, if not present 0 is assumed * @return PVV (VISA PIN Verification Value) * @throws SMException */ String calculatePVV(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvkA, SecureDESKey pvkB, int pvkIdx) throws SMException; /** * Calculate PVV (VISA PIN Verification Value of customer selected PIN) * *

NOTE: {@code pvkA} and {@code pvkB} should be single length keys * but at least one of them may be double length key * * @param pinUnderKd1 the encrypted PIN * @param kd1 Data Key under which the pin is encrypted * @param pvkA first key PVK in PVK pair * @param pvkB second key PVK in PVK pair * @param pvkIdx index of the PVK, in range 0-6, if not present 0 is assumed * @param excludes list of pins which won't be generated. * Each pin has to be pinLen length * @return PVV (VISA PIN Verification Value) * @throws WeakPINException if passed PIN is on {@code excludes} list * @throws SMException */ String calculatePVV(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvkA, SecureDESKey pvkB, int pvkIdx, List excludes) throws SMException; /** * Verify PVV (VISA PIN Verification Value of an LMK encrypted PIN) * *

NOTE: {@code pvkA} and {@code pvkB} should be single * length keys but at least one of them may be double length key * * @param pinUnderKd1 pin block under {@code kd1} * @param kd1 Data Key (also called session key) under which the pin is encrypted (ZPK or TPK) * @param pvkA first PVK in PVK pair * @param pvkB second PVK in PVK pair * @param pvki index of the PVK, in range 0-6, if not present 0 is assumed * @param pvv (VISA PIN Verification Value) * @return true if pin is valid false if not * @throws SMException */ boolean verifyPVV(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvkA, SecureDESKey pvkB, int pvki, String pvv) throws SMException; /** * Calculate an PIN Offset using the IBM 3624 method * *

Using that method is not recomendated. PVV method is prefrred, * but it may be need in some legacy systms * @param pinUnderLmk PIN under LMK * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen pin minimal length * @return IBM PIN Offset * @throws SMException */ String calculateIBMPINOffset(EncryptedPIN pinUnderLmk, SecureDESKey pvk, String decTab, String pinValData, int minPinLen) throws SMException; /** * Calculate an PIN Offset using the IBM 3624 method * *

Using that method is not recomendated. PVV method is prefrred, * but it may be need in some legacy systms * @param pinUnderLmk PIN under LMK * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen pin minimal length * @param excludes list of pins which won't be generated. * Each pin has to be pinLen length * @return IBM PIN Offset * @throws WeakPINException if passed PIN is on {@code excludes} list * @throws SMException */ String calculateIBMPINOffset(EncryptedPIN pinUnderLmk, SecureDESKey pvk, String decTab, String pinValData, int minPinLen, List excludes) throws SMException; /** * Calculate an PIN Offset using the IBM 3624 method of customer selected PIN * *

Using that method is not recomendated. PVV method is prefrred, * but it may be need in some legacy systms * @param pinUnderKd1 the encrypted PIN * @param kd1 Data Key under which the pin is encrypted * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen pin minimal length * @return IBM PIN Offset * @throws SMException */ String calculateIBMPINOffset(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvk, String decTab, String pinValData, int minPinLen) throws SMException; /** * Calculate an PIN Offset using the IBM 3624 method of customer selected PIN * *

Using that method is not recomendated. PVV method is prefrred, * but it may be need in some legacy systms * @param pinUnderKd1 the encrypted PIN * @param kd1 Data Key under which the pin is encrypted * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen pin minimal length * @param excludes list of pins which won't be generated. * Each pin has to be pinLen length * @return IBM PIN Offset * @throws WeakPINException if passed PIN is on {@code excludes} list * @throws SMException */ String calculateIBMPINOffset(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvk, String decTab, String pinValData, int minPinLen, List excludes) throws SMException; /** * Verify an PIN Offset using the IBM 3624 method * * @param pinUnderKd1 pin block under {@code kd1} * @param kd1 Data Key (also called session key) under which the pin is encrypted (ZPK or TPK) * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param offset IBM PIN Offset * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen min pin length * @return true if pin offset is valid false if not * @throws SMException */ boolean verifyIBMPINOffset(EncryptedPIN pinUnderKd1, SecureDESKey kd1, SecureDESKey pvk, String offset, String decTab, String pinValData, int minPinLen) throws SMException; /** * Derive a PIN Using the IBM 3624 method * *

That method derive pin from pin offset (not exacly that same but working). * Therefore that metod is not recomendated. It is similar to obtain pin * from encrypted pinblock, but require (encrypted) decimalisation table * handling is more complicated and returned pin may differ from pin what user has selected * It may be uable e.g. in migration from pin offset method to PVV method * @param accountNo the 12 right-most digits of the account number excluding the check digit * @param pvk accepts single, double, triple size key length. * Single key length is recomendated * @param decTab decimalisation table. Accepts plain text and encrypted * decimalisation table depending to HSM configuration * @param pinValData pin validation data. User-defined data consisting of hexadecimal * characters and the character N, which indicates to the HSM where * to insert the last 5 digits of the account number. Usualy it consists * the first digits of the card number * @param minPinLen min pin length * @param offset IBM PIN Offset * @return PIN under LMK * @throws SMException */ EncryptedPIN deriveIBMPIN(String accountNo, SecureDESKey pvk , String decTab, String pinValData, int minPinLen , String offset) throws SMException; /** * Calaculate a Card Verification Code/Value * *

NOTE: {@code cvkA} and {@code cvkB} should be single * length keys but at least one of them may be double length key * * @param accountNo The account number including BIN and the check digit * @param cvkA the first CVK in CVK pair * @param cvkB the second CVK in CVK pair * @param expDate the card expiration date * @param serviceCode the card service code * Service code should be: *

    *
  • the value which will be placed onto card's magnetic stripe for encoding CVV1/CVC1
  • *
  • "000" for printing CVV2/CVC2 on card's signature stripe
  • *
  • "999" for inclusion iCVV/Chip CVC on EMV chip card
  • *
* @return Card Verification Code/Value * @throws SMException */ String calculateCVV(String accountNo, SecureDESKey cvkA, SecureDESKey cvkB, Date expDate, String serviceCode) throws SMException; /** * Calaculate a 3-D Secure CAVV/AAV. * *
    *
  • Visa uses CAVV (Cardholder Authentication Verification Value)
  • *
  • MasterCard uses AAV (Accountholder Authentication Value)
  • *
*

NOTE: Algorithm used to calculation CAVV/AAV is same as for CVV/CVC * calculation. Only has been changed meaning of parameters * {@code expDate} and {@code serviceCode}. * * @param accountNo the account number including BIN and the check digit. * @param cvk the key used to CVV/CVC generation * @param upn the unpredictable number. Calculated value based * on Transaction Identifier (xid) from PAReq. * A 4 decimal digits value must be supplied. * @param authrc the Authentication Results Code. A value based on * the Transaction Status (status) that will be used in * PARes. A 1 decimal digit value must be supplied. * @param sfarc the Second Factor Authentication Results Code. * A value based on the result of second factor authentication. * A 2 decimal digits value must be suppiled. * @return Cardholder Authentication Verification Value/Accountholder * Authentication Value * @throws SMException */ String calculateCAVV(String accountNo, SecureDESKey cvk, String upn, String authrc, String sfarc) throws SMException; /** * Verify a Card Verification Code/Value * *

NOTE: {@code cvkA} and {@code cvkB} should be single * length keys but at least one of them may be double length key * * @param accountNo The account number including BIN and the check digit * @param cvkA the first CVK in CVK pair * @param cvkB the second CVK in CVK pair * @param cvv Card Verification Code/Value * @param expDate the card expiration date * @param serviceCode the card service code * Service code should be: *

    *
  • taken from card's magnetic stripe for verifing CVV1/CVC1
  • *
  • "000" for verifing CVV2/CVC2 printed on card's signature stripe
  • *
  • "999" for verifing iCVV/Chip CVC included on EMV chip card
  • *
* @return true if CVV/CVC is valid or false if not * @throws SMException */ boolean verifyCVV(String accountNo, SecureDESKey cvkA, SecureDESKey cvkB, String cvv, Date expDate, String serviceCode) throws SMException; /** * Verify a 3-D Secure CAVV/AAV. * *
    *
  • Visa uses CAVV (Cardholder Authentication Verification Value)
  • *
  • MasterCard uses AAV (Accountholder Authentication Value)
  • *
*

NOTE: Algorithm used to verification CAVV/AAV is same as for CVV/CVC * verification. Only has been changed meaning of parameters * {@code expDate} and {@code serviceCode}. * * @param accountNo the account number including BIN and the check digit. * @param cvk the key used to CVV/CVC generation * @param cavv the Cardholder Authentication Verification Value * or Accountholder Authentication Value. * @param upn the unpredictable number. Calculated value based * on Transaction Identifier (xid) from PAReq. * A 4 decimal digits value must be supplied. * @param authrc the Authentication Results Code. A value based on * the Transaction Status (status) that will be used in * PARes. A 1 decimal digit value must be supplied. * @param sfarc the Second Factor Authentication Results Code. * A value based on the result of second factor authentication. * A 2 decimal digits value must be suppiled. * @return true if CAVV/AAV is valid or false if not * @throws SMException */ boolean verifyCAVV(String accountNo, SecureDESKey cvk, String cavv, String upn, String authrc, String sfarc) throws SMException; /** * Verify a Dynamic Card Verification Value (CVV) * *

The EMV "Track 2 Equivalent Data", provided in the authorisation * message and originating from the contactless smart card, is the source * for the following data elements used in this function: *

  • {@code accountNo} *
  • {@code expDate} *
  • {@code serviceCode} *
  • {@code atc} *
  • {@code dCVV} * * @param accountNo The account number including BIN and the check digit * @param imkac the issuer master key for generating and verifying Application Cryptograms * @param dcvv dynamic Card Verification Value * @param expDate the card expiration date * @param serviceCode the card service code * @param atc application transactin counter. This is used for ICC Master * Key derivation. A 2 byte value must be supplied. * @param mkdm ICC Master Key Derivation Method. If {@code null} specified * is assumed. * @return true if dcvv is valid false if not * @throws SMException */ boolean verifydCVV(String accountNo, SecureDESKey imkac, String dcvv, Date expDate, String serviceCode, byte[] atc, MKDMethod mkdm) throws SMException; /** * Verify a Dynamic Card Verification Code 3 (CVC3) *

    * The EMV "Track 2 Equivalent Data", provided in the authorisation * message and originating from the contactless smart card, is the source * for the following data elements used in this function: *

      *
    • {@code accountNo} *
    • {@code expDate} *
    • {@code serviceCode} *
    • {@code atc} *
    • {@code unpredictable number} *
    • {@code cvc3} *
    * * @param imkcvc3 the issuer master key for generating and verifying CVC3 * @param accountNo The account number including BIN and the check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param atc application transactin counter. This is used for CVC3 * calculation. A 2 byte value must be supplied. * @param upn unpredictable number. This is used for CVC3 calculation * A 4 byte value must be supplied. * @param data Static Track Data or when this data length is less or equal 2 IVCVC3 *
      *
    • Static Track 1 or 2 Data. From the the issuer is dependent on * how to obtain it from the EMV "Track 2 Equivalent Data", * provided in the authorisation message and originating from * the contactless smart card. Usually variable part of * Discreditionary Data are replased by some static value. *
    • precomputed Initial Vector for CVC3 calculation * (IVCVC3) which is a MAC calculated over * the static part of Track1 or Track2 data using the key derived * from MK-CVC3. *
    * @param mkdm ICC Master Key Derivation Method. If {@code null} specified * is assumed. * @param cvc3 dynamic Card Verification Code 3. Should contain 5 decimal * digits. Max value is {@code "65535"} (decimal representation * of 2 byte value). Is possible to pass shorter cvc3 value e.g. * {@code "789"} matches with calcuated CVC3 {@code "04789"} * @return true if cvc3 is valid false if not * @throws SMException */ boolean verifyCVC3(SecureDESKey imkcvc3, String accountNo, String acctSeqNo, byte[] atc, byte[] upn, byte[] data, MKDMethod mkdm, String cvc3) throws SMException; /** * Verify Application Cryptogram (ARQC or TC/AAC) *
      *
    • Authorization Request Cryptogram (ARQC) - Online authorization *
    • Transaction certificate (TC) - Offline approval *
    • Application Authentication Cryptogram (AAC) - Offline decline *
    * * @param mkdm ICC Master Key Derivation Method. For {@code skdm} equals * {@link SKDMethod#VSDC} and {@link SKDMethod#MCHIP} this parameter * is ignored and {@link MKDMethod#OPTION_A} is always used. * @param skdm Session Key Derivation Method * @param imkac the issuer master key for generating and verifying Application Cryptograms * @param accountNo account number including BIN and check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param arqc ARQC/TC/AAC. A 8 byte value must be supplied. * @param atc application transactin counter. This is used for Session * Key Generation. A 2 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#VSDC} is not used. * @param upn unpredictable number. This is used for Session Key Generation * A 4 byte value must be supplied. For {@code skdm} equals * {@link SKDMethod#VSDC} is not used. * @param transData transaction data. Transaction data elements and them * order is dependend to proper cryptogram version. If the data * supplied is a multiple of 8 bytes, no extra padding is added. * If it is not a multiple of 8 bytes, additional zero padding is added. * If alternative padding methods are required, it have to be * applied before. * @return true if ARQC/TC/AAC is passed or false if not * @throws SMException */ boolean verifyARQC(MKDMethod mkdm, SKDMethod skdm, SecureDESKey imkac , String accountNo, String acctSeqNo, byte[] arqc, byte[] atc , byte[] upn, byte[] transData) throws SMException; /** * Genarate Authorisation Response Cryptogram (ARPC) * * @param mkdm ICC Master Key Derivation Method. For {@code skdm} equals * {@link SKDMethod#VSDC} and {@link SKDMethod#MCHIP} this parameter * is ignored and {@link MKDMethod#OPTION_A} is always used. * @param skdm Session Key Derivation Method * @param imkac the issuer master key for generating and verifying Application Cryptograms * @param accoutNo account number including BIN and check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param arqc ARQC/TC/AAC. A 8 byte value must be supplied. * @param atc application transactin counter. This is used for Session * Key Generation. A 2 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#VSDC} is not used. * @param upn unpredictable number. This is used for Session Key Generation * A 4 byte value must be supplied. For {@code skdm} equals * {@link SKDMethod#VSDC} is not used. * @param arpcMethod ARPC calculating method. For {@code skdm} equals * {@link SKDMethod#VSDC}, {@link SKDMethod#MCHIP}, * {@link SKDMethod#AEPIS_V40} only {@link ARPCMethod#METHOD_1} is valid * @param arc the Authorisation Response Code. A 2 byte value must be supplied. * For {@code arpcMethod} equals {@link ARPCMethod#METHOD_2} it is * csu - Card Status Update. Then a 4 byte value must be supplied. * @param propAuthData Proprietary Authentication Data. Up to 8 bytes. * Contains optional issuer data for transmission to the card in * the Issuer Authentication Data of an online transaction. * It may by used only for {@code arpcMethod} equals * {@link ARPCMethod#METHOD_2} in other case is ignored. * @return calculated 8 bytes ARPC or if {@code arpcMethod} equals * {@link ARPCMethod#METHOD_2} 4 bytes ARPC * @throws SMException */ byte[] generateARPC(MKDMethod mkdm, SKDMethod skdm, SecureDESKey imkac , String accoutNo, String acctSeqNo, byte[] arqc, byte[] atc, byte[] upn , ARPCMethod arpcMethod, byte[] arc, byte[] propAuthData) throws SMException; /** * Verify Application Cryptogram (ARQC or TC/AAC) and Genarate * Authorisation Response Cryptogram (ARPC) *
      *
    • Authorization Request Cryptogram (ARQC) - Online authorization *
    • Transaction certificate (TC) - Offline approval *
    • Application Authentication Cryptogram (AAC) - Offline decline *
    * @param mkdm ICC Master Key Derivation Method. For {@code skdm} equals * {@link SKDMethod#VSDC} and {@link SKDMethod#MCHIP} this parameter * is ignored and {@link MKDMethod#OPTION_A} is always used. * @param skdm Session Key Derivation Method * @param imkac the issuer master key for generating and verifying Application Cryptograms * @param accountNo account number including BIN and check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param arqc ARQC/TC/AAC. A 8 byte value must be supplied. * @param atc application transactin counter. This is used for Session * Key Generation. A 2 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#VSDC} is not used. * @param upn unpredictable number. This is used for Session Key Generation * A 4 byte value must be supplied. For {@code skdm} equals * {@link SKDMethod#VSDC} is not used. * @param transData transaction data. Transaction data elements and them * order is dependend to proper cryptogram version. If the data * supplied is a multiple of 8 bytes, no extra padding is added. * If it is not a multiple of 8 bytes, additional zero padding is added. * If alternative padding methods are required, it have to be * applied before. * @param arpcMethod ARPC calculating method. For {@code skdm} equals * {@link SKDMethod#VSDC}, {@link SKDMethod#MCHIP}, * {@link SKDMethod#AEPIS_V40} only {@link ARPCMethod#METHOD_1} is valid * @param arc the Authorisation Response Code. A 2 byte value must be supplied. * For {@code arpcMethod} equals {@link ARPCMethod#METHOD_2} it is * csu - Card Status Update. Then a 4 byte value must be supplied. * @param propAuthData Proprietary Authentication Data. Up to 8 bytes. * Contains optional issuer data for transmission to the card in * the Issuer Authentication Data of an online transaction. * It may by used only for {@code arpcMethod} equals * {@link ARPCMethod#METHOD_2} in other case is ignored. * @return if ARQC/TC/AAC verification passed then calculated 8 bytes ARPC * or for {@code arpcMethod} equals {@link ARPCMethod#METHOD_2} * 4 bytes ARPC, null in other case * @throws SMException */ byte[] verifyARQCGenerateARPC(MKDMethod mkdm, SKDMethod skdm, SecureDESKey imkac , String accountNo, String acctSeqNo, byte[] arqc, byte[] atc, byte[] upn , byte[] transData, ARPCMethod arpcMethod, byte[] arc, byte[] propAuthData) throws SMException; /** * Generate Secure Message MAC over suppiled message data *

    * This method is used by issuer to generate MAC over message data send * from the issuer back to the card * * @param mkdm ICC Master Key Derivation Method. For {@code skdm} equals * {@link SKDMethod#VSDC} and {@link SKDMethod#MCHIP} this parameter * is ignored and {@link MKDMethod#OPTION_A} is always used. * @param skdm Session Key Derivation Method * @param imksmi the issuer master key for Secure Messaging Integrity * @param accountNo account number including BIN and check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param atc application transactin counter. This is used for Session * Key Generation. A 2 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#VSDC} is not used. * Second usage is as part of data which will be macked * @param arqc ARQC/TC/AAC. A 8 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#MCHIP} RAND should * be suppiled. RAND is ARQC incremeted by 1 (with overflow) after * each script command for that same ATC value * @param data for which MAC will be generated. Should contain * APDU command e.g. PIN Unblock, Application block/unblock * with some additional application dependent data * @return generated 8 bytes MAC * @throws SMException */ byte[] generateSM_MAC(MKDMethod mkdm, SKDMethod skdm , SecureDESKey imksmi, String accountNo, String acctSeqNo , byte[] atc, byte[] arqc, byte[] data) throws SMException; /** * Translate PIN and generate MAC over suppiled message data *

    * This method is used by issuer to: *

      *
    • translate standard ATM PIN block format encrypted under zone * or terminal key {@code kd1} to an application specific PIN block * format, encrypted under a confidentiality session key, derived from * {@code imksmc} *
    • generate MAC over suppiled message {@code data} and translated * PIN block *
    * @param mkdm ICC Master Key Derivation Method. For {@code skdm} equals * {@link SKDMethod#VSDC} and {@link SKDMethod#MCHIP} this parameter * is ignored and {@link MKDMethod#OPTION_A} is always used. * @param skdm Session Key Derivation Method * @param padm padding method. If null {@code padm} is derived as follow: *
    * * * * * * * * * *
    {@code skdm} valuederived {@code padm} value
    {@link SKDMethod#VSDC}{@link PaddingMethod#VSDC}
    {@link SKDMethod#MCHIP}{@link PaddingMethod#MCHIP}
    {@link SKDMethod#EMV_CSKD}{@link PaddingMethod#CCD}
    * Other variations require to explicite pass {@code padm} value *
    * @param imksmi the issuer master key for Secure Messaging Integrity * @param accountNo account number including BIN and check digit * @param acctSeqNo account sequence number, 2 decimal digits * @param atc application transactin counter. This is used for Session * Key Generation. A 2 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#VSDC} is not used. * Second usage is as part of data which will be macked * @param arqc ARQC/TC/AAC. A 8 byte value must be supplied. * For {@code skdm} equals {@link SKDMethod#MCHIP} RAND should * be suppiled. RAND is ARQC incremeted by 1 (with overflow) after * each script command for that same ATC value * @param data for which MAC will be generated. Should contain APDU * command PIN Change with some additional application dependent data * @param currentPIN encrypted under {@code kd1} current PIN. Used when * {@code destinationPINBlockFormat} equals {@link SMAdapter#FORMAT42} * @param newPIN encrypted under {@code kd1} new PIN. * @param kd1 Data Key (also called transport key) under which the source pin is encrypted * @param imksmc the issuer master key for Secure Messaging Confidentiality * @param imkac the issuer master key for generating and verifying * Application Cryptograms. Used when {@code destinationPINBlockFormat} equals * {@link SMAdapter#FORMAT41} or {@link SMAdapter#FORMAT42} in other cases is ignored * @param destinationPINBlockFormat the PIN Block Format of the translated encrypted PIN *
    *
    Allowed values: *
    {@link SMAdapter#FORMAT34} Standard EMV PIN Block *
    {@link SMAdapter#FORMAT35} Europay/Mastercard *
    {@link SMAdapter#FORMAT41} Visa/Amex format without using Current PIN *
    {@link SMAdapter#FORMAT42} Visa/Amex format using Current PIN *
    * @return Pair of values, encrypted PIN and 8 bytes MAC * @throws SMException */ Pair translatePINGenerateSM_MAC(MKDMethod mkdm , SKDMethod skdm, PaddingMethod padm, SecureDESKey imksmi , String accountNo, String acctSeqNo, byte[] atc, byte[] arqc , byte[] data, EncryptedPIN currentPIN, EncryptedPIN newPIN , SecureDESKey kd1, SecureDESKey imksmc, SecureDESKey imkac , byte destinationPINBlockFormat) throws SMException; /** * Encrypt Data Block. * * @param cipherMode block cipher mode. * @param kd DEK or ZEK key used to encrypt data. * @param data data to be encrypted. If the data is not a multiple of * 8 bytes, padding have to be applied before. * @param iv initial vector. Its length must be equal to the length * of cipher block (8 bytes for DES, 3DES ciphers). After operation * will contain new iv value. Not used for {@link CipherMode#ECB}. * @return encrypted data. In {@code iv} array refference new value of * initial vector value will be placed. * @throws SMException */ byte[] encryptData(CipherMode cipherMode, SecureDESKey kd , byte[] data, byte[] iv) throws SMException; /** * Decrypt Data Block. * * @param cipherMode block cipher mode. * @param kd DEK or ZEK key used to decrypt data. * @param data data to be decrypted. * @param iv initial vector. Its length must be equal to the length * of cipher block (8 bytes for DES, 3DES ciphers). After operation * will contain new iv value. Not used for {@link CipherMode#ECB}. * @return decrypted data. In {@code iv} array refference new value of * initial vector value will be placed. * @throws SMException */ byte[] decryptData(CipherMode cipherMode, SecureDESKey kd , byte[] data, byte[] iv) throws SMException; /** * Generates CBC-MAC (Cipher Block Chaining Message Authentication Code) * for some data. * * @param data the data to be MACed * @param kd the key used for MACing * @return the MAC * @throws SMException */ byte[] generateCBC_MAC(byte[] data, SecureDESKey kd) throws SMException; /** * Generates EDE-MAC (Encrypt Decrypt Encrypt Message Message Authentication Code) * for some data. * * @param data the data to be MACed * @param kd the key used for MACing * @return the MAC * @throws SMException */ byte[] generateEDE_MAC(byte[] data, SecureDESKey kd) throws SMException; /** * Translate key from encryption under the LMK held in key change storage * to encryption under a new LMK. * * @param kd the key encrypted under old LMK * @return key encrypted under the new LMK * @throws SMException if the parity of the imported key is not adjusted AND checkParity = true */ SecureDESKey translateKeyFromOldLMK(SecureDESKey kd) throws SMException; /** * Generate a public/private key pair. * * @param spec algorithm specific parameters, e.g. algorithm, key size, * public key exponent. * @return key pair generated according to passed parameters * @throws SMException */ Pair generateKeyPair(AlgorithmParameterSpec spec) throws SMException; /** * Calculate signature of Data Block. * * @param hash identifier of the hash algorithm used to hash passed data. * @param privateKey private key used to compute data signature. * @param data data to be signed. * @return signature of passed data. * @throws SMException */ byte[] calculateSignature(MessageDigest hash, SecurePrivateKey privateKey ,byte[] data) throws SMException; /** * Erase the key change storage area of memory * * It is recommended that this command is used after keys stored * by the Host have been translated from old to new LMKs. * * @throws SMException */ void eraseOldLMK() throws SMException; }




  • © 2015 - 2024 Weber Informatics LLC | Privacy Policy