10 HIP 세부정보4 패킷 처리1

junpkim·2024년 5월 14일
0

Host Identity Protocol

목록 보기
11/11

각 호스트는 자신의 모든 HIP 연결을 관리하는 단일 HIP 구현을 갖습니다.
호스트는 동시에 둘 이상의 호스트와 동시에 HIP 연결을 유지할 수 있습니다.
동일한 호스트 간에도 서로 다른 HIT로 여러 개의 HIP 연결을 가질 수 있습니다.
두 HIT 쌍 간에 둘 이상의 HIP 연결을 가질 수는 없습니다. 두 호스트가 동시에 둘 이상의 연결을 유지하려면, 최소한 한 쪽에서 다른 HIT를 사용해야 합니다.
각 패킷의 발신 HIT를 기반으로 HIP 연결 여부를 판단합니다.

발신 애플리케이션 데이터 처리

HIP에서는 애플리케이션이 API를 통해 지정된 식별자를 사용하여 데이터를 전송합니다.
이 식별자는 HIT나 IP 주소일 수 있습니다.

알고리즘

  • 지정된 소스 주소가 있으면 반드시 HIT여야 하며, HIT가 아니라면 교체하거나 폐기해야 합니다.
  • 지정되지 않은 소스 주소가 있는 경우, 적절한 HIT를 선택해야 합니다.
  • 주어진 HIT 쌍에 대한 활성 HIP 연결이 없으면 BEX를 실행해 연결을 생성해야 합니다 (MUST).
  • BEX가 완료되기를 기다리는 동안 최소한 하나의 데이터그램을 큐에 넣어 대기시켜야 합니다.
  • 활성 연결이 생성된 후 데이터그램은 전송 처리되며, 적절한 전송 형식이 적용됩니다.
  • 패킷을 전송하기 전에 데이터그램의 HIT가 적절한 IP 주소로 대체되어야 합니다.

수신 애플리케이션 데이터 처리

  • 수신된 데이터그램은 패킷의 정보(ex. ESP의 SPI 값)를 사용하여 기존의 HIP 연결과 매핑됩니다.
  • 특정 전송 형식은 패킷을 복호화하여 일반 IP 패킷처럼 보이도록 처리합니다.
    이 단계에서 해당 패킷이 실제로 원격 HIP에서 전송된 것인지 확인해야 합니다.
    (ex. ESP 전송 형식을 사용할 경우 SPI 값과 연관된 SA(Security Association)로부터 암호화 키를 찾고 이를 사용해 패킷을 복호화합니다.
  • 데이터그램의 IP 주소를 HIP 연결과 연관된 HIT로 교체합니다.
  • 데이터그램은 상위 계층(ex. TCP, UDP 등)으로 전달됩니다.
  • 데이터그램을 역다중화할 때, HIT를 기준으로 적절한 상위 계층 소켓이 선택됩니다.

퍼즐 해결

개시자가 I2 패킷을 생성하기 위해 R1 패킷에서 받은 퍼즐을 해결해나가는 과정을 설명합니다.
R1 패킷에서 #I와 #K 값이 전송됩니다.
I2 패킷에서는 #I와 #J 값이 전송됩니다.
RHASH를 #I, 개시자의 HIT, 응답자의 HIT, #J를 순서대로 연결해 해시를 생성합니다.
생성된 해시의 #K 비트가 모두 0이 되어야 합니다.
퍼즐 #I에 대한 유효한 솔루션 #J는 여러 개 있을 수 있습니다.

응답자가 R1 패킷을 미리 계산하도록 선택한다고 가정하고 처리 단계에 대해 설명합니다.

  1. 응답자의 사전 계산
  • 퍼즐 난이도 #K를 설정합니다.
  • 서명된 R1 패킷을 생성하고 이를 캐시합니다.
  1. 응답자의 응답
  • 적절한 R1 패킷을 캐시에서 선택합니다.
  • 랜덤 숫자 #I를 생성합니다.
  • #I와 #K를 포함한 R1 패킷을 전송합니다.
  • #I와 #K를 일정 시간 동안 저장합니다.
  1. 개시자의 퍼즐 해결
  • 맞는 #J를 찾을 때까지 퍼즐을 해결하려는 시도를 반복합니다.
    V := Ltrunc( RHASH( #I | 개시자 HIT | 응답자 HIT | #J ), #K )
    V == 0이면 허용하고, V != 0이면 거부합니다.
  1. 응답자의 검증
  • 수신된 #I가 저장된 것인지 확인합니다.
  • #I에 기반해 적절한 #K를 찾습니다.
  • 다음과 같이 계산합니다.
    V := Ltrunc(RHASH(#I | 개시자 HIT | 응답자 HIT | #J), #K)
    V == 0이면 허용하고, V != 0이면 거부합니다.

HIP_MAC 및 SIGNATURE 계산 및 확인

다음 하위 섹션에서는 HIP_MAC, HIP_MAC_2, HIP_SIGNATURE 및 HIP_SIGNATURE_2 매개변수를 처리하는 동작을 정의합니다.
HIP_MAC_2 매개변수는 R2 패킷에, HIP_SIGNATURE_2 매개변수는 R1 패킷에 포함되어 있으며, HIP_SIGNATURE 및 HIP_MAC 매개변수는 다른 HIP 패킷에 포함되어 있습니다.

HMAC 계산

HMAC은 해시 함수로 RHASH를 사용하며, RHASH 유형은 응답자의 HIT Suite에 따라 달라집니다. (ex. RSA/DSA/SHA-256은 HMAC-SHA-256, ECDSA/SHA-384는 HMAC-SHA-384에 사용됩니다).
HIP_MAC_2 패킷을 처리할 때는 R1 패킷에서 전송된 HOST_ID 필드가 계산에 포함됩니다.

HMAC 계산 규칙

HIP_MAC 게산 규칙

범위: { HIP header | < Parameters > }
HIP 헤더에서 헤더 길이 필드 값은 HIP_MAC 매개변수의 시작 부분으로 계산됩니다.

HIP_MAC_2 계산 규칙

범위: { HIP header | < Parameters > | HOST_ID }
매개변수는 HIP_MAC의 타입 값보다 작은 타입 값을 가진 매개변수만 포함합니다.
HOST_ID 매개변수는 응답자로부터 R1 패킷으로 받은 형식과 일치합니다.
HIP 헤더에서 헤더 길이 필드 값은 HIP_MAC_2 매개변수의 시작 부분으로 계산되고 연결된 HOST_ID 매개변수 길이(Type 및 길이 필드 포함)만큼 증가합니다.

HIP_MAC, HIP_MAC_2 공통 사항

매개변수는 HIP_MAC의 타입 값보다 작은 타입 값을 가진 매개변수만 포함합니다.
HIP 헤더에서 체크섬 필드는 0으로 설정됩니다.

발신자측 계산 과정

  1. HIP 패킷 생성: HIP_MAC 매개변수보다 큰 타입 값의 매개변수는 제외합니다.
  2. HOST_ID 추가 (HIP_MAC_2의 경우): 응답자의 HOST_ID를 추가합니다.
  3. 헤더 길이 계산: HOST_ID를 포함해 헤더 길이를 계산합니다.
  4. HMAC 계산: KEYMAT에서 가져온 무결성 키를 사용하여 HMAC을 계산합니다.
  5. HOST_ID 제거 (HIP_MAC_2의 경우): HOST_ID 매개변수를 제거합니다.
  6. HIP_MAC 추가: 패킷에 HIP_MAC 매개변수를 추가하고, 다른 매개변수(HIP_MAC보다 큰 타입 값의 매개변수)들을 추가합니다.
  7. HIP 헤더 길이 재계산

수신자측 계산 과정

  1. 헤더 길이 검증: HIP 헤더 길이를 검증합니다.
  2. HIP_MAC 제거: HIP_MAC 매개변수 및 그 이후의 매개변수를 제거합니다.
  3. HOST_ID 추가 (HIP_MAC_2의 경우): 응답자의 HOST_ID를 추가합니다.
  4. 헤더 길이 및 체크섬 계산: 헤더 길이와 체크섬을 재계산합니다.
  5. HMAC 계산 및 검증: KEYMAT에서 가져온 무결성 키로 계산하고, 수신된 HMAC과 비교.
  6. 헤더 필드 재설정: 체크섬과 헤더 길이를 원래 값으로 복원합니다.
  7. HOST_ID 제거 (HIP_MAC_2의 경우)

SIGNATURE 계산

다음 하위 섹션은 HIP_SIGNATURE 및 HIP_SIGNATURE_2 매개변수 모두에 적용됩니다. HIP_SIGNATURE_2 매개변수를 처리할 때 유일한 차이점은 서명을 계산하기 전에 HIP_SIGNATURE 매개변수 대신 HIP_SIGNATURE_2 매개변수가 사용되고 개시자의 HIT 및 PUZZLE 불투명, #I 필드가 지워진다는 것(모두 0으로 설정됨)입니다.

계산 범위

{ HIP header | < Paramaters > }
매개변수의 타입 값보다 작은 매개변수들만 포함합니다.
HIP_SIGNATURE_2의 경우 개시자의 HIT와 PUZZLE 필드를 초기화합니다.
HIP 헤더의 체크섬 필드를 초기화합니다.
헤더 Length 필드는 HIP_SIGNAUTRE 매개변수까지 계산합니다.

발신자측 계산 과정

  1. HIP_SIGNAUTRE 매개변수가 없는 HIP 패킷을 생성합니다.
  2. 헤더 필드 값을 계산하고, 체크섬 필드를 0으로 설정합니다.
  3. HIP_SIGNATURE_2의 경우 HIP 헤더의 개시자 HIT 필드와 퍼즐 매개변수의 불투명 및 #I 필드를 0으로 초기화합니다.
  4. 공개 키에 상응하는 개인 키로 서명을 생성합니다.
  5. 패킷에 HIP_SIGNATURE 매개변수를 추가합니다.
  6. HIP_SIGNATURE 매개변수 뒤에 오는 매개변수를 추가합니다.
  7. HIP 헤더의 길이와 체크섬을 재계산합니다.

수신자측 계산 과정

  1. HIP 헤더 길이와 체크섬을 확인합니다.
  2. HIP_SIGNATURE 매개변수의 내용과 뒤에 오는 다른 모든 매개변수를 저장하고 패킷에서 제거합니다.
  3. 헤더 길이를 다시 계산하고 체크섬 필드를 0으로 초기화합니다.
  4. HIP_SIGNAUTRE_2의 경우, HIP 헤더의 개시자 HIT 필드와 퍼즐 매개변수의 불투명 및 #I 필드를 0으로 초기화합니다.
  5. 제거된 매개변수를 추가하고, 0으로 설정된 값을 재설정하여 원래 패킷을 복원합니다.

HIP KEYMAT 생성

HIP KEYMAT는 BEX 중에 생성된 D-H 세션 키인 Kij에서 파생됩니다.
개시자는 I2 패킷을 생성하는 동안 Kij를 가지고 있고, 응답자는 I2를 수신한 후 Kij를 가지고 있습니다.

Kij를 D-H 그룹 ID에 정의된 키 유도 함수에 입력하여 KEYMAT을 파생시킵니다. 현재 문서에서 정의된 유일한 키 유도 함수는 RHASH 해시 함수를 사용하는 해시 기반 키 파생 함수(HKDF, RFC 5869)입니다.

HKDF를 이용한 KEYMAT 유도

info = sort(HIT-I | HIT-R)
salt = #I | #J

HIT-I와 HIT-R의 정렬은 두 HIT를 네트워크 바이트 순서로 연결하며, 숫자가 작은 HIT가 큰 HIT보다 앞에 오게 됩니다.

초기 키 추출 춘서

  • HOST_g(더 큰 HIT 값을 가진 호스트)를 위한 HIP-gl 암호화 키
  • HOST-g를 위한 HIP-gl 무결성(HMAC) 키
  • HOST-l(더 작은 HIT 값을 가진 호스트)를 위한 HIP-lg 암호화 키
  • HOST_l을 위한 HIP-lg 무결성(HMAC) 키

키 크기

AES: 128 or 256 bits
SHA-1: 160 bits
SHA-256: 256 bits
SHA-384: 384 bits
NULL: 0 bits
다른 키 크기를 사용하는 경우에는 다른 암호화 알고르짐으로 취급하여 별도로 정의해야 합니다 (MUST).

0개의 댓글