본문 바로가기
Android

eSIM

by OKOK 2021. 7. 12.

https://source.android.com/devices/tech/connect/esim-overview

 

eSIM 구현

LPA Android 빌드 이미지에 포함되어야 하는 독립형 시스템 앱임. LAP SM-DP+ eUICC칩 사이를 연결하는 역할을 하므로 일반적으로 eSIM의 프로필 관리 작업을 담당함. LPA APK LPA UI 또는 LUI라 불리는 UI 구성요소를 선택적으로 포함할 수 있음. 이 구성요소를 통해 최종 사용자는 삽입된 모든 구독 프로필을 한곳에서 관리할 수 있음. Android프레임워크는 사용 가능한 최적의 LPA를 자동으로 탐색하여 연결하고 LPA 인스턴스를 통해 모든 eUICC 작업을 라우팅함.

 

모바일 네트워크 운영자는 downloadSubscription(), switchToSubscription() deleteSubscription()과 같은 상위 수준의 프로필 관리 작업을 제공하는 EuiccManagerAPI를 살펴봐야 함. 자체 LPA 시스템 앱을 만들려는 기기 OEMAndroid 프레임워크가 LPA 서비스에 연결되도록 EuiccService를 확장해야 함. 또한, GSMA RSP v2.0 기반의 ES10x 함수를 제공하는 EuiccCardManagerAPI를 사용해야 함. 이러한 함수는 prepareDownload(), loadBoundProfilePackage(), retrieveNotificationList() resetMemory()와 같은 명령어를 eUICC 칩에 실행하는 데 사용 됨.

EuiccManager의 API는 제대로 구현된 LPA앱이 있어야 작동함. EuiccCardManager API의 호출자는 LAP여야 함.

 

이동통신사 앱 만들기

Android 9eUICC API를 사용하면 모바일 네트워크 운영자가 이동통신사 브랜드의 앱을 만들어 프로필을 직접 관리할 수 있음. , 이동통신사가 소유한 구독 프로필을 다운로드 및 삭제하고 이러한 프로필로 전환하는 등의 관리가 필요함.

 

EuiccManager

EuiccManager는 앱이 LPA와 상호작용하는 기본 진입점임. 이동통신사가 소유한 구독을 다운로드 및 삭제하고 이러한 구독으로 전환하는 이동통신사 앱이 포함됨. 또한 삽입된 모든 구독을 한곳의 UI에서 관리할 수 있는 LUI 시스템 앱이 포함됨. EuiccService를 제공하는 앱과는 별도의 앱임. 공개 API를 사용하려면 먼저 이동통신사 앱에서 다음과 같이 Context#getSystemService를 통해 EuiccManager의 인스턴스를 가져와야 함.

 

eSIM 작업을 실행하기 전에 기기에서 eSIM을 지원하는지 확인해야 함. android.hardware.telephony.euicc 기능이 정의되어 있고 LPA 패키지가 있다면 EuiccManager#isEnalbed()는 일반적으로 true를 반환함.

 

downloadSubscription() switchToSubscription() 과 같은 많은 API는 완료하는 데 몇 초 또는 몇 분이 걸릴 수 있기 때문에 PendingIntent 콜백을 사용함. PendingIntent LPA에서 EXTRA_SUBSCRIPTION_DETAILED_CODE로 전파되는 임의의 자세한 결과 코드뿐만 아니라 프레임워크에서 정의한 오류 코드를 제공하는 EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_ 공간의 결과 코드와 함께 전송되므로 이동통신사 앱에서 로깅/디버깅 목적으로 추적할 수 있음. 구독 ID가 지정된 구독으로 전환하려면 다음을 참조

 

해결 가능한 오류

시스템에서 eSIM 작업을 완료할 수 없지만 오류가 사용자에 의해 해결될 수 있는 몇 가지 경우가 있음. 예를 들어, 프로필 메타데이터에 이동통신사 확인 코드가 필수라고 표시되어 있으면 downloadSubscription은 실패할 수 있음. 또는 이동통신사 앱에 대상 프로필(이동통신사가 소유한 프로필)에 관한 이동통신사 권한은 있지만 현재 사용 설정된 프로필에 관한 이동통신사 권한은 없는 경우 switchToSubscription이 실패할 수 있으며 이런 이유로 사용자의 동의가 필요함.

 

이러한 상황에서 호출자의 콜백은 EuiccManager#EMBEDDED_SUBSCRIPTION_RESULT_RESOLVABLE_ERROR 와 함께 호출됨. 콜백 Intent는 호출자가 인텐트를 EuiccManager#startResolutionAcitivity에 전달할 때 LUI를 통해 확인을 요청할 수 있도록 내부 추가 항목들을 포함함.

 

이동통신사 권한

EuiccMaanger를 호출하여 기기에 프로필을 다운로드하는 자체 이동통신사 앱을 개발하는 이동통신사라면 메타데이터의 이동통신사 앱에 상응하는 이동통신사 권한 규칙을 프로필에 포함해야 함. 이는 서로 다른 이동통신사에 속한 구독 프로필이 기기의 eUICC에 공존할 수 있고, 각 이동통신사 앱은 이동통신사에서 소유한 프로필에만 액세스할 수 있어야 하기 때문임. 예를 들어 이동통신사 A에서 이동통신사 B가 소유한 프로필을 다운로드하거나 사용 또는 사용 중지할 수 있어서는 안 됨.

 

소유자만 프로필에 액세스할 수 있도록 하기 위해 프로필 소유자 앱에 특별한 권한을 부여하는 메커니즘을 사용함. 안드로이드 플랫폼은 프로필의 액세스 규칙 파일(ARF)에 저장된 인증서를 로드하고 이 인증서에서 서명한 앱에 권한을 부여하여 EuiccManager API를 호출함.

1.    운영자는 이동통신사 앱 APK에 서명하여, apksigned 도구는 APK에 공개키 인증서를 첨부함

2.    운영자/SM-DP+는 다음이 포함된 ARF를 포함하는 프로필과 메타데이터를 준비함.

a.    이동통신사 앱의 공개키 인증서 서명(SHA-1 또는 SHA-256)

b.    이동통신사 앱의 패키지 이름

3.    이동통신사 앱은 EuiccManager API를 통해 eUICC 작업 실행을 시도함

4.    Android 플랫폼은 호출자 앱 인증서의 SHA-1 또는 SHA-256 해시가 대상 프로필의 ARF에서 가져온 인증서 서명과 일치하는지 확인함. 이동통신사 앱의 패키지 이름이 ARF에 포함되어 있다면 이 이름은 호출자 앱의 패키지 이름과도 일치해야 함.

5.    서명 및 패키지 이름이 확인된 후에는 대상 프로필에 대한 이동통신사 권한이 호출자 앱에 부여됨.

프로필 메타데이터는 LPA가 프로필 메타데이터를 프로필이 다운로드되기 전에 SM-DP+에서 가져오거나 프로필이 사용 중지되었을 때 ISD-R에서 가져올 수 있도록 프로필 외부에서도 사용할 수 있기 때문에 프로필과 동일한 이동통신사 권한 규칙을 포함해야 함

 

eUICC OS SM-DP+는 프로필 메타데이터에서 독점 태그 BF76을 지원해야 함. 태그 콘텐츠는 다음과 같이 UICC 이동통신사 권한에 정의된 액세스 규칙 애플릿(ARA)에서 반환한 것과 동일한 이동통신사 권한 규칙이어야 함.

 

LPA 앱 만들기

Android Euicc API를 사용항 udusrufgodi 하는 자체 LPA를 구현할 수 있음.

하드웨어/모뎀 요구사항

eUICC칩의 LPA eSIM OS는 최소 GSMA RSP v2.0 또는 v2.2를 지원해야 함. 또한 RSP 버전이 일치하는 SM-DP+ SM-DS 서버 사용을 계획해야 함. 또한 Android 9eUICC API와 통합하려면 기기 모뎀이 인코딩된 eUICC 기능(로컬 프로필 관리 및 프로필 다운로드)을 지원하는 터미널 기능을 전송해야 함. 모뎀은 유현한 SIM으로 사용 설정된 기본 부팅 프로필로 eSIM을 인식하고 SIM 전원이 켜진 상태를 유지해야 함.

 

EuiccService

LPALPA 백엔드 및 LPA UI(LUI), 이렇게 두 개의 개별 구성요소로 구성되어 있음(동일한 APK에 모두 구현될 수 있음). LPA 백엔드를 구현하려면 EuiccService를 확장하고 매니페스트 파일에 이 서비스를 선언해야 함. 서비스는 시스템만 서비스에 결합할 수 있도록 하기 위해 android.permission.BIND_EUICC_SERVICE 시스템 권한을 요구해야 함. 또한 서비스에는 android.service.euicc.EuiccService 작업이 있는 인텐트 필터가 포함되어 있어야 함.

 

내부적으로 Android 프레임워크는 활성 LPA를 결정하고 필요한 경우 Android eUICC API를 지원하기 위해 해당 LPA와 상호작용함. PackageManager android.service.euicc.EuiccService 작업의 서비스를 지정하는 android.permission.WRITE_EMBEDDED_SUBSCRIPTIONS 권한을 가진 모든 앱에 쿼리됨. 우선순위가 가장 높은 서비스가 선택됨. 서비스가 없으면 LPA 지원이 중지됨.

 

LUI를 구현하려면 다음 작업을 위해 활동을 제공해야 함.

 

EuiccCardManager

EuiccCardManagereSIM칩과 통신하기 위한 인터페이스임. GSMA RSP 사양에 설명된 대로 ES10 함수를 제공하고 ASN.1 파싱과 함께 하위 수준의 APDU 요청/응답 명령어를 처리함. EuiccCardManager는 시스템 API이며 시스템 권한을 가진 앱에서만 호출할 수 있음.

EuiccCardManager를 통한 프로필 작업 API는 호출자가 LPA여야 함. 이는 Android 프레임워크에서 시행함. , 호출자는 EuiccService를 확장하고 매니페스트 파일에 선언되어야 함. EuiccManager와 마찬가지로 EuiccCardManager API를 사용하려면 LPA에서 Context#getSystemService를 통해 EuiccCardManager의 인스턴스를 가져와야 함.

 

내부적으로 EuiccCardManagerAIDL 인터페이스를 통해 EuiccCardController(전화 프로세스에서 실행됨)에 결합하고 각 EuiccCardManager 메서드는 다른 전용 AIDL 인터페이스를 통해 전화 프로세스에서 콜백을 수신함. EuiccCardManager API를 사용할 때 호출자(LPA)Executor 객체를 제공해야 하며 이 객체를 통해 콜백이 호출됨. Executor 객체는 단일 스레드 또는 선택한 스레드 풀에서 실행할 수 있음.

ResultCallback<EuiccProfileInfo[]> callback =
    new ResultCallback<EuiccProfileInfo[]>() {
        @Override
        public void onComplete(int resultCode,
                    EuiccProfileInfo[] result) {
                        if(resultCode == EUiccCardManagerReflector.RESULT_OK){
                            // handle result
                        }
                        else{
                            // handle error
                        }
                    }
    };

대부분의 EuiccCardManager API는 동일한 사용 패턴을 보임. 예를 들어, 결합한 프로필 패키지를 eUICC로 로드하는 방법은

 

이동통신사 앱을 통해 eSIM 프로필 활성화

Android 9 이상을 실행하는 기기에서는 이동통신사 앱을 사용하여 eSIM을 할성화하고 프로필을 다운로드할 수 있음. 이동통신사 앱은 downloadSubscription을 직접 호출하거나 LPA에 활성화 코드를 제공하여 프로필을 다운로드 할 수 있음.

 

이동통신사 앱이 downloadSubscription을 호출하여 프로필을 다운로드할 때 호출은 앱이 프로필의 이동통신사 권한 규칙을 인코딩하는 BF76 메타데이터 태그를 통해 프로필을 관리할 수 있도록 함. 프로필에 BF76태그가 없거나 BF76 태그가 호출하는 이동통신사 앱의 서명과 일치하지 않으면 다운로드가 거부됨.

 

활성화 코드를 사용하여 eSIM 활성화

활성화 코드를 사용하여 eSIM 프로필을 활성화할 때 LPA는 이동통신사 앱에서 활성화 코드를 가져오고 프로필을 다운로드함. 이 흐름은 LPA에 의해 시작될 수 있으며 LPAUI흐름 전체를 제어할 수 있음. , 이동통시나 앱 UI가 표시되지 않음. 이 접근법은 BF76 태그 확인을 우회하므로 네트워크 운영자는 eSIM 프로필 다운로드 및 오류 처리를 포함하여 eSIM 활성화 UI흐름 전체를 구현할 필요가 없음.

 

이동통신사 eUICC 프로비저닝 서비스 정의

LPA 및 이동통신사 앱은 두가지 AIDL 인터페이스, IcarrierEuiccProvisiongService IgetActivationCodeCallback을 통해 통신함. 이동통신사 앱은 IcarrierEuiccProvisioningSErvice 인터페이스를 구현하여 매니페스트 선언에 노출해야 함. LPAIcarrierEuiccProvisingService에 결합하고 IgetAictivationCodeCallback을 구현해야 함.

 

AIDL 인터페이스를 정의하려면 LPA와 이동통신사 앱 모두를 대상으로 다음 AIDL 파일을 만들어야 함.

 

LPA 구현 예

이동통신사 앱의 IcarrierEuiccProvisioningService 구현에 결합하려면 LPAIcarrierEuiccProvisingService.aidl IgetActivationCodeCallback.aidl 을 모두 프로젝트에 복사하고 ServiceConnection을 구현해야 함.

@Override
public void onServiceConnected(ComponentName componenentName, IBinder iBinder){
    mCarrierProvisiongService = ICarrierEuiccProvisioningSErvice.Stub.asInterface(iBinder);
}

 

이동통신사 앱 구현 예

 

LPA 활성화 흐름에서 이동통신사 앱 UI 시작

Android 11 이상을 실행하는 기기에서는 LPA가 이동통신사 앱의 UI를 시작할 수 있음. 다음은 LPA에서 이동통신사 앱 UI를 시작하는 프로세스입니다.

1. LPAandroid.service.euicc.action.START_CARRIER_ACTIVATION 인텐트를 작업이 포함된 이동통신사 앱 패키지로 전송하여 이동통신사 앱의 활성화 흐름을 시작합니다. (LPA 이외의 앱에서 인텐트를 수신하지 않도록 하려면 이동통신사 앱 수신기가 android:permission=”android.permission.WRITE_EMBEDDED_SUBSCRIPTION” 로 매니페스트 선언에서 보호되어야 함.

2. 이동통신사 앱은 자체 UI를 사용하여 작업을 실행합니다. 예를 들어 사용자 로그인 또는 이동통신사의 백엔드로 HTTP 요청 전송을 실행함.

3. 이동통신사 앱은 setResult(int, Intent) finish()를 호출하여 LPA에 응답함

   a. 이동통신사 앱이 RESULT_OK로 응답하면 LPA는 활성화 흐름을 계속함. 이동통신사 앱은 LPA를 통해 이동통신사 앱의 서비스를 결합하는 대신 사용자가 QR 코드를 스캔해야 한다고 판단하면 RESULT_OK와 함께 setResult(int, Intent)를 사용하고 true로 설정된 부울 추가 항목 android.telephony.euicc.extra.USE_QR_SCANNER가 파함된 Intent 인스턴트를 사용하여 LPA에 응답함.

   b. 이동통신사 앱이 비정상 종료되거나 RESULT_CANCELED로 응답하면 LPAeSIM 활성화 흐름을 취소함

   c. 이동통신사 앱이 RESULT_OK 또는 RESULT_CANCLED 이외의 다른 코드로 응답하면 LPA는 이를 오류로 처리함.

 

이동통신사 앱에서 LPA 활성화 흐름 시작

Andorid 11부터 이동통신사 앱이 eUICC API를 사용하여 eSIM 활성화를 위한 LUI를 시작할 수 있음. 이 메서드는 LPAeSIM 활성화 흐름 UI를 표시히여 eSIM 프로필을 활성화함. 그러면 LPAeSIM 프로필 활성화가 완료될 때 브로드캐스트를 전송함.

1. LPAandroid.service.euicc.action.START_EUICC_ACTIVATION 작업과 함께 인텐트 필터가 포함된 활동을 선언해야 함. 기기에 여러 구현이 있다면 인텐트 필터의 우선순위를 0이 아닌 값으로 설정해야 함.

2. 이동통신사 앱은 자체 UI를 사용하여 실행함. 예를 들어 사용자 로그인 또는 이동통신사의 백엔드로 HTTP 요청 전송을 실행함.

3. 이 시점에서 이동통신사 앱은 IcarrierEuiccProvisioningService 구현을 통해 활성화 코드를 제공할 준비가 되어 있어야 함. 이동통신사 앱은 android.telephony.euicc.action.START_EUICC_ACTIVATION 작업과 함께 startActivityForResult(Intent, int)를 호출하여 LPA를 시작함. 또한 LPA는 부울 추가항목 android.telephony.euicc.extra.USE_QR_SCANNER를 확인함. 값이 true이면 LPAQR 스캐너를 시작하여 사용자가 프로필 QR코드를 스캔할 수 있도록 함.

4. LPA측에서 LPA는 이동통신사 앱의 IcarrierEuiccProvisioningService 구현에 결합하여 활성화 코드를 가져오고 해당 프로필을 다운로드함. LPA는 로드 화면과 같이 다운로드 과정에서 필요한 모든 UI 요소를 표시함.

5. LPA 활성화 흐름이 완료되면 LPA는 이동통신사 앱이 onActivityResult(init, int, Intent)에서 처리하는 결과 코드로 이동통신사 앱에 응답함.

   a. LPA는 새 eSIM 프로필을 성공적으로 다운로드하면 RESULT_OK로 응답함

   b. 사용자가 LPA에서 eSIM 프로필 활성화를 취소하면 LPARESULT_CANCELED로 응답함

   c. LPARESULT_OK 또는 RESULT_CANCELED 이외의 다른 코드로 응답하면 이동통신사 앱은 이를 오류로 처리함

'Android' 카테고리의 다른 글

adb 사용 예  (0) 2021.07.09
eSIM 구현  (0) 2021.06.25
android-developer-phone-sms-course.pdf  (0) 2021.06.24
SL4A(Scripting Layer for Android) (2)  (0) 2021.06.23
SL4A(Scripting Layer for Android) (1)  (0) 2021.06.23

댓글