...
Code Block | ||
---|---|---|
| ||
// NAME....... ola_emv.h // PURPOSE.... Level 2 Abstraction Layer for EMV primitives // to be used by the external world (Level 3 application) // PROJECT.... Arkos Payment Solution // REFERENCES. -- // // // Copyright 2005-2019 - 9164-4187 QUEBEC INC (AMADIS), All Rights Reserved // #ifndef OLA_EMV_H #define OLA_EMV_H //--------------------------------------------------------- // Includes //--------------------------------------------------------- #include <stdint.h> //--------------------------------------------------------- // Definitions //--------------------------------------------------------- typedef enum { OLA_OK, OLA_CARD_MUTE, OLA_CARD_BLOCKED, OLA_MAX_REACHED, OLA_NO_CANDIDATE, OLA_CONTACT_NEW_SELECTION, OLA_CONTACT_SELECTION_ERROR, OLA_CONDITIONS_NOT_SATISFIED, OLA_ACCEPTED, OLA_NOT_ACCEPTED, OLA_OFFLINE_ACCEPTED, OLA_OFFLINE_DECLINED, OLA_GO_ONLINE, OLA_DECLINED, OLA_MISSING_DATA, OLA_PINPAD_ERROR, OLA_PARAM_ERROR, OLA_NOT_IMPLEMENTED, OLA_ERROR, OLA_CARD_ERROR, OLA_CANCEL, OLA_PUBLIC_KEY_OK, OLA_PUBLIC_KEY_MISSING, OLA_PUBLIC_KEY_MAX_REACHED, OLA_PUBLIC_KEY_END, OLA_PUBLIC_KEY_NOT_IMPLEMENTEDERROR, OLA_PUBLIC_KEY_ERROR } tOLAErrorCARD_REMOVED } tOLAError; typedef enum { cvmNone, cvmNoCvm, cvmSignature, cvmOnlinePin, cvmOnlinePin_Signature, cvmOfflinePinPlaintext, cvmOfflinePinPlaintext_Signature, cvmOfflinePinCiphered, cvmOfflinePinCiphered_Signature } tOlaEMVCoCVM; //--------------------------------------------------------- // Primitives //--------------------------------------------------------- //** * @brief Set a tag in L2 stack // Input parameter: // tag // value // length // Return // * @param[in] tag: tag to set * @param[in] value: tag's value * @param[in] length: tag's length * @return value in: * - OLA_EMV_OK // * - OLA_EMV_PARAM_ERROR: invalid input parameter */ tOLAError ola_emv_set_tag( uint32_t tag, uint8_t *value, uint16_t length ); //** * @brief Get a tag from L2 stack // Input parameter: // tag // Output parameter: // value : buffer to copy the value of the tag // length : the length of the value // Return // * @param[in] tag: tag to set * @param[out] value: tag's value * @param[out] length: tag's length * @return value in: * - OLA_EMV_OK * - OLA_EMV_MISSING_DATA: tag not present * - OLA_NOT_IMPLEMENTED: tag read not supported * - OLA_EMV_PARAM_ERROR: invalid input parameter */ tOLAError ola_emv_get_tag( uint32_t tag, uint8_t *value, uint16_t *length ); /** * @brief Get CVM result from tag 9F34's byte 1 interpretation * @param[out] cvm: cvm result * @return value in: * - OLA_EMV_OK // * - OLA_EMV_MISSING_DATAERROR: the tag* is not present // OLA_EMV_PARAM_ERROR - OLA_PARAM_ERROR: invalid input parameter */ tOLAError ola_emv_get_cvm_tagresults( uint32_t tag, uint8_t *value, uint16_t *lengthtOlaEMVCoCVM *cvm ); #endif /* OLA_EMV_H */ |
ola_contact.h
Code Block | ||
---|---|---|
| ||
// NAME....... ola_contact.h // PURPOSE.... Level 2 Abstraction Layer for EMV contact // to be used by the external world (Level 3 application) // PROJECT.... Arkos Payment Solution // REFERENCES. -- // // // Copyright 2005-2019 - 9164-4187 QUEBEC INC (AMADIS), All Rights Reserved // #ifndef OLA_CONTACT_H #define OLA_CONTACT_H //--------------------------------------------------------- // Includes //--------------------------------------------------------- #include "ola_emv.h" #include <stdint.h> //--------------------------------------------------------- // Definitions //--------------------------------------------------------- typedef enum { metUndef = 0, metFull, metExtractPAN, metUnknown } tOlaModeContactTransaction; typedef enum { cvmeNone, cvmeNoCvm, cvmeSignature, cvmeOnlinePin, cvmeOnlinePin_Signature, cvmeOfflinePinPlaintext, cvmeOfflinePinPlaintext_Signature, cvmeOfflinePinCiphered, cvmeOfflinePinCiphered_Signature } tOlaCvmContact; // Callback definitions typedef int (*ola_get_plaintext_pin_fn)(uint8_t *iccRespOut); typedef int (*ola_get_cipher_pin_fn)(void *rsaPinKeyIn, uint8_t *iccRespOut); typedef uint16_t (*ola_get_risk_management_info_fn)(uint8_t *lastAmnt, int *cardInExceptionList); //--------------------------------------------------------- // Primitives //--------------------------------------------------------- ////////////////////////////////////// ///// Callback setting functions ///// ////////////////////////////////////// // OLA calls this L3 function during CVM step when it is time to get Offline Plaintext PIN // The Level 3 must use PAX Prolin OS functions to implement PIN capture. // Output parameters: // iccRespOut: last parameter of OsPedVerifyPlainPin() function // Return // the return code of OsPedVerifyPlainPin() function void ola_contact_set_get_plaintext_pin_callback( const ola_get_plaintext_pin_fn callback ); // OLA calls this L3 function during CVM step when it is time to get Offline Encrypted PIN // The Level 3 must use PAX Prolin OS functions to implement PIN capture. // Input parameter: // rsaPinKeyIn: structure containing the public key used // Output parameters: // iccRespOut: last parameter of OsPedVerifyCipherPin() function // Return // the return code of OsPedVerifyCipherPin() function void ola_contact_set_get_cipher_pin_callback( const ola_get_cipher_pin_fn callback ); // OLA calls this L3 function before Terminal Risk Management step // The Level 3 must use appropriate means to retrieve the sensitive data PAN // (for comparison in batch and negative list) // Output parameters: // lastAmnt: tells the amount of the last transaction approved in batch // for the PAN and PAN sequence number, 6 bytes in BCD format // cardOnExceptionList: tells if PAN and PAN sequence number have been found // in the exception list: 0 is false, else is true // Return // OLA_EMV_OK // OLA_EMV_ERROR void ola_contact_set_get_risk_management_info_callback( const ola_get_risk_management_info_fn callback ); ///////////////////////////// ///// Regular functions ///// ///////////////////////////// // Erase all AID supported from configuration void ola_contact_flush_aid_supported(void); // Get the ATR from the chip card inserted. // Return // OLA_OK // OLA_CARD_MUTE tOLAError ola_contact_answer_to_reset(const char* reader); // Add one AID supported to configuration. // Must be called before ola_emv_build_candidate_list() // Input parameters: // aid : AID, max 16 bytes // aidLength : length of the AID // partial : allow partial selection with this AID when building candidate list; 0 is false, else is true // Return // OLA_OK // OLA_MAX_REACHED // OLA_PARAM_ERROR tOLAError ola_contact_add_aid_supported( const uint8_t *aid, uint8_t aidLength, int partial ); // Build the candidate list of common AID between the card and the configuration, // in order of priority. // Output parameter: // nb_candidates : tell how many candidates are in the list // pse : tell if pse has been used; 0 is false, 1 is true // Return // OLA_OK // OLA_NO_CANDIDATE // OLA_CARD_REMOVED tOLAError ola_contact_build_candidate_list( uint8_t *nb_candidates, int *pse ); // Get a tag from a candidate in the candidate list // Must be called after ola_emv_build_candidate_list() // Input parameter: // candidate : an occurrence in candidate list, value must be from 1 to nb_candidates // tag // Output parameter: // value : buffer to copy the value of the tag // length : the length of the value // Return // OLA_OK // OLA_MISSING_DATA: the tag is not present // OLA_PARAM_ERROR tOLAError ola_contact_get_tag_from_candidate( uint8_t candidate, uint32_t tag, uint8_t *value, uint16_t *length ); // Send the final select to the card for a candidate in the candidate list // Input parameter: // candidate : an occurence in candidate list, value must be from 1 to nb_candidates // Return // OLA_OK // OLA_PARAM_ERROR // OLA_BLOCKED // OLA_CARD_ERROR tOLAError ola_contact_final_select_candidate( uint8_t candidate ); // Initiate the EMV transaction after the AID is selected and configured // (First step is building the PDOL and sending the GPO command) // Input parameter: // mode : when value is metExtractPAN, ola_emv_init_transaction() will stop after READ RECORDS // step (and will end card dialog in sending GENAC with AAC) // Return // OLA_GO_ONLINE // OLA_OFFLINE_APPROVAL // OLA_OFFLINE_DENIAL // OLA_CONDITIONS_NOT_SATISFIED // OLA_CARD_REMOVED // OLA_CARD_ERROR tOLAError ola_contact_initiate_transaction( tOlaModeContactTransaction mode ); // Complete EMV transaction after going online (or trying and being unable). // If there is any EMV script from the issuer, ola_emv_set_tag() with tag 71 or 72 // must be used before calling this function. // Input parameter: // authorResponseCode : two ASCII bytes (as tag 8A) // (NULL pointer when unable to go online) // issuerAuthenticationData : buffer with the value received (as tag 91) // (NULL pointer if there is no value received) // issuerAuthenticationData_length : from 8 to 16 // (0 if there is no value received) // Return // OLA_ACCEPTED // OLA_DECLINED // OLA_NOT_ACCEPTED // OLA_ERROR // OLA_PARAM_ERROR tOLAError ola_contact_complete_transaction( const uint8_t *authorResponseCode, const uint8_t *issuerAuthenticationData, uint8_t issuerAuthenticationData_length ); // Release all internal states void ola_contact_clean(void); #endif /* OLA_CONTACT_H */ |
...