laforge has submitted this change. ( https://gerrit.osmocom.org/c/onomondo-ipa/+/43062?usp=email )
(
10 is the latest approved patch-set. No files were changed between the latest approved patch-set and the submitted one. )Change subject: V1.2: Change of IpaEuiccDataRequest and results ......................................................................
V1.2: Change of IpaEuiccDataRequest and results
Section 2.11.1.2
* Changed tags, added tag * Two search criteria: searchCriteriaNotification, searchCriteriaEuiccPackageResult
Both search criteria of the eUICC Data Request are converted into search criteria of Retrieve Notifications List Request.
The tags have not only changed, but also a new tag for requesting eUICC Package Results has been added. This request cannot be emulated, because a non IoT eUICC does not store these results. In case of emulation, the eUICC Result Data includes an empty eUICC Package Result List.
Related: SYS#8101 Change-Id: I411111c71787ce27615b6b66fc8b19488883d15b --- M asn1/SGP32Definitions.asn M src/ipa/libasn/IpaEuiccDataRequest.c M src/ipa/libasn/IpaEuiccDataRequest.h M src/ipa/libipa/es10b_retr_notif_from_lst.c M src/ipa/libipa/es10b_retr_notif_from_lst.h M src/ipa/libipa/proc_euicc_data_req.c 6 files changed, 203 insertions(+), 82 deletions(-)
Approvals: Jenkins Builder: Verified dexter: Looks good to me, approved
diff --git a/asn1/SGP32Definitions.asn b/asn1/SGP32Definitions.asn index 786ebe5..6a29c31 100644 --- a/asn1/SGP32Definitions.asn +++ b/asn1/SGP32Definitions.asn @@ -117,8 +117,10 @@ euiccCiPKIdentifierToBeUsed OCTET STRING OPTIONAL, -- CI Public Key Identifier (possibly truncated) supported on the eUICC for signature creation searchCriteriaNotification [1] CHOICE { seqNumber [0] INTEGER, - profileManagementOperation [1] NotificationEvent, - euiccPackageResults [2] NULL + profileManagementOperation [1] NotificationEvent + } OPTIONAL, + searchCriteriaEuiccPackageResult [2] CHOICE { + seqNumber [0] INTEGER } OPTIONAL, eimTransactionId [3] TransactionId OPTIONAL -- Tag '83' } diff --git a/src/ipa/libasn/IpaEuiccDataRequest.c b/src/ipa/libasn/IpaEuiccDataRequest.c index fa1924d..9e2852d 100644 --- a/src/ipa/libasn/IpaEuiccDataRequest.c +++ b/src/ipa/libasn/IpaEuiccDataRequest.c @@ -11,7 +11,15 @@ { 0, 0 }, -1}; static asn_per_constraints_t asn_PER_type_searchCriteriaNotification_constr_4 CC_NOTUSED = { - { APC_CONSTRAINED | APC_EXTENSIBLE, 2, 2, 0, 2 } /* (0..2,...) */, + { APC_CONSTRAINED | APC_EXTENSIBLE, 1, 1, 0, 1 } /* (0..1,...) */, + { APC_UNCONSTRAINED, -1, -1, 0, 0 }, + 0, 0 /* No PER value map */ +}; +static asn_oer_constraints_t asn_OER_type_searchCriteriaEuiccPackageResult_constr_8 CC_NOTUSED = { + { 0, 0 }, + -1}; +static asn_per_constraints_t asn_PER_type_searchCriteriaEuiccPackageResult_constr_8 CC_NOTUSED = { + { APC_CONSTRAINED | APC_EXTENSIBLE, 0, 0, 0, 0 } /* (0..0,...) */, { APC_UNCONSTRAINED, -1, -1, 0, 0 }, 0, 0 /* No PER value map */ }; @@ -34,20 +42,10 @@ 0, 0, /* No default value */ "profileManagementOperation" }, - { ATF_NOFLAGS, 0, offsetof(struct IpaEuiccDataRequest__searchCriteriaNotification, choice.euiccPackageResults), - (ASN_TAG_CLASS_CONTEXT | (2 << 2)), - -1, /* IMPLICIT tag at current level */ - &asn_DEF_NULL, - 0, - { 0, 0, 0 }, - 0, 0, /* No default value */ - "euiccPackageResults" - }, }; static const asn_TYPE_tag2member_t asn_MAP_searchCriteriaNotification_tag2el_4[] = { { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 }, /* seqNumber */ - { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 }, /* profileManagementOperation */ - { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 2, 0, 0 } /* euiccPackageResults */ + { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 1, 0, 0 } /* profileManagementOperation */ }; static asn_CHOICE_specifics_t asn_SPC_searchCriteriaNotification_specs_4 = { sizeof(struct IpaEuiccDataRequest__searchCriteriaNotification), @@ -55,9 +53,9 @@ offsetof(struct IpaEuiccDataRequest__searchCriteriaNotification, present), sizeof(((struct IpaEuiccDataRequest__searchCriteriaNotification *)0)->present), asn_MAP_searchCriteriaNotification_tag2el_4, - 3, /* Count of tags in the map */ + 2, /* Count of tags in the map */ 0, 0, - 3 /* Extensions start */ + 2 /* Extensions start */ }; static /* Use -fall-defs-global to expose */ asn_TYPE_descriptor_t asn_DEF_searchCriteriaNotification_4 = { @@ -70,10 +68,49 @@ 0, /* No tags (count) */ { &asn_OER_type_searchCriteriaNotification_constr_4, &asn_PER_type_searchCriteriaNotification_constr_4, CHOICE_constraint }, asn_MBR_searchCriteriaNotification_4, - 3, /* Elements count */ + 2, /* Elements count */ &asn_SPC_searchCriteriaNotification_specs_4 /* Additional specs */ };
+static asn_TYPE_member_t asn_MBR_searchCriteriaEuiccPackageResult_8[] = { + { ATF_NOFLAGS, 0, offsetof(struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult, choice.seqNumber), + (ASN_TAG_CLASS_CONTEXT | (0 << 2)), + -1, /* IMPLICIT tag at current level */ + &asn_DEF_NativeInteger, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "seqNumber" + }, +}; +static const asn_TYPE_tag2member_t asn_MAP_searchCriteriaEuiccPackageResult_tag2el_8[] = { + { (ASN_TAG_CLASS_CONTEXT | (0 << 2)), 0, 0, 0 } /* seqNumber */ +}; +static asn_CHOICE_specifics_t asn_SPC_searchCriteriaEuiccPackageResult_specs_8 = { + sizeof(struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult), + offsetof(struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult, _asn_ctx), + offsetof(struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult, present), + sizeof(((struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult *)0)->present), + asn_MAP_searchCriteriaEuiccPackageResult_tag2el_8, + 1, /* Count of tags in the map */ + 0, 0, + 1 /* Extensions start */ +}; +static /* Use -fall-defs-global to expose */ +asn_TYPE_descriptor_t asn_DEF_searchCriteriaEuiccPackageResult_8 = { + "searchCriteriaEuiccPackageResult", + "searchCriteriaEuiccPackageResult", + &asn_OP_CHOICE, + 0, /* No effective tags (pointer) */ + 0, /* No effective tags (count) */ + 0, /* No tags (pointer) */ + 0, /* No tags (count) */ + { &asn_OER_type_searchCriteriaEuiccPackageResult_constr_8, &asn_PER_type_searchCriteriaEuiccPackageResult_constr_8, CHOICE_constraint }, + asn_MBR_searchCriteriaEuiccPackageResult_8, + 1, /* Elements count */ + &asn_SPC_searchCriteriaEuiccPackageResult_specs_8 /* Additional specs */ +}; + asn_TYPE_member_t asn_MBR_IpaEuiccDataRequest_1[] = { { ATF_NOFLAGS, 0, offsetof(struct IpaEuiccDataRequest, tagList), (ASN_TAG_CLASS_APPLICATION | (28 << 2)), @@ -84,7 +121,7 @@ 0, 0, /* No default value */ "tagList" }, - { ATF_POINTER, 3, offsetof(struct IpaEuiccDataRequest, euiccCiPKIdentifierToBeUsed), + { ATF_POINTER, 4, offsetof(struct IpaEuiccDataRequest, euiccCiPKIdentifierToBeUsed), (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 0, &asn_DEF_OCTET_STRING, @@ -93,7 +130,7 @@ 0, 0, /* No default value */ "euiccCiPKIdentifierToBeUsed" }, - { ATF_POINTER, 2, offsetof(struct IpaEuiccDataRequest, searchCriteriaNotification), + { ATF_POINTER, 3, offsetof(struct IpaEuiccDataRequest, searchCriteriaNotification), (ASN_TAG_CLASS_CONTEXT | (1 << 2)), +1, /* EXPLICIT tag at current level */ &asn_DEF_searchCriteriaNotification_4, @@ -102,6 +139,15 @@ 0, 0, /* No default value */ "searchCriteriaNotification" }, + { ATF_POINTER, 2, offsetof(struct IpaEuiccDataRequest, searchCriteriaEuiccPackageResult), + (ASN_TAG_CLASS_CONTEXT | (2 << 2)), + +1, /* EXPLICIT tag at current level */ + &asn_DEF_searchCriteriaEuiccPackageResult_8, + 0, + { 0, 0, 0 }, + 0, 0, /* No default value */ + "searchCriteriaEuiccPackageResult" + }, { ATF_POINTER, 1, offsetof(struct IpaEuiccDataRequest, eimTransactionId), (ASN_TAG_CLASS_CONTEXT | (3 << 2)), -1, /* IMPLICIT tag at current level */ @@ -112,7 +158,7 @@ "eimTransactionId" }, }; -static const int asn_MAP_IpaEuiccDataRequest_oms_1[] = { 1, 2, 3 }; +static const int asn_MAP_IpaEuiccDataRequest_oms_1[] = { 1, 2, 3, 4 }; static const ber_tlv_tag_t asn_DEF_IpaEuiccDataRequest_tags_1[] = { (ASN_TAG_CLASS_CONTEXT | (82 << 2)), (ASN_TAG_CLASS_UNIVERSAL | (16 << 2)) @@ -121,16 +167,17 @@ { (ASN_TAG_CLASS_UNIVERSAL | (4 << 2)), 1, 0, 0 }, /* euiccCiPKIdentifierToBeUsed */ { (ASN_TAG_CLASS_APPLICATION | (28 << 2)), 0, 0, 0 }, /* tagList */ { (ASN_TAG_CLASS_CONTEXT | (1 << 2)), 2, 0, 0 }, /* searchCriteriaNotification */ - { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 3, 0, 0 } /* eimTransactionId */ + { (ASN_TAG_CLASS_CONTEXT | (2 << 2)), 3, 0, 0 }, /* searchCriteriaEuiccPackageResult */ + { (ASN_TAG_CLASS_CONTEXT | (3 << 2)), 4, 0, 0 } /* eimTransactionId */ }; asn_SEQUENCE_specifics_t asn_SPC_IpaEuiccDataRequest_specs_1 = { sizeof(struct IpaEuiccDataRequest), offsetof(struct IpaEuiccDataRequest, _asn_ctx), asn_MAP_IpaEuiccDataRequest_tag2el_1, - 4, /* Count of tags in the map */ + 5, /* Count of tags in the map */ asn_MAP_IpaEuiccDataRequest_oms_1, /* Optional members */ - 3, 0, /* Root/Additions */ - 4, /* First extension addition */ + 4, 0, /* Root/Additions */ + 5, /* First extension addition */ }; asn_TYPE_descriptor_t asn_DEF_IpaEuiccDataRequest = { "IpaEuiccDataRequest", @@ -144,7 +191,7 @@ /sizeof(asn_DEF_IpaEuiccDataRequest_tags_1[0]), /* 2 */ { 0, 0, SEQUENCE_constraint }, asn_MBR_IpaEuiccDataRequest_1, - 4, /* Elements count */ + 5, /* Elements count */ &asn_SPC_IpaEuiccDataRequest_specs_1 /* Additional specs */ };
diff --git a/src/ipa/libasn/IpaEuiccDataRequest.h b/src/ipa/libasn/IpaEuiccDataRequest.h index c4f0a87..b3f0347 100644 --- a/src/ipa/libasn/IpaEuiccDataRequest.h +++ b/src/ipa/libasn/IpaEuiccDataRequest.h @@ -16,7 +16,6 @@ #include "TransactionId.h" #include <NativeInteger.h> #include "NotificationEvent.h" -#include <NULL.h> #include <constr_CHOICE.h> #include <constr_SEQUENCE.h>
@@ -28,11 +27,16 @@ typedef enum IpaEuiccDataRequest__searchCriteriaNotification_PR { IpaEuiccDataRequest__searchCriteriaNotification_PR_NOTHING, /* No components present */ IpaEuiccDataRequest__searchCriteriaNotification_PR_seqNumber, - IpaEuiccDataRequest__searchCriteriaNotification_PR_profileManagementOperation, - IpaEuiccDataRequest__searchCriteriaNotification_PR_euiccPackageResults + IpaEuiccDataRequest__searchCriteriaNotification_PR_profileManagementOperation /* Extensions may appear below */ } IpaEuiccDataRequest__searchCriteriaNotification_PR; +typedef enum IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR { + IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR_NOTHING, /* No components present */ + IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR_seqNumber + /* Extensions may appear below */ + +} IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR;
/* IpaEuiccDataRequest */ typedef struct IpaEuiccDataRequest { @@ -43,7 +47,6 @@ union IpaEuiccDataRequest__searchCriteriaNotification_u { long seqNumber; NotificationEvent_t profileManagementOperation; - NULL_t euiccPackageResults; /* * This type is extensible, * possible extensions are below. @@ -53,6 +56,19 @@ /* Context for parsing across buffer boundaries */ asn_struct_ctx_t _asn_ctx; } *searchCriteriaNotification; + struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult { + IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR present; + union IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_u { + long seqNumber; + /* + * This type is extensible, + * possible extensions are below. + */ + } choice; + + /* Context for parsing across buffer boundaries */ + asn_struct_ctx_t _asn_ctx; + } *searchCriteriaEuiccPackageResult; TransactionId_t *eimTransactionId /* OPTIONAL */; /* * This type is extensible, @@ -66,7 +82,7 @@ /* Implementation */ extern asn_TYPE_descriptor_t asn_DEF_IpaEuiccDataRequest; extern asn_SEQUENCE_specifics_t asn_SPC_IpaEuiccDataRequest_specs_1; -extern asn_TYPE_member_t asn_MBR_IpaEuiccDataRequest_1[4]; +extern asn_TYPE_member_t asn_MBR_IpaEuiccDataRequest_1[5];
#ifdef __cplusplus } diff --git a/src/ipa/libipa/es10b_retr_notif_from_lst.c b/src/ipa/libipa/es10b_retr_notif_from_lst.c index bd90b3a..ae2cc8e 100644 --- a/src/ipa/libipa/es10b_retr_notif_from_lst.c +++ b/src/ipa/libipa/es10b_retr_notif_from_lst.c @@ -66,6 +66,12 @@ } }
+static void empty_euicc_package_result_list(struct ipa_es10b_retr_notif_from_lst_res *res) +{ + res->sgp32_res = IPA_ALLOC_ZERO(struct SGP32_RetrieveNotificationsListResponse); + res->sgp32_res->present = SGP32_RetrieveNotificationsListResponse_PR_euiccPackageResultList; +} + /*! Free a converted notificationList (RetrieveNotificationsListResponse). */ void free_converted_notification_list(PendingNotificationList_t *lst) { @@ -155,31 +161,32 @@ struct RetrieveNotificationsListRequest__searchCriteria search_criteria = { 0 }; struct ipa_buf *es10b_req = NULL;
- if (req->dr_search_criteria) { - /* Convert from foreigen searchCriteria (see comment in header file) */ - switch (req->dr_search_criteria->present) { - case IpaEuiccDataRequest__searchCriteriaNotification_PR_seqNumber: - search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_seqNumber; - search_criteria.choice.seqNumber = req->dr_search_criteria->choice.seqNumber; - break; - case IpaEuiccDataRequest__searchCriteriaNotification_PR_profileManagementOperation: - search_criteria.present = - RetrieveNotificationsListRequest__searchCriteria_PR_profileManagementOperation; - search_criteria.choice.profileManagementOperation = - req->dr_search_criteria->choice.profileManagementOperation; - break; - case IpaEuiccDataRequest__searchCriteriaNotification_PR_euiccPackageResults: - IPA_LOGP_ES10X("RetrieveNotificationsList", LERROR, - "unsupported euiccPackageResults searchCriteria in IpaEuiccDataRequest!\n"); - search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; - break; - default: - IPA_LOGP_ES10X("RetrieveNotificationsList", LERROR, - "empty searchCriteria in IpaEuiccDataRequest!\n"); + switch (req->dr_tag) { + case 0xA0: + if (!req->dr_search_criteria_notification) { + IPA_LOGP_ES10X("RetrieveNotificationsList", LDEBUG, + "no searchCriteria in IpaEuiccDataRequest, requesting all notifiactions.\n"); search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; break; } - } else { + switch (req->dr_search_criteria_notification->present) { + case IpaEuiccDataRequest__searchCriteriaNotification_PR_seqNumber: + search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_seqNumber; + search_criteria.choice.seqNumber = req->search_criteria.choice.seqNumber; + break; + case IpaEuiccDataRequest__searchCriteriaNotification_PR_profileManagementOperation: + search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_profileManagementOperation; + search_criteria.choice.profileManagementOperation = + req->search_criteria.choice.profileManagementOperation; + break; + default: + IPA_LOGP_ES10X("RetrieveNotificationsList", LDEBUG, + "empty searchCriteria in IpaEuiccDataRequest, requesting all notifiactions.\n"); + search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; + break; + } + break; + default: /* Use native search_criteria as provided by caller */ search_criteria.present = req->search_criteria.present; switch (req->search_criteria.present) { @@ -215,32 +222,55 @@ struct SGP32_RetrieveNotificationsListRequest__searchCriteria search_criteria = { 0 }; struct ipa_buf *es10b_req = NULL;
- if (req->dr_search_criteria) { - /* Convert from foreigen searchCriteria (see comment in header file) */ - switch (req->dr_search_criteria->present) { + switch (req->dr_tag) { + case 0xA0: + if (!req->dr_search_criteria_notification) { + IPA_LOGP_ES10X("RetrieveNotificationsList", LDEBUG, + "no searchCriteria in IpaEuiccDataRequest, requesting all notifiactions.\n"); + search_criteria.present = SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; + break; + } + switch (req->dr_search_criteria_notification->present) { case IpaEuiccDataRequest__searchCriteriaNotification_PR_seqNumber: search_criteria.present = SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_seqNumber; - search_criteria.choice.seqNumber = req->dr_search_criteria->choice.seqNumber; + search_criteria.choice.seqNumber = req->dr_search_criteria_notification->choice.seqNumber; break; case IpaEuiccDataRequest__searchCriteriaNotification_PR_profileManagementOperation: search_criteria.present = SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_profileManagementOperation; search_criteria.choice.profileManagementOperation = - req->dr_search_criteria->choice.profileManagementOperation; - break; - case IpaEuiccDataRequest__searchCriteriaNotification_PR_euiccPackageResults: - search_criteria.present = - SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_euiccPackageResults; - search_criteria.choice.euiccPackageResults = - req->dr_search_criteria->choice.euiccPackageResults; + req->dr_search_criteria_notification->choice.profileManagementOperation; break; default: - IPA_LOGP_ES10X("RetrieveNotificationsList", LERROR, - "empty searchCriteria in IpaEuiccDataRequest!\n"); - search_criteria.present = RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; + IPA_LOGP_ES10X("RetrieveNotificationsList", LDEBUG, + "empty searchCriteria in IpaEuiccDataRequest, requesting all notifiactions.\n"); + search_criteria.present = + SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_NOTHING; break; } - } else { + break; + case 0xA2: + if (!req->dr_search_criteria_epr) { + IPA_LOGP_ES10X("RetrieveNotificationsList", LDEBUG, + "no searchCriteria in IpaEuiccDataRequest, requesting all eUICC Package Results.\n"); + search_criteria.present = + SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_euiccPackageResults; + break; + } + switch (req->dr_search_criteria_epr->present) { + case IpaEuiccDataRequest__searchCriteriaEuiccPackageResult_PR_seqNumber: + search_criteria.present = + SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_seqNumber; + search_criteria.choice.seqNumber = + req->dr_search_criteria_notification->choice.seqNumber; + break; + default: + search_criteria.present = + SGP32_RetrieveNotificationsListRequest__searchCriteria_PR_euiccPackageResults; + break; + } + break; + default: /* Use native search_criteria as provided by caller */ search_criteria = req->search_criteria; } @@ -265,10 +295,17 @@ struct ipa_es10b_retr_notif_from_lst_res *res = IPA_ALLOC_ZERO(struct ipa_es10b_retr_notif_from_lst_res); int rc;
- if (ctx->cfg->iot_euicc_emu_enabled) + if (ctx->cfg->iot_euicc_emu_enabled) { + if (req->dr_tag == 0xA2) { + IPA_LOGP_ES10X("RetrieveNotificationsList", LINFO, + "IoT eUICC emulation active, provide empty euiccPackageResult list.\n"); + empty_euicc_package_result_list(res); + return res; + } es10b_req = enc_retr_notif_from_lst_req(req); - else + } else { es10b_req = enc_retr_notif_from_lst_req_sgp32(req); + } if (!es10b_req) { IPA_LOGP_ES10X("RetrieveNotificationsList", LERROR, "unable to encode ES10b request\n"); goto error; diff --git a/src/ipa/libipa/es10b_retr_notif_from_lst.h b/src/ipa/libipa/es10b_retr_notif_from_lst.h index 2773356..33aaf5d 100644 --- a/src/ipa/libipa/es10b_retr_notif_from_lst.h +++ b/src/ipa/libipa/es10b_retr_notif_from_lst.h @@ -19,7 +19,9 @@ /* When the caller has access to a search searchCriteria that originates from an IpaEuiccDataRequest, the * pointer to it may be passed here. The function will then atomatically convert the searchCriteria into * the native RetrieveNotificationsListRequest format. */ - const struct IpaEuiccDataRequest__searchCriteriaNotification *dr_search_criteria; + const struct IpaEuiccDataRequest__searchCriteriaNotification *dr_search_criteria_notification; + const struct IpaEuiccDataRequest__searchCriteriaEuiccPackageResult *dr_search_criteria_epr; + uint16_t dr_tag; };
struct ipa_es10b_retr_notif_from_lst_res { diff --git a/src/ipa/libipa/proc_euicc_data_req.c b/src/ipa/libipa/proc_euicc_data_req.c index 41cd592..d099694 100644 --- a/src/ipa/libipa/proc_euicc_data_req.c +++ b/src/ipa/libipa/proc_euicc_data_req.c @@ -105,7 +105,8 @@ struct ipa_es10b_get_certs_req get_certs_req = { 0 }; struct ipa_es10b_get_certs_res *get_certs_res = NULL; struct ipa_es10b_retr_notif_from_lst_req retr_notif_from_lst_req = { 0 }; - struct ipa_es10b_retr_notif_from_lst_res *retr_notif_from_lst_res = NULL; + struct ipa_es10b_retr_notif_from_lst_res *retr_notif_from_lst_res_a0 = NULL; + struct ipa_es10b_retr_notif_from_lst_res *retr_notif_from_lst_res_a2 = NULL; struct ipa_esipa_prvde_eim_pkg_rslt_req prvde_eim_pkg_rslt_req = { 0 }; struct ipa_esipa_prvde_eim_pkg_rslt_res *prvde_eim_pkg_rslt_res = NULL;
@@ -114,7 +115,7 @@
/* Collect requested data */ tag_list = IPA_BUF_FROM_ASN(&pars->ipa_euicc_data_request->tagList); - if (ipa_tag_in_taglist(0x80, tag_list)) { + if (ipa_tag_in_taglist(0x81, tag_list)) { IPA_LOGP(SIPA, LINFO, "eIM asks for Default SM-DP+ address\n"); euicc_cfg_addr = ipa_es10a_get_euicc_cfg_addr(ctx); if (euicc_cfg_addr && euicc_cfg_addr->res->defaultDpAddress) @@ -180,7 +181,7 @@ } }
- if (ipa_tag_in_taglist(0x88, tag_list)) { + if (ipa_tag_in_taglist(0xA8, tag_list)) { IPA_LOGP(SIPA, LINFO, "eIM asks for IPA Capabilities\n"); ipa_euicc_data_response.choice.ipaEuiccData.ipaCapabilities = make_ipa_capabilties(); } else { @@ -194,15 +195,29 @@ ipa_euicc_data_response.choice.ipaEuiccData.deviceInfo = NULL; }
- if (ipa_tag_in_taglist(0xBF2B, tag_list)) { - IPA_LOGP(SIPA, LINFO, "eIM asks for List of Notifications and/or eUICC Package Results\n"); + if (ipa_tag_in_taglist(0xA0, tag_list)) { + IPA_LOGP(SIPA, LINFO, "eIM asks for List of Notifications\n");
- retr_notif_from_lst_req.dr_search_criteria = pars->ipa_euicc_data_request->searchCriteriaNotification; - retr_notif_from_lst_res = ipa_es10b_retr_notif_from_lst(ctx, &retr_notif_from_lst_req); - if (retr_notif_from_lst_res && retr_notif_from_lst_res->sgp32_res && - retr_notif_from_lst_res->sgp32_res->present == SGP32_RetrieveNotificationsListResponse_PR_notificationList) { + retr_notif_from_lst_req.dr_search_criteria_notification = pars->ipa_euicc_data_request->searchCriteriaNotification; + retr_notif_from_lst_req.dr_tag = 0xA0; + retr_notif_from_lst_res_a0 = ipa_es10b_retr_notif_from_lst(ctx, &retr_notif_from_lst_req); + if (retr_notif_from_lst_res_a0 && retr_notif_from_lst_res_a0->sgp32_res && + retr_notif_from_lst_res_a0->sgp32_res->present == SGP32_RetrieveNotificationsListResponse_PR_notificationList) { ipa_euicc_data_response.choice.ipaEuiccData.notificationsList = - (struct PendingNotificationList *)&retr_notif_from_lst_res->sgp32_res->choice.notificationList; + &retr_notif_from_lst_res_a0->sgp32_res->choice.notificationList; + } + } + + if (ipa_tag_in_taglist(0xA2, tag_list)) { + IPA_LOGP(SIPA, LINFO, "eIM asks for eUICC Package Results\n"); + + retr_notif_from_lst_req.dr_search_criteria_epr = pars->ipa_euicc_data_request->searchCriteriaEuiccPackageResult; + retr_notif_from_lst_req.dr_tag = 0xA2; + retr_notif_from_lst_res_a2 = ipa_es10b_retr_notif_from_lst(ctx, &retr_notif_from_lst_req); + if (retr_notif_from_lst_res_a2 && retr_notif_from_lst_res_a2->sgp32_res && + retr_notif_from_lst_res_a2->sgp32_res->present == SGP32_RetrieveNotificationsListResponse_PR_euiccPackageResultList) { + ipa_euicc_data_response.choice.ipaEuiccData.euiccPackageResultList = + &retr_notif_from_lst_res_a2->sgp32_res->choice.euiccPackageResultList; } }
@@ -226,7 +241,8 @@ ipa_es10b_get_euicc_info_free(euicc_info_2); ipa_es10b_get_eim_cfg_data_free(eim_cfg_data); ipa_es10b_get_certs_res_free(get_certs_res); - ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res); + ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res_a0); + ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res_a2); ipa_esipa_prvde_eim_pkg_rslt_free(prvde_eim_pkg_rslt_res); return 0; error: @@ -236,7 +252,8 @@ ipa_es10b_get_euicc_info_free(euicc_info_2); ipa_es10b_get_eim_cfg_data_free(eim_cfg_data); ipa_es10b_get_certs_res_free(get_certs_res); - ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res); + ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res_a0); + ipa_es10b_retr_notif_from_lst_res_free(retr_notif_from_lst_res_a2); ipa_esipa_prvde_eim_pkg_rslt_free(prvde_eim_pkg_rslt_res); IPA_LOGP(SIPA, LINFO, "IPA get EUICC data failed!\n"); return -EINVAL;