1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 /*
18  * Smart Card Completion Routing component
19  */
20 
21 #ifndef PHFRINFC_SMTCRDFMT_H
22 #define PHFRINFC_SMTCRDFMT_H
23 
24 #include <phNfcTypes_Mapping.h>
25 
26 /********************* Definitions and structures *****************************/
27 
28 #define DESFIRE_FMT_EV1
29 
30 #define PH_FRI_NFC_SMTCRDFMT_NFCSTATUS_FORMAT_ERROR 9 /* Format error */
31 #define PH_FRINFC_SMTCRDFMT_MSTD_DEFAULT_KEYA_OR_KEYB \
32   { 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF } /* Default Key */
33 #define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_KEYA \
34   { 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 } /* Key A */
35 #define PH_FRINFC_SMTCRDFMT_NFCFORUMSECT_KEYA \
36   { 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 } /* NFC Forum Key */
37 #define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_ACCESSBITS \
38   { 0x78, 0x77, 0x88 } /* Access bits */
39 #define PH_FRINFC_SMTCRDFMT_MSTD_NFCFORUM_ACCESSBITS \
40   { 0x7F, 0x07, 0x88 }                               /* NFC Forum access bits */
41 #define PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED 1 /* TLV support */
42 #define PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE 252 /* Buffer size */
43 #define PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT 1         /* Format state */
44 
45 /*
46  * Enum definition contains Tag Types
47  */
48 enum {
49   PH_FRINFC_SMTCRDFMT_MIFARE_UL_CARD,
50   PH_FRINFC_SMTCRDFMT_ISO14443_4A_CARD,
51   PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD,
52   PH_FRINFC_SMTCRDFMT_MFSTD_2K_CRD,
53   PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD,
54   PH_FRINFC_SMTCRDFMT_TOPAZ_CARD
55 };
56 
57 #define PH_FRINFC_SMTCRDFMT_CR_FORMAT 0 /* Index for phFriNfc_SmtCrd_Format */
58 #define PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE \
59   1                              /* Index for Unknown States/Operations */
60 #define PH_FRINFC_SMTCRDFMT_CR 2 /* Number of completion routines */
61 
62 /*
63  * Mifare Std Additional Information Structure
64  */
65 typedef struct phFriNfc_MfStd_AddInfo {
66   uint8_t Default_KeyA_OR_B[6];  /* Stores the Default KeyA and KeyB values */
67   uint8_t MADSect_KeyA[6];       /* Key A of MAD sector */
68   uint8_t NFCForumSect_KeyA[6];  /* Key A of NFC Forum Sector sector */
69   uint8_t MADSect_AccessBits[3]; /* Access Bits of MAD sector */
70   uint8_t NFCForumSect_AccessBits[3]; /* Access Bits of NFC Forum sector */
71   uint8_t ScrtKeyB[6];    /* Secret key B to given by the application */
72   uint8_t AuthState;      /* Status of the different authentication */
73   uint16_t CurrentBlock;  /* Stores the current block */
74   uint8_t NoOfDevices;    /* Stores the current block */
75   uint8_t SectCompl[40];  /* Store the compliant sectors */
76   uint8_t WrMADBlkFlag;   /* Flag to know that MAD sector */
77   uint8_t MADSectBlk[80]; /* Fill the MAD sector blocks */
78   uint8_t UpdMADBlk;      /* Fill the MAD sector blocks */
79 } phFriNfc_MfStd_AddInfo_t;
80 
81 /*
82  *  Ndef Mifare Std Additional Information Structure
83  */
84 typedef struct phFriNfc_sNdefSmtCrdFmt_AddInfo {
85   phFriNfc_MfStd_AddInfo_t
86       MfStdInfo; /* Mifare Std Additional Information Structure */
87 
88 } phFriNfc_sNdefSmtCrdFmt_AddInfo_t;
89 
90 /*
91  *  Context information Structure
92  */
93 typedef struct phFriNfc_sNdefSmtCrdFmt {
94   phNfc_sTransceiveInfo_t*
95       pTransceiveInfo; /* Pointer to the Transceive information */
96   phHal_sRemoteDevInformation_t*
97       psRemoteDevInfo; /* Pointer to the Remote Device Information */
98   uint8_t CardType;    /* Stores the type of the smart card */
99   uint8_t State;       /* The state of the operation */
100   uint8_t CardState;   /* Stores the card state */
101   phFriNfc_CplRt_t CompletionRoutine
102       [PH_FRINFC_SMTCRDFMT_CR];             /* Completion Routine Context */
103   phFriNfc_CplRt_t SmtCrdFmtCompletionInfo; /* Holds the completion routine
104                                                informations of the Smart Card
105                                                Formatting Layer */
106   phHal_uCmdList_t Cmd;     /* Holds the Command Type(read/write) */
107   uint16_t* SendRecvLength; /* Holds the length of the received data */
108   uint8_t* SendRecvBuf;     /* Holds the ack of some intial commands */
109   uint16_t SendLength;      /* Holds the length of the data to be sent */
110   NFCSTATUS
111   FmtProcStatus; /* Stores the output/result of the format procedure */
112   phFriNfc_sNdefSmtCrdFmt_AddInfo_t AddInfo; /* Stores Additional Information
113                                                 needed to format the different
114                                                 types of tags*/
115   uint8_t TLVMsg[PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED]
116                 [8]; /* Stores NDEF message TLV */
117 } phFriNfc_sNdefSmtCrdFmt_t;
118 
119 NFCSTATUS
120 phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt,
121                           void* LowerDevice,
122                           phHal_sRemoteDevInformation_t* psRemoteDevInfo,
123                           uint8_t* SendRecvBuffer, uint16_t* SendRecvBuffLen);
124 
125 NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt,
126                                     uint8_t FunctionID,
127                                     pphFriNfc_Cr_t CompletionRoutine,
128                                     void* CompletionRoutineContext);
129 
130 void phFriNfc_NdefSmtCrd_Process(void* Context, NFCSTATUS Status);
131 
132 void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t* NdefSmtCrdFmt,
133                                    NFCSTATUS Status);
134 
135 #endif /* PHFRINFC_SMTCRDFMT_H */
136