es10a struct update

This commit is contained in:
estkme 2024-01-09 19:45:34 +08:00
parent 2696f3e9f3
commit 2dd4a00d69
3 changed files with 33 additions and 54 deletions

View file

@ -14,23 +14,15 @@
#include "asn1c/asn1/SetDefaultDpAddressRequest.h" #include "asn1c/asn1/SetDefaultDpAddressRequest.h"
#include "asn1c/asn1/SetDefaultDpAddressResponse.h" #include "asn1c/asn1/SetDefaultDpAddressResponse.h"
struct userdata_get_euicc_configured_addresses
{
char **smds;
char **smdp;
};
static int iter_EuiccConfiguredAddressesResponse(struct apdu_response *response, void *userdata) static int iter_EuiccConfiguredAddressesResponse(struct apdu_response *response, void *userdata)
{ {
struct userdata_get_euicc_configured_addresses *ud = (struct userdata_get_euicc_configured_addresses *)userdata; struct es10a_euicc_configured_addresses *ud = (struct es10a_euicc_configured_addresses *)userdata;
int fret = 0; int fret = 0;
asn_dec_rval_t asn1drval; asn_dec_rval_t asn1drval;
EuiccConfiguredAddressesResponse_t *asn1resp = NULL; EuiccConfiguredAddressesResponse_t *asn1resp = NULL;
if (ud->smds) ud->defaultDpAddress = NULL;
*ud->smds = NULL; ud->rootDsAddress = NULL;
if (ud->smdp)
*ud->smdp = NULL;
asn1drval = ber_decode(NULL, &asn_DEF_EuiccConfiguredAddressesResponse, (void **)&asn1resp, response->data, response->length); asn1drval = ber_decode(NULL, &asn_DEF_EuiccConfiguredAddressesResponse, (void **)&asn1resp, response->data, response->length);
if (asn1drval.code != RC_OK) if (asn1drval.code != RC_OK)
@ -38,54 +30,33 @@ static int iter_EuiccConfiguredAddressesResponse(struct apdu_response *response,
goto err; goto err;
} }
if (ud->smds) if (asn1resp->defaultDpAddress)
{ {
*ud->smds = malloc(asn1resp->rootDsAddress.size + 1); ud->defaultDpAddress = malloc(asn1resp->defaultDpAddress->size + 1);
if (!*ud->smds) if (!ud->defaultDpAddress)
{ {
goto err; goto err;
} }
memcpy(*ud->smds, asn1resp->rootDsAddress.buf, asn1resp->rootDsAddress.size); memcpy(ud->defaultDpAddress, asn1resp->defaultDpAddress->buf, asn1resp->defaultDpAddress->size);
(*ud->smds)[asn1resp->rootDsAddress.size] = '\0'; ud->defaultDpAddress[asn1resp->defaultDpAddress->size] = '\0';
} }
if (ud->smdp) ud->rootDsAddress = malloc(asn1resp->rootDsAddress.size + 1);
if (!ud->rootDsAddress)
{ {
if (asn1resp->defaultDpAddress) goto err;
{
*ud->smdp = malloc(asn1resp->defaultDpAddress->size + 1);
if (!*ud->smdp)
{
goto err;
}
memcpy(*ud->smdp, asn1resp->defaultDpAddress->buf, asn1resp->defaultDpAddress->size);
(*ud->smdp)[asn1resp->defaultDpAddress->size] = '\0';
}
else
{
*ud->smdp = malloc(1);
if (!*ud->smdp)
{
goto err;
}
(*ud->smdp)[0] = '\0';
}
} }
memcpy(ud->rootDsAddress, asn1resp->rootDsAddress.buf, asn1resp->rootDsAddress.size);
ud->rootDsAddress[asn1resp->rootDsAddress.size] = '\0';
goto exit; goto exit;
err: err:
fret = -1; fret = -1;
if (*ud->smds) free(ud->rootDsAddress);
{ ud->rootDsAddress = NULL;
free(*ud->smds); free(ud->defaultDpAddress);
*ud->smds = NULL; ud->defaultDpAddress = NULL;
}
if (*ud->smdp)
{
free(*ud->smdp);
*ud->smdp = NULL;
}
exit: exit:
if (asn1resp) if (asn1resp)
{ {
@ -95,13 +66,12 @@ exit:
return fret; return fret;
} }
int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, char **smdp, char **smds) int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, struct es10a_euicc_configured_addresses *address)
{ {
int fret = 0; int fret = 0;
int ret; int ret;
asn_enc_rval_t asn1erval; asn_enc_rval_t asn1erval;
EuiccConfiguredAddressesRequest_t *asn1req = NULL; EuiccConfiguredAddressesRequest_t *asn1req = NULL;
struct userdata_get_euicc_configured_addresses ud;
asn1req = malloc(sizeof(EuiccConfiguredAddressesRequest_t)); asn1req = malloc(sizeof(EuiccConfiguredAddressesRequest_t));
if (!asn1req) if (!asn1req)
@ -118,10 +88,7 @@ int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, char **smdp, cha
goto err; goto err;
} }
ud.smdp = smdp; ret = es10x_command_iter(ctx, ctx->g_asn1_der_request_buf, asn1erval.encoded, iter_EuiccConfiguredAddressesResponse, address);
ud.smds = smds;
ret = es10x_command_iter(ctx, ctx->g_asn1_der_request_buf, asn1erval.encoded, iter_EuiccConfiguredAddressesResponse, &ud);
if (ret < 0) if (ret < 0)
{ {
goto err; goto err;

View file

@ -2,5 +2,11 @@
#include "euicc.h" #include "euicc.h"
int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, char **smdp, char **smds); struct es10a_euicc_configured_addresses
{
char *defaultDpAddress;
char *rootDsAddress;
};
int es10a_get_euicc_configured_addresses(struct euicc_ctx *ctx, struct es10a_euicc_configured_addresses *address);
int es10a_set_default_dp_address(struct euicc_ctx *ctx, const char *smdp); int es10a_set_default_dp_address(struct euicc_ctx *ctx, const char *smdp);

View file

@ -18,6 +18,8 @@ static int applet_main(int argc, char **argv)
char *imei = NULL; char *imei = NULL;
char *confirmation_code = NULL; char *confirmation_code = NULL;
struct es10a_euicc_configured_addresses configured_addresses;
char *b64_euicc_challenge = NULL; char *b64_euicc_challenge = NULL;
char *b64_euicc_info_1 = NULL; char *b64_euicc_info_1 = NULL;
struct es9p_initiate_authentication_resp es9p_initiate_authentication_resp; struct es9p_initiate_authentication_resp es9p_initiate_authentication_resp;
@ -66,11 +68,15 @@ static int applet_main(int argc, char **argv)
if (smdp == NULL) if (smdp == NULL)
{ {
jprint_progress("es10a_get_euicc_configured_addresses"); jprint_progress("es10a_get_euicc_configured_addresses");
if (es10a_get_euicc_configured_addresses(&euicc_ctx, &smdp, NULL)) if (es10a_get_euicc_configured_addresses(&euicc_ctx, &configured_addresses))
{ {
jprint_error("es10a_get_euicc_configured_addresses", NULL); jprint_error("es10a_get_euicc_configured_addresses", NULL);
return -1; return -1;
} }
else
{
smdp = configured_addresses.defaultDpAddress;
}
} }
if (!smdp || (strlen(smdp) == 0)) if (!smdp || (strlen(smdp) == 0))