| /***************************************************************/ | |
| // | |
| //²Î¼û LPA½Ó¿ÚÎĵµV0.1 SGP.22, ·µ»ØJSON | |
| // | |
| /***************************************************************/ | |
| #include <stdio.h> | |
| #include <stdlib.h> | |
| #include <string.h> | |
| #include <ctype.h> | |
| #include <sys/time.h> | |
| #include <termios.h> | |
| #include "lpa_inner.h" | |
| #define LPA_AUTH_DATA_LEN 512 | |
| /***************************************************************/ | |
| // | |
| //euiccChallenge:¿¨·µ»ØµÄAPDU,²»º¬9000 | |
| //euiccInfo1: ¿¨·µ»ØµÄAPDU,²»º¬9000 | |
| //smdpAddress:¼¤»îÂëÖÐsdmpµØÖ· | |
| //·µ»Øjson | |
| // | |
| /***************************************************************/ | |
| char *InitiateAuthentication(char *euiccChallenge, char *euiccInfo1, char *smdpAddress) | |
| { | |
| char *js_data = NULL; | |
| unsigned char clg_byte[APDU_BYTE_LEN] = {0}; | |
| unsigned char info1_byte[APDU_BYTE_LEN] = {0}; | |
| int clg_len = 0; | |
| int info1_len = 0; | |
| char *clg_b64 = NULL; | |
| char *info1_b64 = NULL; | |
| clg_len = string2bytes(euiccChallenge, clg_byte, strlen(euiccChallenge)); | |
| clg_b64 = lpa_base64_encode(clg_byte, clg_len); | |
| if (clg_b64 == NULL) | |
| return NULL; | |
| info1_len = string2bytes(euiccInfo1, info1_byte, strlen(euiccInfo1)); | |
| info1_b64 = lpa_base64_encode(info1_byte, info1_len); | |
| if (info1_b64 == NULL) { | |
| free(clg_b64); | |
| return NULL; | |
| } | |
| js_data = malloc(LPA_AUTH_DATA_LEN); | |
| if (js_data != NULL) { | |
| memset(js_data, 0, LPA_AUTH_DATA_LEN); | |
| snprintf(js_data, LPA_AUTH_DATA_LEN, "{\"euiccChallenge\":\"%s\",\"euiccInfo1\":\"%s\",\"smdpAddress\":\"%s\"}", | |
| clg_b64, info1_b64, smdpAddress); | |
| //printf("js_data:-%s-\n", js_data); | |
| } | |
| free(clg_b64); | |
| free(info1_b64); | |
| return js_data; | |
| } | |
| /***************************************************************/ | |
| // | |
| //transactionId: smdp InitiateAuthentication½Ó¿Ú·µ»Ø | |
| //authSerRespHex:¿¨·µ»ØµÄAPDU,²»º¬9000 | |
| // | |
| /***************************************************************/ | |
| char *AuthenticateClient( | |
| char *transactionId, | |
| char *authSerRespHex) | |
| { | |
| char *ac_js = NULL; | |
| unsigned char *as_byte = NULL; | |
| int as_byte_len = 0; | |
| int ashex_len = strlen(authSerRespHex); | |
| char *as_b64 = NULL; | |
| int as_b64_len = 0; | |
| as_byte = malloc(ashex_len/2 + 1); | |
| if (as_byte == NULL) { | |
| return NULL; | |
| } | |
| memset(as_byte, 0, ashex_len/2 + 1); | |
| as_byte_len = string2bytes(authSerRespHex, as_byte, ashex_len); | |
| as_b64 = lpa_base64_encode(as_byte, as_byte_len); | |
| if (as_b64 == NULL) { | |
| free(as_byte); | |
| return NULL; | |
| } | |
| as_b64_len = strlen(as_b64); | |
| ac_js = malloc(as_b64_len + 100); | |
| if (ac_js != NULL) { | |
| memset(ac_js, 0, as_b64_len + 100); | |
| snprintf(ac_js, as_b64_len + 100, "{\"transactionId\":\"%s\",\"authenticateServerResponse\":\"%s\"}", | |
| transactionId, as_b64); | |
| //printf("js_data:-%s-\n", ac_js); | |
| } | |
| free(as_byte); | |
| free(as_b64); | |
| return ac_js; | |
| } | |
| /***************************************************************/ | |
| // | |
| //transactionId: smdp AuthenticateClient½Ó¿Ú·µ»Ø | |
| //predlRespHex: prepareDownloadResponseHex ¿¨·µ»ØµÄAPDU,²»º¬9000 | |
| // | |
| /***************************************************************/ | |
| char *GetBoundProfilePackage ( | |
| char *transactionId, | |
| char *predlRespHex) | |
| { | |
| char *bpp_js = NULL; | |
| unsigned char *pdl_byte = NULL; | |
| int pdl_byte_len = 0; | |
| int pdlhex_len = strlen(predlRespHex); | |
| char *pdl_b64 = NULL; | |
| int pdl_b64_len = 0; | |
| pdl_byte = malloc(pdlhex_len/2 + 1); | |
| if (pdl_byte == NULL) { | |
| return NULL; | |
| } | |
| memset(pdl_byte, 0, pdlhex_len/2 + 1); | |
| pdl_byte_len = string2bytes(predlRespHex, pdl_byte, pdlhex_len); | |
| pdl_b64 = lpa_base64_encode(pdl_byte, pdl_byte_len); | |
| if (pdl_b64 == NULL) { | |
| free(pdl_byte); | |
| return NULL; | |
| } | |
| pdl_b64_len = strlen(pdl_b64); | |
| bpp_js = malloc(pdl_b64_len + 100); | |
| if (bpp_js != NULL) { | |
| memset(bpp_js, 0, pdl_b64_len + 100); | |
| snprintf(bpp_js, pdl_b64_len + 100, "{\"transactionId\":\"%s\",\"prepareDownloadResponse\":\"%s\"}", | |
| transactionId, pdl_b64); | |
| //printf("js_data:-%s-\n", bpp_js); | |
| } | |
| free(pdl_byte); | |
| free(pdl_b64); | |
| return bpp_js; | |
| } | |
| /***************************************************************/ | |
| // | |
| //pnfHex: pendingNotification ¿¨·µ»ØµÄAPDU,²»º¬9000 | |
| // | |
| /***************************************************************/ | |
| char *HandleNotification(char *pnfHex) | |
| { | |
| char *bpp_js = NULL; | |
| unsigned char *pdl_byte = NULL; | |
| int pdl_byte_len = 0; | |
| int pdlhex_len = strlen(pnfHex); | |
| char *pdl_b64 = NULL; | |
| int pdl_b64_len = 0; | |
| pdl_byte = malloc(pdlhex_len/2 + 1); | |
| if (pdl_byte == NULL) { | |
| return NULL; | |
| } | |
| memset(pdl_byte, 0, pdlhex_len/2 + 1); | |
| pdl_byte_len = string2bytes(pnfHex, pdl_byte, pdlhex_len); | |
| pdl_b64 = lpa_base64_encode(pdl_byte, pdl_byte_len); | |
| if (pdl_b64 == NULL) { | |
| free(pdl_byte); | |
| return NULL; | |
| } | |
| pdl_b64_len = strlen(pdl_b64); | |
| bpp_js = malloc(pdl_b64_len + 100); | |
| if (bpp_js != NULL) { | |
| memset(bpp_js, 0, pdl_b64_len + 100); | |
| snprintf(bpp_js, pdl_b64_len + 100, | |
| "{\"header\":{\"functionExecutionStatus\":{\"status\":\"Executed-Success\"}},\"pendingNotification\":\"%s\"}", pdl_b64); | |
| //printf("js_data:-%s-\n", bpp_js); | |
| } | |
| free(pdl_byte); | |
| free(pdl_b64); | |
| return bpp_js; | |
| } | |