ABOUT ME

-

  • UDS 진단 통신으로 하는 소프트웨어 업데이트 2 - 보안 접속
    diagnostic 2025. 2. 26. 16:19

    보안 접속(Security Access)

    • 시드 & 키 보안 접속으로 설명한다. 아래 순서대로 동작한다.

    시드 & 키 보안 접속 절차

     

     

    시드 요청 (Request Seed)

    • Diagnostic 창의 왼쪽에 UDS 표준의 서비스들이 나열된 트리 영역에서 SecurityAccess 항목을 선택하고 마우스 우클릭하여 Add New Service를 선택한다. 그리고 아래 그림과 같이 Request Seed를 입력한다.
    • SecurityAccess의 서비스 아이디는 0x27이다. 
    • SecurityAccessType은 입력 칸의 오른쪽 끝 '...' 버튼을 클릭하여 Select Sub Function ID 창을 열고 0x01 RequestSeed를 선택한다. RequestSeed와 SendKey는 둘이 한 쌍을 이룬다. 0x01로 시드를 요청한 경우, 0x02로 키를 전송한다. 0x03인 경우는 0x04로.  

    Request Seed를 정의한다.
    SecurityAccessType 칸에서 '...' 버튼을 클릭하여 열린 Select Sub Function ID 창에서 0x01 RequestSeed를 선택한다.

     

    • 시드 요청에 대해 UDS Simulator의 실제 답은 아래 그림과 같다. 서비스에 대한 정의는 Basic Diagnostic Config 탭에서 했다. 서비스 실행은 Diagnostic Console 탭에서 한다. 해당 서비스를 더블 클릭하면 정의된 메시지가 전송된다. UDS Simulator가 "67 01 E8 BC CD 9A"라고 응답하였다. 0x67은 요청 0x27 + 0x40이다. 즉, 0x27 요청의 긍정 응답 표시이다. 0x01은 요청의 파라미터이다. 0x01에 해당하는 시드 요청이다. " E8 BC CD 9A"는 시드이다.   

    Diagnostic Console에서 시드 요청을 실행하고 응답을 받았다.

     

     

    UDS Simulator

    • UDS 통신을 실습하기 위해 상대 제어기가 필요하다. 나는 상대 제어기로 토선의 UDS Simulator 프로그램을 사용한다. 아래와 같이 생겼다. 

    UDS Simulator

    • TSMaster와 UDS Simulator는 TC1013 하드웨어의 한 채널씩을 사용한다. 두 채널을 점퍼 케이블을 이용해서 연결하였다. 

    TC1013의 두 개 채널 중 하나를 TSMaster 다른 하나를 UDS Simulator에 할당하고, 점퍼 케이블로 두 채널을 연결하였다.

    •  하드웨어 설정은 아래와 같이 한다. TSMaster와 UDS Simulator의 채널을 모두 1개로 한다. TSMaster에는 TC1013의 1번 채널을 할당한다. USD Simulator에는 2번 채널을 할당한다. 이렇게 하였더니 별개의 두 프로그램이 한 개의 하드웨어를 함께 사용할 수 있다.

    TSMaster와 UDS Simulator의 하드웨어 설정 화면에서 채널 카운트를 1로 하고, 각각 TC1013의 한 채널씩을 할당하였다.

     

    • 양쪽의 CAN 설정을 동일하게 하였다. 

    TSMaster와 UDS Simulator의 CAN 파라미터들을 동일하게 설정하였다. (당연하고 중요하다.)

     

    • Diagnostic 창에 Protocol (ISO TP) 탭에 Request Id, Response Id. UDS Simulator에도 동일한 설정이 있다. TSMaster의 Request Id와 UDS의 Response Id를 동일하게 설정하였다.
    • TSMaster와 UDS Simulator에 FD Max DLC 설정이 있다. (UDS Simulator의 이름은 Max Length 이다.) 둘을 동일하게 설정하였다.    

    TSMaster의 Request ID는 UDS Simulator의 Response ID로 설정하였다. Max Data Length도 동일하게 설정하였다. (당연하고 중요하다)

     

     

    키 생성

    • UDS Simulator에서 받은 시드에서 키를 생성해야 한다. (물론, 키를 생성하는 알고리즘은 사전에 공유되어야 한다.)
    • 알고리즘을  미리 dll이나 미니프로그램으로 만들어두고, 이를 이용하여 시드에서 키를 계산할 수 있다. 
    • Diagnostic 창의 Protocol (ISO TP) 탭을 열면, 왼쪽 탐색 창에서 Diagnostic Layer를 선택한다. SeedKey 설정에서 dll이나 미니프로그램(Security Code)을 선택한다.   

    SeedKey 설정에서 시드에서 키를 계산하는 dll이나 미니프로그램을 선택할 수 있다.

     

    • 미니프로그램을 선택한 후 "C" 버튼을 클릭하여 코드 창을 열고, 알고리즘을 코딩할 수 있다.
    • 예제의 경우, SecurityAccessType이 0x01인 경우, 시드의 각 바이트에 8을 더하여 키의 각 바이트를 만든다.
    • case 문을 이용하여, SecurityAccessType 별로 알고리즘을 코딩할 수 있다. 코드를 수정한 후 창을 닫으면 자동으로 컴파일 된다. 

    미니프로그램에 시드에서 키를 계산하는 알고리즘을 코딩한다. 예제의 경우 시드의 각 바이트에 8을 더해서 키의 각 바이트를 만든다.

     

    • 미니프로그램은 몇 가지 인터페이스를 지원한다. 시드 & 키 알고리즘 코딩 창의 맨 윗줄에서 드롭-다운 리스트를 클릭하면 지원되는 인터페이스들을 확인할 수 있다. 아래 그림에서 하이라이트되어 있는 인터페이스가 흔하게 사용된다.  

    시드 & 키 알고리즘을 코딩 창 맨 위 드롭-다운 리스트를 클릭하여 인터페이스를 선택할 수 있다.

     

    • "SeedKey Dll"의 경우 한 가지 인터페이스만 지원한다. 위 그림에 하이라이트된 인터페이스이다. C++ 인터페이스는 아래와 같다. 
    /// @fn   DllMain ... Windows DLL entrance point
    //*****************************************************************************
    KEYGEN_API GenerateKeyEx(
    	const unsigned char* ipSeedArray,              /* Array for the seed [in] */
    	unsigned int iSeedArraySize,                   /* Length of the array for the seed [in] */
    	const unsigned int iSecurityLevel,             /* Security level [in] */
    	const char* ipVariant,                         /* Name of the active variant [in] */
    	unsigned char* iopKeyArray,                    /* Array for the key [in, out] */
    	unsigned int iMaxKeyArraySize,                 /* Maximum length of the array for the key [in] */
    	unsigned int& oActualKeyArraySize)             /* Length of the key [out] */
    • SeedKey Dll을 코딩하기 위한 C++와 C# 템플릿은 TSMaster 설치 디렉토리 아래에서 찾을 수 있다. 기본 경로에 설치했다면 아래 경로에서 찾을 수 있다. 
    C:\Program Files (x86)\TOSUN\TSMaster\Data\Components\Diagnostics\GenerateKeyEx

    시드 & 키 dll 를 직접 작성할 경우, 위 그림의 경로에서 코드 템플릿을 찾을 수 있다.

    • "C" 버튼 왼쪽에 사칙연산 기호 버튼을 클릭하여 시드 & 키 계산기를 열 수 있다. 시드를 입력한 후 GenKey 버튼을 클릭하면 키가 생성된다. 

    시드와 키를 계산해볼 수 있다.

     

    키 전송 (Send Key)

    • SecurityAccess 서비스에서 마우스 우클릭하여 "Add New Service" 메뉴를 선택하여 "Send Key" 서비스를 아래 그림과 같이 정의한다. Security AccessType의 오른쪽 '...' 버튼을 클릭하여 0x02 SendKey를 선택한다. (0x01 RequestSeed의 짝이다.)  Generate Key Automatically를 체크해 둔다. 

    SecurityAccess에서 마우스 우클릭으로 Add New Service를 하여 Send Key를 정의한다.

     

    SecurityAccessType 입력창 오른쪽 끝에 있는 '...' 버튼을 클릭하여 0x02 SendKey를 선택한다.

     

    • Diagnostic Console 창의 왼쪽 서비스 트리창에서 Send Key 서비스를 더블 클릭하여 키를 전송한다. 미니프로그램으로 자동 계산한 키가 전송된다. 그리고 UDS Simulator에서 긍정 응답을 받는다. 

    Send Key를 실행하면 미니프로그램으로 자동 계산된 키가 전송된다.

     

    • 서비스를 선택한 후 창의 오른쪽 상단에 있는 "Execute" 버튼을 클릭해도 된다. 서비스를 선택한 후 마우스 우클릭으로 팝-업 메뉴를 띄워 "Execute" 메뉴를 실행해도 된다.   

     

    다음 블로그에서 소프트웨어를 전송하는 과정에 관해 설명한다. UDS 진단 통신으로 하는 소프트웨어 업데이트 3 - 소프트웨어 전송 :: hsl's tsmaster 사용기