Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.
Table of Contents

Introduction

OLA stands for Open L2 API. It is a programmable interface normalizing card processing (L2) services required by a payment application (L3).

Important: this interface has been designed from a Nexo Fast perspective. OLA is a global initiative aiming to cover a missing key element in the payment ecosystem: the EMV L2 API. However, OLA is generic enough to support any kind of payment dynamic beyond Nexo implementations.

Principles

Interacting with a L2 stack is based a simple principles:

...

  • A payment application detects whether a contact or contactless application will be triggerred

  • A payment application implements the logic to select a final application based on OLA services

  • A payment application configures the EMV parameters based on the final selection

Architecture

OLA aims:

  • To break dependencies between different integration levels and L2 implementations

  • To fill the gap between different objectives of testability (usually dependent on the context of integration)

  • To normalize L2 API beyond certificatibility objectives

Image RemovedImage Added

Interfaces

Interface

Description

ola_implem.h

This interface presents callback structures to integrate OLA with a minimum zero dependency from platform

ola.h

This interface presents different administrative services

ola_emv.h

This interface presents common services required to support contact and contactless card processing

ola_publickey.h

This interface allows a payment application to intialize a L2 stack with a set of public keys required to execute an EMV transaction flow (contact and contactless)

ola_contact.h

This interface is meant to support contact transaction flow

ola_contactless.h

This interface is meant to support contactless transaction flow

ola_tags_dictionary.h

This header lists all the tags that are specific to Nexo Fast and consequently subject to a translation for further indexation in the L2 stack

ola_terminal.h

Deprecated from OLA 2.x versions

API

ola_implem.h

Code Block
breakoutModefull-width
languagec
// NAME.......  ola_implem.h
// PURPOSE....  Level 2 Abstraction Layer for contactless to be used by the external world (Level 3 application)
// PROJECT....  Arkos Payment Solution
// REFERENCES.	--
//
//
// Copyright 2005-2020 - 9164-4187 QUEBEC INC (AMADIS), All Rights Reserved
//

#ifndef OLA_IMPLEM_H_
#define OLA_IMPLEM_H_

#include "ola.h"

//---------------------------------------------------------
//			OLA related Services
//---------------------------------------------------------

typedef struct {
	void (*flush_aid_supported)(void);
	tOLAError (*answer_to_reset)(const char* reader);
	tOLAError (*add_aid_supported)(const uint8_t *aid, uint8_t aidLength, int partial);
	tOLAError (*build_candidate_list)(uint8_t *nb_candidates, int *pse);
	tOLAError (*get_tag_from_candidate)(uint8_t candidate, uint32_t tag, uint8_t *value, uint16_t *length);
	tOLAError (*final_select_candidate)(uint8_t candidate);
	tOLAError (*initiate_transaction)(tOlaModeContactTransaction mode);
	tOLAError (*complete_transaction)(const uint8_t *authorResponseCode, const uint8_t *issuerAuthenticationData, uint8_t issuerAuthenticationData_length);
	void  (*clean)(void);
} ola_contact_implem_t;

typedef struct {
	void (*flush_aid_supported)(void);
	tOLAError (*add_aid_supported)(const uint8_t *aid, uint8_t aidLength, int partial, uint8_t kernelId, const uint8_t *tlv, uint16_t tlvLength);
	uint16_t (*add_drl_supported)(const uint8_t *programId, uint8_t programIdLength, const uint8_t *transactionLimit, const uint8_t *floorLimit, const uint8_t *CVMLimit, int statusCheck, int isZeroAllowed, uint8_t kernelId);
	void (*commit_supported_aids)(void);
	uint16_t (*build_candidate_list)(uint8_t *nb_candidates);
	uint16_t (*get_tag_from_candidate)(uint8_t candidate, uint32_t tag, uint8_t *value, uint16_t *length);
	tOLAError (*final_select_candidate)(uint8_t candidate, uint8_t *kernelId);
	tOLAError (*get_card_preferred_language)(char *language);
	tOLAError (*preprocess)(void);
	tOLAError (*do_transaction)(void);
	void (*clean)(void);
	tOLAError (*get_outcome)(tOlaOutcomeParameter *outcome);
	tOLAError (*get_UI_request_upon_outcome)(tOlaUIRequest *uiRequest);
	tOLAError (*get_UI_request_restart)(tOlaUIRequest *uiRequest);
} ola_contactless_implem_t;

typedef struct {
	tOLAError (*set_tag)(uint32_t tag, uint8_t *value, uint16_t length);
	tOLAError (*get_tag)(uint32_t tag, uint8_t *value, uint16_t *length);
	tOLAError (*get_cvm_results)(tOlaEMVCoCVM *cvm);
} ola_emv_implem_t;

typedef struct {
	void (*flush)(void);
	tOLAError (*add)(const tOlaPubKey *key, const uint8_t *checksum);
	tOLAError (*find)(tOlaPubKey *key, uint8_t *checksum);
	tOLAError (*get_next_id)(uint8_t *idx, uint8_t *rid, int start);
	tOLAError (*commit)(void);
} ola_publickey_implem_t;

typedef struct {
	ola_contact_implem_t contact;
	ola_contactless_implem_t contactless;
	ola_emv_implem_t emv;
	ola_publickey_implem_t publickey;
} ola_implem_t;


#endif /* OLA_IMPLEM_H_ */

...