laforge has submitted this change. ( https://gerrit.osmocom.org/c/pysim/+/42301?usp=email )
Change subject: pySim/transport: fix GET RESPONSE behaviour
......................................................................
pySim/transport: fix GET RESPONSE behaviour
The current behavior we implement in the method __send_apdu_T0 is
incomplete. Some details discussed in ETSI TS 102 221,
section 7.3.1.1.4, clause 4 seem to be not fully implemented. We
may also end up sending a GET RESPONSE in other APDU cases than
case 4 (the only case that uses the GET RESPONSE command).
Related: OS#6970
Change-Id: I26f0566af0cdd61dcc97f5f502479dc76adc37cc
---
M pySim/transport/__init__.py
M tests/pySim-shell_test/apdu/test_apdu.script
2 files changed, 60 insertions(+), 16 deletions(-)
Approvals:
laforge: Looks good to me, approved
fixeria: Looks good to me, but someone else must approve
Jenkins Builder: Verified
diff --git a/pySim/transport/__init__.py b/pySim/transport/__init__.py
index 6833a90..d689a0a 100644
--- a/pySim/transport/__init__.py
+++ b/pySim/transport/__init__.py
@@ -301,24 +301,54 @@
prev_tpdu = tpdu
data, sw = self.send_tpdu(tpdu)
+ log.debug("T0: case #%u TPDU: %s => %s %s", case, tpdu, data or "(no data)", sw or "(no status word)")
+ if sw is None:
+ raise ValueError("no status word received")
- # When we have sent the first APDU, the SW may indicate that there are response bytes
- # available. There are two SWs commonly used for this 9fxx (sim) and 61xx (usim), where
- # xx is the number of response bytes available.
- # See also:
- if sw is not None:
- while (sw[0:2] in ['9f', '61', '62', '63']):
- # SW1=9F: 3GPP TS 51.011 9.4.1, Responses to commands which are correctly executed
- # SW1=61: ISO/IEC 7816-4, Table 5 — General meaning of the interindustry values of SW1-SW2
- # SW1=62: ETSI TS 102 221 7.3.1.1.4 Clause 4b): 62xx, 63xx, 9xxx != 9000
- tpdu_gr = tpdu[0:2] + 'c00000' + sw[2:4]
+ # After sending the APDU/TPDU the UICC/eUICC or SIM may response with a status word that indicates that further
+ # TPDUs have to be sent in order to complete the task.
+ if case == 4 or self.apdu_strict == False:
+ # In case the APDU is a case #4 APDU, the UICC/eUICC/SIM may indicate that there is response data
+ # available which has to be retrieved using a GET RESPONSE command TPDU.
+ #
+ # ETSI TS 102 221, section 7.3.1.1.4 is very cleare about the fact that the GET RESPONSE mechanism
+ # shall only apply on case #4 APDUs but unfortunately it is impossible to distinguish between case #3
+ # and case #4 when the APDU format is not strictly followed. In order to be able to detect case #4
+ # correctly the Le byte (usually 0x00) must be present, is often forgotten. To avoid problems with
+ # legacy scripts that use raw APDU strings, we will still loosely apply GET RESPONSE based on what
+ # the status word indicates. Unless the user explicitly enables the strict mode (set apdu_strict true)
+ while True:
+ if sw in ['9000', '9100']:
+ # A status word of 9000 (or 9100 in case there is pending data from a proactive SIM command)
+ # indicates that either no response data was returnd or all response data has been retrieved
+ # successfully. We may discontinue the processing at this point.
+ break;
+ if sw[0:2] in ['61', '9f']:
+ # A status word of 61xx or 9fxx indicates that there is (still) response data available. We
+ # send a GET RESPONSE command with the length value indicated in the second byte of the status
+ # word. (see also ETSI TS 102 221, section 7.3.1.1.4, clause 4a and 3GPP TS 51.011 9.4.1 and
+ # ISO/IEC 7816-4, Table 5)
+ le_gr = sw[2:4]
+ elif sw[0:2] in ['62', '63']:
+ # There are corner cases (status word is 62xx or 63xx) where the UICC/eUICC/SIM asks us
+ # to send a dummy GET RESPONSE command. We send a GET RESPONSE command with a length of 0.
+ # (see also ETSI TS 102 221, section 7.3.1.1.4, clause 4b and ETSI TS 151 011, section 9.4.1)
+ le_gr = '00'
+ else:
+ # A status word other then the ones covered by the above logic may indicate an error. In this
+ # case we will discontinue the processing as well.
+ # (see also ETSI TS 102 221, section 7.3.1.1.4, clause 4c)
+ break
+ tpdu_gr = tpdu[0:2] + 'c00000' + le_gr
prev_tpdu = tpdu_gr
- d, sw = self.send_tpdu(tpdu_gr)
- data += d
- if sw[0:2] == '6c':
- # SW1=6C: ETSI TS 102 221 Table 7.1: Procedure byte coding
- tpdu_gr = prev_tpdu[0:8] + sw[2:4]
- data, sw = self.send_tpdu(tpdu_gr)
+ data_gr, sw = self.send_tpdu(tpdu_gr)
+ log.debug("T0: GET RESPONSE TPDU: %s => %s %s", tpdu_gr, data_gr or "(no data)", sw or "(no status word)")
+ data += data_gr
+ if sw[0:2] == '6c':
+ # SW1=6C: ETSI TS 102 221 Table 7.1: Procedure byte coding
+ tpdu_gr = prev_tpdu[0:8] + sw[2:4]
+ data, sw = self.send_tpdu(tpdu_gr)
+ log.debug("T0: repated case #%u TPDU: %s => %s %s", case, tpdu_gr, data or "(no data)", sw or "(no status word)")
return data, sw
diff --git a/tests/pySim-shell_test/apdu/test_apdu.script b/tests/pySim-shell_test/apdu/test_apdu.script
index a949b2d..2531987 100644
--- a/tests/pySim-shell_test/apdu/test_apdu.script
+++ b/tests/pySim-shell_test/apdu/test_apdu.script
@@ -7,10 +7,24 @@
# No command data field, No response data field present
apdu 00700001 --expect-sw 9000 --expect-response-regex '^$'
+# Case #1: (verify pin)
+# This command returns the number of remaining authentication attempts in the
+# form of a status that has the form 63cX, where X is the number of remaining
+# attempts. Such a status word can be easily confused with the response to a
+# case #4 APDU. This test checks if the transport layer correctly distinguishes
+# the between APDU case #1 and APDU case #4.
+apdu 0020000A --expect-sw 63c? --expect-response-regex '^$'
+
# Case #2: (status)
# No command data field, Response data field present
apdu 80F2000000 --expect-sw 9000 --expect-response-regex '^[a-fA-F0-9]+$'
+# Case #2: (verify pin)
+# (see also above). This test checks if the transport layer is also able to
+# distinguish correctly between APDU case #2 (with zero length response) and
+# APDU case #4.
+apdu 0020000A00 --expect-sw 63c? --expect-response-regex '^$'
+
# Case #3: (terminal capability)
# Command data field present, No response data field
apdu 80AA000005a903830180 --expect-sw 9000 --expect-response-regex '^$'
--
To view, visit https://gerrit.osmocom.org/c/pysim/+/42301?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: merged
Gerrit-Project: pysim
Gerrit-Branch: master
Gerrit-Change-Id: I26f0566af0cdd61dcc97f5f502479dc76adc37cc
Gerrit-Change-Number: 42301
Gerrit-PatchSet: 9
Gerrit-Owner: dexter <pmaier(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Attention is currently required from: Hoernchen, fixeria, laforge.
Timur Davydov has posted comments on this change by Timur Davydov. ( https://gerrit.osmocom.org/c/osmo-trx/+/42411?usp=email )
Change subject: transceiver: add optional WebSDR device support
......................................................................
Patch Set 11:
(1 comment)
Patchset:
PS11:
> I don't mind refactoring but cluttering everything with ifdefs is not acceptable, we won't be able t […]
I initially implemented this as a separate class (WebTransceiver), but I likely misunderstood comment here https://gerrit.osmocom.org/c/osmo-trx/+/42411/comments/dfb1f065_15681493 when I moved the logic into Transceiver.cpp.
The intention was not to clutter the code with ifdefs, but rather to follow the suggestion and reduce duplication. However, I see your point about keeping the Web-specific logic isolated.
I can revert to the original approach and keep it in a separate WebTransceiver class overriding the required parts.
--
To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/42411?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
Gerrit-Change-Number: 42411
Gerrit-PatchSet: 11
Gerrit-Owner: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Reviewer: Hoernchen <ewild(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-CC: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: Hoernchen <ewild(a)sysmocom.de>
Gerrit-Attention: laforge <laforge(a)osmocom.org>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Wed, 29 Apr 2026 19:26:30 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: Hoernchen <ewild(a)sysmocom.de>
Attention is currently required from: Timur Davydov, fixeria, laforge.
Hoernchen has posted comments on this change by Timur Davydov. ( https://gerrit.osmocom.org/c/osmo-trx/+/42411?usp=email )
Change subject: transceiver: add optional WebSDR device support
......................................................................
Patch Set 11: Code-Review-2
(1 comment)
Patchset:
PS11:
I don't mind refactoring but cluttering everything with ifdefs is not acceptable, we won't be able to maintain code like that, because we neither run the web backend nor do existing users nor do we want to run it and we don't have tests either. That would mean code rot as soon as anyone changes anything because we don't know where and what to wrap in ifdefs. The only way I see here is to derive/template a WebTransceiver or something like that and just override parts, so this can be somehow contained.
--
To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/42411?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: Ia0d340c323c2eea28fbe82601ba0af7cfbd68f6d
Gerrit-Change-Number: 42411
Gerrit-PatchSet: 11
Gerrit-Owner: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Reviewer: Hoernchen <ewild(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-CC: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: laforge <laforge(a)osmocom.org>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Attention: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Comment-Date: Wed, 29 Apr 2026 18:10:53 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
Attention is currently required from: fixeria, osmith.
falconia has posted comments on this change by falconia. ( https://gerrit.osmocom.org/c/osmo-bsc/+/42712?usp=email )
Change subject: nokia: add support for Flexi Multiradio
......................................................................
Patch Set 3:
(2 comments)
This change is ready for review.
File src/osmo-bsc/bts_nokia_site.c:
https://gerrit.osmocom.org/c/osmo-bsc/+/42712/comment/92e99bbc_62a835c2?usp… :
PS1, Line 1778: It is also possible to configure the BTS without a reset, but in this case
> Thank you for making the linked cosmetic patch to osmo-bsc! I just CR+1'ed it; once it gets merged, […]
Done
https://gerrit.osmocom.org/c/osmo-bsc/+/42712/comment/319db058_e2797aec?usp… :
PS1, Line 1785: static int abis_nm_rcvmsg_fom(struct e1inp_sign_link *sign_link,
> patch to disable this rule as it is clearly not working as intended: https://gerrit.osmocom. […]
Strangely enough, the current revision of this patch passes the linter, even though the linked osmo-ci patch hasn't been merged yet.
--
To view, visit https://gerrit.osmocom.org/c/osmo-bsc/+/42712?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-bsc
Gerrit-Branch: master
Gerrit-Change-Id: Icd429552c3b5e90d6c5d3ae5f52afd6550e3cebc
Gerrit-Change-Number: 42712
Gerrit-PatchSet: 3
Gerrit-Owner: falconia <falcon(a)freecalypso.org>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-CC: osmith <osmith(a)sysmocom.de>
Gerrit-Attention: osmith <osmith(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Comment-Date: Wed, 29 Apr 2026 18:03:43 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Comment-In-Reply-To: osmith <osmith(a)sysmocom.de>
Comment-In-Reply-To: falconia <falcon(a)freecalypso.org>
Comment-In-Reply-To: fixeria <vyanitskiy(a)sysmocom.de>
Attention is currently required from: Timur Davydov.
Hoernchen has posted comments on this change by Timur Davydov. ( https://gerrit.osmocom.org/c/osmo-trx/+/42655?usp=email )
Change subject: convolve: avoid function pointer casts by adding wrapper functions
......................................................................
Patch Set 1:
(1 comment)
Patchset:
PS1:
why are the wrappers not static?
--
To view, visit https://gerrit.osmocom.org/c/osmo-trx/+/42655?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-trx
Gerrit-Branch: master
Gerrit-Change-Id: Idecb118be285eb3e4691d1761d0d8fa24fd80c75
Gerrit-Change-Number: 42655
Gerrit-PatchSet: 1
Gerrit-Owner: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Reviewer: Hoernchen <ewild(a)sysmocom.de>
Gerrit-Reviewer: Jenkins Builder
Gerrit-CC: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Comment-Date: Wed, 29 Apr 2026 17:35:12 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No
Attention is currently required from: Timur Davydov.
pespin has posted comments on this change by Timur Davydov. ( https://gerrit.osmocom.org/c/osmo-bts/+/42690?usp=email )
Change subject: build: make sched_* usage optional
......................................................................
Patch Set 3: Code-Review-1
(1 comment)
File src/common/main.c:
https://gerrit.osmocom.org/c/osmo-bts/+/42690/comment/c98b2067_3936c532?usp… :
PS3, Line 322: #endif /* HAVE_SCHED_SETSCHEDULER */
imho if user passes param to set rtprio and it is not supported, the program should at least inform the user about it.
Actually, if sched_setscheduler is not present, the binary program shouldn't have the command line option available to start with.
--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/42690?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: I5af357c1e2074fa1e05ac6bc20af8535c474d906
Gerrit-Change-Number: 42690
Gerrit-PatchSet: 3
Gerrit-Owner: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-Reviewer: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Comment-Date: Wed, 29 Apr 2026 17:26:05 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: Yes
Attention is currently required from: Timur Davydov, fixeria.
pespin has posted comments on this change by Timur Davydov. ( https://gerrit.osmocom.org/c/osmo-bts/+/42689?usp=email )
Change subject: build: make timerfd usage optional
......................................................................
Patch Set 3:
(1 comment)
File src/osmo-bts-trx/scheduler_trx.c:
https://gerrit.osmocom.org/c/osmo-bts/+/42689/comment/42a1e7f3_ad7a42cb?usp… :
PS3, Line 56: #endif
so the code doesn't fail if this header is not included? why? is this header needed here?
--
To view, visit https://gerrit.osmocom.org/c/osmo-bts/+/42689?usp=email
To unsubscribe, or for help writing mail filters, visit https://gerrit.osmocom.org/settings?usp=email
Gerrit-MessageType: comment
Gerrit-Project: osmo-bts
Gerrit-Branch: master
Gerrit-Change-Id: Id5a700c865f984e8f99199a1e365bb7f1462030a
Gerrit-Change-Number: 42689
Gerrit-PatchSet: 3
Gerrit-Owner: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Reviewer: Jenkins Builder
Gerrit-Reviewer: laforge <laforge(a)osmocom.org>
Gerrit-CC: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-CC: pespin <pespin(a)sysmocom.de>
Gerrit-Attention: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-Attention: Timur Davydov <dtv.comp(a)gmail.com>
Gerrit-Comment-Date: Wed, 29 Apr 2026 17:24:14 +0000
Gerrit-HasComments: Yes
Gerrit-Has-Labels: No