% Copyright (c) 2025 Onomondo ApS & sysmocom - s.f.m.c. GmbH. All rights reserved. % % SPDX-License-Identifier: AGPL-3.0-only % % Author: Harald Welte / sysmocom - s.f.m.c. GmbH % Author: Philipp Maier / sysmocom - s.f.m.c. GmbH -module(esipa_asn1_codec). -export([decode_ipa_to_eim/1, encode_eim_to_ipa/1]). decode_ipa_to_eim(Data) -> 'SGP32Definitions':decode('EsipaMessageFromIpaToEim', Data). % The ASN.1 encoder that is generated using erlang's (asn1ct) encodes an additional constructed tag in front of the % actual EsipaMessageFromEimToIpa. This is probably due to the fact that EsipaMessageFromEimToIpa is a choice % definition (anonymous) that is misinterpreted by the ASN.1 compiler. It is conspicuous that chosen tag for the excess % constructed tag is always the tag of the chosen type. In general one would expect to see the tag of the chosen type % followed by the length+value of the chosen type. (see also ITU-T Rec. X.690, section 8.13). In any case, since we are % at the top level, we can work around this by directly encoding the chosen type. encode_eim_to_ipa({getEimPackageResponse, EimToIpaChoice}) -> 'SGP32Definitions':encode('GetEimPackageResponse', EimToIpaChoice); encode_eim_to_ipa({authenticateClientResponseEsipa, EimToIpaChoice}) -> 'SGP32Definitions':encode('AuthenticateClientResponseEsipa', EimToIpaChoice); encode_eim_to_ipa({initiateAuthenticationResponseEsipa, EimToIpaChoice}) -> 'SGP32Definitions':encode('InitiateAuthenticationResponseEsipa', EimToIpaChoice); encode_eim_to_ipa({getBoundProfilePackageResponseEsipa, EimToIpaChoice}) -> 'SGP32Definitions':encode('GetBoundProfilePackageResponseEsipa', EimToIpaChoice); encode_eim_to_ipa({cancelSessionResponseEsipa, EimToIpaChoice}) -> 'SGP32Definitions':encode('CancelSessionResponseEsipa', EimToIpaChoice); encode_eim_to_ipa(emptyResponse) -> {ok, <<>>}; encode_eim_to_ipa(EimToIpa) -> 'SGP32Definitions':encode('EsipaMessageFromEimToIpa', EimToIpa).