channels/smartcard: further split decoding from calling