RFC 9052 COSE 구조 2022년 8월
Schaad 표준 트랙 [페이지]
스트림:
인터넷 엔지니어링 태스크 포스(IETF)
RFC:
9052
STD:
96
폐기 대상:
8152
범주:
표준 트랙
게시:
ISSN:
2070-1721
저자:
J. Schaad
August Cellars

RFC 9052

CBOR 객체 서명 및 암호화(COSE): 구조 및 처리

초록

간결한 이진 객체 표현(Concise Binary Object Representation, CBOR)은 작은 코드 크기와 작은 메시지 크기를 위해 설계된 데이터 형식입니다. 이 데이터 형식에 대한 기본 보안 서비스를 정의할 수 있어야 할 필요가 있습니다. 이 문서는 CBOR 객체 서명 및 암호화(COSE) 프로토콜을 정의합니다. 이 명세는 직렬화에 CBOR을 사용하여 서명, 메시지 인증 코드 및 암호화를 생성하고 처리하는 방법을 설명합니다. 또한 이 명세는 CBOR을 사용하여 암호학적 키를 표현하는 방법을 설명합니다.

이 문서는 RFC 9053과 함께 RFC 8152를 폐기합니다.

이 메모의 상태

이것은 인터넷 표준 트랙 문서입니다.

이 문서는 인터넷 엔지니어링 태스크 포스(IETF)의 산출물입니다. 이 문서는 IETF 커뮤니티의 합의를 나타냅니다. 공개 검토를 받았으며 인터넷 엔지니어링 운영 그룹(IESG)에 의해 게시 승인을 받았습니다. 인터넷 표준에 대한 추가 정보는 RFC 7841의 섹션 2에서 확인할 수 있습니다.

이 문서의 현재 상태, 모든 정오표 및 이에 대한 피드백 제공 방법에 관한 정보는 https://www.rfc-editor.org/info/rfc9052에서 확인할 수 있습니다.

목차

1. 소개

사물 인터넷(IoT)을 구성하는 작고 제약이 있는 장치에 대한 관심이 높아져 왔습니다. 이 과정에서 나온 표준 중 하나가 "간결한 이진 객체 표현(Concise Binary Object Representation, CBOR)" [STD94]입니다. CBOR은 무엇보다도 이진 데이터를 허용함으로써 JavaScript Object Notation(JSON) [STD90]의 데이터 모델을 확장했습니다. CBOR은 IoT 세계를 다루는 여러 IETF 작업 그룹에서 데이터 구조를 인코딩하는 방법으로 채택되었습니다. CBOR은 전송되는 메시지와 구현 크기 모두에서 작고, 스키마 없는 디코더를 갖도록 특별히 설계되었습니다. IoT에 메시지 보안 서비스를 제공할 필요가 있으며, 메시지 인코딩 형식으로 CBOR을 사용하는 것은 타당합니다.

JOSE 작업 그룹은 JSON을 사용하여 암호화, 서명 및 메시지 인증 코드(MAC) 작업을 처리하는 방법과 키를 인코딩하는 방법을 명시한 일련의 문서 [RFC7515] [RFC7516] [RFC7517] [RFC7518]를 작성했습니다. 이 문서는 CBOR 인코딩 형식에 대해 같은 일을 수행하는 CBOR 객체 서명 및 암호화(COSE) 표준을 정의합니다. 이 문서는 초기 알고리즘 집합을 제공하는 [RFC9053]과 함께 구성됩니다. 원래의 JSON 객체 서명 및 암호화(JOSE) 문서의 느낌을 유지하려는 강한 시도가 있지만, 다음 두 가지 고려사항이 반영됩니다:

이 문서는 다음을 포함합니다:

이 문서는 특정 암호학적 알고리즘을 사용하는 규칙과 절차를 포함하지 않습니다. 특정 알고리즘에 대한 세부사항은 [RFC9053][RFC8230]에서 찾을 수 있습니다. 추가 알고리즘에 대한 세부사항은 향후 문서에서 정의될 것으로 예상됩니다.

COSE는 처음에 제약된 RESTful 환경(CoRE)에 보안을 제공하기 위한 솔루션의 일부로 설계되었으며, 이는 [RFC8613][CORE-GROUPCOMM]을 사용하여 수행됩니다. 그러나 COSE는 이러한 경우에만 제한되지 않으며, 보안 서비스를 제공하기 위해 JOSE 또는 암호 메시지 구문(CMS) [RFC5652]를 고려할 수 있는 어떤 곳에서도 사용할 수 있습니다. JOSE 및 CMS와 마찬가지로 COSE는 저장 후 전달 또는 오프라인 프로토콜에서만 사용됩니다. 암호화가 필요한 온라인 프로토콜에서 COSE를 사용하려면 객체를 주고받기 전에 온라인 키 설정 프로세스가 수행되어야 합니다. 보안 서비스에 COSE를 사용하는 모든 애플리케이션은 먼저 필요한 보안 서비스를 결정한 다음, 그 요구에 따라 적절한 COSE 구조와 암호학적 알고리즘을 선택해야 합니다. 섹션 10은 COSE를 사용할 때 애플리케이션이 명시해야 하는 사항에 대한 추가 정보를 제공합니다.

CMS에는 있지만 이 표준에는 없는 한 가지 기능은 다이제스트 구조입니다. 이러한 생략은 의도적인 것입니다. 서로 다른 프로토콜은 구조의 일부로 서로 다른 필드 집합을 포함하려 하므로, 해당 구조는 각 프로토콜에서 정의되는 것이 더 좋습니다. 알고리즘 식별자와 다이제스트 값은 모든 애플리케이션에 공통적이지만, 알고리즘이 여러 값과 함께 한 번만 정의될 수 있으므로 두 값이 항상 인접해 있지는 않을 수 있습니다. 애플리케이션은 구조의 일부로 추가 데이터 필드를 정의하고자 할 수도 있습니다. 그러한 애플리케이션별 요소 중 하나는 해시되는 데이터를 얻을 수 있는 URI 또는 기타 포인터를 포함하는 것입니다. [RFC9054]는 그러한 가능한 구조 하나를 포함하며 다이제스트 알고리즘 집합을 정의합니다.

COSE를 인터넷 표준으로 발전시키는 과정에서, COSE_Sign1 구조에 대한 카운터서명의 보안 속성 설명이 올바르지 않다는 점이 발견되었습니다. 설명되어 있던 보안 속성 -- 진정한 카운터서명의 속성 -- 이 작업 그룹이 원하던 것이었기 때문에, 이 문서에서 모든 카운터서명 관련 텍스트를 제거하고 새 문서 [COSE-COUNTERSIGN]를 만들어 이전 카운터서명 알고리즘 및 헤더 매개변수를 폐기하고, 원하는 보안 속성을 갖는 새 알고리즘 및 헤더 매개변수를 정의하기로 결정했습니다.

1.1. 요구사항 용어

이 문서의 핵심 단어 "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY" 및 "OPTIONAL"은 여기에 표시된 것처럼 모두 대문자로 나타나는 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석됩니다.

1.2. RFC 8152와의 변경 사항

  • 원래 문서를 이 문서와 [RFC9053]으로 분할했습니다.
  • COSE에서 정의한 다이제스트 구조가 없는 이유를 설명하는 텍스트를 추가했습니다.
  • 텍스트 설명과 용어를 명확히 하고 변경했습니다.
  • 카운터서명과 관련된 모든 세부사항을 제거하고 [COSE-COUNTERSIGN]에 배치했습니다.

1.3. JOSE와의 설계 변경 사항

  • 암호화, 서명 및 MAC 적용 메시지를 쉽게 식별하고 일관된 관점을 유지할 수 있도록 단일한 전체 메시지 구조가 정의되었습니다.
  • 서명된 메시지는 콘텐츠와 관련된 보호 및 비보호 헤더 매개변수와, 서명과 관련된 보호 및 비보호 헤더 매개변수를 구분합니다.
  • MAC 적용 메시지는 서명된 메시지와 분리됩니다.
  • MAC 적용 메시지는 MAC 인증 키를 얻기 위해 엔벨로프 메시지와 동일한 수신자 알고리즘 집합을 사용할 수 있습니다.
  • 이진 데이터를 인코딩하기 위해 base64url 인코딩이 아니라 이진 인코딩이 사용됩니다.
  • 암호화 알고리즘의 인증 태그가 암호문과 결합되었습니다.
  • 암호학적 알고리즘 집합은 일부 방향으로는 확장되고 다른 방향으로는 축소되었습니다.

1.4. CBOR 데이터 구조를 위한 CDDL 문법

COSE가 처음 작성되었을 때 간결한 데이터 정의 언어(Concise Data Definition Language, CDDL) [RFC8610]는 아직 RFC로 게시되지 않았으므로 COSE가 사용하는 CBOR 데이터 구조를 규범적으로 설명하는 데이터 설명 언어로 사용할 수 없었습니다. 이러한 이유로 여기에서 정의된 CBOR 데이터 객체는 산문으로 설명됩니다. COSE 데이터 객체에 대한 추가적인 비규범 설명은 아래에 설명된 CDDL의 부분집합으로 제공됩니다.

이 문서는 먼저 문법을 작업한 다음 그에 맞는 산문을 개발하는 방식으로 작성되었습니다. 그 결과물로서, 산문은 간결한 데이터 정의 언어(CDDL) [RFC8610]가 정의한 원시 타입 문자열을 사용하여 작성되었습니다. 이 명세에서는 다음 원시 타입이 사용됩니다:

any:
모든 CBOR 값을 여기에 배치할 수 있게 하는 비특정 값입니다.
bool:
불리언 값입니다(true: 주 타입 7, 값 21; false: 주 타입 7, 값 20).
bstr:
바이트 문자열(주 타입 2)입니다.
int:
부호 없는 정수 또는 음의 정수입니다.
nil:
null 값입니다(주 타입 7, 값 22).
nint:
음의 정수(주 타입 1)입니다.
tstr:
UTF-8 텍스트 문자열(주 타입 3)입니다.
uint:
부호 없는 정수(주 타입 0)입니다.

이 문서에는 CDDL의 세 가지 구문이 약식 표기로 나타납니다. 이들은 다음과 같습니다:

FOO / BAR:
FOO 또는 BAR 중 하나가 여기에 나타날 수 있음을 나타냅니다.
[+ FOO]:
타입 FOO가 배열에서 한 번 이상 나타남을 나타냅니다.
* FOO:
타입 FOO가 0번 이상 나타남을 나타냅니다.

CDDL이 정의한 제약 두 가지도 이 문서에서 사용됩니다. 이들은 다음과 같습니다:

type1 .cbor type2:
일반적으로 bstr인 type1의 내용이 type2의 값을 포함함을 나타냅니다.
type1 .size integer:
type1의 내용이 integer 바이트 길이임을 나타냅니다.

산문 설명과 함께, CBOR 데이터 구조에 대한 문법이 앞서 설명한 CDDL의 부분집합으로 제시됩니다. CDDL 문법은 정보성이고, 산문 설명은 규범적입니다.

수집된 CDDL은 아래 XPath 표현식을 통해 이 문서의 XML 버전에서 추출할 수 있습니다. (사용하는 XPath 평가기에 따라 >를 엔터티로 처리해야 할 수도 있습니다.)

//sourcecode[@type='cddl']/text()

CDDL은 초기 비단말 기호가 파일의 첫 번째 기호일 것을 기대합니다. 이러한 이유로 CDDL의 첫 번째 조각이 여기에 제시됩니다.

start = COSE_Messages / COSE_Key / COSE_KeySet / Internal_Types

; This is defined to make the tool quieter:
Internal_Types = Sig_structure / Enc_structure / MAC_structure

비단말 Internal_Types는 이 문서 작성 중 사용된 자동화된 검증 도구를 처리하기 위해 정의됩니다. 이는 보안 계산에는 사용되지만 전송을 위해 방출되지는 않는 비단말들을 참조합니다.

JSON에서는 맵을 객체라고 부르며, 맵 키의 종류는 텍스트 문자열 하나뿐입니다. COSE에서는 텍스트 문자열, 음의 정수 및 부호 없는 정수를 맵 키로 사용합니다. 정수는 인코딩의 간결성과 쉬운 비교를 위해 사용됩니다. 텍스트 문자열을 포함하면 짧게 인코딩된 값의 추가 범위를 사용할 수도 있습니다. "key"라는 단어는 주로 암호학적 키라는 다른 의미로 사용되므로, 맵 키로서의 이 용례에는 "label"이라는 용어를 사용합니다.

이 명세가 정의하는 CBOR 맵에서 텍스트 문자열도 정수도 아닌 label이 존재하는 것은 오류입니다. 애플리케이션은 처리를 실패시킬 수도 있고 잘못된 label을 무시하여 메시지를 처리할 수도 있습니다. 그러나 애플리케이션은 잘못된 label이 있는 메시지를 생성해서는 MUST NOT 됩니다.

CDDL 문법 조각은 앞 문단에서와 같이 "label" 비단말과, 임의의 값을 사용할 수 있게 하는 "values"를 정의합니다.

label = int / tstr
values = any

1.6. 문서 용어

이 문서에서는 다음 용어를 사용합니다:

Byte:
octet의 동의어입니다.
Constrained Application Protocol (CoAP):
제약된 시스템에서 사용하기 위한 특수한 웹 전송 프로토콜입니다. 이는 [RFC7252]에 정의되어 있습니다.
Authenticated Encryption (AE) 알고리즘 [RFC5116]:
암호화 서비스와 함께 내용에 대한 인증 검사를 제공하는 암호화 알고리즘입니다. COSE에서 사용되는 AE 알고리즘의 한 예는 AES Key Wrap [RFC3394]입니다. 이러한 알고리즘은 키 암호화에 사용되지만, 연관 데이터가 있는 인증 암호화(Authenticated Encryption with Associated Data, AEAD) 알고리즘이 선호됩니다.
AEAD 알고리즘 [RFC5116]:
AE 알고리즘과 동일하게 콘텐츠의 인증 서비스를 제공하고, 또한 암호화된 본문의 일부가 아닌 연관 데이터를 인증 서비스에 포함할 수 있게 하는 암호화 알고리즘입니다. COSE에서 사용되는 AEAD 알고리즘의 한 예는 AES-GCM [RFC5116]입니다. 이러한 알고리즘은 콘텐츠 암호화에 사용되며 키 암호화에도 사용할 수 있습니다.

"Context"는 COSE 메시지의 일부가 아닌 정보를 나타내기 위해 문서 전체에서 사용됩니다. context의 일부인 정보는 프로토콜 상호작용, 연관된 키 구조 및 프로그램 구성 등 여러 서로 다른 출처에서 올 수 있습니다. 사용할 context는 암시적일 수 있고, [RFC8613]에 정의된 "kid context" 헤더 매개변수를 사용하여 식별될 수도 있으며, 프로토콜별 식별자로 식별될 수도 있습니다. context는 일반적으로 암호학적 구성에 포함되어야 합니다. 자세한 내용은 섹션 4.3을 참조하십시오.

"byte string"이라는 용어는 바이트의 시퀀스에 사용되고, "text string"이라는 용어는 문자의 시퀀스에 사용됩니다.

2. 기본 COSE 구조

COSE 객체 구조는 서로 다른 유형의 보안 메시지를 파싱하고 처리할 때 많은 양의 공통 코드를 사용할 수 있도록 설계되었습니다. 모든 메시지 구조는 CBOR 배열 타입 위에 구축됩니다. 배열의 처음 세 요소는 항상 같은 정보를 포함합니다:

  1. bstr로 인코딩되고 래핑된 보호 헤더 매개변수입니다.
  2. 맵으로 된 비보호 헤더 매개변수입니다.
  3. 메시지의 내용입니다. 내용은 적절한 경우 평문이거나 암호문입니다. 내용은 분리될 수 있습니다(즉, COSE 구조와 별도로 전송될 수 있음). 하지만 위치는 여전히 사용됩니다. 내용이 존재하는 경우 bstr로 래핑되고, 분리된 경우 nil 값입니다.

이 지점 이후의 요소는 특정 메시지 유형에 따라 달라집니다.

COSE 메시지는 서로 다른 유형의 암호학적 개념을 분리하기 위해 계층 개념을 사용하여 구축됩니다. 이것이 어떻게 작동하는지에 대한 예로 COSE_Encrypt 메시지(섹션 5.1)를 생각해 보십시오. 이 메시지 유형은 콘텐츠 계층과 수신자 계층이라는 두 계층으로 나뉩니다. 콘텐츠 계층은 암호화된 평문과 암호화된 메시지에 대한 정보를 포함합니다. 수신자 계층은 각 수신자에 대해 암호화된 콘텐츠 암호화 키(CEK)와 그것이 어떻게 암호화되는지에 대한 정보를 포함합니다. CEK가 사전 공유된 경우를 위해 암호화 메시지 COSE_Encrypt0(섹션 5.2)의 단일 계층 버전이 제공됩니다.

제시된 메시지 유형을 식별하는 것은 다음 방법으로 수행됩니다:

  1. 특정 메시지 유형이 context에서 알려져 있습니다. 이는 포함하는 구조의 마커에 의해 정의되거나 애플리케이션 프로토콜이 지정한 제한에 의해 정의될 수 있습니다.
  2. 메시지 유형은 CBOR 태그로 식별됩니다. CBOR 태그가 있는 메시지는 이 명세에서 태그가 지정된 메시지로 알려져 있고, CBOR 태그가 없는 메시지는 태그가 지정되지 않은 메시지로 알려져 있습니다. 이 문서는 각 메시지 구조에 대한 CBOR 태그를 정의합니다. 이러한 태그는 표 1에서 찾을 수 있습니다.
  3. COSE 객체가 "application/cose" 미디어 유형으로 전달될 때 선택적 매개변수 "cose-type"을 사용하여 포함된 객체를 식별할 수 있습니다. 구조의 태그가 지정된 버전을 사용하는 경우 이 매개변수는 OPTIONAL입니다. 구조의 태그가 지정되지 않은 버전을 사용하는 경우 이 매개변수는 REQUIRED입니다. 각 구조에 대해 매개변수와 함께 사용할 값은 표 1에서 찾을 수 있습니다.
  4. COSE 객체가 CoAP 페이로드로 전달될 때 CoAP Content-Format Option을 사용하여 메시지 내용을 식별할 수 있습니다. CoAP Content-Format 값은 표 2에서 찾을 수 있습니다. 각 보안 메시지가 고유하게 식별되므로 메시지 구조에 대한 CBOR 태그는 필요하지 않습니다.
표 1: COSE 메시지 식별
CBOR 태그 cose-type 데이터 항목 의미
98 cose-sign COSE_Sign COSE 서명된 데이터 객체
18 cose-sign1 COSE_Sign1 COSE 단일 서명자 데이터 객체
96 cose-encrypt COSE_Encrypt COSE 암호화된 데이터 객체
16 cose-encrypt0 COSE_Encrypt0 COSE 단일 수신자 암호화된 데이터 객체
97 cose-mac COSE_Mac COSE MAC 적용 데이터 객체
17 cose-mac0 COSE_Mac0 수신자가 없는 COSE MAC 객체
표 2: COSE를 위한 CoAP Content-Formats
미디어 유형 인코딩 ID 참조
application/cose; cose-type="cose-sign" 98 RFC 9052
application/cose; cose-type="cose-sign1" 18 RFC 9052
application/cose; cose-type="cose-encrypt" 96 RFC 9052
application/cose; cose-type="cose-encrypt0" 16 RFC 9052
application/cose; cose-type="cose-mac" 97 RFC 9052
application/cose; cose-type="cose-mac0" 17 RFC 9052
application/cose-key 101 RFC 9052
application/cose-key-set 102 RFC 9052

다음 CDDL 조각은 이 문서에서 정의한 모든 최상위 메시지를 식별합니다. 메시지의 태그가 지정된 버전과 태그가 지정되지 않은 버전에 대해 별도의 비단말이 정의됩니다.

COSE_Messages = COSE_Untagged_Message / COSE_Tagged_Message

COSE_Untagged_Message = COSE_Sign / COSE_Sign1 /
    COSE_Encrypt / COSE_Encrypt0 /
    COSE_Mac / COSE_Mac0

COSE_Tagged_Message = COSE_Sign_Tagged / COSE_Sign1_Tagged /
    COSE_Encrypt_Tagged / COSE_Encrypt0_Tagged /
    COSE_Mac_Tagged / COSE_Mac0_Tagged

3. 헤더 매개변수

COSE의 구조는 페이로드 자체의 일부로 간주되지는 않지만, 계층을 처리하기 위한 콘텐츠, 알고리즘, 키 또는 평가 힌트에 관한 정보를 보관하는 데 사용되는 두 개의 정보 버킷을 갖도록 설계되었습니다. 이 두 버킷은 키를 제외한 모든 구조에서 사용할 수 있습니다. 이러한 버킷이 존재하더라도, 모든 인스턴스에서 항상 사용할 수 있는 것은 아닙니다. 예를 들어 보호 버킷이 수신자 구조의 일부로 정의되어 있더라도, 수신자 구조에 사용되는 일부 알고리즘은 인증된 데이터를 제공하지 않습니다. 이 경우 보호 버킷은 비워 둡니다.

두 버킷 모두 CBOR 맵으로 구현됩니다. 맵 키는 "label"(섹션 1.5)입니다. 값 부분은 label에 대한 정의에 따라 달라집니다. 두 맵 모두 같은 label/value 쌍 집합을 사용합니다. label에 대한 정수 및 텍스트 문자열 값은 표준 범위, 사적 사용 범위 및 선택된 알고리즘에 의존하는 범위를 포함하여 여러 섹션으로 나뉘어 있습니다. 정의된 label은 "COSE Header Parameters" IANA 레지스트리(섹션 11.1)에서 찾을 수 있습니다.

두 버킷은 다음과 같습니다:

protected:

암호학적으로 보호되는 현재 계층에 대한 매개변수를 포함합니다. 이 버킷은 암호학적 계산에 포함되지 않을 경우 비어 있어야 MUST 합니다. 이 버킷은 메시지에서 이진 객체로 인코딩됩니다. 이 값은 보호 맵을 CBOR로 인코딩하고 bstr 객체로 래핑하여 얻습니다. 송신자는 길이가 0인 맵을 길이가 0인 맵(h'a0'로 인코딩됨)이 아니라 길이가 0인 바이트 문자열로 인코딩하는 것이 SHOULD 됩니다. 길이가 0인 바이트 문자열 인코딩이 더 짧고, 암호학적 계산을 위한 직렬화 구조에서 사용되는 버전이기 때문에 선호됩니다. 수신자는 길이가 0인 바이트 문자열과 바이트 문자열 안에 인코딩된 길이가 0인 맵을 모두 수락해야 MUST 합니다.

인코딩을 바이트 문자열로 래핑하면 보호 맵이 전송 중 우연히 변경되지 않을 가능성을 높여 전송될 수 있습니다. (잘못 동작하는 중간자는 디코딩 후 다시 인코딩할 수 있지만, 다시 인코딩된 바이트 문자열이 디코딩된 바이트 문자열과 동일하지 않으면 검증 실패가 발생합니다.) 이는 모든 당사자가 암호학적 작업의 입력으로 사용하기 위해 맵에 대해 공통된 정규 인코딩을 수행할 수 있어야 하는 문제를 피합니다.

unprotected:
암호학적으로 보호되지 않는 현재 계층에 대한 매개변수를 포함합니다.

현재 계층을 다루는 헤더 매개변수만 그 계층에 배치되어야 합니다. 이에 대한 예로 "content type" 헤더 매개변수는 메시지에 실린 메시지의 내용을 설명합니다. 따라서 이 헤더 매개변수는 콘텐츠 계층에만 배치되고 수신자 또는 서명 계층에는 배치되지 않습니다. 원칙적으로는 어떤 주어진 계층도 다른 계층을 참조하지 않고 처리할 수 있어야 합니다. COSE_Sign 구조를 제외하면, 계층을 가로질러야 하는 유일한 데이터는 암호학적 키입니다.

버킷은 이 문서에서 정의한 모든 보안 객체에 존재합니다. 필드는 순서대로 CBOR "bstr" 타입인 "protected" 버킷, 그리고 CBOR "map" 타입인 "unprotected" 버킷입니다. 두 버킷의 존재는 필수입니다. 버킷에 들어가는 헤더 매개변수는 IANA "COSE Header Parameters" 레지스트리(섹션 11.1)에서 옵니다. 일부 헤더 매개변수는 다음 섹션에서 정의됩니다.

각 맵의 label은 고유해야 MUST 합니다. 메시지를 처리할 때 label이 여러 번 나타나면, 메시지는 잘못 형성된 것으로 거부되어야 MUST 합니다. 애플리케이션은 보호 및 비보호 헤더 매개변수 양쪽에 같은 label이 발생하지 않는지 검증하는 것이 SHOULD 됩니다. 메시지가 잘못 형성된 것으로 거부되지 않는 경우, 속성은 보호 버킷에서 얻어야 MUST 하며, 보호 버킷에서 속성이 발견되지 않은 경우에만 비보호 버킷에서 그 속성을 얻을 수 있습니다.

다음 CDDL 조각은 두 헤더 매개변수 버킷을 나타냅니다. 속성이 배치되는 두 버킷을 나타내는 "Headers" 그룹이 CDDL에 정의됩니다. 이 그룹은 모든 위치에서 이 두 필드를 일관되게 제공하는 데 사용됩니다. 공통 헤더 매개변수의 맵을 나타내는 타입도 정의됩니다.

Headers = (
    protected : empty_or_serialized_map,
    unprotected : header_map
)

header_map = {
    Generic_Headers,
    * label => values
}

empty_or_serialized_map = bstr .cbor header_map / bstr .size 0

3.1. 공통 COSE 헤더 매개변수

이 섹션은 공통 헤더 매개변수 집합을 정의합니다. 이러한 헤더 매개변수의 요약은 표 3에서 찾을 수 있습니다. 이 표는 label의 값과 값의 타입을 결정할 때 참조해야 합니다.

이 섹션에서 정의되는 헤더 매개변수 집합은 다음과 같습니다:

alg:
이 헤더 매개변수는 보안 처리에 사용되는 알고리즘을 나타내는 데 사용됩니다. 이 헤더 매개변수는 그렇게 할 수 있는 능력이 존재하는 경우 인증되어야 MUST 합니다. 이 지원은 AEAD 알고리즘 또는 구성 (예: COSE_Sign 및 COSE_Mac0)에 의해 제공됩니다. 이 인증은 헤더 매개변수를 protected-header-parameters 버킷에 배치하거나 외부에서 제공된 데이터(섹션 4.3)의 일부로 배치하여 수행할 수 있습니다. 값은 "COSE Algorithms" 레지스트리([COSE.Algorithms] 참조)에서 가져옵니다.
crit:

이 헤더 매개변수는 메시지를 처리하는 애플리케이션이 이해해야 하는 보호 헤더 매개변수를 나타내는 데 사용됩니다. 이 문서에서 정의된 헤더 매개변수는 모든 구현이 이해해야 하므로 포함될 필요가 없습니다. 또한 [RFC8152]에서 정의한 "counter signature" 헤더 매개변수(label 7)는, 해당 문서를 준수하고 모든 구현이 이를 이해한다고 가정하는 송신자와의 호환성을 유지하기 위해 새 구현이 반드시 이해해야 합니다. "crit" 헤더 매개변수가 존재하는 경우, protected-header-parameters 버킷에 배치되어야 MUST 합니다. 배열에는 적어도 하나의 값이 있어야 MUST 합니다.

모든 헤더 매개변수 label이 "crit" 헤더 매개변수에 포함될 필요는 없습니다. 어떤 헤더 매개변수를 배열에 배치할지 결정하는 규칙은 다음과 같습니다:

  • 0부터 7까지의 범위에 있는 정수 label은 생략하는 것이 SHOULD 됩니다.
  • -1부터 -128까지의 범위에 있는 정수 label은 생략할 수 있습니다. 알고리즘은 label의 내용을 처리할 수 있는 능력이 알고리즘 구현의 핵심으로 간주되는 경우 이 범위에 label을 할당할 수 있습니다. 알고리즘은 이 범위 밖의 label을 할당하고, label의 내용을 처리할 수 있는 능력이 알고리즘의 핵심 기능으로 간주되지는 않지만 이 인스턴스를 올바르게 처리하기 위해 이해되어야 하는 경우 이를 "crit" 헤더 매개변수에 포함할 수 있습니다. -129부터 -65536까지의 범위에 있는 정수 label은 일반적으로 지원되지 않을 수 있는 덜 일반적인 헤더 매개변수이므로 포함하는 것이 SHOULD 됩니다.
  • 애플리케이션에 필요한 헤더 매개변수의 label은 생략될 수 MAY 있습니다. 애플리케이션은 label을 생략할 수 있는지 여부를 선언하는 진술을 가져야 합니다.

"crit"로 표시된 헤더 매개변수는 보안 라이브러리 코드 또는 보안 라이브러리를 사용하는 애플리케이션이 처리할 수 있습니다. 유일한 요구사항은 헤더 매개변수가 처리된다는 것입니다. "crit" 값 목록에 protected-header-parameters 버킷에 없는 헤더 매개변수에 대한 label이 포함되어 있으면, 이는 메시지 처리에서 치명적인 오류입니다.

content type:
이 헤더 매개변수는 "payload" 또는 "ciphertext" 필드에 있는 데이터의 콘텐츠 유형을 나타내는 데 사용됩니다. 정수는 "CoAP Content-Formats" IANA 레지스트리 표 [COAP.Formats]에서 옵니다. 텍스트 값은 "<type-name>/<subtype-name>" 구문을 따르며, 여기서 <type-name> 및 <subtype-name>은 섹션 4.2 of [RFC6838]에 정의되어 있습니다. 앞뒤 공백은 허용되지 않습니다. 텍스트 콘텐츠 유형 값은 매개변수 및 하위 매개변수와 함께 IANA "Media Types" 레지스트리를 사용하여 찾을 수 있습니다. 콘텐츠 구조가 잠재적으로 모호한 경우 애플리케이션은 이 헤더 매개변수를 제공하는 것이 SHOULD 됩니다.
kid:
이 헤더 매개변수는 필요한 암호학적 키를 찾기 위한 입력으로 사용할 수 있는 데이터 조각 하나를 식별합니다. 이 헤더 매개변수의 값은 COSE_Key 구조의 "kid" 멤버와 대조될 수 있습니다. 다른 키 배포 방법은 대조할 동등한 필드를 정의할 수 있습니다. 애플리케이션은 "kid" 값이 고유하다고 가정해서는 MUST NOT 됩니다. 같은 "kid" 값을 가진 키가 둘 이상 있을 수 있으므로, 이 "kid"와 연관된 모든 키를 확인해야 할 수도 있습니다. "kid" 값의 내부 구조는 정의되어 있지 않으며 애플리케이션이 이에 의존할 수 없습니다. 키 식별자 값은 어떤 키를 사용할지에 대한 힌트입니다. 이는 보안에 중요한 필드가 아닙니다. 이러한 이유로 비보호 헤더 매개변수 버킷에 배치할 수 있습니다.
IV:
이 헤더 매개변수는 초기화 벡터(IV) 값을 보관합니다. 일부 대칭 암호화 알고리즘에서는 이를 nonce라고 부를 수 있습니다. AE 및 AEAD 알고리즘의 경우 IV를 수정하면 복호화가 실패하므로, IV는 비보호 버킷에 배치할 수 있습니다.
Partial IV:

이 헤더 매개변수는 IV 값의 일부를 보관합니다. COSE_Encrypt0 구조를 사용할 때 IV의 일부는 키와 연관된 context(Context IV)의 일부가 될 수 있고, 일부는 각 메시지마다 변경될 수 있습니다(Partial IV). 이 필드는 각 메시지마다 IV가 변경되도록 하는 값을 전달하는 데 사용됩니다. 값을 수정하면 복호화가 쉽게 감지할 수 있는 깨진 평문을 산출하므로 Partial IV는 비보호 버킷에 배치할 수 있습니다. "Initialization Vector" 및 "Partial Initialization Vector" 헤더 매개변수는 같은 보안 계층에 둘 다 존재해서는 MUST NOT 됩니다.

메시지 IV는 다음 단계에 의해 생성됩니다:

  1. Partial IV를 IV의 길이(알고리즘에 의해 결정됨)에 맞춰 왼쪽에 0을 채웁니다.
  2. 채워진 Partial IV를 Context IV와 XOR합니다.
표 3: 공통 헤더 매개변수
이름 Label 값 타입 값 레지스트리 설명
alg 1 int / tstr COSE Algorithms registry 사용할 암호학적 알고리즘
crit 2 [+ label] COSE Header Parameters registry 이해되어야 하는 중요 헤더 매개변수
content type 3 tstr / uint CoAP Content-Formats 또는 Media Types registries 페이로드의 콘텐츠 유형
kid 4 bstr 키 식별자
IV 5 bstr 전체 초기화 벡터
Partial IV 6 bstr 부분 초기화 벡터

이 섹션에서 정의된 헤더 매개변수 집합을 나타내는 CDDL 조각이 아래에 제시되어 있습니다. 각 헤더 매개변수는 모든 맵에 있을 필요가 없기 때문에 선택 사항으로 표시되어 있습니다. 특정 맵에서 필요한 헤더 매개변수는 위에서 논의됩니다.

Generic_Headers = (
    ? 1 => int / tstr,  ; algorithm identifier
    ? 2 => [+label],    ; criticality
    ? 3 => tstr / int,  ; content type
    ? 4 => bstr,        ; key identifier
    ? ( 5 => bstr //    ; IV
        6 => bstr )     ; Partial IV
)

4. 서명 객체

COSE는 두 가지 서로 다른 서명 구조를 지원합니다. COSE_Sign은 하나 이상의 서명이 동일한 콘텐츠에 적용될 수 있게 합니다. COSE_Sign1은 단일 서명자로 제한됩니다. 서명 계산에는 어떤 구조가 사용되는지 식별하는 매개변수가 포함되므로, 두 구조는 서로 변환될 수 없습니다. 변환된 구조는 서명 검증에 실패합니다.

4.1. 하나 이상의 서명자로 서명하기

COSE_Sign 구조는 하나 이상의 서명이 메시지 페이로드에 적용될 수 있게 합니다. 콘텐츠와 관련된 헤더 매개변수 및 서명과 관련된 헤더 매개변수는 서명 자체와 함께 전달됩니다. 이러한 헤더 매개변수는 서명으로 인증될 수도 있고, 단순히 존재할 수도 있습니다. 콘텐츠에 대한 헤더 매개변수의 예는 content type 헤더 매개변수입니다. 서명에 대한 헤더 매개변수의 예는 서명을 만드는 데 사용된 알고리즘과 키입니다.

[RFC5652]는 다음과 같이 나타냅니다:

둘 이상의 서명이 존재하는 경우, 주어진 서명자와 연결된 하나의 서명이 성공적으로 검증되면 일반적으로 그 서명자가 성공적으로 서명한 것으로 처리됩니다. 그러나 다른 규칙이 필요한 애플리케이션 환경도 있습니다. 각 서명자에 대해 하나의 유효한 서명 이외의 규칙을 사용하는 애플리케이션은 해당 규칙을 명시해야 합니다. 또한 서명자 식별자를 단순히 일치시키는 것만으로는 서명이 동일한 서명자에 의해 생성되었는지 판단하기에 충분하지 않은 경우, 애플리케이션 명세는 어떤 서명이 동일한 서명자에 의해 생성되었는지 판단하는 방법을 설명해야 합니다. 서로 다른 수신자 커뮤니티를 지원하는 것이 서명자가 둘 이상의 서명을 포함하도록 선택하는 주된 이유입니다.

예를 들어, COSE_Sign 구조는 Edwards-curve Digital Signature Algorithm(EdDSA) [RFC8032] 및 Elliptic Curve Digital Signature Algorithm(ECDSA) [DSS]로 생성된 서명을 포함할 수 있습니다. 이를 통해 수신자는 한 알고리즘 또는 다른 알고리즘과 연결된 서명을 검증할 수 있습니다. 다중 서명 평가에 대한 더 자세한 정보는 [RFC5752]에서 찾을 수 있습니다.

서명 구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Sign 구조는 CBOR 태그 98로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Sign_Tagged = #6.98(COSE_Sign)

COSE Signed Message는 두 부분으로 정의됩니다. 본문과 메시지에 대한 정보를 전달하는 CBOR 객체를 COSE_Sign 구조라고 합니다. 서명과 서명에 대한 정보를 전달하는 CBOR 객체를 COSE_Signature 구조라고 합니다. COSE Signed Message의 예는 부록 C.1에서 찾을 수 있습니다.

COSE_Sign 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
payload:

이 필드는 서명될 직렬화된 콘텐츠를 포함합니다. payload가 메시지에 존재하지 않는 경우, 애플리케이션은 payload를 별도로 제공해야 합니다. payload는 변경 없이 전송되도록 보장하기 위해 bstr로 래핑됩니다. payload가 별도로 전송되는 경우("분리된 콘텐츠"), 이 위치에는 nil CBOR 객체가 배치되며, 변경 없이 전송되도록 보장하는 것은 애플리케이션의 책임입니다.

참고: 메시지 복구 알고리즘을 사용하는 서명(섹션 8.1)이 사용되는 경우, 복구될 수 있는 최대 바이트 수는 원래 payload의 길이입니다. 인코딩된 payload의 크기는 복구될 바이트 수만큼 줄어듭니다. 원래 payload의 모든 바이트가 소비되는 경우, 전송되는 payload는 존재하지 않는 것으로 인코딩되는 것이 아니라 길이가 0인 바이트 문자열로 인코딩됩니다.

signatures:
이 필드는 서명의 배열입니다. 각 서명은 COSE_Signature 구조로 표현됩니다.

COSE_Sign에 대한 위 텍스트를 나타내는 CDDL 조각은 다음과 같습니다.

COSE_Sign = [
    Headers,
    payload : bstr / nil,
    signatures : [+ COSE_Signature]
]

COSE_Signature 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
signature:
이 필드는 계산된 서명 값을 포함합니다. 필드의 타입은 bstr입니다. 알고리즘은 서명 값이 8비트의 배수가 아닌 경우 패딩을 명시해야 MUST 합니다.

COSE_Signature에 대한 위 텍스트를 나타내는 CDDL 조각은 다음과 같습니다.

COSE_Signature =  [
    Headers,
    signature : bstr
]

4.2. 하나의 서명자로 서명하기

COSE_Sign1 서명 구조는 메시지에 하나의 서명만 배치될 경우 사용됩니다. 콘텐츠와 서명을 다루는 헤더 매개변수는 COSE_Sign처럼 분리되지 않고 동일한 한 쌍의 버킷에 배치됩니다.

구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Sign1 구조는 CBOR 태그 18로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Sign1_Tagged = #6.18(COSE_Sign1)

본문, 서명, 그리고 본문 및 서명에 대한 정보를 전달하는 CBOR 객체를 COSE_Sign1 구조라고 합니다. COSE_Sign1 메시지의 예는 부록 C.2에서 찾을 수 있습니다.

COSE_Sign1 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
payload:
이는 섹션 4.1에 설명된 것과 같습니다.
signature:
이 필드는 계산된 서명 값을 포함합니다. 필드의 타입은 bstr입니다.

COSE_Sign1에 대한 위 텍스트를 나타내는 CDDL 조각은 다음과 같습니다.

COSE_Sign1 = [
    Headers,
    payload : bstr / nil,
    signature : bstr
]

4.3. 외부에서 제공된 데이터

COSE가 제공하는 기능 중 하나는 애플리케이션이 인증되어야 하지만 COSE 객체의 일부로는 전달되지 않는 추가 데이터를 제공할 수 있는 능력입니다. 이를 지원하는 주된 이유는 CoAP 메시지 구조 [RFC7252]를 살펴보면 알 수 있는데, 여기에는 옵션이 payload 앞에 전달될 수 있는 기능이 존재합니다. 이 위치에 배치될 수 있는 데이터의 예로는 CoAP 코드 또는 CoAP 옵션이 있습니다. 데이터가 CoAP 메시지의 헤더에 있으면, 프록시가 프록시 작업을 수행하는 데 도움을 주기 위해 이를 사용할 수 있습니다. 예를 들어, Accept 옵션은 적절한 값이 프록시의 캐시에 있는지 프록시가 결정하는 데 사용될 수 있습니다. 송신자는 additional-data 기능을 사용하여 프록시 또는 공격자가 Accept 값 집합에 가한 변경을 감지할 수 있게 할 수 있습니다. 필드를 외부에서 제공된 데이터에 포함하면, 이후 수정은 서버의 메시지 처리가 실패하도록 만듭니다.

이 문서는 외부에서 제공된 인증 데이터의 바이트 배열을 사용하는 절차를 설명합니다. 바이트 배열을 구성하는 방법은 애플리케이션의 함수입니다. 이 기능을 사용하는 애플리케이션은 외부에서 제공된 인증 데이터가 어떻게 구성될지를 정의해야 합니다. 그러한 구성은 다음 문제들을 고려해야 합니다:

  • 여러 항목이 포함되는 경우, 애플리케이션은 서로 다른 입력이 동일한 바이트 문자열을 생성할 수 없도록 보장해야 합니다. 문제가 되는 시나리오가 발생할 수 있는 예는 텍스트 문자열 "AB"와 "CDE"를 연결하거나 텍스트 문자열 "ABC"와 "DE"를 연결하는 것입니다. 이는 보통 필드를 고정 폭으로 만들거나, 필드의 길이를 출력의 일부로 인코딩함으로써 해결됩니다. CoAP [RFC7252]의 옵션을 예로 들면, 이러한 필드는 TLV 구조를 사용하므로 문제 없이 연결될 수 있습니다.
  • 여러 항목이 포함되는 경우, 항목에 대한 순서가 정의되어야 합니다. CoAP의 옵션을 예로 들면, 애플리케이션은 필드가 옵션 번호에 따라 정렬되어야 한다고 명시할 수 있습니다.
  • 애플리케이션은 바이트 문자열이 양쪽에서 동일할 것임을 보장해야 합니다. CoAP의 옵션을 사용하면 같은 상대 번호가 유지되는 경우 문제가 생길 수 있습니다. 중간 노드가 옵션을 삽입하거나 제거하여 상대 번호가 수행되는 방식을 변경할 수 있습니다. 애플리케이션은 상대 번호가 외부 데이터에 있는 옵션에 대해서만 상대적이도록 다시 인코딩되어야 한다고 명시해야 합니다.

4.4. 서명 및 검증 프로세스

서명을 생성하려면 잘 정의된 바이트 문자열이 필요합니다. Sig_structure는 정규 형식을 만드는 데 사용됩니다. 이 서명 및 검증 프로세스는 본문 정보(COSE_Sign 또는 COSE_Sign1), 서명자 정보 (COSE_Signature), 그리고 애플리케이션 데이터(외부 소스)를 입력으로 받습니다. Sig_structure는 CBOR 배열입니다. Sig_structure의 필드는 순서대로 다음과 같습니다:

  1. 서명의 context를 식별하는 context 텍스트 문자열입니다. context 텍스트 문자열은 다음과 같습니다:

    • COSE_Signature 구조를 사용하는 서명의 경우 "Signature"입니다.
    • COSE_Sign1 구조를 사용하는 서명의 경우 "Signature1"입니다.
  2. 본문 구조의 보호 속성으로, bstr 타입으로 인코딩됩니다. 보호 속성이 없는 경우, 길이가 0인 바이트 문자열이 사용됩니다.
  3. 서명자 구조의 보호 속성으로, bstr 타입으로 인코딩됩니다. 보호 속성이 없는 경우, 길이가 0인 바이트 문자열이 사용됩니다. 이 필드는 COSE_Sign1 서명 구조에서는 생략됩니다.
  4. 애플리케이션에서 외부로 제공한 데이터로, bstr 타입으로 인코딩됩니다. 이 필드가 제공되지 않으면 기본값은 길이가 0인 바이트 문자열입니다. (이 필드를 구성하는 데 대한 애플리케이션 지침은 섹션 4.3을 참조하십시오.)
  5. 서명될 payload로, bstr 타입으로 인코딩됩니다. 전송 방식과 무관하게 전체 payload가 여기에서 사용됩니다.

위 텍스트를 설명하는 CDDL 조각은 다음과 같습니다:

Sig_structure = [
    context : "Signature" / "Signature1",
    body_protected : empty_or_serialized_map,
    ? sign_protected : empty_or_serialized_map,
    external_aad : bstr,
    payload : bstr
]

서명을 계산하는 방법:

  1. Sig_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 Sig_structure를 바이트 문자열로 인코딩함으로써 ToBeSigned 값을 생성합니다.
  3. 서명 생성 알고리즘을 호출하여 K(서명에 사용할 키), alg(서명에 사용할 알고리즘), ToBeSigned(서명할 값)를 전달합니다.
  4. 결과 서명 값을 올바른 위치에 배치합니다. 이는 COSE_Signature 또는 COSE_Sign1 구조의 "signature" 필드입니다.

서명을 검증하는 단계는 다음과 같습니다:

  1. Sig_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 Sig_structure를 바이트 문자열로 인코딩함으로써 ToBeSigned 값을 생성합니다.
  3. 서명 검증 알고리즘을 호출하여 K(검증에 사용할 키), alg(서명에 사용된 알고리즘), ToBeSigned(서명할 값), sig(검증할 서명)를 전달합니다.

서명 검증을 수행하는 것에 더해, 애플리케이션은 작업을 수행하기 전에 키가 서명 신원과 올바르게 짝지어져 있는지, 그리고 서명 신원이 권한을 부여받았는지 보장하기 위한 적절한 검사를 수행합니다.

5. 암호화 객체

COSE는 두 가지 서로 다른 암호화 구조를 지원합니다. COSE_Encrypt0은 사용할 키가 암시적으로 알려져 있어 수신자 구조가 필요하지 않을 때 사용됩니다. COSE_Encrypt는 나머지 모든 경우에 사용됩니다. 여기에는 여러 수신자가 있거나 direct(즉, 사전 공유 비밀) 이외의 수신자 알고리즘이 사용되는 경우가 포함됩니다.

5.1. 엔벨로프 COSE 구조

엔벨로프 구조는 메시지의 하나 이상의 수신자를 허용합니다. 메시지에는 콘텐츠에 대한 헤더 매개변수와 수신자 정보에 대한 헤더 매개변수가 전달될 수 있는 장치가 있습니다. 콘텐츠와 연결된 보호 헤더 매개변수는 콘텐츠 암호화 알고리즘에 의해 인증됩니다. 수신자와 연결된 보호 헤더 매개변수는 알고리즘이 이를 지원하는 경우 수신자 알고리즘에 의해 인증됩니다. 콘텐츠에 대한 헤더 매개변수의 예로는 콘텐츠의 유형과 콘텐츠 암호화 알고리즘이 있습니다. 수신자에 대한 헤더 매개변수의 예로는 수신자의 키 식별자와 수신자의 암호화 알고리즘이 있습니다.

평문과 키를 암호화하는 데 동일한 기법과 거의 동일한 구조가 사용됩니다. 이는 콘텐츠 계층과 수신자 계층에 서로 다른 구조를 사용하는 "Cryptographic Message Syntax (CMS)" [RFC5652] 및 "JSON Web Encryption (JWE)" [RFC7516]의 접근 방식과 다릅니다. 두 구조가 정의됩니다. 암호화된 콘텐츠를 보관하는 COSE_Encrypt와 수신자에 대한 암호화된 키를 보관하는 COSE_recipient입니다. 엔벨로프 메시지의 예는 부록 C.3에서 찾을 수 있습니다.

COSE_Encrypt 구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Encrypt 구조는 CBOR 태그 96으로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Encrypt_Tagged = #6.96(COSE_Encrypt)

COSE_Encrypt 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
ciphertext:
이 필드는 bstr로 인코딩된 암호문을 포함합니다. 암호문이 암호화 프로세스에 대한 제어 정보와 독립적으로 전송되어야 하는 경우(즉, 분리된 콘텐츠), 필드는 nil 값으로 인코딩됩니다.
recipients:
이 필드는 수신자 정보 구조의 배열을 포함합니다. 수신자 정보 구조의 타입은 COSE_recipient입니다.

위 텍스트에 대응하는 CDDL 조각은 다음과 같습니다:

COSE_Encrypt = [
    Headers,
    ciphertext : bstr / nil,
    recipients : [+COSE_recipient]
]

COSE_recipient 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
ciphertext:
이 필드는 bstr로 인코딩된 암호화된 키를 포함합니다. 모든 인코딩된 키는 대칭 키이며, 키의 이진 값이 콘텐츠입니다. 암호화된 키가 없는 경우, 이 필드는 nil 값으로 인코딩됩니다.
recipients:
이 필드는 수신자 정보 구조의 배열을 포함합니다. 수신자 정보 구조의 타입은 COSE_recipient입니다(이에 대한 예는 부록 B에서 찾을 수 있습니다). 수신자 정보 구조가 없는 경우, 이 요소는 존재하지 않습니다.

COSE_recipient에 대한 위 텍스트에 대응하는 CDDL 조각은 다음과 같습니다:

COSE_recipient = [
    Headers,
    ciphertext : bstr / nil,
    ? recipients : [+COSE_recipient]
]

5.1.1. 콘텐츠 키 배포 방법

암호화된 메시지는 암호화된 콘텐츠와 하나 이상의 수신자에 대한 암호화된 CEK로 구성됩니다. CEK는 각 수신자에 대해 해당 수신자에 특정한 키를 사용하여 암호화됩니다. 이 암호화의 세부사항은 수신자 알고리즘이 어떤 클래스에 속하는지에 따라 달라집니다. 각 클래스에 대한 구체적인 세부사항은 섹션 8.5에서 찾을 수 있습니다. 다섯 가지 콘텐츠 키 배포 방법의 간단한 요약은 다음과 같습니다:

direct:
CEK는 식별된, 이전에 배포된 대칭 키와 동일하거나 이전에 배포된 비밀에서 유도됩니다. 메시지에서는 CEK가 전송되지 않습니다.
symmetric key-encryption keys (KEKs):
CEK는 이전에 배포된 대칭 KEK를 사용하여 암호화됩니다. key wrap이라고도 알려져 있습니다.
key agreement:
수신자의 공개 키와 송신자의 개인 키를 사용하여 쌍별 비밀을 생성하고, Key Derivation Function(KDF)을 적용하여 키를 유도한 다음, CEK는 유도된 키가 되거나 유도된 키로 암호화됩니다.
key transport:
CEK는 수신자의 공개 키로 암호화됩니다.
passwords:
CEK는 password에서 유도된 KEK로 암호화됩니다. 이 문서가 게시되었을 당시에는 password 알고리즘이 정의되어 있지 않았습니다.

5.2. 단일 수신자 암호화

COSE_Encrypt0 암호화 구조에는 메시지의 수신자를 명시하는 기능이 없습니다. 이 구조는 객체의 수신자가 메시지를 복호화하는 데 사용할 키의 신원을 이미 알고 있다고 가정합니다. 수신자에게 키를 식별해 줄 필요가 있다면, 엔벨로프 구조가 사용되어야 합니다.

암호화된 메시지의 예는 부록 C.4에서 찾을 수 있습니다.

COSE_Encrypt0 구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Encrypt0 구조는 CBOR 태그 16으로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Encrypt0_Tagged = #6.16(COSE_Encrypt0)

COSE_Encrypt0 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
ciphertext:
이는 섹션 5.1에 설명된 것과 같습니다.

위 텍스트에 대응하는 COSE_Encrypt0에 대한 CDDL 조각은 다음과 같습니다:

COSE_Encrypt0 = [
    Headers,
    ciphertext : bstr / nil,
]

5.3. AEAD 알고리즘을 위한 암호화 및 복호화 방법

AEAD 알고리즘을 위한 암호화 알고리즘은 상당히 단순합니다. 첫 번째 단계는 인증된 데이터 구조에 대해 일관된 바이트 문자열을 만드는 것입니다. 이를 위해 Enc_structure를 사용합니다. Enc_structure는 CBOR 배열입니다. Enc_structure의 필드는 순서대로 다음과 같습니다:

  1. 인증된 데이터 구조의 context를 식별하는 context 텍스트 문자열입니다. context 텍스트 문자열은 다음과 같습니다:

    • COSE_Encrypt0 데이터 구조의 콘텐츠 암호화에는 "Encrypt0"입니다.
    • COSE_Encrypt 데이터 구조의 첫 번째 계층(즉, 콘텐츠 암호화)에는 "Encrypt"입니다.
    • COSE_Encrypt 데이터 구조에 배치될 수신자 인코딩에는 "Enc_Recipient"입니다.
    • MAC 적용 메시지 구조에 배치될 수신자 인코딩에는 "Mac_Recipient"입니다.
    • 수신자 구조에 배치될 수신자 인코딩에는 "Rec_Recipient"입니다.
  2. 본문 구조의 보호 속성으로, bstr 타입으로 인코딩됩니다. 보호 속성이 없는 경우, 길이가 0인 바이트 문자열이 사용됩니다.
  3. 애플리케이션에서 외부로 제공한 데이터로, bstr 타입으로 인코딩됩니다. 이 필드가 제공되지 않으면 기본값은 길이가 0인 바이트 문자열입니다. (이 필드를 구성하는 데 대한 애플리케이션 지침은 섹션 4.3을 참조하십시오.)

위 텍스트를 설명하는 CDDL 조각은 다음과 같습니다:

Enc_structure = [
    context : "Encrypt" / "Encrypt0" / "Enc_Recipient" /
        "Mac_Recipient" / "Rec_Recipient",
    protected : empty_or_serialized_map,
    external_aad : bstr
]

메시지를 암호화하는 방법:

  1. Enc_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 Enc_structure를 바이트 문자열(Additional Authenticated Data(AAD))로 인코딩합니다.
  3. 암호화 키(K)를 결정합니다. 이 단계는 사용 중인 수신자 알고리즘의 클래스에 따라 달라집니다. 다음의 경우:

    No Recipients:
    사용할 키는 현재 계층의 알고리즘과 키에 의해 결정됩니다. 예로는 key wrap 키(섹션 8.5.2)와 사전 공유 비밀이 있습니다.
    Direct Encryption and Direct Key Agreement:
    키는 수신자 구조의 키와 알고리즘에 의해 결정됩니다. 사용할 암호화 알고리즘과 키의 크기는 수신자에 대해 사용되는 KDF의 입력입니다. (direct의 경우 KDF는 항등 연산으로 생각할 수 있습니다.) 이러한 알고리즘의 예는 [RFC9053]의 섹션 6.16.3에서 찾을 수 있습니다.
    Other:
    키는 무작위로 생성됩니다.
  4. K(암호화 키), P(평문), AAD를 사용하여 암호화 알고리즘을 호출합니다. 반환된 암호문을 구조의 "ciphertext" 필드에 배치합니다.
  5. non-direct 알고리즘을 사용하는 메시지 수신자에 대해, K(암호화 키)를 평문으로 사용하여 해당 수신자에 대한 암호화 알고리즘을 재귀적으로 수행합니다.

메시지를 복호화하는 방법:

  1. Enc_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 Enc_structure를 바이트 문자열(AAD)로 인코딩합니다.
  3. 복호화 키를 결정합니다. 이 단계는 사용 중인 수신자 알고리즘의 클래스에 따라 달라집니다. 다음의 경우:

    No Recipients:
    사용할 키는 현재 계층의 알고리즘과 키에 의해 결정됩니다. 예로는 key wrap 키(섹션 8.5.2)와 사전 공유 비밀이 있습니다.
    Direct Encryption and Direct Key Agreement:
    키는 수신자 구조의 키와 알고리즘에 의해 결정됩니다. 사용할 암호화 알고리즘과 키의 크기는 수신자에 대해 사용되는 KDF의 입력입니다. (direct의 경우 KDF는 항등 연산으로 생각할 수 있습니다.)
    Other:
    키는 수신자 구조 중 하나를 디코딩하고 복호화하여 결정됩니다.
  4. K(사용할 복호화 키), C(암호문), AAD를 사용하여 복호화 알고리즘을 호출합니다.

5.4. AE 알고리즘을 위한 암호화 및 복호화 방법

메시지를 암호화하는 방법:

  1. "protected" 필드가 길이가 0인 바이트 문자열인지 확인합니다.
  2. 이 작업에 대해 외부 추가 인증 데이터가 제공되지 않았는지 확인합니다.
  3. 암호화 키를 결정합니다. 이 단계는 사용 중인 수신자 알고리즘의 클래스에 따라 달라집니다. 다음의 경우:

    No Recipients:
    사용할 키는 현재 계층의 알고리즘과 키에 의해 결정됩니다. 예로는 key wrap 키(섹션 8.5.2)와 사전 공유 비밀이 있습니다.
    Direct Encryption and Direct Key Agreement:
    키는 수신자 구조의 키와 알고리즘에 의해 결정됩니다. 사용할 암호화 알고리즘과 키의 크기는 수신자에 대해 사용되는 KDF의 입력입니다. (direct의 경우 KDF는 항등 연산으로 생각할 수 있습니다.) 이러한 알고리즘의 예는 [RFC9053]의 섹션 6.16.3에서 찾을 수 있습니다.
    Other:
    키는 무작위로 생성됩니다.
  4. K(사용할 암호화 키)와 P(평문)를 사용하여 암호화 알고리즘을 호출합니다. 반환된 암호문을 구조의 "ciphertext" 필드에 배치합니다.
  5. non-direct 알고리즘을 사용하는 메시지 수신자에 대해, K(암호화 키)를 평문으로 사용하여 해당 수신자에 대한 암호화 알고리즘을 재귀적으로 수행합니다.

메시지를 복호화하는 방법:

  1. "protected" 필드가 길이가 0인 바이트 문자열인지 확인합니다.
  2. 이 작업에 대해 외부 추가 인증 데이터가 제공되지 않았는지 확인합니다.
  3. 복호화 키를 결정합니다. 이 단계는 사용 중인 수신자 알고리즘의 클래스에 따라 달라집니다. 다음의 경우:

    No Recipients:
    사용할 키는 현재 계층의 알고리즘과 키에 의해 결정됩니다. 예로는 key wrap 키(섹션 8.5.2)와 사전 공유 비밀이 있습니다.
    Direct Encryption and Direct Key Agreement:
    키는 수신자 구조의 키와 알고리즘에 의해 결정됩니다. 사용할 암호화 알고리즘과 키의 크기는 수신자에 대해 사용되는 KDF의 입력입니다. (direct의 경우 KDF는 항등 연산으로 생각할 수 있습니다.) 이러한 알고리즘의 예는 [RFC9053]의 섹션 6.16.3에서 찾을 수 있습니다.
    Other:
    키는 수신자 구조 중 하나를 디코딩하고 복호화하여 결정됩니다.
  4. K(사용할 복호화 키)와 C(암호문)를 사용하여 복호화 알고리즘을 호출합니다.

6. MAC 객체

COSE는 두 가지 서로 다른 MAC 구조를 지원합니다. COSE_Mac0은 사용할 키가 암시적으로 알려져 있어 수신자 구조가 필요하지 않을 때 사용됩니다. COSE_Mac은 그 밖의 모든 경우에 사용됩니다. 여기에는 여러 수신자가 필요하거나, 키가 알려져 있지 않거나, direct 이외의 수신자 알고리즘이 사용되는 경우가 포함됩니다.

이 섹션에서는 COSE에서 MAC 인증을 수행할 때 사용할 구조와 방법을 설명합니다. 이 문서는 암호화에 허용되는 것과 동일한 모든 수신자 알고리즘 클래스의 사용을 허용합니다.

MAC 작업을 사용할 수 있는 두 가지 모드가 있습니다. 첫 번째는 MAC이 계산된 이후 콘텐츠가 변경되지 않았는지만 확인하는 것입니다. 이 목적에는 어떤 수신자 알고리즘 클래스도 사용할 수 있습니다. 두 번째 모드는 MAC이 계산된 이후 콘텐츠가 변경되지 않았는지를 확인하는 동시에, 수신자 알고리즘을 사용하여 누가 그것을 보냈는지 검증하는 것입니다. 이를 지원하는 수신자 알고리즘 클래스는 사전 공유 비밀을 사용하거나 Static-Static(SS) 키 합의(key wrap 단계 없음)를 수행하는 것들입니다. 이 두 경우 모두 메시지 MAC을 생성하고 보낸 엔터티를 검증할 수 있습니다. (송신자에 대한 이 지식은 관여한 당사자가 두 명뿐이며 자신에게 메시지를 보내지 않았다고 가정합니다.) 출처 속성은 두 MAC 메시지 구조 모두에서 얻을 수 있습니다.

6.1. 수신자가 있는 MAC 적용 메시지

다중 수신자 MAC 적용 메시지는 두 구조를 사용합니다. 본문을 전달하기 위해 이 섹션에서 정의한 COSE_Mac 구조를 사용하고, MAC 계산에 사용되는 키를 보관하기 위해 COSE_recipient 구조(섹션 5.1)를 사용합니다. MAC 적용 메시지의 예는 부록 C.5에서 찾을 수 있습니다.

MAC 구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Mac 구조는 CBOR 태그 97로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Mac_Tagged = #6.97(COSE_Mac)

COSE_Mac 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
payload:
이 필드는 MAC이 적용될 직렬화된 콘텐츠를 포함합니다. payload가 메시지에 존재하지 않는 경우, 애플리케이션은 payload를 별도로 제공해야 합니다. payload는 변경 없이 전송되도록 보장하기 위해 bstr로 래핑됩니다. payload가 별도로 전송되는 경우(즉, 분리된 콘텐츠), 이 위치에는 nil CBOR 값이 배치되며, 변경 없이 전송되도록 보장하는 것은 애플리케이션의 책임입니다.
tag:
이 필드는 MAC 값을 포함합니다.
recipients:
이는 섹션 5.1에 설명된 것과 같습니다.

COSE_Mac에 대한 위 텍스트를 나타내는 CDDL 조각은 다음과 같습니다.

COSE_Mac = [
   Headers,
   payload : bstr / nil,
   tag : bstr,
   recipients : [+COSE_recipient]
]

6.2. 암시적 키가 있는 MAC 적용 메시지

이 섹션에서는 수신자가 암시적으로 알려져 있는 경우 MAC 인증을 수행할 때 사용할 구조와 방법을 설명합니다.

MAC 적용 메시지는 본문을 전달하기 위해 이 섹션에서 정의한 COSE_Mac0 구조를 사용합니다. 암시적 키가 있는 MAC 적용 메시지의 예는 부록 C.6에서 찾을 수 있습니다.

MAC 구조는 사용될 context에 따라 태그가 지정된 형식 또는 태그가 지정되지 않은 형식으로 인코딩될 수 있습니다. 태그가 지정된 COSE_Mac0 구조는 CBOR 태그 17로 식별됩니다. 이를 나타내는 CDDL 조각은 다음과 같습니다:

COSE_Mac0_Tagged = #6.17(COSE_Mac0)

COSE_Mac0 구조는 CBOR 배열입니다. 배열의 필드는 순서대로 다음과 같습니다:

protected:
이는 섹션 3에 설명된 것과 같습니다.
unprotected:
이는 섹션 3에 설명된 것과 같습니다.
payload:
이는 섹션 6.1에 설명된 것과 같습니다.
tag:
이 필드는 MAC 값을 포함합니다.

위 텍스트에 대응하는 CDDL 조각은 다음과 같습니다:

COSE_Mac0 = [
   Headers,
   payload : bstr / nil,
   tag : bstr,
]

6.3. MAC 계산 및 검증 방법

인증될 데이터의 일관된 인코딩을 얻기 위해 MAC_structure를 사용하여 정규 형식을 만듭니다. MAC_structure는 CBOR 배열입니다. MAC_structure의 필드는 순서대로 다음과 같습니다:

  1. 인코딩되는 구조를 식별하는 context 텍스트 문자열입니다. 이 context 텍스트 문자열은 COSE_Mac 구조의 경우 "MAC"입니다. 이 context 텍스트 문자열은 COSE_Mac0 구조의 경우 "MAC0"입니다.
  2. 본문 구조의 보호 속성입니다. 보호 속성이 없는 경우, 길이가 0인 bstr이 사용됩니다.
  3. 애플리케이션에서 외부로 제공한 데이터로, bstr 타입으로 인코딩됩니다. 이 필드가 제공되지 않으면 기본값은 길이가 0인 바이트 문자열입니다. (이 필드를 구성하는 데 대한 애플리케이션 지침은 섹션 4.3을 참조하십시오.)
  4. MAC이 적용될 payload로, bstr 타입으로 인코딩됩니다. 전송 방식과 무관하게 전체 payload가 여기에서 사용됩니다.

위 텍스트에 대응하는 CDDL 조각은 다음과 같습니다:

MAC_structure = [
     context : "MAC" / "MAC0",
     protected : empty_or_serialized_map,
     external_aad : bstr,
     payload : bstr
]

MAC을 계산하는 단계는 다음과 같습니다:

  1. MAC_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 MAC_structure를 바이트 문자열로 인코딩함으로써 ToBeMaced 값을 생성합니다.
  3. MAC 생성 알고리즘을 호출하여 K(사용할 키), alg(MAC을 적용할 알고리즘), ToBeMaced(MAC을 계산할 값)를 전달합니다.
  4. 결과 MAC을 COSE_Mac 또는 COSE_Mac0 구조의 "tag" 필드에 배치합니다.
  5. COSE_Mac 구조의 경우, 메시지의 각 수신자에 대해 MAC 키를 암호화하고 인코딩합니다.

MAC을 검증하는 단계는 다음과 같습니다:

  1. MAC_structure를 생성하고 적절한 필드로 채웁니다.
  2. 섹션 9에 설명된 인코딩을 사용하여 MAC_structure를 바이트 문자열로 인코딩함으로써 ToBeMaced 값을 생성합니다.
  3. COSE_Mac 구조의 경우, 수신자 구조 중 하나를 디코딩하고 복호화하여 암호학적 키를 얻습니다.
  4. MAC 생성 알고리즘을 호출하여 K(사용할 키), alg(MAC을 적용할 알고리즘), ToBeMaced(MAC을 계산할 값)를 전달합니다.
  5. MAC 값을 COSE_Mac 또는 COSE_Mac0 구조의 "tag" 필드와 비교합니다.

7. 키 객체

COSE Key 구조는 CBOR 맵 위에 구축됩니다. COSE Key에 나타날 수 있는 공통 매개변수 집합은 IANA "COSE Key Common Parameters" 레지스트리 [COSE.KeyParameters]에서 찾을 수 있습니다(섹션 11.2 참조). 특정 키 유형에 대해 정의된 추가 매개변수는 IANA "COSE Key Type Parameters" 레지스트리 [COSE.KeyTypes]에서 찾을 수 있습니다.

COSE Key Set은 CBOR 배열 객체를 기본 타입으로 사용합니다. 배열 요소의 값은 COSE Key입니다. COSE Key Set은 배열에 적어도 하나의 요소를 가져야 MUST 합니다. COSE Key Set의 예는 부록 C.7에서 찾을 수 있습니다.

COSE Key Set의 각 요소는 독립적으로 처리되어야 MUST 합니다. COSE Key Set의 한 요소가 잘못 형성되었거나 애플리케이션이 이해하지 못하는 키를 사용하는 경우, 해당 키는 무시되고 다른 키들은 정상적으로 처리됩니다.

요소 "kty"는 COSE_Key 맵에서 필수 요소입니다.

COSE_Key와 COSE_KeySet을 설명하는 CDDL 문법은 다음과 같습니다:

COSE_Key = {
    1 => tstr / int,          ; kty
    ? 2 => bstr,              ; kid
    ? 3 => tstr / int,        ; alg
    ? 4 => [+ (tstr / int) ], ; key_ops
    ? 5 => bstr,              ; Base IV
    * label => values
}

COSE_KeySet = [+COSE_Key]

7.1. COSE Key 공통 매개변수

이 문서는 COSE Key 객체를 위한 공통 매개변수 집합을 정의합니다. 표 4는 이 섹션에서 정의된 매개변수의 요약을 제공합니다. 특정 키 유형에 대해 정의된 매개변수도 있습니다. 키 유형별 매개변수는 [RFC9053]에서 찾을 수 있습니다.

표 4: 키 맵 Label
이름 Label CBOR 타입 값 레지스트리 설명
kty 1 tstr / int COSE Key Types 키 유형 식별
kid 2 bstr 키 식별 값 -- 메시지의 "kid"와 대조
alg 3 tstr / int COSE Algorithms 이 알고리즘으로의 키 사용 제한
key_ops 4 [+ (tstr/int)] 허용 가능한 작업 집합 제한
Base IV 5 bstr Partial IV와 XOR될 Base IV
kty:
이 매개변수는 이 구조에 대한 키의 패밀리, 따라서 찾을 키 유형별 매개변수 집합을 식별하는 데 사용됩니다. 이 문서에서 정의한 값 집합은 [COSE.KeyTypes]에서 찾을 수 있습니다. 이 매개변수는 키 객체에 존재해야 MUST 합니다. 구현은 처리 중인 알고리즘에 키 유형이 적절한지 검증해야 MUST 합니다. 키 유형은 신뢰 결정 프로세스의 일부로 포함되어야 MUST 합니다.
alg:
이 매개변수는 키와 함께 사용되는 알고리즘을 제한하는 데 사용됩니다. 이 매개변수가 키 구조에 존재하는 경우, 애플리케이션은 이 알고리즘이 해당 키가 사용되는 알고리즘과 일치하는지 검증해야 MUST 합니다. 알고리즘이 일치하지 않으면, 이 키 객체는 암호학적 작업을 수행하는 데 사용되어서는 MUST NOT 안 됩니다. 같은 키가 서로 다른 알고리즘이 지정된, 또는 알고리즘이 지정되지 않은 다른 키 구조에 있을 수 있음에 유의하십시오. 그러나 이는 좋지 않은 보안 관행으로 간주됩니다.
kid:
이 매개변수는 키에 대한 식별자를 제공하는 데 사용됩니다. 식별자는 구조화되어 있지 않으며, 사용자가 제공한 바이트 문자열부터 키의 공개 부분에 대해 계산된 값까지 무엇이든 될 수 있습니다. 이 필드는 검사해야 할 키 집합을 줄이기 위해 메시지의 "kid" 매개변수와 대조하기 위한 것입니다. 식별자의 값은 고유한 값이 아니며, 서로 다른 키에 대해서도 다른 키 객체에 나타날 수 있습니다.
key_ops:
이 매개변수는 키가 사용될 작업 집합을 제한하도록 정의됩니다. 필드의 값은 표 5의 값 배열입니다. 알고리즘은 나타날 수 있고 특정 작업에 필요한 key ops 값을 정의합니다. 값 집합은 [RFC7517][W3C.WebCrypto]의 값과 일치합니다.
Base IV:

이 매개변수는 IV의 기본 부분을 전달하도록 정의됩니다. 이는 섹션 3.1에서 정의된 Partial IV 헤더 매개변수와 함께 사용되도록 설계되었습니다. 이 필드는 키와 Base IV를 연결하고, 이후 메시지별로 Partial IV로 수정할 수 있는 기능을 제공합니다.

애플리케이션에서 Base IV를 사용할 때는 극도의 주의가 필요합니다. 많은 암호화 알고리즘은 동일한 IV가 두 번 사용되면 보안을 잃습니다.

각 송신자에 대해 서로 다른 키가 유도되는 경우, 동일한 Base IV에서 시작하는 것은 이 조건을 만족할 가능성이 큽니다. 여러 송신자에게 동일한 키가 사용되는 경우, 애플리케이션은 송신자 간에 IV 공간을 나누는 방법을 제공해야 합니다. 이는 시작할 다른 기본 지점을 제공하거나, 시작할 다른 Partial IV를 제공하고, 재키잉 전에 보낼 메시지 수를 제한함으로써 수행될 수 있습니다.

표 5: 키 작업 값
이름 설명
sign 1 키는 서명을 생성하는 데 사용됩니다. 개인 키 필드가 필요합니다.
verify 2 키는 서명 검증에 사용됩니다.
encrypt 3 키는 키 전송 암호화에 사용됩니다.
decrypt 4 키는 키 전송 복호화에 사용됩니다. 개인 키 필드가 필요합니다.
wrap key 5 키는 key wrap 암호화에 사용됩니다.
unwrap key 6 키는 key wrap 복호화에 사용됩니다. 개인 키 필드가 필요합니다.
derive key 7 키는 키를 유도하는 데 사용됩니다. 개인 키 필드가 필요합니다.
derive bits 8 키는 키로 사용되지 않을 비트를 유도하는 데 사용됩니다. 개인 키 필드가 필요합니다.
MAC create 9 키는 MAC을 생성하는 데 사용됩니다.
MAC verify 10 키는 MAC을 검증하는 데 사용됩니다.

8. COSE에서 사용하는 알고리즘의 분류

이 섹션에서는 COSE에서 사용할 수 있는 다양한 알고리즘 유형의 분류를 제시합니다. 이 분류는 완전한 것으로 간주해서는 안 됩니다. 이 분류에 들어맞지 않는 새로운 알고리즘이 만들어질 것입니다.

8.1. 서명 알고리즘

서명 알고리즘은 데이터 출처 및 데이터 무결성 서비스를 제공합니다. 데이터 출처는 누가 데이터에 서명했는지에 기반하여 누가 데이터를 생성했는지 추론할 수 있는 능력을 제공합니다. 데이터 무결성은 데이터가 서명된 이후 수정되지 않았음을 검증할 수 있는 능력을 제공합니다.

일반적인 서명 알고리즘 방식은 두 가지입니다. 첫 번째는 부록이 있는 서명입니다. 이 방식에서는 메시지 콘텐츠가 처리되고 서명이 생성되며, 그 서명은 부록이라고 불립니다. 이는 ECDSA 및 RSA Probabilistic Signature Scheme (RSASSA-PSS)과 같은 알고리즘에서 사용하는 방식입니다. (실제로 RSASSA-PSS의 SSA는 Signature Scheme with Appendix를 의미합니다.)

이 방식의 서명 함수는 다음과 같습니다:

signature = Sign(message content, key)

valid = Verification(message content, key, signature)

두 번째 방식은 메시지 복구가 있는 서명입니다. 이러한 알고리즘의 예는 [PVSig]입니다. 이 방식에서는 메시지 콘텐츠가 처리되지만, 그 일부가 서명에 포함됩니다. 메시지 콘텐츠의 바이트를 서명 안으로 옮기면 서명된 메시지를 더 작게 만들 수 있습니다. 서명 크기는 여전히 잠재적으로 클 수 있지만, 메시지 콘텐츠는 줄어듭니다. 이는 이러한 알고리즘을 구현하는 시스템과 이를 사용하는 애플리케이션에 영향을 미칩니다. 첫 번째 영향은 서명이 검증된 이후에야 메시지 콘텐츠를 완전히 사용할 수 있다는 것입니다. 그 시점 전에는 서명 내부에 포함된 메시지 부분을 복구할 수 없습니다. 두 번째 영향은 서명 강도에 대한 보안 분석이 메시지 콘텐츠의 구조에 크게 의존할 수 있다는 것입니다. 마지막으로, 하나의 메시지에 여러 서명이 적용되는 경우 모든 서명 알고리즘은 동일한 메시지 콘텐츠 바이트를 소비해야 합니다. 이는 하나의 메시지 안에서 signature-with-message-recovery 방식과 signature-with-appendix 방식을 혼합하는 것이 지원되지 않음을 의미합니다.

이 방식의 서명 함수는 다음과 같습니다:

signature, message sent = Sign(message content, key)

valid, message content = Verification(message sent, key, signature)

COSE에 대해 공식적으로 정의된 메시지 복구 서명 알고리즘은 아직 없습니다. 이 방식에서 발생하는 새로운 제약을 고려할 때, 이미 일부 문제가 식별되었지만 메시지 복구 서명 알고리즘을 통합할 때 추가 문제가 발생할 가능성이 높습니다. 처음 정의되는 알고리즘은 이러한 문제에 대해 결정을 내려야 하며, 그 결정은 이후 정의되는 모든 알고리즘에 구속력을 가질 가능성이 큽니다.

아래에서는 다음 용어를 사용합니다:

message content bytes:
서명되도록 애플리케이션이 제공하는 바이트 문자열입니다.
to-be-signed bytes:
서명 알고리즘에 전달되는 바이트 문자열입니다.
recovered bytes:
서명 검증 프로세스 중 복구되는 바이트입니다.

이미 식별된 문제 중 일부는 다음과 같습니다:

  • to-be-signed bytes는 message content bytes와 동일하지 않습니다. 이는 서명 처리 중 더 큰 to-be-signed 메시지를 만들기 때문입니다. recovered bytes의 길이는 message content의 길이를 초과할 수 있지만, to-be-signed bytes의 길이는 초과하지 않습니다. 예를 들어 외부에서 제공된 데이터에 기밀 정보가 포함된 경우, 이는 개인정보 보호 고려사항으로 이어질 수 있습니다.
  • recovered bytes에는 message content bytes에 없는 데이터가 포함되기 때문에, recovered bytes가 to-be-signed bytes와 어디에서 대응되는지 결정하는 데 어려움이 있을 수 있습니다. 이를 방지하기 위해 패딩 방식을 만드는 것이 가능한 선택지 중 하나일 수 있습니다.
  • 모든 메시지 복구 서명 알고리즘이 to-be-signed bytes의 끝에서 recovered bytes를 가져오는 것은 아닙니다. 이는 문제입니다. message content bytes가 to-be-signed bytes의 끝에 있기 때문입니다. 복구될 바이트가 to-be-signed bytes의 끝이 아니라 시작에서 가져와지는 경우, 기본적으로 message content bytes가 recovered bytes에 전혀 포함되지 않을 수 있습니다. 이를 처리하는 가능한 선택지 중 하나는 recovered bytes가 to-be-signed bytes의 끝이 아니라 시작에서 가져와지는 경우 to-be-signed 데이터를 뒤집는 것입니다.

서명 알고리즘은 COSE_Signature 및 COSE_Sign1 구조와 함께 사용됩니다. 이 문서 작성 시점에는 COSE에서 사용하도록 정의된 것은 부록이 있는 서명뿐입니다. 그러나 가능한 효과적인 크기 감소 때문에 메시지 복구가 있는 서명 알고리즘 사용에 상당한 관심이 표명되었습니다.

8.2. 메시지 인증 코드 (MAC) 알고리즘

메시지 인증 코드(MAC)는 데이터 인증 및 무결성 보호를 제공합니다. 이들은 데이터 출처를 제공하지 않거나 매우 제한적으로만 제공합니다. 예를 들어 MAC은 송신자의 신원을 제3자에게 증명하는 데 사용할 수 없습니다.

MAC은 signature-with-appendix 알고리즘과 동일한 방식을 사용합니다. 메시지 콘텐츠가 처리되고 인증 코드가 생성됩니다. 인증 코드는 흔히 tag라고 불립니다.

MAC 함수는 다음과 같습니다:

tag = MAC_Create(message content, key)

valid = MAC_Verify(message content, key, tag)

MAC 알고리즘은 블록 암호 알고리즘(즉, AES-MAC) 또는 해시 알고리즘(즉, Hash-based Message Authentication Code(HMAC))을 기반으로 할 수 있습니다. [RFC9053]은 이러한 각 구성 방식을 사용하는 MAC 알고리즘을 정의합니다.

MAC 알고리즘은 COSE_Mac 및 COSE_Mac0 구조에서 사용됩니다.

8.3. 콘텐츠 암호화 알고리즘

콘텐츠 암호화 알고리즘은 대칭 키를 사용하여 잠재적으로 큰 데이터 블록에 대한 데이터 기밀성을 제공합니다. 이들은 암호화된 데이터의 무결성을 제공합니다. 그러나 데이터 출처는 제공하지 않거나 매우 제한적으로만 제공합니다. (예를 들어, 이를 송신자의 신원을 제3자에게 증명하는 데 사용할 수 없습니다.) 데이터 출처를 제공하는 능력은 CEK가 어떻게 획득되는지와 연결됩니다.

COSE는 합법적인 콘텐츠 암호화 알고리즘 집합을 콘텐츠와 추가 데이터 모두의 인증을 지원하는 알고리즘으로 제한합니다. 암호화 프로세스는 어떤 형태의 인증 값을 생성하지만, 그 값은 알고리즘 정의 측면에서 명시적이거나 암시적일 수 있습니다. 단순화를 위해 인증 코드는 일반적으로 암호문 스트림에 추가되는 것으로 정의됩니다. 암호화 함수는 다음과 같습니다:

ciphertext = Encrypt(message content, key, additional data)

valid, message content = Decrypt(ciphertext, key, additional data)

대부분의 AEAD 알고리즘은 복호화가 유효한 경우에만 메시지 콘텐츠를 반환하는 것으로 논리적으로 정의됩니다. 많은 구현이 이 관례를 따르지만, 모든 구현이 그런 것은 아닙니다. 복호화가 검증되지 않으면 메시지 콘텐츠를 사용해서는 MUST NOT 안 됩니다.

이러한 알고리즘은 COSE_Encrypt 및 COSE_Encrypt0에서 사용됩니다.

8.4. 키 유도 함수 (KDF)

KDF는 어떤 비밀 값을 가져와 다른 값을 생성하는 데 사용됩니다. 비밀 값에는 세 가지 종류가 있습니다:

일반 KDF는 첫 번째 유형의 비밀에는 잘 작동하고, 두 번째 유형의 비밀에는 합리적으로 잘 작동할 수 있지만, 마지막 유형의 비밀에는 일반적으로 잘 작동하지 않습니다. 무작위가 아닌 비밀에는 Argon2 [RFC9106]와 같은 함수를 사용해야 합니다.

동일한 KDF는 첫 번째 두 유형의 비밀을 서로 다른 방식으로 처리하도록 설정될 수 있습니다. 섹션 5.1 of [RFC9053]에서 정의된 KDF가 그러한 함수입니다. 이는 HMAC-based Extract-and-Expand Key Derivation Function(HKDF)을 중심으로 정의된 알고리즘 집합에 반영되어 있습니다.

KDF를 사용할 때 포함되는 구성 요소 중 하나는 context 정보입니다. context 정보는 동일한 비밀에서 서로 다른 키 자료가 유도될 수 있게 하는 데 사용됩니다. context 기반 키 자료의 사용은 좋은 보안 관행으로 간주됩니다.

8.5. 콘텐츠 키 배포 방법

콘텐츠 키 배포 방법(수신자 알고리즘)은 여러 다른 클래스로 정의될 수 있습니다. COSE는 많은 수신자 알고리즘 클래스를 지원할 수 있는 능력을 갖고 있습니다. 이 섹션에서는 여러 클래스가 나열됩니다. [RFC7516]에서 정의된 수신자 알고리즘 클래스에 대해서는 동일한 이름이 사용됩니다. 다른 명세는 수신자 알고리즘 클래스에 대해 다른 용어를 사용하거나 일부 수신자 알고리즘 클래스를 지원하지 않습니다.

8.5.1. 직접 암호화

Direct Encryption 클래스의 알고리즘은 송신자와 수신자 사이에 비밀을 공유하며, 이 비밀은 직접 또는 조작 후 CEK로 사용됩니다. direct-encryption 모드가 사용될 때, 이는 메시지에서 사용되는 유일한 모드여야 MUST 합니다.

수신자에 대한 COSE_Recipient 구조는 다음과 같이 구성됩니다:

  • "protected" 필드는 콘텐츠 키 계산에 사용되지 않는 한 길이가 0인 바이트 문자열이어야 MUST 합니다.
  • "alg" 헤더 매개변수는 존재해야 MUST 합니다.
  • 공유 비밀을 식별하는 헤더 매개변수가 존재하는 것이 SHOULD 됩니다.
  • "ciphertext" 필드는 길이가 0인 바이트 문자열이어야 MUST 합니다.
  • "recipients" 필드는 존재하지 않아야 MUST 합니다.

8.5.2. Key Wrap

key wrap 모드에서는 CEK가 무작위로 생성되고, 그 키는 송신자와 수신자 사이의 공유 비밀로 암호화됩니다. 현재 정의된 COSE용 key wrap 알고리즘은 모두 AE 알고리즘입니다. 시스템에 무작위 키 생성을 수행할 능력이 조금이라도 있다면 key wrap 모드는 Direct Encryption보다 우수한 것으로 간주됩니다. 이는 공유 키가 어느 정도 구조가 있고 실제로 동일한 콘텐츠를 반복할 수 있는 데이터가 아니라 무작위 데이터를 래핑하는 데 사용되기 때문입니다. key wrap을 사용하면 direct-encryption 알고리즘이 제공하는 약한 데이터 출처 속성을 잃습니다.

수신자에 대한 COSE_Recipient 구조는 다음과 같이 구성됩니다:

  • key wrap 알고리즘이 AE 알고리즘인 경우, "protected" 필드는 길이가 0인 바이트 문자열이어야 MUST 합니다.
  • "recipients" 필드는 보통 존재하지 않지만 사용할 수 있습니다. 애플리케이션은 지원되지 않는 알고리즘이 있는 recipient 필드가 존재하는 경우를 처리해야 MUST 합니다. 해당 특정 수신자를 복호화하지 못하는 것은 이를 처리하는 허용 가능한 방법입니다. 메시지 처리를 실패시키는 것은 이를 처리하는 허용 가능한 방법이 아닙니다.
  • 암호화될 평문은 다음 아래 계층(보통 콘텐츠 계층)의 키입니다.
  • 최소한 "unprotected" 필드는 "alg" 헤더 매개변수를 포함해야 MUST 하며, 공유 비밀을 식별하는 헤더 매개변수를 포함하는 것이 SHOULD 됩니다.

8.5.3. 키 전송

키 전송 모드는 일부 표준에서 키 암호화 모드라고도 불립니다. 키 전송 모드는 키를 보호하기 위해 대칭 암호화 알고리즘이 아니라 비대칭 암호화 알고리즘을 사용한다는 점에서 key wrap 모드와 다릅니다. 키 전송 알고리즘 집합은 [RFC8230]에서 정의됩니다.

키 전송 알고리즘을 사용할 때, 수신자에 대한 COSE_Recipient 구조는 다음과 같이 구성됩니다:

  • "protected" 필드는 길이가 0인 바이트 문자열이어야 MUST 합니다.
  • 암호화될 평문은 다음 아래 계층(보통 콘텐츠 계층)의 키입니다.
  • 최소한 "unprotected" 필드는 "alg" 헤더 매개변수를 포함해야 MUST 하며, 비대칭 키를 식별하는 매개변수를 포함하는 것이 SHOULD 됩니다.

8.5.4. 직접 키 합의

Direct Key Agreement 클래스의 수신자 알고리즘은 키 합의 방법을 사용하여 공유 비밀을 생성합니다. 그런 다음 공유 비밀에 KDF를 적용하여 데이터를 보호하는 데 사용할 키를 유도합니다. 이 키는 일반적으로 CEK 또는 MAC 키로 사용되지만, 두 계층을 초과하여 사용하는 경우 다른 목적으로도 사용할 수 있습니다(부록 B 참조).

가장 일반적으로 사용되는 키 합의 알고리즘은 Diffie-Hellman이지만, 다른 변형도 존재합니다. COSE는 온라인 환경이 아니라 저장 후 전달 환경을 위해 설계되었기 때문에, 메시지 수신자가 어떤 동적 키 자료도 제공할 수 없으므로 많은 DH 변형을 사용할 수 없습니다. 이로 인한 한 가지 부수 효과는 전방 보안([RFC4949] 참조)을 달성할 수 없다는 것입니다. COSE 객체의 수신자에는 항상 정적 키가 사용됩니다.

지원되는 DH의 두 가지 변형은 다음과 같습니다:

Ephemeral-Static (ES) DH:
메시지의 송신자는 일회용 DH 키를 만들고 수신자에는 정적 키를 사용합니다. 임시 송신자 키의 사용은 이것이 각 메시지마다 무작위로 생성되므로 추가적인 무작위 입력이 필요하지 않음을 의미합니다.
Static-Static (SS) DH:
송신자와 수신자 모두에 정적 키가 사용됩니다. 정적 키의 사용은 수신자가 메시지에 대한 약한 형태의 데이터 출처를 얻을 수 있게 합니다. Static-Static 키 합의가 사용될 때는 각 메시지마다 다른 키가 생성되도록 보장하기 위해 KDF에 대한 어떤 고유 데이터 조각이 필요합니다.

직접 키 합의 모드가 사용될 때, 메시지에는 수신자가 하나만 있어야 MUST 합니다. 이 방법은 키를 직접 생성하며, 이로 인해 추가 수신자와 혼합하기 어렵습니다. 여러 수신자가 필요한 경우 key wrap을 사용하는 버전을 사용해야 합니다.

수신자에 대한 COSE_Recipient 구조는 다음과 같이 구성됩니다:

  • 최소한 헤더는 "alg" 헤더 매개변수를 포함해야 MUST 하며, 수신자의 비대칭 키를 식별하는 헤더 매개변수를 포함하는 것이 SHOULD 됩니다.
  • 헤더는 Static-Static 버전의 경우 송신자의 키를 식별하는 것이 SHOULD 되며, ephemeral-static 버전의 경우 송신자의 임시 키를 포함해야 MUST 합니다.

8.5.5. 키 래핑을 사용하는 키 합의

Key Agreement with Key Wrap은 무작위로 생성된 CEK를 사용합니다. 그런 다음 CEK는 key wrap 알고리즘과 키 합의 알고리즘이 계산한 공유 비밀에서 유도된 키를 사용하여 암호화됩니다. 이를 위한 함수는 다음과 같습니다:

encryptedKey = KeyWrap(KDF(DH-Shared, context), CEK)

수신자에 대한 COSE_Recipient 구조는 다음과 같이 구성됩니다:

  • "protected" 필드는 KDF context 구조에 입력됩니다.
  • 암호화될 평문은 다음 아래 계층(보통 콘텐츠 계층)의 키입니다.
  • "alg" 헤더 매개변수는 계층에 존재해야 MUST 합니다.
  • 수신자의 키를 식별하는 헤더 매개변수가 존재하는 것이 SHOULD 됩니다. 송신자의 키를 식별하는 헤더 매개변수가 존재하는 것이 SHOULD 됩니다.

9. CBOR 인코딩 제한

이 문서는 CBOR Encoder가 어떻게 작동해야 하는지에 부과하는 제한을 한정합니다. 새로운 인코딩 제한은 섹션 4.2.1 of RFC 8949 [STD94]에 명시된 Core Deterministic Encoding Requirements와 정렬되어 있습니다. 이는 다음 제한으로 좁혀졌습니다:

10. 애플리케이션 프로파일링 고려사항

이 문서는 보안 서비스 집합을 제공하도록 설계되었지만 특정 사용에 대한 알고리즘 구현 요구사항을 부과하지는 않습니다. 상호운용성 요구사항은 각각의 개별 서비스가 어떻게 사용되는지, 그리고 알고리즘이 상호운용성을 위해 어떻게 사용되어야 하는지에 대해 제공됩니다. 어떤 알고리즘과 어떤 서비스가 필요한지에 대한 요구사항은 각 애플리케이션으로 이연됩니다.

프로파일의 예는 [RFC8613]에서 찾을 수 있으며, 여기서는 CoAP 헤더와 함께 콘텐츠를 전달하기 위한 프로파일이 개발되었습니다.

이 문서의 프로파일이 생성되어 해당 특정 애플리케이션에 대한 상호운용성 요구사항을 정의하는 것이 의도되어 있습니다. 이 섹션은 이 문서를 프로파일링할 때 고려해야 할 지침과 주제 집합을 제공합니다.

11. IANA 고려사항

아래 나열된 레지스트리와 등록은 RFC 8152 [RFC8152]에서 정의되었습니다. 다음 조치의 대부분은 참조가 이 문서를 가리키도록 갱신하는 것입니다.

[RFC9053]도 원래 [RFC8152]가 설정한 레지스트리와 등록을 갱신하지만, 요청된 갱신은 상호 배타적이라는 점에 유의하십시오. 이 문서에서 요청한 갱신은 [RFC9053]에서 요청한 갱신과 충돌하거나 겹치지 않으며, 그 반대도 마찬가지입니다.

11.1. COSE Header Parameters 레지스트리

"COSE Header Parameters" 레지스트리는 [RFC8152]에서 정의되었습니다. IANA는 이 레지스트리의 참조가 [RFC8152] 대신 이 문서를 가리키도록 갱신했습니다. IANA는 또한 "counter signature" 및 "CounterSignature0"을 제외하고 [RFC8152]를 참조하던 모든 항목을 이 문서를 참조하도록 갱신했습니다. "counter signature" 및 "CounterSignature0"에 대한 참조는 계속해서 [RFC8152]를 참조합니다.

11.2. COSE Key Common Parameters 레지스트리

"COSE Key Common Parameters" 레지스트리 [COSE.KeyParameters][RFC8152]에서 정의되었습니다. IANA는 이 레지스트리의 참조가 [RFC8152] 대신 이 문서를 가리키도록 갱신했습니다. IANA는 또한 [RFC8152]를 참조하던 항목들이 이 문서를 참조하도록 갱신했습니다.

11.3. 미디어 유형 등록

11.3.1. COSE 보안 메시지

IANA는 "Media Types" 레지스트리에 "application/cose" 미디어 유형을 등록했습니다. 이 미디어 유형은 콘텐츠가 COSE 메시지임을 나타내는 데 사용됩니다.

Type name:
application
Subtype name:
cose
Required parameters:
해당 없음
Optional parameters:
cose-type
Encoding considerations:
binary
Security considerations:
RFC 9052의 보안 고려사항 섹션을 참조하십시오.
Interoperability considerations:
해당 없음
Published specification:
RFC 9052
Applications that use this media type:
HTTP(S) 전송을 통해 보안 콘텐츠를 보내는 IoT 애플리케이션.
Fragment identifier considerations:
해당 없음
Additional information:
  • 이 유형에 대한 폐기된 별칭 이름: 해당 없음
  • Magic number(s): 해당 없음
  • 파일 확장자: cbor
  • Macintosh file type code(s): 해당 없음
추가 정보를 위한 연락 담당자 및 이메일 주소:

iesg@ietf.org
Intended usage:
COMMON
Restrictions on usage:
해당 없음
Author:
Jim Schaad
Change Controller:
IESG
Provisional registration?
아니요

11.3.2. COSE Key 미디어 유형

IANA는 "Media Types" 레지스트리에 "application/cose-key" 및 "application/cose-key-set" 미디어 유형을 등록했습니다. 이러한 미디어 유형은 각각 콘텐츠가 COSE_Key 또는 COSE_KeySet 객체임을 나타내는 데 사용됩니다.

"application/cose-key"에 대한 템플릿은 다음과 같습니다:

Type name:
application
Subtype name:
cose-key
Required parameters:
해당 없음
Optional parameters:
해당 없음
Encoding considerations:
binary
Security considerations:
RFC 9052의 보안 고려사항 섹션을 참조하십시오.
Interoperability considerations:
해당 없음
Published specification:
RFC 9052
Applications that use this media type:
IoT 애플리케이션을 위한 COSE 기반 키의 배포.
Fragment identifier considerations:
해당 없음
Additional information:
  • 이 유형에 대한 폐기된 별칭 이름: 해당 없음
  • Magic number(s): 해당 없음
  • 파일 확장자: cbor
  • Macintosh file type code(s): 해당 없음
추가 정보를 위한 연락 담당자 및 이메일 주소:

iesg@ietf.org
Intended usage:
COMMON
Restrictions on usage:
해당 없음
Author:
Jim Schaad
Change Controller:
IESG
Provisional registration?
아니요

"application/cose-key-set" 등록을 위한 템플릿은 다음과 같습니다:

Type name:
application
Subtype name:
cose-key-set
Required parameters:
해당 없음
Optional parameters:
해당 없음
Encoding considerations:
binary
Security considerations:
RFC 9052의 보안 고려사항 섹션을 참조하십시오.
Interoperability considerations:
해당 없음
Published specification:
RFC 9052
Applications that use this media type:
IoT 애플리케이션을 위한 COSE 기반 키의 배포.
Fragment identifier considerations:
해당 없음
Additional information:
  • 이 유형에 대한 폐기된 별칭 이름: 해당 없음
  • Magic number(s): 해당 없음
  • 파일 확장자: cbor
  • Macintosh file type code(s): 해당 없음
추가 정보를 위한 연락 담당자 및 이메일 주소:
iesg@ietf.org
Intended usage:
COMMON
Restrictions on usage:
해당 없음
Author:
Jim Schaad
Change Controller:
IESG
Provisional registration?
아니요

11.4. CoAP Content-Formats 레지스트리

IANA는 [RFC8152]에 표시된 대로 "CoAP Content-Formats" 레지스트리에 항목을 추가했습니다. IANA는 참조가 [RFC8152] 대신 이 문서를 가리키도록 갱신했습니다.

11.5. CBOR Tags 레지스트리

IANA는 [RFC8152]에 표시된 대로 "CBOR Tags" 레지스트리에 항목을 추가했습니다. IANA는 참조가 [RFC8152] 대신 이 문서를 가리키도록 갱신했습니다.

11.6. 전문가 검토 지침

[RFC8152]가 설정한 모든 IANA 레지스트리는 적어도 부분적으로 Expert Review [RFC8126]로 정의됩니다. 이 섹션은 전문가들이 무엇을 살펴봐야 하는지에 대한 몇 가지 일반 지침을 제공하지만, 그들은 이유가 있어 전문가로 지정되므로 상당한 재량이 주어져야 합니다.

전문가 검토자는 다음을 고려해야 합니다:

  • 포인트 선점은 억제되어야 합니다. 검토자는 사용이 기존 등록과 중복되지 않고 해당 코드 포인트가 배포에서 사용될 가능성이 있음을 보장하기 위해 등록 요청에 대한 충분한 정보를 얻도록 권장됩니다. private use로 표시된 범위는 테스트 목적 및 폐쇄 환경을 위한 것입니다. 다른 범위의 코드 포인트는 테스트용으로 할당되어서는 안 됩니다.
  • Standards Action 범위에 코드 포인트를 등록하려면 Standards Track 또는 BCP RFC가 필요합니다. Specification Required 범위에는 명세가 존재해야 하지만, RFC가 제공되기 전의 조기 할당은 허용 가능한 것으로 간주됩니다. 포인트가 폐쇄 환경 밖에서 상호운용 가능한 방식으로 사용될 것으로 예상되는 경우 first-come, first-served 범위에도 명세가 필요합니다. 명세가 제공되지 않는 경우, 제공되는 설명은 해당 포인트가 무엇에 사용되는지 식별할 수 있을 만큼 충분한 정보를 가져야 합니다.
  • 전문가는 코드 포인트 할당을 승인할 때 필드의 예상 사용을 고려해야 합니다. Standards Action 범위가 Standards Track 문서에만 제공된다는 사실이 Standards Track 문서가 그 범위 밖에서 포인트를 할당받을 수 없다는 뜻은 아닙니다. 인코딩된 값의 길이는 해당 길이의 코드 포인트가 얼마나 남아 있는지, 그리고 그것이 사용될 장치의 크기와 비교하여 평가되어야 합니다.
  • 알고리즘이 등록될 때, 과시적 등록은 억제되어야 합니다. 이를 수행하는 한 가지 방법은 등록이 알고리즘의 보안 분석에 대한 추가 문서를 제공하도록 요구하는 것입니다. 고려해야 할 또 다른 사항은 Crypto Forum Research Group(CFRG)에 알고리즘에 대한 의견을 요청하는 것입니다. 알고리즘은 등록에 적합하려면 커뮤니티의 보안 요구사항과 메시지 구조의 요구사항을 충족해야 합니다.

12. 보안 고려사항

이 명세의 구현자가 고려해야 할 보안 고려사항이 여러 가지 있습니다. 일부 고려사항은 여기에서 강조되었지만, 추가 고려사항은 참고문헌에 나열된 문서에서 찾을 수 있습니다.

구현은 모든 개인의 개인 키 자료를 보호해야 합니다. 이 문서의 일부 경우는 이 문제와 관련하여 강조될 필요가 있습니다.

Elliptic Curve Diffie-Hellman(ECDH) 및 direct plus KDF(key wrap 없음)를 사용한다고 해서 개인 키가 직접 누출되지는 않습니다. KDF의 일방향 함수가 이를 방지할 것입니다. 그러나 해결해야 할 다른 문제가 있습니다. 두 수신자가 있으면 CEK가 두 수신자 사이에서 공유되어야 합니다. 따라서 두 번째 수신자는 약한 출처 증명에 사용될 수 있는 자료에서 유도된 CEK를 갖게 됩니다. 두 번째 수신자는 동일한 CEK를 사용하여 메시지를 만들고 첫 번째 수신자에게 보낼 수 있습니다. 첫 번째 수신자는 Static-Static ECDH 또는 direct plus KDF에 대해 CEK가 출처 증명에 사용될 수 있다고 가정할 것입니다. 비록 그것이 잘못된 엔터티에서 온 것이라도 말입니다. key wrap 단계가 추가되면 출처 증명이 암시되지 않으므로 이는 문제가 되지 않습니다.

앞서 언급되었지만, 단일 키를 여러 알고리즘에 사용하는 것이 일부 경우 키에 대한 정보를 누출하여 공격자가 무결성 tag를 위조하거나 암호화된 콘텐츠에 대한 정보를 얻을 기회를 제공한다는 점은 다시 강조할 가치가 있습니다. 키를 단일 알고리즘에 바인딩하면 이러한 문제가 방지됩니다. 키 생성자와 키 소비자는 서로 다른 각 알고리즘에 대해 새 키를 만들 뿐 아니라, 키 자료 배포에 해당 알고리즘 선택을 포함하고, 키 구조의 알고리즘과 메시지 구조의 알고리즘이 일치하는지 엄격히 강제할 것을 강력히 권장합니다. 알고리즘이 올바른지 확인하는 것 외에도, 키 형식도 확인해야 합니다. "OKP" 키가 예상되는 곳에서 "EC2" 키를 사용하지 마십시오.

전송에 키를 사용하기 전, 또는 수신한 정보에 따라 행동하기 전에는 키에 대한 신뢰 결정을 내려야 합니다. 데이터 또는 작업이 키와 연결된 엔터티가 볼 권리 또는 요청할 권리가 있는 것입니까? 여러 요인이 이 신뢰 결정과 관련됩니다. 여기에서 강조하는 일부는 다음과 같습니다:

노출되고 있는 한 영역은 메시지 길이를 기반으로 한 암호화된 메시지의 트래픽 분석입니다. 이 명세는 메시지 구조의 일부로 패딩을 제공하는 통일된 방법을 제공하지 않습니다. 관찰자는 [RFC9053]에서 정의된 모든 콘텐츠 암호화 알고리즘에 대해 길이를 기반으로 두 개의 서로 다른 메시지(예: "YES"와 "NO")를 구별할 수 있습니다. 이는 그러한 분석을 방지하거나 억제하기 위해 콘텐츠 패딩이 어떻게 수행되어야 하는지 문서화하는 것이 애플리케이션의 몫임을 의미합니다. (예를 들어, 텍스트 문자열은 "YES"와 "NO "로 정의될 수 있습니다.)

13. 참고문헌

13.1. 규범적 참고문헌

[RFC2119]
Bradner, S., "RFC에서 요구사항 수준을 나타내기 위해 사용하는 핵심 단어", BCP 14, RFC 2119, DOI 10.17487/RFC2119, , <https://www.rfc-editor.org/info/rfc2119>.
[RFC8174]
Leiba, B., "RFC 2119 핵심 단어에서 대문자와 소문자의 모호성", BCP 14, RFC 8174, DOI 10.17487/RFC8174, , <https://www.rfc-editor.org/info/rfc8174>.
[RFC9053]
Schaad, J., "CBOR 객체 서명 및 암호화(COSE): 초기 알고리즘", RFC 9053, DOI 10.17487/RFC9053, , <https://www.rfc-editor.org/info/rfc9053>.
[STD94]
Bormann, C. and P. Hoffman, "간결한 이진 객체 표현(CBOR)", STD 94, RFC 8949, , <https://www.rfc-editor.org/info/std94>.

13.2. 정보성 참고문헌

[BCP201]
Housley, R., "암호학적 알고리즘 민첩성 및 필수 구현 알고리즘 선택을 위한 지침", BCP 201, RFC 7696, , <https://www.rfc-editor.org/info/bcp201>.
[COAP.Formats]
IANA, "CoAP Content-Formats", <https://www.iana.org/assignments/core-parameters/>.
[CORE-GROUPCOMM]
Dijk, E., Wang, C., and M. Tiloca, "제약된 애플리케이션 프로토콜(CoAP)을 위한 그룹 통신", 진행 중인 작업, Internet-Draft, draft-ietf-core-groupcomm-bis-07, , <https://datatracker.ietf.org/doc/html/draft-ietf-core-groupcomm-bis-07>.
[COSE-COUNTERSIGN]
Schaad, J. and R. Housley, "CBOR 객체 서명 및 암호화(COSE): 카운터서명", 진행 중인 작업, Internet-Draft, draft-ietf-cose-countersign-08, , <https://datatracker.ietf.org/doc/html/draft-ietf-cose-countersign-08>.
[COSE.Algorithms]
IANA, "COSE Algorithms", <https://www.iana.org/assignments/cose/>.
[COSE.KeyParameters]
IANA, "COSE Key Common Parameters", <https://www.iana.org/assignments/cose/>.
[COSE.KeyTypes]
IANA, "COSE Key Types", <https://www.iana.org/assignments/cose/>.
[DSS]
National Institute of Standards and Technology, "디지털 서명 표준(DSS)", FIPS 186-4, DOI 10.6028/NIST.FIPS.186-4, , <https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.186-4.pdf>.
[GitHub-Examples]
"GitHub의 COSE 예제", commit 3221310, , <https://github.com/cose-wg/Examples>.
[PVSig]
Brown, D.R.L. and D.B. Johnson, "부분 메시지 복구가 있는 서명 방식에 대한 형식적 보안 증명", LNCS Volume 2020, DOI 10.1007/3-540-45353-9_11, , <https://www.certicom.com/content/dam/certicom/images/pdfs/CerticomWP-PVSigSec_login.pdf>.
[RFC2633]
Ramsdell, B., Ed., "S/MIME 버전 3 메시지 명세", RFC 2633, DOI 10.17487/RFC2633, , <https://www.rfc-editor.org/info/rfc2633>.
[RFC3394]
Schaad, J. and R. Housley, "고급 암호화 표준(AES) Key Wrap 알고리즘", RFC 3394, DOI 10.17487/RFC3394, , <https://www.rfc-editor.org/info/rfc3394>.
[RFC3851]
Ramsdell, B., Ed., "Secure/Multipurpose Internet Mail Extensions(S/MIME) 버전 3.1 메시지 명세", RFC 3851, DOI 10.17487/RFC3851, , <https://www.rfc-editor.org/info/rfc3851>.
[RFC4262]
Santesson, S., "Secure/Multipurpose Internet Mail Extensions(S/MIME) Capabilities를 위한 X.509 인증서 확장", RFC 4262, DOI 10.17487/RFC4262, , <https://www.rfc-editor.org/info/rfc4262>.
[RFC4949]
Shirey, R., "인터넷 보안 용어집, 버전 2", FYI 36, RFC 4949, DOI 10.17487/RFC4949, , <https://www.rfc-editor.org/info/rfc4949>.
[RFC5116]
McGrew, D., "인증 암호화를 위한 인터페이스 및 알고리즘", RFC 5116, DOI 10.17487/RFC5116, , <https://www.rfc-editor.org/info/rfc5116>.
[RFC5652]
Housley, R., "암호 메시지 구문 (CMS)", STD 70, RFC 5652, DOI 10.17487/RFC5652, , <https://www.rfc-editor.org/info/rfc5652>.
[RFC5751]
Ramsdell, B. and S. Turner, "Secure/Multipurpose Internet Mail Extensions(S/MIME) 버전 3.2 메시지 명세", RFC 5751, DOI 10.17487/RFC5751, , <https://www.rfc-editor.org/info/rfc5751>.
[RFC5752]
Turner, S. and J. Schaad, "암호 메시지 구문(CMS)의 다중 서명", RFC 5752, DOI 10.17487/RFC5752, , <https://www.rfc-editor.org/info/rfc5752>.
[RFC5990]
Randall, J., Kaliski, B., Brainard, J., and S. Turner, "암호 메시지 구문(CMS)에서 RSA-KEM 키 전송 알고리즘의 사용", RFC 5990, DOI 10.17487/RFC5990, , <https://www.rfc-editor.org/info/rfc5990>.
[RFC6838]
Freed, N., Klensin, J., and T. Hansen, "미디어 유형 명세 및 등록 절차", BCP 13, RFC 6838, DOI 10.17487/RFC6838, , <https://www.rfc-editor.org/info/rfc6838>.
[RFC7252]
Shelby, Z., Hartke, K., and C. Bormann, "제약된 애플리케이션 프로토콜(CoAP)", RFC 7252, DOI 10.17487/RFC7252, , <https://www.rfc-editor.org/info/rfc7252>.
[RFC7515]
Jones, M., Bradley, J., and N. Sakimura, "JSON Web Signature(JWS)", RFC 7515, DOI 10.17487/RFC7515, , <https://www.rfc-editor.org/info/rfc7515>.
[RFC7516]
Jones, M. and J. Hildebrand, "JSON Web Encryption(JWE)", RFC 7516, DOI 10.17487/RFC7516, , <https://www.rfc-editor.org/info/rfc7516>.
[RFC7517]
Jones, M., "JSON Web Key(JWK)", RFC 7517, DOI 10.17487/RFC7517, , <https://www.rfc-editor.org/info/rfc7517>.
[RFC7518]
Jones, M., "JSON Web Algorithms(JWA)", RFC 7518, DOI 10.17487/RFC7518, , <https://www.rfc-editor.org/info/rfc7518>.
[RFC8032]
Josefsson, S. and I. Liusvaara, "Edwards-Curve Digital Signature Algorithm(EdDSA)", RFC 8032, DOI 10.17487/RFC8032, , <https://www.rfc-editor.org/info/rfc8032>.
[RFC8126]
Cotton, M., Leiba, B., and T. Narten, "RFC에서 IANA 고려사항 섹션을 작성하기 위한 지침", BCP 26, RFC 8126, DOI 10.17487/RFC8126, , <https://www.rfc-editor.org/info/rfc8126>.
[RFC8152]
Schaad, J., "CBOR 객체 서명 및 암호화(COSE)", RFC 8152, DOI 10.17487/RFC8152, , <https://www.rfc-editor.org/info/rfc8152>.
[RFC8230]
Jones, M., "CBOR 객체 서명 및 암호화(COSE) 메시지와 RSA 알고리즘 사용", RFC 8230, DOI 10.17487/RFC8230, , <https://www.rfc-editor.org/info/rfc8230>.
[RFC8551]
Schaad, J., Ramsdell, B., and S. Turner, "Secure/Multipurpose Internet Mail Extensions(S/MIME) 버전 4.0 메시지 명세", RFC 8551, DOI 10.17487/RFC8551, , <https://www.rfc-editor.org/info/rfc8551>.
[RFC8610]
Birkholz, H., Vigano, C., and C. Bormann, "간결한 데이터 정의 언어(CDDL): 간결한 이진 객체 표현(CBOR) 및 JSON 데이터 구조를 표현하기 위한 표기 규약", RFC 8610, DOI 10.17487/RFC8610, , <https://www.rfc-editor.org/info/rfc8610>.
[RFC8613]
Selander, G., Mattsson, J., Palombini, F., and L. Seitz, "제약된 RESTful 환경을 위한 객체 보안(OSCORE)", RFC 8613, DOI 10.17487/RFC8613, , <https://www.rfc-editor.org/info/rfc8613>.
[RFC9054]
Schaad, J., "CBOR 객체 서명 및 암호화(COSE): 해시 알고리즘", RFC 9054, DOI 10.17487/RFC9054, , <https://www.rfc-editor.org/info/rfc9054>.
[RFC9106]
Biryukov, A., Dinu, D., Khovratovich, D., and S. Josefsson, "Password 해싱 및 작업 증명 애플리케이션을 위한 Argon2 메모리-하드 함수", RFC 9106, DOI 10.17487/RFC9106, , <https://www.rfc-editor.org/info/rfc9106>.
[STD90]
Bray, T., Ed., "JavaScript Object Notation (JSON) 데이터 교환 형식", STD 90, RFC 8259, , <https://www.rfc-editor.org/info/std90>.
[W3C.WebCrypto]
Watson, M., Ed., "Web Cryptography API", W3C 권고안, , <https://www.w3.org/TR/WebCryptoAPI/>.

부록 A. 알고리즘의 외부 데이터 인증을 위한 지침

COSE 개발 중에 알고리즘 식별자가 보호 속성에 위치해야 한다는 요구사항은 must에서 should로 완화되었습니다. 이 입장을 뒷받침하기 위해 두 가지 기본적인 이유가 제시되었습니다. 첫째, CoAP 환경에서 가장 일반적인 메시지에서 알고리즘 식별자를 생략하면 결과 메시지가 더 작아집니다. 둘째, 알고리즘 식별자가 배치될 수 있는 서로 다른 위치(메시지 자체, 애플리케이션 진술, 송신자가 보유한 키 구조, 수신자가 보유한 키 구조) 사이에서 전체 검사가 올바르게 수행되지 않으면 잠재적인 버그가 발생할 수 있습니다.

이 부록은 그러한 변경이 어떻게 이루어질 수 있는지와, 이 옵션을 사용하기 위해 애플리케이션이 지정해야 하는 세부사항을 설명합니다. 두 가지 서로 다른 세부사항 집합이 지정됩니다. 하나는 알고리즘 식별자를 생략하는 데 필요한 것이고, 다른 하나는 자신에 대한 속성을 포함하지 않는 countersignature 속성의 변형을 사용하는 데 필요한 것입니다.

세 가지 권장사항 집합이 제시됩니다. 첫 번째 권장사항 집합은 COSE 객체의 단일 계층에 대해 암시적 알고리즘이 식별되는 경우에 적용됩니다. 두 번째 권장사항 집합은 COSE 객체의 여러 계층에 대해 여러 암시적 알고리즘이 식별되는 경우에 적용됩니다. 세 번째 권장사항 집합은 여러 COSE 객체 구성에 대해 암시적 알고리즘을 갖는 경우에 적용됩니다.

BCP 14([RFC2119][RFC8174])의 핵심 단어는 여기에서 의도적으로 사용되지 않습니다. 이 명세는 권장사항을 제공할 수는 있지만, 이를 강제할 수는 없습니다.

이 권장사항 집합은 애플리케이션이 단일 COSE 객체에서 사용하기 위해 키 정보와 함께 고정 알고리즘을 배포하는 경우에 적용됩니다. 이는 일반적으로 가장 작은 COSE 객체, 구체적으로 COSE_Sign1, COSE_Mac0 및 COSE_Encrypt0에 적용되지만, 다른 구조에도 적용될 수 있습니다.

다음 항목들을 고려해야 합니다:

두 번째 경우는 다중 계층 COSE 객체에 대해 여러 암시적 알고리즘 식별자가 지정되는 경우입니다. 이것이 어떻게 작동하는지에 대한 예는 애플리케이션이 지정하는 암호화 context이며, 이는 콘텐츠 암호화 알고리즘, key wrap 알고리즘, 키 식별자 및 공유 비밀을 포함합니다. 송신자는 콘텐츠 계층과 수신자 계층 모두에 대한 알고리즘 식별자 전송을 생략하고 키 식별자만 남깁니다. 그러면 수신자는 키 식별자를 사용하여 암시적 알고리즘 식별자를 얻습니다.

다음 추가 항목들을 고려해야 합니다:

세 번째 경우는 여러 암시적 알고리즘 식별자가 있지만, 잠재적으로 관련 없는 계층 또는 서로 다른 COSE 객체를 대상으로 하는 경우입니다. 이것이 적용될 수 있는 여러 다른 시나리오가 있습니다. 이러한 시나리오 중 일부는 다음과 같습니다:

이러한 경우에는 다음 추가 항목을 고려해야 합니다:

부록 B. 수신자 정보의 두 계층

현재 정의된 모든 수신자 알고리즘 클래스는 COSE 구조의 두 계층만 사용합니다. 첫 번째 계층(COSE_Encrypt)은 메시지 콘텐츠이고, 두 번째 계층(COSE_Recipient)은 콘텐츠 키 암호화입니다. 그러나 RSA Key Encapsulation Mechanism(RSA-KEM)과 같은 수신자 알고리즘을 사용하는 경우 (RSA-KEM [RFC5990]의 부록 A 참조), COSE_Recipient 구조의 두 계층을 갖는 것이 타당합니다.

이러한 계층은 다음과 같습니다:

다음은 삼중 계층 메시지가 어떤 모습인지 보여 주는 예입니다. 읽기 쉽게 하기 위해, 바이너리 덤프가 아니라 확장 CBOR 진단 표기법([RFC8610]에서 정의됨)을 사용하여 제시됩니다. 메시지는 다음 계층을 갖습니다:

사실상 이 예는 ECDH-ES+A128KW 알고리즘 사용을 분해한 버전입니다.

바이너리 파일의 크기는 183바이트입니다

96(
  [ / COSE_Encrypt /
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >>,
    / unprotected / {
      / iv / 5:h'02d1f7e6f26c43d4868d87ce'
    },
    / ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e2852948658f0
811139868826e89218a75715b',
    / recipients / [
      [ / COSE_Recipient /
        / protected / h'',
        / unprotected / {
          / alg / 1:-3 / A128KW /
        },
        / ciphertext / h'dbd43c4e9d719c27c6275c67d628d493f090593db82
18f11',
        / recipients / [
          [ / COSE_Recipient /
            / protected h'a1013818' / << {
                / alg / 1:-25 / ECDH-ES + HKDF-256 /
              } >> ,
            / unprotected / {
              / ephemeral / -1:{
                / kty / 1:2,
                / crv / -1:1,
                / x / -2:h'b2add44368ea6d641f9ca9af308b4079aeb519f11
e9b8a55a600b21233e86e68',
                / y / -3:false
              },
              / kid / 4:'meriadoc.brandybuck@buckland.example'
            },
            / ciphertext / h''
          ]
        ]
      ]
    ]
  ]
)

부록 C. 예제

이 부록은 이 문서에서 정의된 다양한 기능과 메시지 유형을 보여 주는 예제 집합을 포함합니다. 예제를 더 읽기 쉽게 하기 위해, 바이너리 덤프가 아니라 확장 CBOR 진단 표기법([RFC8610]에서 정의됨)을 사용하여 제시됩니다.

[GitHub-Examples]에 GitHub 프로젝트가 생성되어 있으며, 여기에는 이 문서에 제시된 예제뿐 아니라 더 완전한 테스트 예제 집합도 포함되어 있습니다. 각 예제는 예제를 만드는 데 사용된 입력, 예제를 디버깅할 때 사용할 수 있는 일부 중간 값, 그리고 예제의 출력을 hex dump와 CBOR 진단 표기법 형식으로 모두 포함하는 JSON 파일에서 찾을 수 있습니다. 사이트의 일부 예제는 실패 테스트 사례로 설계되어 있으며, 이러한 예제는 JSON 파일에서 명확히 그렇게 표시되어 있습니다. 이 문서의 예제에서 오류가 발견되면 GitHub의 예제가 갱신되고, 그 취지의 메모가 JSON 파일에 배치됩니다.

앞서 언급했듯이 예제는 CBOR의 진단 표기법을 사용하여 제시됩니다. 진단 표기법과 바이너리 사이를 변환할 수 있는 Ruby 기반 도구가 존재합니다. 이 도구는 다음 명령줄로 설치할 수 있습니다:

gem install cbor-diag

진단 표기법은 다음 명령줄을 사용하여 바이너리 파일로 변환할 수 있습니다:

diag2cbor.rb < inputfile > outputfile

모든 소스 코드가 type='cbor-diag' 속성으로 태그되어 있으므로, 예제는 XPath 표현식을 통해 이 문서의 XML 버전에서 추출할 수 있습니다. (사용 중인 XPath 평가기에 따라 &gt;를 엔터티로 처리해야 할 수도 있습니다.)

//sourcecode[@type='cbor-diag']/text()

C.1. 서명된 메시지의 예

C.1.1. 단일 서명

이 예제는 다음을 사용합니다:

  • 서명 알고리즘: ECDSA w/ SHA-256, Curve P-256

바이너리 파일의 크기는 103바이트입니다

98(
  [
    / protected / h'',
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
      ]
    ]
  ]
)

C.1.2. 여러 서명자

이 예제는 다음을 사용합니다:

  • 서명 알고리즘: ECDSA w/ SHA-256, Curve P-256
  • 서명 알고리즘: ECDSA w/ SHA-512, Curve P-521

바이너리 파일의 크기는 277바이트입니다

98(
  [
    / protected / h'',
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'e2aeafd40d69d19dfe6e52077c5d7ff4e408282cbefb
5d06cbf414af2e19d982ac45ac98b8544c908b4507de1e90b717c3d34816fe926a2b
98f53afd2fa0f30a'
      ],
      [
        / protected h'a1013823' / << {
            / alg / 1:-36 / ECDSA 521 /
          } >> ,
        / unprotected / {
          / kid / 4:'bilbo.baggins@hobbiton.example'
        },
        / signature / h'00a2d28a7c2bdb1587877420f65adf7d0b9a06635dd1
de64bb62974c863f0b160dd2163734034e6ac003b01e8705524c5c4ca479a952f024
7ee8cb0b4fb7397ba08d009e0c8bf482270cc5771aa143966e5a469a09f613488030
c5b07ec6d722e3835adb5b2d8c44e95ffb13877dd2582866883535de3bb03d01753f
83ab87bb4f7a0297'
      ]
    ]
  ]
)

C.1.3. 중요도 표시가 있는 서명

이 예제는 다음을 사용합니다:

  • 서명 알고리즘: ECDSA w/ SHA-256, Curve P-256
  • "reserved" 헤더 매개변수에 중요도 표시가 있습니다.

바이너리 파일의 크기는 125바이트입니다

98(
  [
    / protected h'a2687265736572766564f40281687265736572766564' /
    << {
        "reserved":false,
        / crit / 2:[
          "reserved"
        ]
      } >>,
    / unprotected / {},
    / payload / 'This is the content.',
    / signatures / [
      [
        / protected h'a10126' / << {
            / alg / 1:-7 / ECDSA 256 /
          } >>,
        / unprotected / {
          / kid / 4:'11'
        },
        / signature / h'3fc54702aa56e1b2cb20284294c9106a63f91bac658d
69351210a031d8fc7c5ff3e4be39445b1a3e83e1510d1aca2f2e8a7c081c7645042b
18aba9d1fad1bd9c'
      ]
    ]
  ]
)

C.2. 단일 서명자 예제

C.2.1. 단일 ECDSA 서명

이 예제는 다음을 사용합니다:

  • 서명 알고리즘: ECDSA w/ SHA-256, Curve P-256

바이너리 파일의 크기는 98바이트입니다

18(
  [
    / protected h'a10126' / << {
        / alg / 1:-7 / ECDSA 256 /
      } >>,
    / unprotected / {
      / kid / 4:'11'
    },
    / payload / 'This is the content.',
    / signature / h'8eb33e4ca31d1c465ab05aac34cc6b23d58fef5c083106c4
d25a91aef0b0117e2af9a291aa32e14ab834dc56ed2a223444547e01f11d3b0916e5
a4c345cacb36'
  ]
)

C.3. 엔벨로프 메시지의 예

C.3.1. Direct ECDH

이 예제는 다음을 사용합니다:

  • CEK: 128비트 키를 사용하는 AES-GCM
  • 수신자 클래스: ECDH Ephemeral-Static, Curve P-256

바이너리 파일의 크기는 151바이트입니다

96(
  [
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >>,
    / unprotected / {
      / iv / 5:h'c9cf4df2fe6c632bf7886413'
    },
    / ciphertext / h'7adbe2709ca818fb415f1e5df66f4e1a51053ba6d65a1a0
c52a357da7a644b8070a151b0',
    / recipients / [
      [
        / protected h'a1013818' / << {
            / alg / 1:-25 / ECDH-ES + HKDF-256 /
          } >>,
        / unprotected / {
          / ephemeral / -1:{
            / kty / 1:2,
            / crv / -1:1,
            / x / -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbf
bf054e1c7b4d91d6280',
            / y / -3:true
          },
          / kid / 4:'meriadoc.brandybuck@buckland.example'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.3.2. Direct Plus Key Derivation

이 예제는 다음을 사용합니다:

  • CEK: 128비트 키를 사용하는 AES-CCM, tag를 64비트로 잘라냄
  • 수신자 클래스: 다음 암시적 필드를 context의 일부로 사용하여 공유 비밀에 HKDF를 사용합니다.

    • salt: "aabbccddeeffgghh"
    • PartyU identity: "lighting-client"
    • PartyV identity: "lighting-server"
    • Supplementary Public Other: "Encryption Example 02"

바이너리 파일의 크기는 91바이트입니다

96(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >>,
    / unprotected / {
      / iv / 5:h'89f52f65a1c580933b5261a76c'
    },
    / ciphertext / h'753548a19b1307084ca7b2056924ed95f2e3b17006dfe93
1b687b847',
    / recipients / [
      [
        / protected h'a10129' / << {
            / alg / 1:-10
          } >>,
        / unprotected / {
          / salt / -20:'aabbccddeeffgghh',
          / kid / 4:'our-secret'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.3.3. 외부 데이터가 있는 암호화된 콘텐츠

이 예제는 다음을 사용합니다:

  • CEK: 128비트 키를 사용하는 AES-GCM
  • 수신자 클래스: AES Key Wrap을 사용하는 ECDH Static-Static, Curve P-256
  • 외부에서 제공된 AAD: h'0011bbcc22dd44ee55ff660077'

바이너리 파일의 크기는 173바이트입니다

96(
  [
    / protected h'a10101' / << {
        / alg / 1:1 / AES-GCM 128 /
      } >> ,
    / unprotected / {
      / iv / 5:h'02d1f7e6f26c43d4868d87ce'
    },
    / ciphertext / h'64f84d913ba60a76070a9a48f26e97e863e28529d8f5335
e5f0165eee976b4a5f6c6f09d',
    / recipients / [
      [
        / protected / h'a101381f' / {
            \ alg \ 1:-32 \ ECDH-SS+A128KW \
          } / ,
        / unprotected / {
          / static kid / -3:'peregrin.took@tuckborough.example',
          / kid / 4:'meriadoc.brandybuck@buckland.example',
          / U nonce / -22:h'0101'
        },
        / ciphertext / h'41e0d76f579dbd0d936a662d54d8582037de2e366fd
e1c62'
      ]
    ]
  ]
)

C.4. 암호화된 메시지의 예

C.4.1. 단순 암호화 메시지

이 예제는 다음을 사용합니다:

  • CEK: 128비트 키와 64비트 tag를 사용하는 AES-CCM

바이너리 파일의 크기는 52바이트입니다

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / iv / 5:h'89f52f65a1c580933b5261a78c'
    },
    / ciphertext / h'5974e1b99a3a4cc09a659aa2e9e7fff161d38ce71cb45ce
460ffb569'
  ]
)

C.4.2. Partial IV가 있는 암호화된 메시지

이 예제는 다음을 사용합니다:

  • CEK: 128비트 키와 64비트 tag를 사용하는 AES-CCM
  • IV의 prefix는 89F52F65A1C580933B52입니다

바이너리 파일의 크기는 41바이트입니다

16(
  [
    / protected h'a1010a' / << {
        / alg / 1:10 / AES-CCM-16-64-128 /
      } >> ,
    / unprotected / {
      / partial iv / 6:h'61a7'
    },
    / ciphertext / h'252a8911d465c125b6764739700f0141ed09192de139e05
3bd09abca'
  ]
)

C.5. MACed 메시지의 예

C.5.1. 공유 비밀 Direct MAC

이 예제는 다음을 사용합니다:

  • MAC: AES-CMAC, 256비트 키, 64비트로 잘라냄
  • 수신자 클래스: direct shared secret

바이너리 파일의 크기는 57바이트입니다

97(
  [
    / protected h'a1010f' / << {
        / alg / 1:15 / AES-CBC-MAC-256//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'9e1226ba1f81b848',
    / recipients / [
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-6 / direct /,
          / kid / 4:'our-secret'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.5.2. ECDH Direct MAC

이 예제는 다음을 사용합니다:

  • MAC: HMAC w/SHA-256, 256비트 키
  • 수신자 클래스: ECDH 키 합의, 두 개의 정적 키, HKDF w/context structure

바이너리 파일의 크기는 214바이트입니다

97(
  [
    / protected h'a10105' / << {
        / alg / 1:5 / HMAC 256//256 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'81a03448acd3d305376eaa11fb3fe416a955be2cbe7ec96f012c99
4bc3f16a41',
    / recipients / [
      [
        / protected h'a101381a' / << {
            / alg / 1:-27 / ECDH-SS + HKDF-256 /
          } >> ,
        / unprotected / {
          / static kid / -3:'peregrin.took@tuckborough.example',
          / kid / 4:'meriadoc.brandybuck@buckland.example',
          / U nonce / -22:h'4d8553e7e74f3c6a3a9dd3ef286a8195cbf8a23d
19558ccfec7d34b824f42d92bd06bd2c7f0271f0214e141fb779ae2856abf585a583
68b017e7f2a9e5ce4db5'
        },
        / ciphertext / h''
      ]
    ]
  ]
)

C.5.3. Wrapped MAC

이 예제는 다음을 사용합니다:

  • MAC: AES-MAC, 128비트 키, 64비트로 잘라냄
  • 수신자 클래스: 사전 공유된 256비트 키를 사용하는 AES Key Wrap

바이너리 파일의 크기는 109바이트입니다

97(
  [
    / protected h'a1010e' / << {
        / alg / 1:14 / AES-CBC-MAC-128//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'36f5afaf0bab5d43',
    / recipients / [
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-5 / A256KW /,
          / kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
        },
        / ciphertext / h'711ab0dc2fc4585dce27effa6781c8093eba906f227
b6eb0'
      ]
    ]
  ]
)

C.5.4. 다중 수신자 MACed 메시지

이 예제는 다음을 사용합니다:

  • MAC: HMAC w/ SHA-256, 128비트 키
  • 수신자 클래스: 두 가지 서로 다른 방법을 사용합니다.

    1. ECDH Ephemeral-Static, Curve P-521, 128비트 키를 사용하는 AES Key Wrap
    2. 256비트 키를 사용하는 AES Key Wrap

바이너리 파일의 크기는 309바이트입니다

97(
  [
    / protected h'a10105' / << {
        / alg / 1:5 / HMAC 256//256 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'bf48235e809b5c42e995f2b7d5fa13620e7ed834e337f6aa43df16
1e49e9323e',
    / recipients / [
      [
        / protected h'a101381c' / << {
            / alg / 1:-29 / ECDH-ES+A128KW /
          } >> ,
        / unprotected / {
          / ephemeral / -1:{
            / kty / 1:2,
            / crv / -1:3,
            / x / -2:h'0043b12669acac3fd27898ffba0bcd2e6c366d53bc4db
71f909a759304acfb5e18cdc7ba0b13ff8c7636271a6924b1ac63c02688075b55ef2
d613574e7dc242f79c3',
            / y / -3:true
          },
          / kid / 4:'bilbo.baggins@hobbiton.example'
        },
        / ciphertext / h'339bc4f79984cdc6b3e6ce5f315a4c7d2b0ac466fce
a69e8c07dfbca5bb1f661bc5f8e0df9e3eff5'
      ],
      [
        / protected / h'',
        / unprotected / {
          / alg / 1:-5 / A256KW /,
          / kid / 4:'018c0ae5-4d9b-471b-bfd6-eef314bc7037'
        },
        / ciphertext / h'0b2c7cfce04e98276342d6476a7723c090dfdd15f9a
518e7736549e998370695e6d6a83b4ae507bb'
      ]
    ]
  ]
)

C.6. MAC0 메시지의 예

C.6.1. 공유 비밀 Direct MAC

이 예제는 다음을 사용합니다:

  • MAC: AES-CMAC, 256비트 키, 64비트로 잘라냄
  • 수신자 클래스: direct shared secret

바이너리 파일의 크기는 37바이트입니다

17(
  [
    / protected h'a1010f' / << {
        / alg / 1:15 / AES-CBC-MAC-256//64 /
      } >> ,
    / unprotected / {},
    / payload / 'This is the content.',
    / tag / h'726043745027214f'
  ]
)

이 예제는 부록 C.5.1과 동일한 입력을 사용한다는 점에 유의하십시오.

C.7. COSE Key

C.7.1. 공개 키

이는 COSE Key Set의 예입니다. 이 예제는 이전 모든 예제에 대한 공개 키를 포함합니다.

순서대로 키는 다음과 같습니다:

  • kid가 "meriadoc.brandybuck@buckland.example"인 EC 키
  • kid가 "11"인 EC 키
  • kid가 "bilbo.baggins@hobbiton.example"인 EC 키
  • kid가 "peregrin.took@tuckborough.example"인 EC 키

바이너리 파일의 크기는 481바이트입니다

[
  {
    -1:1,
    -2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
    -3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
    1:2,
    2:'meriadoc.brandybuck@buckland.example'
  },
  {
    -1:1,
    -2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
    -3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
    1:2,
    2:'11'
  },
  {
    -1:3,
    -2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
    -3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
    1:2,
    2:'bilbo.baggins@hobbiton.example'
  },
  {
    -1:1,
    -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
    -3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
    1:2,
    2:'peregrin.took@tuckborough.example'
  }
]

C.7.2. 개인 키

이는 COSE Key Set의 예입니다. 이 예제는 이전 모든 예제에 대한 개인 키를 포함합니다.

순서대로 키는 다음과 같습니다:

  • kid가 "meriadoc.brandybuck@buckland.example"인 EC 키
  • kid가 "11"인 EC 키
  • kid가 "bilbo.baggins@hobbiton.example"인 EC 키
  • kid가 "our-secret"인 shared-secret 키
  • kid가 "peregrin.took@tuckborough.example"인 EC 키
  • kid가 "our-secret2"인 shared-secret 키
  • kid가 "018c0ae5-4d9b-471b-bfd6-eef314bc7037"인 shared-secret 키

바이너리 파일의 크기는 816바이트입니다

[
  {
    1:2,
    2:'meriadoc.brandybuck@buckland.example',
    -1:1,
    -2:h'65eda5a12577c2bae829437fe338701a10aaa375e1bb5b5de108de439c0
8551d',
    -3:h'1e52ed75701163f7f9e40ddf9f341b3dc9ba860af7e0ca7ca7e9eecd008
4d19c',
    -4:h'aff907c99f9ad3aae6c4cdf21122bce2bd68b5283e6907154ad911840fa
208cf'
  },
  {
    1:2,
    2:'11',
    -1:1,
    -2:h'bac5b11cad8f99f9c72b05cf4b9e26d244dc189f745228255a219a86d6a
09eff',
    -3:h'20138bf82dc1b6d562be0fa54ab7804a3a64b6d72ccfed6b6fb6ed28bbf
c117e',
    -4:h'57c92077664146e876760c9520d054aa93c3afb04e306705db609030850
7b4d3'
  },
  {
    1:2,
    2:'bilbo.baggins@hobbiton.example',
    -1:3,
    -2:h'0072992cb3ac08ecf3e5c63dedec0d51a8c1f79ef2f82f94f3c737bf5de
7986671eac625fe8257bbd0394644caaa3aaf8f27a4585fbbcad0f2457620085e5c8
f42ad',
    -3:h'01dca6947bce88bc5790485ac97427342bc35f887d86d65a089377e247e
60baa55e4e8501e2ada5724ac51d6909008033ebc10ac999b9d7f5cc2519f3fe1ea1
d9475',
    -4:h'00085138ddabf5ca975f5860f91a08e91d6d5f9a76ad4018766a476680b
55cd339e8ab6c72b5facdb2a2a50ac25bd086647dd3e2e6e99e84ca2c3609fdf177f
eb26d'
  },
  {
    1:4,
    2:'our-secret',
    -1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
  },
  {
    1:2,
    -1:1,
    2:'peregrin.took@tuckborough.example',
    -2:h'98f50a4ff6c05861c8860d13a638ea56c3f5ad7590bbfbf054e1c7b4d91
d6280',
    -3:h'f01400b089867804b8e9fc96c3932161f1934f4223069170d924b7e03bf
822bb',
    -4:h'02d1f7e6f26c43d4868d87ceb2353161740aacf1f7163647984b522a848
df1c3'
  },
  {
    1:4,
    2:'our-secret2',
    -1:h'849b5786457c1491be3a76dcea6c4271'
  },
  {
    1:4,
    2:'018c0ae5-4d9b-471b-bfd6-eef314bc7037',
    -1:h'849b57219dae48de646d07dbb533566e976686457c1491be3a76dcea6c4
27188'
  }
]

감사의 말

이 문서는 IETF의 COSE Working Group의 산출물입니다.

다음 사람들은 애초에 제가 이 프로젝트를 시작하게 만든 책임이 있습니다: Richard Barnes, Matt Miller, 그리고 Martin Thomson.

명세의 초기 초안 버전은 어느 정도 JOSE 및 S/MIME Working Group의 산출물을 기반으로 했습니다.

다음 사람들은 문서의 최종 형태에 의견을 제공했습니다: Carsten Bormann, John Bradley, Brian Campbell, Michael B. Jones, Ilari Liusvaara, Francesca Palombini, Ludwig Seitz, 그리고 Göran Selander.

저자 주소

Jim Schaad
August Cellars