Web Cryptography Level 2

W3C 최초 공개 작업 초안

이 문서에 대한 자세한 정보
이 버전:
https://www.w3.org/TR/2025/WD-webcrypto-2-20250422/
최신 공개 버전:
https://www.w3.org/TR/webcrypto-2/
최신 편집자 초안:
https://w3c.github.io/webcrypto/
이력:
https://www.w3.org/standards/history/webcrypto-2/
커밋 이력
편집자:
(Proton AG)
이전 편집자:
Mark Watson - 까지
Ryan Sleevi - 까지
피드백:
GitHub w3c/webcrypto (풀 리퀘스트, 새 이슈, 열려 있는 이슈)

초록

이 명세는 웹 애플리케이션에서 해싱, 서명 생성 및 검증, 암호화 및 복호화와 같은 기본적인 암호화 작업을 수행하기 위한 JavaScript API를 설명한다. 또한, 이러한 작업을 수행하는 데 필요한 키 자료를 생성하거나 관리하기 위한 애플리케이션용 API를 설명한다. 이 API의 용도는 사용자 또는 서비스 인증, 문서 또는 코드 서명, 통신의 기밀성과 무결성 보장에 이르기까지 다양하다.

이 문서의 상태

이 절은 이 문서가 공개된 시점의 상태를 설명한다. 현재 W3C 공개문서 목록과 이 기술 보고서의 최신 개정판은 https://www.w3.org/TR/의 W3C 표준 및 초안 색인에서 확인할 수 있다.

이 문서는 Web Application Security Working Group에 의해 Recommendation 트랙을 사용한 최초 공개 작업 초안으로 공개되었다.

최초 공개 작업 초안으로 공개되었다는 것은 W3C 및 그 회원의 승인을 의미하지 않는다.

이는 초안 문서이며 언제든지 다른 문서로 갱신, 대체 또는 폐기될 수 있다. 이 문서를 진행 중인 작업 이외의 것으로 인용하는 것은 적절하지 않다.

이 문서는 W3C Patent Policy에 따라 운영되는 그룹에 의해 작성되었다. W3C는 그룹의 산출물과 관련하여 이루어진 모든 특허 공개의 공개 목록을 유지한다. 해당 페이지에는 특허를 공개하기 위한 지침도 포함되어 있다. 어떤 개인이 그 개인이 필수 청구항을 포함한다고 믿는 특허에 대한 실제 지식을 가지고 있는 경우, W3C Patent Policy 제6절에 따라 그 정보를 공개해야 한다.

이 문서는 2023년 11월 03일 W3C Process Document의 적용을 받는다.

1. 소개

이 절은 비규범적이다.

Web Cryptography API는 사용자 에이전트가 관리하거나 노출하는 암호화 키 자료와 상호작용하기 위한 저수준 인터페이스를 정의한다. API 자체는 기반 키 저장소 구현과 무관하지만, 풍부한 웹 애플리케이션이 원시 키 자료에 접근할 필요 없이 서명 생성 및 검증, 해싱 및 검증, 암호화 및 복호화와 같은 작업을 수행할 수 있게 하는 공통 인터페이스 집합을 제공한다.

암호화 변환은 SubtleCrypto 인터페이스를 통해 노출되며, 이 인터페이스는 일반적인 암호화 작업을 수행하기 위한 메서드 집합을 정의한다. 서명 생성 및 검증, 해싱 및 검증, 암호화 및 복호화와 같은 작업 외에도, 이 API는 키 생성, 키 파생, 키 가져오기 및 내보내기를 위한 인터페이스를 제공한다.

2. 사용 사례

이 절은 비규범적이다.

2.1 다중 요소 인증

웹 애플리케이션은 기존의 사용자 이름/비밀번호 기반 인증 체계를, 사용자가 어떤 비밀 키 자료에 접근할 수 있음을 증명하는 데 기반한 인증 방법으로 확장하거나 대체하고자 할 수 있다. TLS 클라이언트 인증서와 같은 전송 계층 인증을 사용하는 대신, 웹 애플리케이션은 애플리케이션 자체 내에서 인증함으로써 제공되는 더 풍부한 사용자 경험을 선호할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 적절한 클라이언트 키를 찾을 수 있으며, 이 키는 이전에 사용자 에이전트를 통해 생성되었거나 웹 애플리케이션에 의해 대역 외 방식으로 미리 제공되었을 수 있다. 그런 다음 인증 챌린지를 복호화하고 이어서 인증 응답에 서명하는 것과 같은 암호화 작업을 수행할 수 있다.

이 교환은 클라이언트가 인증 중인 TLS 세션에 인증을 결합함으로써, 기반 전송의 속성을 바탕으로 키를 파생하여 더욱 강화될 수 있다.

사용자가 아직 자신의 계정과 연결된 키를 가지고 있지 않은 경우, 웹 애플리케이션은 사용자 에이전트가 새 키를 생성하거나 사용자가 선택한 기존 키를 재사용하도록 지시할 수 있다.

2.2 보호된 문서 교환

웹 애플리케이션은 민감하거나 개인정보를 포함하는 문서가 TLS를 통해서와 같이 안전하게 수신된 경우에도, 그 문서를 볼 수 있는 사람을 제한하고자 할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 문서를 비밀 키로 암호화한 다음, 그 키를 권한 있는 뷰어와 연결된 공개 키로 래핑함으로써 이를 수행할 수 있다. 사용자 에이전트가 이러한 웹 애플리케이션으로 이동하면, 애플리케이션은 문서의 암호화된 형태를 전송한다. 그런 다음 사용자 에이전트는 사용자의 개인 키를 사용해 암호화 키를 언래핑하도록 지시받고, 이후 그 키로 문서를 복호화하여 표시한다.

2.3 클라우드 스토리지

웹 애플리케이션은 원격 서비스 제공자에게 업로드하기 전에 사용자가 데이터와 문서의 기밀성을 보호할 수 있도록 허용하고자 할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 사용자가 개인 키 또는 비밀 키를 선택하게 하고, 선택한 키에서 선택적으로 암호화 키를 파생한 다음, 문서를 암호화하고, 기존 API를 사용하여 암호화된 데이터를 서비스 제공자에게 업로드할 수 있다.

이 사용 사례는 보호된 문서 교환 사용 사례와 유사하며, 문서의 열람자는 사용자 자신으로 제한된다.

2.4 문서 서명

웹 애플리케이션은 물리적 서명을 요구하는 대신 문서에 대한 전자 서명을 수락하고자 할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 사용자에게 키를 선택하도록 지시할 수 있으며, 이 키는 대역 외 방식으로 미리 제공되었거나 웹 애플리케이션을 위해 특별히 생성되었을 수 있다. 이 키를 사용하여 애플리케이션은 사용자가 문서를 수락한다는 증거로 어떤 데이터에 대한 서명 작업을 수행할 수 있다.

2.5 데이터 무결성 보호

웹 애플리케이션은 데이터를 로컬에 캐시하면서, 이 데이터가 오프라인 공격에서 수정될 수 없도록 보장하고자 할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 애플리케이션 안에 포함된 공개 키를 사용하여 데이터 캐시의 내용을 검증할 수 있다. 이전에 데이터가 캐시에 추가될 때, 해당 개인 키로 서버가 그 데이터에 서명했을 것이다. 캐시에서 데이터를 복원할 때 서명을 검증함으로써, 클라이언트는 캐시된 데이터가 변조되지 않았음을 보장한다.

2.6 보안 메시징

웹 애플리케이션은 메시지가 TLS를 통해서와 같이 안전하게 수신된 경우에도, off-the-record (OTR) 메시징과 같은 방식을 사용하여 메시지 계층 보안을 적용하고자 할 수 있다.

Web Cryptography API는 키 합의를 수행할 수 있게 함으로써 OTR 및 유사한 메시지 서명 방식을 가능하게 한다. 두 당사자는 메시지의 암호화와 복호화를 허용하고 변조를 방지하기 위해 공유 암호화 키와 메시지 인증 코드(MAC) 키를 협상할 수 있다.

2.7 JavaScript Object Signing and Encryption (JOSE)

웹 애플리케이션은 IETF JavaScript Object Signing and Encryption (JOSE) Working Group이 정의한 구조와 메시지 형식과 상호작용하고자 할 수 있다.

Web Cryptography API를 사용하면, 애플리케이션은 JSON 키 형식(JWK)으로 인코딩된 키를 읽고 가져오거나, 디지털 서명 또는 MAC을 사용하여 무결성이 보호된 메시지(JWS)를 검증하거나, 암호화된 메시지(JWE)를 복호화할 수 있다.

3. 적합성

비규범적이라고 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.

이 문서의 핵심 단어 MUST, REQUIRED, SHALL은 여기에 표시된 것처럼 모두 대문자로 나타날 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.

이 명세는 다음 적합성 클래스를 정의한다.

적합한 사용자 에이전트

사용자 에이전트는 구현에 적용되는 이 명세의 모든 MUST-, REQUIRED- 및 SHALL-수준 기준을 만족하는 경우 적합한 사용자 에이전트로 간주된다. 이 명세는 이 제품 클래스를 가리키기 위해 "적합한 사용자 에이전트"와 "사용자 에이전트"라는 용어를 모두 사용한다.

알고리즘이나 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등하다면 어떤 방식으로든 구현될 수 있다. (특히, 이 명세에 정의된 알고리즘은 따라가기 쉽도록 의도된 것이며, 성능이 뛰어나도록 의도된 것은 아니다.)

이 명세에 정의된 API를 구현하기 위해 ECMAScript를 사용하는 사용자 에이전트는, 이 명세가 해당 명세와 용어를 사용하므로 Web IDL 명세 [WebIDL]에 정의된 ECMAScript 바인딩과 일관된 방식으로 이를 구현해야 MUST 한다.

달리 명시되지 않는 한, 문자열 비교는 대소문자를 구분하는 방식으로 수행된다. 이 명세에서 "this"와 같이 고정폭 글꼴로 작성된 문자열 리터럴에는 둘러싼 따옴표가 포함되지 않는다.

3.1 확장성

이 명세에 대한 벤더별 독점 확장은 강력히 권장되지 않는다. 작성자는 그러한 확장을 사용해서는 안 된다. 그렇게 하면 상호운용성이 저하되고 사용자 기반이 분열되어, 특정 사용자 에이전트의 사용자만 해당 콘텐츠에 접근할 수 있게 되기 때문이다.

벤더별 확장이 필요한 경우, 이 명세의 향후 버전과 충돌하는 것을 방지하기 위해 멤버에는 벤더별 문자열을 접두사로 붙여야 한다. 확장은 확장의 사용이 이 명세에 정의된 기능과 모순되지도 않고, 그 기능의 부적합을 야기하지도 않도록 정의되어야 한다.

이 명세에 대한 벤더 중립적 확장이 필요한 경우, 이 명세를 그에 맞게 갱신하거나, 이 명세의 요구사항을 재정의하는 확장 명세를 작성할 수 있다. 이 명세를 자신의 활동에 적용하는 누군가가 그러한 확장 명세의 요구사항을 인정하기로 결정하면, 그것은 이 명세의 적합성 요구사항 목적상 적용 가능한 명세가 된다. W3C Web Cryptography Working Group이 정의한 적용 가능한 명세는 아래 표에 나열되어 있다.

명세 참조
참고
독자는 위 표의 갱신 사항을 확인하기 위해 이 명세의 정오표를 참조하는 것이 좋다.

4. 범위

이 절은 비규범적이다.

4.1 추상화 수준

이 명세는 다양한 플랫폼별 또는 표준화된 암호화 API 사이의 공통 기능과 특징에 초점을 맞추고, 하나 또는 두 구현에만 특정된 특징과 기능을 피하려고 시도한다. 따라서 이 API는 개발자가 기반 키 저장소의 구현을 신경 쓸 필요가 없도록 하는 추상화 수준에서 키 생성, 관리 및 교환을 허용한다. 이 API는 기반 원시 암호화 키 자료에 대한 추상화로서 CryptoKey 객체를 중심으로 특별히 초점을 맞춘다. 그 의도는, 적합한 사용자 에이전트가 사용자 에이전트가 직접 저장하고 관리하는 키, 일부 운영 체제가 제공하는 사용자별 키 저장소와 같은 격리된 저장소 API를 사용하여 저장되거나 관리될 수 있는 키, 또는 보안 요소와 같은 키 저장 장치 안의 키를 노출할 수 있을 만큼 충분히 일반적인 API를 허용하면서, 풍부한 웹 애플리케이션이 키를 조작할 수 있게 하고 웹 애플리케이션이 기반 키 저장소의 성격을 알 필요가 없도록 하는 것이다.

4.2 암호화 알고리즘

기반 암호화 구현은 적합한 사용자 에이전트마다 다를 것이며, 정부 또는 산업 규제, 보안 모범 사례, 지적 재산권 문제, 제한된 운영 환경과 같은 사항을 포함하되 이에 한정되지 않는 지역 정책의 적용을 받을 수 있으므로, 이 명세는 구현해야 MUST 하는 필수 알고리즘 집합을 지시하지 않는다. 대신, 알고리즘에 독립적인 방식으로 사용할 수 있는 공통 바인딩 집합, 사용자 에이전트나 키 핸들이 기반 알고리즘을 지원하는지 발견하기 위한 공통 프레임워크, 그리고 구현된 경우 개별 알고리즘의 동작에 대한 적합성 요구사항 집합을 정의한다.

4.3 범위 밖

이 API는 애플리케이션이 키 자료를 생성, 검색 및 조작할 수 있게 하지만, 보안 요소나 스마트 카드와 같은 특정 유형의 키 저장소에 키를 프로비저닝하는 것은 구체적으로 다루지 않는다. 이는 그러한 프로비저닝 작업이 벤더별 세부 사항을 수반하는 경우가 많아, 벤더에 구애받지 않는 인터페이스를 정의하는 일을 부적절하게 한정 없는 작업으로 만들기 때문이다. 또한, 이 API는 암호화 모듈의 발견을 처리하거나 다루지 않는다. 그러한 개념은 기반 사용자 에이전트에 의존하며 공통 운영 체제, 암호화 라이브러리 및 구현 간에 이식 가능한 개념이 아니기 때문이다.

5. 개념

이 절은 비규범적이다.

5.1 기반 암호화 구현

이 명세는 적합한 사용자 에이전트가 사용자 에이전트 자체 안에서 암호화 작업을 직접 구현하지 않으며, 앞으로도 직접 구현하지 않을 것이라고 가정하지만, 이를 요구하지는 않는다. 역사적으로 많은 사용자 에이전트는 TLS 내에서 사용되는 것과 같은 암호화 작업을, 기반 운영 체제의 일부로 제공되는 기존 API나 사용자 에이전트와 독립적으로 관리되는 서드파티 모듈에 위임해 왔다.

CryptoKey 객체는 [[handle]]이라는 내부 슬롯을 사용하여 JavaScript 실행 환경과 이러한 기반 라이브러리 사이의 다리를 나타낸다. 이 핸들은 구현에 특정된 불투명 타입을 나타내며, JavaScript 타입 안에서 표현되지 않을 수 있고 스크립트 작성자에게 결코 노출되지 않는다. 이런 방식으로, CryptoKey 객체는 JavaScript 실행 환경에 대해 개념적으로, [[handle]]이 기반 암호화 구현에 대해 갖는 관계와 동등하다.

이러한 API는 전통적으로 암호화 제공자라는 개념을 중심으로 구축된다. 이는 알고리즘 집합의 특정 구현에 대한 추상화이다. 운영 체제나 라이브러리는 기본 제공자를 포함할 수 있으며, 사용자는 추가 제공자를 추가하거나, 활성화된 알고리즘 집합을 재구성하거나, 암호화 서비스가 제공되는 방식을 달리 사용자 지정할 수 있는 경우가 많다.

대부분의 사용자 에이전트는 순수하게 소프트웨어로 구현된 암호화 제공자와 상호작용할 것이라고 가정되지만, 이 명세가 이를 요구하지는 않는다. 그 결과 일부 구현의 기능은 기반 하드웨어의 기능에 의해 제한될 수 있으며, 사용자가 기반 암호화 라이브러리를 구성한 방식에 따라 이는 사용자 에이전트에 완전히 불투명할 수 있다.

5.2 키 저장소

이 명세는 CryptoKey 객체를 위한 새로운 저장소 메커니즘을 명시적으로 제공하지 않는다. 대신 직렬화 및 역직렬화 단계CryptoKey 객체에 대해 정의함으로써, 직렬화 가능한 객체 저장을 지원하는 기존 또는 미래의 모든 웹 저장소 메커니즘을 사용하여 CryptoKey 객체를 저장할 수 있다.

실제로는 대부분의 작성자가 Indexed Database API [INDEXEDDB]를 사용할 것으로 예상된다. 이는 키/값 쌍의 연관 저장을 허용하며, 여기서 키는 애플리케이션에 의미 있는 어떤 문자열 식별자이고, 값은 CryptoKey 객체이다. 이를 통해 키 자료를 애플리케이션이나 JavaScript 환경에 전혀 노출하지 않고도 키 자료를 저장하고 검색할 수 있다. 또한 이는 작성자에게 CryptoKey 자체와 함께 추가 메타데이터를 저장할 수 있는 완전한 유연성을 제공한다.

6. 보안 고려사항

이 절은 비규범적이다.

6.1 구현자를 위한 보안 고려사항

명시적인 저장소 메커니즘을 제공하지 않음으로써, 이 명세는 CryptoKey 객체가 현재 실행 환경과 그 환경에서 사용할 수 있는 모든 저장소 메커니즘(예: Indexed Database API)으로 범위가 한정된다고 가정한다. 애플리케이션 작성자는 자신의 애플리케이션 보안을 위해 이에 의존한다. 동일한 CryptoKey 객체를 가진 두 출처는 기반 키에 완전한 접근 권한을 가지며, 따라서 이러한 애플리케이션의 메시지는 구별될 수 없고, 이러한 애플리케이션으로 전송된 메시지는 완전히 복구될 수 있다. 구현자는 작성자가 명시적으로 공유하기로 선택한 경우 (예: postMessage 사용을 통해) 외에는 CryptoKey 객체가 두 출처 간에 공유되지 않도록 보장해야 한다

이 명세에 지정된 여러 알고리즘은 상당히 큰 소수의 생성이나 특정 작업의 반복적 수행과 같은 계산 집약적인 작업을 수행한다. 따라서 악의적인 애플리케이션은 이 API를 오용하여 구현이 상당한 양의 작업을 수행하게 하려 할 수 있으며, 실행 중인 다른 애플리케이션의 접근 또는 서비스를 거부하게 만들 수 있다. 구현은 구현이 동시에 수행하는 작업 수를 제한하거나, 실행 환경을 방해할 수 있다고 알려진 작업에 대해 사용자 동의를 요구하거나, 키 크기 또는 반복 횟수와 같은 속성에 대해 장치별 제한을 정의하는 등 이러한 위험을 완화하기 위한 조치를 취해야 한다.

6.2 작성자를 위한 보안 고려사항

이 명세에는 다양한 암호화 작업에 대한 설명이 포함되어 있으며, 그중 일부는 부적절하게 사용될 경우 알려진 약점을 가진다. 애플리케이션 개발자는 이러한 문제를 이해하고 완화하기 위해 주의를 기울이고 적절하며 최신인 암호화 문헌을 검토해야 한다. 일반적으로 애플리케이션 개발자는 새로운 암호화 프로토콜을 고안하는 것을 강력히 권장받지 않는다. 모든 애플리케이션과 마찬가지로, 이 명세의 사용자는 기존 프로토콜을 사용함으로써 가장 큰 이점을 얻을 수 있으며, 이 명세는 그러한 프로토콜을 구현하는 데 필요한 구성 요소를 제공한다.

이 명세에 정의된 API를 사용하여 의미 있는 암호화 보장을 제공하려면, 작성자는 웹 애플리케이션에 대한 기존 위협과 사용되는 기반 보안 모델에 익숙해야 한다. 개념적으로 스크립트 삽입과 같은 문제는 다른 운영 환경의 원격 코드 실행과 동등하며, 악의적인 스크립트의 삽입을 허용하면 키 또는 데이터의 유출이 가능해질 수 있다. 스크립트 삽입은 다른 애플리케이션에서 발생할 수 있으며, 이 경우 Content Security Policy를 신중하게 사용하여 완화할 수 있고, 악의적인 네트워크 중개자에서 발생할 수 있으며, 이 경우 Transport Layer Security를 사용하여 완화할 수 있다.

이 명세는 암호화 키의 저장을 위한 어떤 특정 메커니즘도 정의하지 않는다. 기본적으로, Indexed Database API 사용 등을 통해 키를 지속시키기 위한 특정 노력을 작성자가 기울이지 않는 한, 이 API로 생성된 키는 현재 페이지의 지속 시간 동안만 유효하다(예: 탐색 이벤트가 발생할 때까지). 서로 다른 페이지나 여러 브라우징 세션에 걸쳐 동일한 키를 사용하려는 작성자는 기존 웹 저장소 기술을 사용해야 한다. 작성자는 동일 출처 보안 모델과 같은 이러한 기술의 보안 가정을 인식해야 한다. 즉, 동일한 스킴, 호스트 및 포트를 공유하는 모든 애플리케이션은 경로와 같은 다른 정보가 다르더라도 동일한 저장소 파티션에 접근할 수 있다. 작성자는 postMessage와 같은 출처 간 공유를 사용하여 이 보안을 명시적으로 완화하도록 선택할 수 있다.

작성자는 이 명세가 기반 암호화 키 자료가 저장되는 방식에 대해 구현에 어떠한 규범적 요구사항도 부과하지 않는다는 점을 인식해야 한다. 유일한 요구사항은 키 자료가 exportKeywrapKey 작업을 사용하는 경우를 제외하고는 스크립트에 노출되지 않는다는 것이다. 특히, 기반 암호화 키 자료가 디스크에 지속되지 않을 것이라고 보장하지 않으며, 암호화되지 않은 상태로 지속될 가능성도 있다. 또한 사용자나 User Agent와 동일한 권한으로 실행되는 다른 애플리케이션이 접근할 수 없다고 보장하지도 않는다. 장치 저장소에 접근할 수 있는 모든 애플리케이션 또는 사용자는, 스크립트를 통한 접근이 금지되어 있더라도 키 자료를 복구할 수 있을 수 있다.

이 명세는 모든 참조가 사라진 후 구현이 키 자료를 어떻게 처리하는지에 대해 어떠한 규범적 요구사항도 부과하지 않는다. 즉, 적합한 사용자 에이전트는 키 자료를 영점화할 필요가 없으며, CryptoKey에 대한 모든 참조가 사라진 후에도 키 자료가 장치 저장소나 장치 메모리에서 여전히 접근 가능할 수 있다.

애플리케이션은 구조화된 복제 알고리즘과 postMessage와 같은 API를 사용하여 출처와 같은 보안 경계를 넘어 CryptoKey 객체를 공유할 수 있다. 기반 암호화 키 자료에 대한 접근은 extractable 속성에 따라 제한될 수 있지만, 키가 대상 출처와 공유되면 원본 출처는 이후에 그 키에 대한 접근을 제한하거나 취소할 수 없다. 따라서 작성자는 대상 출처가 원본 출처가 사용하는 것과 동일한 악의적 스크립트 완화 조치를 취한다고 신뢰할 수 있는지 주의 깊게 보장해야 한다. 또한 원본 출처에서 스크립트 삽입이 발생하면, 공격자는 공격자가 제어하는 출처로 키를 게시할 수 있다. 사용자 에이전트가 공격자의 출처를 방문할 때마다, 사용자 에이전트는 기존 메시지의 복호화나 새로운 사기성 메시지의 생성과 같은 암호화 작업을 그 키를 사용하여 수행하도록 지시받을 수 있다.

작성자는 사용자가 언제든지 어떤 출처와 연결된 저장소를 지우도록 선택할 수 있으며, 이로 인해 키가 파괴될 수 있다는 점을 인식해야 한다. 서버에서와 같이 장기 저장을 제공하도록 의도된 애플리케이션은 이러한 데이터가 접근 불가능해지는 것을 방지하기 위해 키 에스크로와 같은 기술을 고려해야 한다. 작성자는 키가 무기한 사용 가능하다고 가정해서는 안 된다.

6.3 사용자를 위한 보안 고려사항

이 명세에 정의된 API를 사용하는 애플리케이션의 사용자는, 이러한 애플리케이션이 사용된 암호화 방식과 관계없이 교환되는 모든 메시지에 완전히 접근할 수 있음을 인식해야 한다. 즉, 암호화된 메시지의 경우에도 이러한 API를 사용하는 애플리케이션은 복호화된 메시지에도 완전히 접근할 수 있다.

7. 개인정보 보호 고려사항

이 절은 비규범적이다.

핑거프린팅
기반 플랫폼의 기능을 반영하는 추가 API를 노출함으로써, 이 명세는 악의적인 애플리케이션이 서로 다른 사용자 에이전트 또는 장치를 판별하거나 구별할 수 있게 할 수 있다.
슈퍼 쿠키
이 명세는 악의적인 애플리케이션이 기존 웹 저장소 기술보다 더 오래 지속되는 식별자를 만들 수 있는 수단을 제공하지 않는다. 그러나 이 API의 향후 개정이나 하드웨어 기반(예: 스마트 카드 또는 Trusted Platform Module)과 같은 추가 암호화 기능을 도입할 때는 주의를 기울여야 한다. 그러한 저장소는 어떤 두 사용자도 동일한 기반 키 데이터를 갖지 못하도록 설계되어 있다는 점을 고려하면, 그러한 API는 사용자의 의사에 반하는 영구 식별자로 사용될 실제 위험을 나타낼 수 있다.
randomUUID를 사용자 ID로 사용
randomUUID사용자 ID를 생성하는 데 유용하지만, 전역 식별자를 생성할 수 있는 능력을 직접 제공하지는 않는다.

8. 의존성

이 명세는 기반 명세에 의존한다.

DOM

적합한 사용자 에이전트는 이 명세가 의존하는 DOM에 정의된 기능의 적어도 하위 집합을 지원해야 MUST 하며, 특히 PromiseDOMException을 지원해야 MUST 한다. [DOM]

HTML

적합한 사용자 에이전트는 이 명세가 의존하는 HTML에 정의된 기능의 적어도 하위 집합을 지원해야 MUST 하며, 특히 ArrayBufferView typedef와 직렬화 가능한 객체를 지원해야 MUST 한다. [HTML]

Web IDL

적합한 사용자 에이전트는 Web IDL 명세에 설명된 대로, 이 명세의 IDL 조각에 대한 적합한 구현이어야 MUST 한다. [WebIDL]

9. 용어

용어 ArrayBuffer, ArrayBufferView직렬화 가능한 객체는 HTML 명세 [HTML]에 정의되어 있다.

용어 DOMStringBufferSource는 [WEBIDL]에 정의되어 있다.

용어 바이트 시퀀스는 [Infra]에 정의되어 있다.

바이트 시퀀스비트 단위 길이는 그 길이에 8을 곱한 값이다.

비트 시퀀스 b를 포함하는 바이트 시퀀스는, 결과 비트 시퀀스의 길이가 최소이면서 8의 정수배가 되도록 b에 값이 0인 비트를 0개 이상 먼저 추가한 다음, 그 문자열에서 연속된 8비트의 각 시퀀스를 바이트로 간주하여 얻은 바이트 시퀀스이다.

이 명세가 n * 8이 i의 밑 2 로그보다 큰 경우, 음이 아닌 정수 i를 길이 n의 바이트 시퀀스로 변환하라고 말할 때, 사용자 에이전트는 먼저 i의 이진 표현을 최상위 비트부터 계산하고, 여기에 n * 8 길이의 비트 시퀀스를 형성하기에 충분한 0비트를 접두사로 붙인 다음, 그 비트 시퀀스에서 연속된 8비트의 각 시퀀스를 바이트로 간주하여 형성된 바이트 시퀀스를 반환해야 한다.

두 문자열을 대소문자를 구분하는 방식으로 비교한다는 것은 코드 포인트별로 정확히 비교한다는 뜻이다.

두 문자열을 ASCII 대소문자를 구분하지 않는 방식으로 비교한다는 것은 코드 포인트별로 정확히 비교하되, 범위 U+0041 .. U+005A(즉, LATIN CAPITAL LETTER A부터 LATIN CAPITAL LETTER Z까지)의 코드 포인트와 범위 U+0061 .. U+007A의 대응하는 코드 포인트 (즉, LATIN SMALL LETTER A부터 LATIN SMALL LETTER Z까지)도 일치하는 것으로 간주한다는 뜻이다.

이 명세가 알고리즘을 종료하라고 말할 때, 사용자 에이전트는 현재 수행 중인 단계를 마친 뒤 알고리즘을 종료해야 한다. 여기서 말하는 알고리즘은 처리 중일 수 있는 기반 암호화 알고리즘이 아니라, 명세에 정의된 처리 단계의 집합이다.

이 명세가 ASN.1 구조를 파싱하라고 말할 때, 사용자 에이전트는 다음 단계를 수행해야 한다.

  1. data를 파싱할 바이트 시퀀스로 둔다.

  2. structure를 파싱할 ASN.1 구조로 둔다.

  3. exactData를 선택적 불리언 값으로 둔다. 제공되지 않은 경우, true로 초기화한다.

  4. [X690]의 Distinguished Encoding Rules에 따라 data를 파싱하며, structure를 디코딩할 ASN.1 구조로 사용한다.

  5. exactData가 지정되었고, 파싱 단계 중에 data의 모든 바이트가 소비되지 않았다면, throw a DataError.

  6. 파싱된 ASN.1 구조를 반환한다.

이 명세가 subjectPublicKeyInfo를 파싱하라고 말할 때, 사용자 에이전트는 data를 파싱할 바이트 시퀀스로, structure를 [RFC5280]에 지정된 subjectPublicKeyInfo의 ASN.1 구조로, exactDatatrue로 설정하여 ASN.1 구조를 파싱해야 한다.

이 명세가 PrivateKeyInfo를 파싱하라고 말할 때, 사용자 에이전트는 ASN.1 구조를 파싱해야 하며, data는 파싱할 바이트 시퀀스로 설정하고, structure는 [RFC5208]에 지정된 PrivateKeyInfo의 ASN.1 구조로 설정하며, exactDatatrue로 설정한다.

이 명세가 JWK를 파싱하라고 말할 때, 사용자 에이전트는 다음 단계를 실행해야 한다.

  1. data를 파싱할 바이트 시퀀스로 둔다.

  2. jsondata를 UTF-8에 따라 해석한 결과인 Unicode 문자열로 둔다.

  3. json을 UTF-16으로 변환한다.

  4. result를 새 전역 객체의 컨텍스트에서 JSON.parse 내부 함수를 실행한 결과인 객체 리터럴로 두며, text 인수는 json을 포함하는 JavaScript String으로 설정한다.

  5. keyresultJsonWebKey의 IDL 딕셔너리 타입으로 변환한 결과로 둔다.

  6. keykty 필드가 정의되어 있지 않으면, throw a DataError.

  7. key를 반환한다.

이 명세가 두 시퀀스 ab사용법 교집합을 계산하라고 말할 때, 결과는 인식된 키 사용법 값 목록에 나열된 순서대로, ab 모두에 나타나는 각 인식된 키 사용법 값을 포함하는 시퀀스여야 한다. 여기서 어떤 값은 그 값과 대소문자를 구분하는 문자열 일치를 하는 요소가 시퀀스에 존재하면 그 시퀀스에 나타난다고 말한다.

이 명세가 usages 사용법 목록의 정규화된 값을 계산하라고 말할 때, 결과는 usages와 모든 인식된 키 사용법 값을 포함하는 시퀀스의 사용법 교집합이어야 한다.

이 명세가 object의 내부 슬롯 [[slot]]과 연결된 캐시된 ECMAScript 객체를 참조할 때, 사용자 에이전트는 다음 단계를 실행해야 한다.

  1. object의 [[slot_cached]] 내부 슬롯이 undefined인 경우:
    object의 [[slot_cached]] 내부 슬롯을 object의 [[slot]] 내부 슬롯의 내용에 대해 [WebIDL]에 정의된 ECMAScript 객체로의 타입 변환을 수행한 결과로 설정한다.
  2. object의 [[slot_cached]] 내부 슬롯의 내용을 반환한다.

10. Crypto 인터페이스

Crypto 인터페이스는 진정한 난수 값으로 시드된 암호학적으로 강력한 의사 난수 생성기를 포함하는 범용 암호화 기능에 대한 인터페이스를 나타낸다.

WebIDLpartial interface mixin WindowOrWorkerGlobalScope {
  [SameObject] readonly attribute Crypto crypto;
};

[Exposed=(Window,Worker)]
interface Crypto {
  [SecureContext] readonly attribute SubtleCrypto subtle;
  ArrayBufferView getRandomValues(ArrayBufferView array);
  [SecureContext] DOMString randomUUID();
};
참고
구현은 운영 체제 엔트로피 소스(예: "/dev/urandom")와 같은 고품질 엔트로피로 시드된, 잘 확립된 암호학적 의사 난수 생성기를 사용하여 암호학적으로 강력한 난수 값을 생성해야 한다. 이 명세는 암호학적으로 강력한 난수 값에 존재하는 정보 이론적 엔트로피에 대한 하한을 제공하지 않지만, 구현은 가능한 한 많은 엔트로피를 제공하기 위해 최선의 노력을 해야 한다.
참고
이 인터페이스는 암호학적으로 강력한 난수 값을 얻기 위한 동기 메서드를 정의한다. 일부 장치와 구현은 진정한 난수 암호화 숫자 생성기를 지원하거나 엔트로피가 충분하지 않을 때 차단되는 인터페이스를 제공할 수 있지만, 구현은 성능과 시스템의 엔트로피 고갈을 피하기 위해 getRandomValues를 구현할 때 이러한 소스를 사용하는 것을 권장받지 않는다. 대신, 이러한 소스는 이후 적절한 값을 효율적으로 반환할 수 있는 암호학적 의사 난수 생성기를 시드하는 데 사용해야 한다.

10.1 메서드와 매개변수

10.1.1 getRandomValues 메서드

getRandomValues 메서드는 암호학적으로 강력한 난수 값을 생성한다. 이는 다음과 같이 동작해야 한다.

  1. arrayInt8Array, Uint8Array, Uint8ClampedArray, Int16Array, Uint16Array, Int32Array, Uint32Array, BigInt64Array 또는 BigUint64Array가 아니면, throw a TypeMismatchError 하고 알고리즘을 종료한다.

  2. byteLengtharray바이트 길이로 둔다.

  3. byteLength가 65536보다 크면, throw a QuotaExceededError 하고 알고리즘을 종료한다.

  4. bytes를 길이 byteLength바이트 시퀀스로 둔다.

  5. bytes를 암호학적으로 안전한 난수 바이트로 채운다.

  6. bytesarray쓴다.

  7. array를 반환한다.

참고

getRandomValues 메서드를 사용하여 키를 생성하지 말라. 대신 generateKey 메서드를 사용하라.

10.1.2 randomUUID 메서드

randomUUID 메서드는 새 버전 4 UUID를 생성하고, [RFC4122]의 3절에 설명된 대로 그 네임스페이스별 문자열 표현을 반환한다. 무작위 UUID를 생성하려면:

  1. bytes를 길이 16의 바이트 시퀀스로 둔다.
  2. bytes를 암호학적으로 안전한 난수 바이트로 채운다.
  3. UUID 버전을 나타내는 bytes[6]의 최상위 4비트를 0100으로 설정한다.
  4. UUID 변종을 나타내는 bytes[8]의 최상위 2비트를 10으로 설정한다.
  5. «의 문자열 연결을 반환한다.

    1. bytes[0]의 16진수 표현, bytes[1]의 16진수 표현, bytes[2]의 16진수 표현, bytes[3]의 16진수 표현,
    2. "-",
    3. bytes[4]의 16진수 표현, bytes[5]의 16진수 표현,
    4. "-",
    5. bytes[6]의 16진수 표현, bytes[7]의 16진수 표현,
    6. "-",
    7. bytes[8]의 16진수 표현, bytes[9]의 16진수 표현,
    8. "-",
    9. bytes[10]의 16진수 표현, bytes[11]의 16진수 표현, bytes[12]의 16진수 표현, bytes[13]의 16진수 표현, bytes[14]의 16진수 표현, bytes[15]의 16진수 표현

    ».

무작위 UUID를 생성하기 위한 알고리즘에 설명된 단계에서, 바이트 value16진수 표현ASCII 소문자 16진수 숫자를 사용하여 value를 16진수로 표현하고, 두 개의 ASCII 소문자 16진수 숫자가 되도록 왼쪽에 "0"을 채워 만든 두 문자 문자열이다.

10.2 속성

10.2.1 subtle 속성

subtle 속성은 저수준 암호화 프리미티브와 알고리즘을 제공하는 SubtleCrypto 인터페이스의 인스턴스를 제공한다.

11. Algorithm 딕셔너리

Algorithm 객체는 알고리즘과 원하는 작업을 완전히 지정하는 데 필요한 추가 매개변수를 지정하는 데 사용되는 딕셔너리 객체 [WEBIDL]이다.

WebIDLtypedef (object or DOMString) AlgorithmIdentifier;

typedef AlgorithmIdentifier HashAlgorithmIdentifier;

dictionary Algorithm {
  required DOMString name;
};

11.1 Algorithm 딕셔너리 멤버

name
사용할 등록된 알고리즘의 이름.

12. KeyAlgorithm 딕셔너리

KeyAlgorithm 딕셔너리는 주어진 CryptoKey 객체의 내용에 관한 정보를 나타낸다.

WebIDLdictionary KeyAlgorithm {
  required DOMString name;
};

12.1 설명

이 절은 비규범적이다.

KeyAlgorithm 딕셔너리는 CryptoKey의 고정된 공개 속성이 애플리케이션에 어떻게 다시 반영되는지를 문서화하는 데 도움을 주기 위해 제공된다. 실제 딕셔너리 타입은 애플리케이션에 결코 노출되지 않는다.

12.2 KeyAlgorithm 딕셔너리 멤버

name
CryptoKey를 생성하는 데 사용된 알고리즘의 이름

13. CryptoKey 인터페이스

CryptoKey 객체는 사용자 에이전트가 관리하는 키 자료에 대한 불투명 참조를 나타낸다.

WebIDLenum KeyType { "public", "private", "secret" };

enum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey" };

[SecureContext,Exposed=(Window,Worker),Serializable]
interface CryptoKey {
  readonly attribute KeyType type;
  readonly attribute boolean extractable;
  readonly attribute object algorithm;
  readonly attribute object usages;
};

13.1 설명

이 절은 비규범적이다.

이 명세는 사용자 에이전트가 관리하는 다양한 종류의 키 자료에 대한 균일한 인터페이스를 제공한다. 여기에는 사용자 에이전트가 생성한 키, 사용자 에이전트가 다른 키에서 파생한 키, 사용자 작업을 통해 또는 이 API를 사용하여 사용자 에이전트로 가져온 키, 사용자 에이전트가 접근할 수 있는 소프트웨어나 하드웨어 안에 미리 제공된 키, 또는 다른 방식으로 사용자 에이전트가 사용할 수 있게 된 키가 포함될 수 있다. 키라는 용어는 암호화 작업을 위한 실제 키와 키 파생 또는 교환 작업 안에서 얻은 비밀 값을 포함한 모든 키 자료를 넓게 가리킨다.

CryptoKey 객체는 기반 키 저장소 메커니즘과 직접 인터페이스할 필요가 없으며, 대신 암호화 작업을 수행할 때와 같이 필요한 경우 사용자 에이전트가 키 자료를 얻는 방법을 이해하기 위한 참조일 수 있다.

13.2 키 인터페이스 데이터 타입

KeyType
키의 타입. 인식된 키 타입 값은 "public", "private" 및 "secret"이다. 대칭 알고리즘에 사용되는 것을 포함한 불투명 키 자료는 secret으로 표현되며, public/private 키 쌍으로 구성된 비대칭 알고리즘의 일부로 사용되는 키는 public 또는 private이다.
KeyUsage
키를 사용하여 수행할 수 있는 작업의 타입. 인식된 키 사용법 값encrypt, decrypt, sign, verify, deriveKey, deriveBits, wrapKeyunwrapKey이다.

13.3 CryptoKey 내부 슬롯

모든 CryptoKey 객체는 키에 관한 정보를 저장하는 내부 슬롯 집합을 가진다. 이러한 슬롯은 이 명세의 일부로 노출되지 않는다. 이 슬롯들은 구현이 이 명세를 구현하는 데 사용하는 내부 상태를 나타낸다. [ECMA-262]에서 사용하는 표기 관례를 여기서 재사용한다. 내부 슬롯은 이중 대괄호 [[ ]]로 둘러싸인 이름으로 식별된다.

모든 CryptoKey 객체는 [[type]], [[extractable]], [[algorithm]], [[algorithm_cached]], [[usages]], [[usages_cached]], 및 [[handle]]이라는 내부 슬롯을 가진다.

[[algorithm]] 내부 슬롯의 내용은 KeyAlgorithm이거나, 그것에서 파생되어야 한다. [[usages]] 내부 슬롯의 내용은 Sequence<KeyUsage> 타입이어야 한다.

참고

[[handle]] 슬롯은 기반 암호화 구현이 논리적 키를 나타내는 데 사용하는 임의의 데이터를 포함하는 불투명 타입이다. 서로 다른 암호화 구현은 정수로 표현되는 불투명 식별자, 포인터 타입, 또는 식별 정보를 제공하는 구조에 이르기까지 서로 다른 타입을 사용할 수 있다. 이러한 핸들은 애플리케이션에 결코 노출되지 않는다.

13.4 CryptoKey 인터페이스 멤버

type
기반 키의 타입을 포함하는 [[type]] 내부 슬롯을 반영한다.
extractable
원시 키 자료가 애플리케이션에 의해 내보내질 수 있는지 여부를 나타내는 [[extractable]] 내부 슬롯을 반영한다.
algorithm
[[algorithm]] 내부 슬롯과 연결된 캐시된 ECMAScript 객체를 반환한다.
usages
이 키와 함께 사용하는 것이 허용되는 암호화 작업을 나타내는 [[usages]] 내부 슬롯과 연결된 캐시된 ECMAScript 객체를 반환한다.

13.5 직렬화 및 역직렬화 단계

CryptoKey 객체는 직렬화 가능한 객체이다. valueserialized가 주어졌을 때, 이들의 직렬화 단계는 다음과 같다.

  1. serialized.[[Type]]을 value[[type]] 내부 슬롯으로 설정한다.
  2. serialized.[[Extractable]]을 value[[extractable]] 내부 슬롯으로 설정한다.
  3. serialized.[[Algorithm]]을 value[[algorithm]] 내부 슬롯의 하위 직렬화로 설정한다.
  4. serialized.[[Usages]]를 value[[usages]] 내부 슬롯의 하위 직렬화로 설정한다.
  5. serialized.[[Handle]]을 value[[handle]] 내부 슬롯으로 설정한다.

serializedvalue가 주어졌을 때, 이들의 역직렬화 단계는 다음과 같다.

  1. value[[type]] 내부 슬롯을 serialized.[[Type]]으로 초기화한다.
  2. value[[extractable]] 내부 슬롯을 serialized.[[Extractable]]로 초기화한다.
  3. value[[algorithm]] 내부 슬롯을 serialized.[[Algorithm]]의 하위 역직렬화로 초기화한다.
  4. value[[usages]] 내부 슬롯을 serialized.[[Usages]]의 하위 역직렬화로 초기화한다.
  5. value[[handle]] 내부 슬롯을 serialized.[[Handle]]로 초기화한다.
참고
직렬화된 CryptoKey 객체를 역직렬화할 때, 객체가 다른 타입으로 역직렬화되지 않는 것이 중요하다. 이는 역직렬화 단계의 정의에 의해 규범적으로 요구되지만, 특정한 주의를 기울일 가치가 있다. 그러한 역직렬화는 키 자료의 내용을 노출할 수 있으며, 어떤 경우에는 ([[extractable]] 내부 슬롯이 false인 경우와 같이) 애플리케이션에 노출되어서는 안 되기 때문이다.

14. SubtleCrypto 인터페이스

SubtleCrypto 인터페이스는 저수준 암호화 프리미티브와 알고리즘을 다루기 위한 메서드 집합을 제공한다.

WebIDLenum KeyFormat { "raw", "spki", "pkcs8", "jwk" };

[SecureContext,Exposed=(Window,Worker)]
interface SubtleCrypto {
  Promise<ArrayBuffer> encrypt(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<ArrayBuffer> decrypt(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<ArrayBuffer> sign(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource data
  );
  Promise<boolean> verify(
    AlgorithmIdentifier algorithm,
    CryptoKey key,
    BufferSource signature,
    BufferSource data
  );
  Promise<ArrayBuffer> digest(
    AlgorithmIdentifier algorithm,
    BufferSource data
  );

  Promise<(CryptoKey or CryptoKeyPair)> generateKey(
    AlgorithmIdentifier algorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<CryptoKey> deriveKey(
    AlgorithmIdentifier algorithm,
    CryptoKey baseKey,
    AlgorithmIdentifier derivedKeyType,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<ArrayBuffer> deriveBits(
    AlgorithmIdentifier algorithm,
    CryptoKey baseKey,
    optional unsigned long? length = null
  );

  Promise<CryptoKey> importKey(
    KeyFormat format,
    (BufferSource or JsonWebKey) keyData,
    AlgorithmIdentifier algorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<(ArrayBuffer or JsonWebKey)> exportKey(
    KeyFormat format,
    CryptoKey key
  );

  Promise<ArrayBuffer> wrapKey(
    KeyFormat format,
    CryptoKey key,
    CryptoKey wrappingKey,
    AlgorithmIdentifier wrapAlgorithm
  );
  Promise<CryptoKey> unwrapKey(
    KeyFormat format,
    BufferSource wrappedKey,
    CryptoKey unwrappingKey,
    AlgorithmIdentifier unwrapAlgorithm,
    AlgorithmIdentifier unwrappedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
};
참고

SubtleCrypto 인터페이스는 이러한 알고리즘 중 다수가 필요한 알고리즘 보안 보장을 제공하기 위해 미묘한 사용 요구사항을 가진다는 사실을 반영하기 위해 "SubtleCrypto"라는 이름을 가진다.

예를 들어, 카운터 모드의 AES와 같은 인증되지 않은 암호화 방식을 직접 사용하면 잠재적 공격자가 입력의 비트를 조작하여 출력의 비트를 조작할 수 있게 되어 메시지의 무결성을 훼손한다. 그러나 AES-CTR은 메시지 인증 코드와 같은 다른 암호화 프리미티브와 조합하여 보호된 메시지의 무결성을 보장하는 데 안전하게 사용할 수 있지만, 이는 메시지 인증 코드가 암호화된 메시지와 IV 위에 구성된 경우에만 해당한다.

SubtleCrypto 인터페이스를 사용하는 개발자는 제공되는 여러 알고리즘의 설계와 구현 모두와 관련된 보안 문제를 인식하고 있을 것으로 기대된다. 원시 알고리즘은 개발자가 다양한 프로토콜과 애플리케이션을 구현할 때 최대한의 유연성을 가질 수 있도록 제공되며, 이들 각각은 원시 알고리즘의 사용을 필요로 하는 고유한 방식으로 구성과 보안 매개변수를 나타낼 수 있다.

14.1 데이터 타입

KeyFormat
키의 직렬화 형식을 지정한다. 인식된 키 형식 값은 다음과 같다.
raw
형식화되지 않은 바이트 시퀀스. 비밀 키를 위한 것이다.
pkcs8
[RFC5208]의 PrivateKeyInfo 구조의 DER 인코딩.
spki
[RFC5280]의 SubjectPublicKeyInfo 구조의 DER 인코딩.
jwk
키는 JavaScript 객체로 인코딩된 JsonWebKey 딕셔너리이다

14.2 태스크 소스

crypto 태스크 소스
태스크 소스SubtleCrypto의 메서드 호출에 대한 응답으로 생성된 promise를 resolve하거나 reject하기 위한 태스크를 큐에 넣는 데 사용된다.
참고
이 명세는 SubtleCrypto 메서드 호출에 대한 응답의 순서에 대해, 여러 호출 사이에서도 호출과 다른 태스크 소스의 태스크 사이에서도 어떤 구체적인 요구사항도 두지 않는다. 이 태스크 소스는 암호화 작업이 완료될 때마다 관련 promise를 resolve하거나 reject하기 위해 태스크를 큐에 넣는 데 사용될 뿐이며, 이는 경쟁 상태를 방지하기 위한 것이다.

14.3 메서드와 매개변수

참고

모든 오류는 반환된 Promise를 reject함으로써 비동기적으로 보고된다. 여기에는 Web IDL 타입 매핑 오류도 포함된다.

14.3.1 encrypt 메서드

encrypt 메서드는 제공된 CryptoKey와 함께 지정된 AlgorithmIdentifier를 사용하여 데이터를 암호화할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.

  1. algorithmkey를 각각 encrypt() 메서드에 전달된 algorithmkey 매개변수로 둔다.

  2. dataencrypt() 메서드에 전달된 data 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "encrypt"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. normalizedAlgorithmname 멤버가 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  10. key[[usages]] 내부 슬롯에 "encrypt"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  11. ciphertextnormalizedAlgorithm에 의해 지정된 encrypt 작업을 algorithmkey를 사용하고, dataplaintext로 사용하여 수행한 결과로 둔다.

  12. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  13. resultrealm 안에서 ciphertext를 포함하는 ArrayBuffer생성한 결과로 둔다.

  14. promiseresult로 resolve한다.

14.3.2 decrypt 메서드

decrypt 메서드는 제공된 CryptoKey와 함께 지정된 AlgorithmIdentifier를 사용하여 데이터를 복호화할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.

  1. algorithmkey를 각각 decrypt() 메서드에 전달된 algorithmkey 매개변수로 둔다.

  2. datadecrypt() 메서드에 전달된 data 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "decrypt"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. normalizedAlgorithmname 멤버가 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  10. key[[usages]] 내부 슬롯에 "decrypt"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  11. plaintextnormalizedAlgorithm에 의해 지정된 decrypt 작업을 keyalgorithm을 사용하고 dataciphertext로 사용하여 수행한 결과로 둔다.

  12. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  13. resultrealm 안에서 plaintext를 포함하는 ArrayBuffer생성한 결과로 둔다.

  14. promiseresult로 resolve한다.

14.3.3 sign 메서드

sign 메서드는 제공된 CryptoKey와 함께 지정된 AlgorithmIdentifier를 사용하여 데이터에 서명할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.

  1. algorithmkey를 각각 sign() 메서드에 전달된 algorithmkey 매개변수로 둔다.

  2. datasign() 메서드에 전달된 data 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "sign"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. normalizedAlgorithmname 멤버가 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  10. key[[usages]] 내부 슬롯에 "sign"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  11. signaturenormalizedAlgorithm에 의해 지정된 sign 작업을 keyalgorithm을 사용하고 datamessage로 사용하여 수행한 결과로 둔다.

  12. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  13. resultrealm 안에서 signature를 포함하는 ArrayBuffer생성한 결과로 둔다.

  14. promiseresult로 resolve한다.

14.3.4 verify 메서드

verify 메서드는 제공된 CryptoKey와 함께 지정된 AlgorithmIdentifier를 사용하여 데이터를 검증할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.

  1. algorithmkey를 각각 verify() 메서드에 전달된 algorithmkey 매개변수로 둔다.

  2. signatureverify() 메서드에 전달된 signature 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. dataverify() 메서드에 전달된 data 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  4. normalizedAlgorithmalgalgorithm으로, op를 "verify"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  5. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  6. realm관련 realm of this로 둔다.

  7. promise를 새 Promise로 둔다.

  8. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  9. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  10. normalizedAlgorithmname 멤버가 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  11. key[[usages]] 내부 슬롯에 "verify"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  12. resultnormalizedAlgorithm에 의해 지정된 verify 작업을 key, algorithmsignature를 사용하고 datamessage로 사용하여 수행한 결과로 둔다.

  13. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  14. promiseresult로 resolve한다.

14.3.5 digest 메서드

digest 메서드는 지정된 AlgorithmIdentifier를 사용하여 데이터를 다이제스트할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.

  1. algorithmdigest() 메서드에 전달된 algorithm 매개변수로 둔다.

  2. datadigest() 메서드에 전달된 data 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "digest"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. digestnormalizedAlgorithm에 의해 지정된 digest 작업을 algorithm을 사용하고, datamessage로 사용하여 수행한 결과로 둔다.

  10. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  11. resultrealm 안에서 digest를 포함하는 ArrayBuffer생성한 결과로 둔다.

  12. promiseresult로 resolve한다.

14.3.6 generateKey 메서드

호출될 때, generateKey는 다음 단계를 수행해야 MUST 한다.

  1. algorithm, extractableusages를 각각 generateKey() 메서드에 전달된 algorithm, extractablekeyUsages 매개변수로 둔다.

  2. normalizedAlgorithmalgalgorithm으로, op를 "generateKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  3. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  4. realm관련 realm of this로 둔다.

  5. promise를 새 Promise로 둔다.

  6. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  7. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  8. resultnormalizedAlgorithm에 의해 지정된 generate key 작업을 algorithm, extractableusages를 사용하여 수행한 결과로 둔다.

  9. resultCryptoKey 객체인 경우:

    result[[type]] 내부 슬롯이 "secret" 또는 "private"이고 usages가 비어 있으면, throw a SyntaxError.

    resultCryptoKeyPair 객체인 경우:

    resultprivateKey 속성의 [[usages]] 내부 슬롯이 빈 시퀀스이면, throw a SyntaxError.

  10. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  11. result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.

  12. promiseresult로 resolve한다.

14.3.7 deriveKey 메서드

호출될 때, deriveKey는 다음 단계를 수행해야 MUST 한다.

  1. algorithm, baseKey, derivedKeyType, extractableusages를 각각 deriveKey() 메서드에 전달된 algorithm, baseKey, derivedKeyType, extractablekeyUsages 매개변수로 둔다.

  2. normalizedAlgorithmalgalgorithm으로, op를 "deriveBits"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  3. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  4. normalizedDerivedKeyAlgorithmImportalgderivedKeyType으로, op를 "importKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  5. 오류가 발생했다면, normalizedDerivedKeyAlgorithmImport로 reject된 Promise를 반환한다.

  6. normalizedDerivedKeyAlgorithmLengthalgderivedKeyType으로, op를 "get key length"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  7. 오류가 발생했다면, normalizedDerivedKeyAlgorithmLength로 reject된 Promise를 반환한다.

  8. realm관련 realm of this로 둔다.

  9. promise를 새 Promise로 둔다.

  10. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  11. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  12. normalizedAlgorithmname 멤버가 baseKey[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  13. baseKey[[usages]] 내부 슬롯에 "deriveKey"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  14. lengthnormalizedDerivedKeyAlgorithmLength에 의해 지정된 get key length 알고리즘을 derivedKeyType을 사용하여 수행한 결과로 둔다.

  15. secretnormalizedAlgorithm에 의해 지정된 derive bits 작업을 key, algorithmlength를 사용하여 수행한 결과로 둔다.

  16. resultnormalizedDerivedKeyAlgorithmImport에 의해 지정된 import key 작업을, "raw"를 format으로, secretkeyData로, derivedKeyTypealgorithm으로 사용하고, extractableusages를 사용하여 수행한 결과로 둔다.

  17. result[[type]] 내부 슬롯이 "secret" 또는 "private"이고 usages가 비어 있으면, throw a SyntaxError.

  18. result[[extractable]] 내부 슬롯을 extractable로 설정한다.

  19. result[[usages]] 내부 슬롯을 usages정규화된 값으로 설정한다.

  20. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  21. result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.

  22. promiseresult로 resolve한다.

14.3.8 deriveBits 메서드

호출될 때, deriveBits는 다음 단계를 수행해야 MUST 한다.

  1. algorithm, baseKeylength를 각각 deriveBits() 메서드에 전달된 algorithm, baseKeylength 매개변수로 둔다.

  2. normalizedAlgorithmalgalgorithm으로, op를 "deriveBits"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  3. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  4. realm관련 realm of this로 둔다.

  5. promise를 새 Promise로 둔다.

  6. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  7. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  8. normalizedAlgorithmname 멤버가 baseKey[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  9. baseKey[[usages]] 내부 슬롯에 "deriveBits"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  10. bitsnormalizedAlgorithm에 의해 지정된 derive bits 작업을 baseKey, algorithmlength를 사용하여 수행한 결과로 둔다.

  11. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  12. resultrealm 안에서 bits를 포함하는 ArrayBuffer생성한 결과로 둔다.

  13. promiseresult로 resolve한다.

14.3.9 importKey 메서드

호출될 때, importKey 메서드는 다음 단계를 수행해야 MUST 한다.

  1. format, algorithm, extractableusages를 각각 importKey() 메서드에 전달된 format, algorithm, extractablekeyUsages 매개변수로 둔다.

  2. format이 문자열 "raw", "pkcs8", 또는 "spki"와 같은 경우:
    1. importKey() 메서드에 전달된 keyData 매개변수가 JsonWebKey 딕셔너리이면, throw a TypeError.

    2. keyDataimportKey() 메서드에 전달된 keyData 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

    format이 문자열 "jwk"와 같은 경우:
    1. importKey() 메서드에 전달된 keyData 매개변수가 JsonWebKey 딕셔너리가 아니면, throw a TypeError.

    2. keyDataimportKey() 메서드에 전달된 keyData 매개변수로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "importKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. resultnormalizedAlgorithm에 의해 지정된 import key 작업을 keyData, algorithm, format, extractableusages를 사용하여 수행한 결과인 CryptoKey 객체로 둔다.

  10. result[[type]] 내부 슬롯이 "secret" 또는 "private"이고 usages가 비어 있으면, throw a SyntaxError.

  11. result[[extractable]] 내부 슬롯을 extractable로 설정한다.

  12. result[[usages]] 내부 슬롯을 usages정규화된 값으로 설정한다.

  13. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  14. result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.

  15. promiseresult로 resolve한다.

참고

상호운용성을 위해 "raw" 키 형식 지원이 권장된다. 웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해 테스트 스위트를 참조해야 한다.

참고

구조화된 키 형식인 "spki", "pkcs8" 및 "jwk"의 경우, 알고리즘의 키 가져오기 절차에서 명시적으로 참조되지 않는 필드는 무시된다.

14.3.10 exportKey 메서드

호출될 때, exportKey 메서드는 다음 단계를 수행해야 MUST 한다.

  1. formatkey를 각각 exportKey() 메서드에 전달된 formatkey 매개변수로 둔다.

  2. realm관련 realm of this로 둔다.

  3. promise를 새 Promise로 둔다.

  4. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  5. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  6. key[[algorithm]] 내부 슬롯의 name 멤버가 export key 작업을 지원하는 등록된 알고리즘을 식별하지 않으면, throw a NotSupportedError.

  7. key[[extractable]] 내부 슬롯이 false이면, throw an InvalidAccessError.

  8. resultkey[[algorithm]] 내부 슬롯에 의해 지정된 export key 작업을 keyformat을 사용하여 수행한 결과로 둔다.

  9. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  10. format이 문자열 "raw", "pkcs8", 또는 "spki"와 같은 경우:
    resultrealm 안에서 result를 포함하는 ArrayBuffer생성한 결과로 둔다.
    format이 문자열 "jwk"와 같은 경우:
    result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.
  11. promiseresult로 resolve한다.

참고

상호운용성을 위해 "raw" 키 형식 지원이 권장된다. 웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해 테스트 스위트를 참조해야 한다.

14.3.11 wrapKey 메서드

호출될 때, wrapKey 메서드는 다음 단계를 수행해야 MUST 한다.

  1. format, key, wrappingKeyalgorithm을 각각 wrapKey() 메서드에 전달된 format, key, wrappingKeywrapAlgorithm 매개변수로 둔다.

  2. normalizedAlgorithmalgalgorithm으로, op를 "wrapKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  3. 오류가 발생했다면, normalizedAlgorithmalgalgorithm으로, op를 "encrypt"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  5. realm관련 realm of this로 둔다.

  6. promise를 새 Promise로 둔다.

  7. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  8. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  9. normalizedAlgorithmname 멤버가 wrappingKey[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  10. wrappingKey[[usages]] 내부 슬롯에 "wrapKey"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  11. key[[algorithm]] 내부 슬롯에 의해 식별되는 알고리즘이 export key 작업을 지원하지 않으면, throw a NotSupportedError.

  12. key[[extractable]] 내부 슬롯이 false이면, throw an InvalidAccessError.

    참고

    wrapKey 메서드는 사실상 키를 내보내므로, extractable로 표시된 키만 래핑될 수 있다. 특히 이는 이 API가 ext JWK 멤버를 사용하여 non-extractable로 표시된 래핑된 JWK 키를 만들 수 없다는 뜻이다.

    그러나 unwrapKey 메서드는 ext JWK 멤버를 지원하므로, 예를 들어 서버 등 다른 곳에서 만들어진 래핑된 non-extractable 키를 이 API를 사용하여 언래핑할 수 있다.

  13. exportedKeykey[[algorithm]] 내부 슬롯에 의해 지정된 export key 작업을 keyformat을 사용하여 수행한 결과로 둔다.

  14. format이 문자열 "raw", "pkcs8", 또는 "spki"와 같은 경우:
    bytesexportedKey로 둔다.
    format이 문자열 "jwk"와 같은 경우:
    1. jsonexportedKey를 JSON 문법에 부합하는 UTF-16 문자열로 표현한 결과로 둔다. 예를 들어 새 전역 객체의 컨텍스트에서 [ECMA-262]에 지정된 JSON.stringify 알고리즘을 실행하여 얻을 수 있다.

    2. bytesjsonUTF-8 인코딩한 결과로 둔다.

    참고

    일부 알고리즘의 키 래핑 작업은 페이로드 크기에 제약을 둔다. 예를 들어 AES-KW는 페이로드 길이가 8바이트의 배수일 것을 요구하고 RSA-OAEP는 길이에 제한을 둔다. 주어진 키의 직렬화에 유연성을 제공하는 키 형식(예: JWK)의 경우, 구현은 래핑 알고리즘의 제약에 맞게 직렬화를 조정하도록 선택할 수 있다. 이것이 JSON.stringify가 규범적으로 요구되지 않는 이유이다. 그렇지 않으면 구현이 추가 패딩을 도입하는 것을 금지하게 되기 때문이다.

  15. normalizedAlgorithm이 wrap key 작업을 지원하는 경우:

    resultnormalizedAlgorithm에 의해 지정된 wrap key 작업을 algorithm을 사용하고, wrappingKeykey로, bytesplaintext로 사용하여 수행한 결과로 둔다.

    그렇지 않고, normalizedAlgorithm이 encrypt 작업을 지원하는 경우:

    resultnormalizedAlgorithm에 의해 지정된 encrypt 작업을 algorithm을 사용하고, wrappingKeykey로, bytesplaintext로 사용하여 수행한 결과로 둔다.

    그 밖의 경우:
    throw a NotSupportedError.
  16. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  17. resultrealm 안에서 result를 포함하는 ArrayBuffer생성한 결과로 둔다.

  18. promiseresult로 resolve한다.

참고

상호운용성을 위해 "raw" 키 형식 지원이 권장된다. 웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해 테스트 스위트를 참조해야 한다.

14.3.12 unwrapKey 메서드

호출될 때, unwrapKey 메서드는 다음 단계를 수행해야 MUST 한다.

  1. format, unwrappingKey, algorithm, unwrappedKeyAlgorithm, extractableusages를 각각 unwrapKey() 메서드에 전달된 format, unwrappingKey, unwrapAlgorithm, unwrappedKeyAlgorithm, extractablekeyUsages 매개변수로 둔다.

  2. wrappedKeyunwrapKey() 메서드에 전달된 wrappedKey 매개변수가 보유한 바이트의 복사본을 얻은 결과로 둔다.

  3. normalizedAlgorithmalgalgorithm으로, op를 "unwrapKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  4. 오류가 발생했다면, normalizedAlgorithmalgalgorithm으로, op를 "decrypt"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  5. 오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.

  6. normalizedKeyAlgorithmalgunwrappedKeyAlgorithm으로, op를 "importKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.

  7. 오류가 발생했다면, normalizedKeyAlgorithm으로 reject된 Promise를 반환한다.

  8. realm관련 realm of this로 둔다.

  9. promise를 새 Promise로 둔다.

  10. promise를 반환하고 나머지 단계를 병렬로 수행한다.

  11. 다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.

  12. normalizedAlgorithmname 멤버가 unwrappingKey[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw an InvalidAccessError.

  13. unwrappingKey[[usages]] 내부 슬롯에 "unwrapKey"인 항목이 포함되어 있지 않으면, throw an InvalidAccessError.

  14. normalizedAlgorithm이 unwrap key 작업을 지원하는 경우:
    bytesnormalizedAlgorithm에 의해 지정된 unwrap key 작업을 algorithm을 사용하고, unwrappingKeykey로, wrappedKeyciphertext로 사용하여 수행한 결과로 둔다.
    그렇지 않고, normalizedAlgorithm이 decrypt 작업을 지원하는 경우:
    bytesnormalizedAlgorithm에 의해 지정된 decrypt 작업을 algorithm을 사용하고, unwrappingKeykey로, wrappedKeyciphertext로 사용하여 수행한 결과로 둔다.
    그 밖의 경우:
    throw a NotSupportedError.
  15. format이 문자열 "raw", "pkcs8", 또는 "spki"와 같은 경우:
    keybytes로 둔다.
    format이 문자열 "jwk"와 같은 경우:
    keybytes를 파싱할 data로 하여 JWK 파싱 알고리즘을 실행한 결과로 둔다.
  16. resultnormalizedKeyAlgorithm에 의해 지정된 import key 작업을 unwrappedKeyAlgorithmalgorithm으로, format, usagesextractable을 사용하고, keykeyData로 사용하여 수행한 결과로 둔다.

  17. result[[type]] 내부 슬롯이 "secret" 또는 "private"이고 usages가 비어 있으면, throw a SyntaxError.

  18. result[[extractable]] 내부 슬롯을 extractable로 설정한다.

  19. result[[usages]] 내부 슬롯을 usages정규화된 값으로 설정한다.

  20. realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.

  21. result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.

  22. promiseresult로 resolve한다.

참고

상호운용성을 위해 "raw" 키 형식 지원이 권장된다. 웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해 테스트 스위트를 참조해야 한다.

14.4 예외

SubtleCrypto 인터페이스의 메서드는 ECMAScript [ECMA-262] 또는 DOMException에 정의된 미리 정의된 예외로 반환된 promise를 reject함으로써 오류를 반환한다. 다음의 미리 정의된 예외가 사용된다: TypeError. [DOM]의 다음 DOMException 타입이 사용된다:

이름 설명
NotSupportedError 알고리즘이 지원되지 않는다
SyntaxError 필수 매개변수가 누락되었거나 범위를 벗어났다
InvalidAccessError 요청된 작업이 제공된 키에 대해 유효하지 않다
DataError 작업에 제공된 데이터가 요구사항을 충족하지 않는다
OperationError 작업별 이유로 작업이 실패했다

이 명세가 오류를 throw하라고 말할 때, 사용자 에이전트는 [WebIDL]에 설명된 대로 오류를 throw해야 한다. 이것이 하위 알고리즘에서 발생하면, 예외를 잡는 절차를 명시적으로 설명하는 알고리즘에 도달할 때까지 해당 하위 알고리즘과 모든 상위 알고리즘의 실행이 종료된다. throw된 오류 객체는 관련 realm of this와 연결되어야 한다.

15. JsonWebKey 딕셔너리

WebIDLdictionary RsaOtherPrimesInfo {
  // The following fields are defined in Section 6.3.2.7 of JSON Web Algorithms
  DOMString r;
  DOMString d;
  DOMString t;
};

dictionary JsonWebKey {
  // The following fields are defined in Section 3.1 of JSON Web Key
  DOMString kty;
  DOMString use;
  sequence<DOMString> key_ops;
  DOMString alg;

  // The following fields are defined in JSON Web Key Parameters Registration
  boolean ext;

  // The following fields are defined in Section 6 of JSON Web Algorithms
  DOMString crv;
  DOMString x;
  DOMString y;
  DOMString d;
  DOMString n;
  DOMString e;
  DOMString p;
  DOMString q;
  DOMString dp;
  DOMString dq;
  DOMString qi;
  sequence<RsaOtherPrimesInfo> oth;
  DOMString k;
};

JsonWebKey 딕셔너리는 Web Cryptography API 애플리케이션 안에서 네이티브하고 효율적으로 사용할 수 있도록 하면서, JSON Web Key [JWK] 구조로 표현되는 암호화 키를 표현하고 교환하는 방법을 제공한다.

RsaOtherPrimesInfo의 멤버는 JSON Web Algorithms의 6.3.2.7절에 정의되어 있다.

16. BigInteger

WebIDLtypedef Uint8Array BigInteger;

BigInteger typedef는 임의 크기의 부호 없는 정수를 빅 엔디언 순서로 보유하는 Uint8Array이다. API에서 읽은 값은 최소 typed array 길이를 가져야 SHALL 한다 (즉, 앞쪽 0비트가 최대 7개이며, 길이가 8비트여야 하는 값 0은 제외한다). API는 빈 배열을 포함하여, 앞쪽 0비트가 임의 개수인 값을 받아들여야 SHALL 하며, 빈 배열은 0을 나타낸다.

참고
정수는 부호 없는 값이므로, 최상위 비트는 부호 비트가 아니다. 구현자는 부호 있는 정수를 기대하는 big integer 구현에 매핑할 때 주의해야 한다.

17. CryptoKeyPair 딕셔너리

WebIDLdictionary CryptoKeyPair {
  CryptoKey publicKey;
  CryptoKey privateKey;
};

CryptoKeyPair 딕셔너리는 공개 (publicKey) 키와 비공개 (privateKey) 키 둘 모두로 구성된 비대칭 키 쌍을 나타낸다.

18. 알고리즘

18.1 개요

이 절은 비규범적이다.

이 명세는 SubtleCrypto 인터페이스를 통해 암호화 작업을 수행하기 위한 공통 인터페이스를 제공하는 것 외에도, 작성자가 사용하고자 할 수 있고 User Agent가 구현하기로 선택할 수 있는 다양한 알고리즘에 대한 설명도 제공한다. 여기에는 널리 배포된 대칭 및 비대칭 알고리즘, 키 파생 메커니즘, 그리고 키를 래핑하고 언래핑하기 위한 메서드의 선택이 포함된다. 또한 이 명세는 추가 명세가 추가 암호화 알고리즘을 도입할 수 있도록 하는 프로세스를 정의한다.

18.2 개념

18.2.1 명명

Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은 고유한 이름을 가져야 MUST 하며, 이를 그 알고리즘의 인식된 알고리즘 이름이라고 한다. 이 이름은 다른 어떤 명세도 Web Cryptography API와 함께 사용하기 위해 동일한 대소문자 구분 없는 문자열을 정의하지 않도록 해야 한다.

18.2.2 지원되는 작업

Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은 원하는 암호화 작업을 수행하기 위해 SubtleCrypto 인터페이스가 호출할 하위 알고리즘들의 집합인 지원되는 작업 목록을 가진다. 이 명세는 다음 작업을 사용한다.

  • encrypt
  • decrypt
  • sign
  • verify
  • digest
  • deriveBits
  • wrapKey
  • unwrapKey
  • generateKey
  • importKey
  • exportKey
  • get key length

주어진 알고리즘 명세가 특정 작업을 지원되는 것으로 나열하지 않거나, 명시적으로 어떤 작업을 지원되지 않는 것으로 나열하면, User Agent는 그 하위 알고리즘의 호출이 NotSupportedError를 throw한 것처럼 동작해야 MUST 한다.

18.2.3 정규화

Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은 지원되는 작업마다 알고리즘 정규화에 사용할 IDL 타입과, 하위 알고리즘 반환값의 IDL 타입 또는 타입들을 정의해야 MUST 한다.

18.3 명세 관례

이 명세 안의 모든 암호화 알고리즘 정의는 다음 명세 관례를 따른다. "Registration"이라는 제목의 절은 인식된 알고리즘 이름을 포함한다. 또한 여기에는 각 지원되는 작업을 행으로 나열하는 표가 포함되며, 각 행은 Operation 열로 식별된다. 주어진 행의 Parameters 열의 내용은 그 작업에 대해 알고리즘 정규화에 사용할 IDL 타입을 포함하고, 그 행의 Result 열의 내용은 지원되는 작업을 수행한 결과가 되는 IDL 타입을 나타낸다.

적합한 User Agent가 어떤 알고리즘을 구현한다면, 모든 지원되는 작업을 구현해야 MUST 하며, 지정된 IDL 타입을 반환해야 MUST 한다.

또한 초기화 시, 적합한 User Agent는 지원되는 각 작업에 대해 알고리즘 정의 단계를 수행하여, 표시된 대로 그 IDL 매개변수 타입을 등록해야 한다.

달리 명시되지 않는 한, 이 명세에서 정의한 작업이 생성한 객체는 관련 realm of this와 연결되어야 한다.

18.4 알고리즘 정규화

18.4.1 설명

이 절은 비규범적이다.

AlgorithmIdentifier typedef는 알고리즘을 DOMString 또는 객체로 지정할 수 있게 한다. DOMString을 사용하는 것은 매개변수가 없는 알고리즘(예: SHA-1)을 작성자가 간단히 표기할 수 있게 하기 위한 것이다. 객체를 사용하는 것은 객체와 관련된 모든 매개변수를 포함하는 Algorithm(또는 적절한 서브클래스)를 지정할 수 있게 하기 위한 것이다.

이 때문에 AlgorithmIdentifier를 이 API에서 사용할 수 있는 적절한 딕셔너리로 변환하는 알고리즘을 정의할 필요가 있다. 이 알고리즘은 새로운 암호화 알고리즘을 추가할 수 있도록 확장 가능해야 하며, 호출 스크립트로 제어가 반환되기 전에 Web IDL 타입 매핑이 일어날 수 있도록 일관적이어야 한다. 그렇지 않으면 매개변수나 스크립트 환경의 변이가 잠재적으로 허용될 수 있다.

18.4.2 내부 상태 객체

이 명세는 내부 객체인 supportedAlgorithms를 사용한다. 이 내부 객체는 애플리케이션에 노출되지 않는다.

이 값은 애플리케이션에 노출되지 않으므로, 정확한 타입은 지정되지 않는다. 다만 키 비교가 대소문자를 구분하는 방식으로 수행되는 키/값 쌍의 연관 컨테이너처럼 동작해야 한다는 것만 요구된다.

이 내부 객체의 초기 내용은 다음과 같다.

  1. 지원되는 작업 목록의 각 값 v에 대해, 내부 객체 supportedAlgorithmsv 키를 새 연관 컨테이너로 설정한다.

18.4.3 알고리즘 정의

알고리즘 정의 알고리즘은 특정 알고리즘에 대해 사용자 에이전트가 인수를 어떻게 정규화해야 하는지를 명세 작성자가 나타내기 위해 사용된다. 그 입력은 DOMString으로 표현되는 알고리즘 이름 alg, DOMString으로 표현되는 작업 이름 op, 그리고 원하는 IDL 딕셔너리 타입 type이다. 알고리즘은 다음과 같이 동작한다.

  1. registeredAlgorithmssupportedAlgorithmsop 키에 저장된 연관 컨테이너로 둔다.
  2. registeredAlgorithmsalg 키를 IDL 딕셔너리 타입 type으로 설정한다.

18.4.4 알고리즘 정규화

알고리즘 정규화 알고리즘은 Web IDL 변환이 일어난 뒤 입력을 대상 IDL 딕셔너리 타입으로 강제 변환하는 프로세스를 정의한다. 이 알고리즘은 향후 명세가 추가 알고리즘을 정의할 수 있도록 확장 가능하고, Promise와 함께 사용하기에 안전하도록 설계되어 있다. 그 입력은 작업 이름 opAlgorithmIdentifier alg이다. 그 출력은 IDL 딕셔너리 타입 또는 오류이다. 이는 다음과 같이 동작한다.

alg가 DOMString의 인스턴스인 경우:

alg를, name 속성이 alg인 새 Algorithm 딕셔너리로 설정하고, opop로 설정하여 알고리즘 정규화 알고리즘을 실행한 결과를 반환한다.

alg가 객체인 경우:
  1. registeredAlgorithmssupportedAlgorithmsop 키에 저장된 연관 컨테이너로 둔다.
  2. initialAlgalg가 나타내는 ECMAScript 객체를 [WebIDL]에 정의된 대로 IDL 딕셔너리 타입 Algorithm으로 변환한 결과로 둔다.
  3. 오류가 발생했다면, 오류를 반환하고 이 알고리즘을 종료한다.
  4. algNameinitialAlgname 속성 값으로 둔다.
  5. registeredAlgorithmsalgName대소문자를 구분하지 않는 문자열 일치를 하는 키를 포함하는 경우:
    1. algName을 일치하는 키의 값으로 설정한다.

    2. desiredTyperegisteredAlgorithmsalgName에 저장된 IDL 딕셔너리 타입으로 둔다.

    그 밖의 경우:
    NotSupportedError를 반환하고 이 알고리즘을 종료한다.
  6. normalizedAlgorithmalg가 나타내는 ECMAScript 객체를 [WebIDL]에 정의된 대로 IDL 딕셔너리 타입 desiredType으로 변환한 결과로 둔다.
  7. normalizedAlgorithmname 속성을 algName으로 설정한다.
  8. 오류가 발생했다면, 오류를 반환하고 이 알고리즘을 종료한다.
  9. dictionaries를 IDL 딕셔너리 타입 desiredTypedesiredType의 모든 상속된 딕셔너리로 구성된 목록으로 두며, 가장 덜 파생된 것에서 가장 많이 파생된 것 순서로 둔다.
  10. dictionaries 안의 각 딕셔너리 dictionary에 대해:

    1. dictionary에 선언된 각 딕셔너리 멤버 member에 대해, 순서대로:

      1. keymember의 식별자로 둔다.
      2. idlValuenormalizedAlgorithm에서 key라는 키 이름을 가진 딕셔너리 멤버의 값으로 둔다.
      3. member가 타입 BufferSource이고 존재하는 경우:
        normalizedAlgorithm에서 키 이름이 key인 딕셔너리 멤버를 idlValue보유한 바이트의 복사본을 얻은 결과로 설정하여, 현재 값을 대체한다.
        member가 타입 HashAlgorithmIdentifier인 경우:
        normalizedAlgorithm에서 키 이름이 key인 딕셔너리 멤버를 algidlValue로, op를 "digest"로 설정하여 알고리즘을 정규화한 결과로 설정한다.
        member가 타입 AlgorithmIdentifier인 경우:
        normalizedAlgorithm에서 키 이름이 key인 딕셔너리 멤버를 algidlValue로 설정하고, opalgName으로 식별되는 알고리즘을 정의한 명세가 정의한 작업으로 설정하여 알고리즘을 정규화한 결과로 설정한다.
      4. 오류가 발생했다면, 오류를 반환하고 이 알고리즘을 종료한다.
  11. normalizedAlgorithm을 반환한다.

18.5 권장사항

이 절은 비규범적이다.

18.5.1 작성자를 위해

이 API는 암호학의 향후 발전을 따라갈 수 있도록 확장 가능하게 의도되었으므로, 적합한 사용자 에이전트가 구현해야 하는 알고리즘은 없다. 따라서 작성자는 현재 어떤 알고리즘이 권장되고 구현에서 지원되는지 확인해야 한다.

보안 고려사항에서 강조했듯이, 어떤 목적에서는 강력하다고 여겨질 수 있는 암호화 알고리즘도 다른 목적에 사용될 때는 충분하지 않을 수 있다. 따라서 작성자는 새로운 암호화 프로토콜을 고안하기 전에 극도로 주의해서 진행해야 한다.

또한 이 명세에는 기본 사용 방식에서 암호화 취약점으로 이어질 수 있는 여러 알고리즘이 포함되어 있다. 이러한 우려는 이 명세가 제공하는 추가 알고리즘과 결합 및 조합하는 방법 등을 통해 완화될 수 있지만, 작성자는 특정 알고리즘을 사용하기 전에 주의를 기울이고 관련 암호학 문헌을 검토해야 한다. 이 명세에 알고리즘이 포함되어 있다는 것은 그 알고리즘이 어떤 목적이나 모든 목적에 적합하다는 표시가 아니며, 단지 적합한 User Agent가 해당 알고리즘을 구현하기로 선택한 경우 그 알고리즘을 어떻게 구현해야 하는지에 대한 명세를 제공하는 역할을 할 뿐이다.

18.5.2 구현자를 위해

개발자를 위한 상호운용성을 촉진하기 위해, 이 명세는 권장 알고리즘 목록을 포함한다. 이들은 작성 시점에 실제로 가장 널리 사용되는 알고리즘으로 간주되며, 따라서 이 명세의 초기 구현을 위한 좋은 출발점을 제공한다. 권장 알고리즘은 다음과 같다.

19. 알고리즘 개요

이 절은 비규범적이다.

아래 표는 이 명세에서 설명하는 알고리즘의 개요와, 해당 알고리즘을 사용할 수 있는 SubtleCrypto 메서드 집합을 포함한다. 알고리즘이 어떤 메서드와 함께 사용되려면, 그 메서드의 절차에서 정의된 대응하는 작업 또는 작업들이 알고리즘 명세에 정의되어 있어야 한다. 메서드에서 기반 작업으로의 이 매핑은 일대일이 아니라는 점에 유의하라.

참고

애플리케이션 개발자와 스크립트 작성자는 이 표를 특정 알고리즘 사용에 대한 권장사항으로 해석해서는 안 된다. 대신 이 표는 단순히 어떤 메서드가 지원되는지를 문서화한다. 작성자는 특정 알고리즘을 사용할 때 발생할 수 있는 위험과 우려를 더 잘 이해하기 위해 이 문서의 작성자를 위한 보안 고려사항 절을 참조해야 한다.

알고리즘 이름 encrypt decrypt sign verify digest generateKey deriveKey deriveBits importKey exportKey wrapKey unwrapKey
RSASSA-PKCS1-v1_5
RSA-PSS
RSA-OAEP
ECDSA
ECDH
Ed25519
X25519
AES-CTR
AES-CBC
AES-GCM
AES-KW
HMAC
SHA-1
SHA-256
SHA-384
SHA-512
HKDF
PBKDF2

20. RSASSA-PKCS1-v1_5

20.1 설명

이 절은 비규범적이다.

"RSASSA-PKCS1-v1_5" 알고리즘 식별자는 [RFC3447]에 지정된 RSASSA-PKCS1-v1_5 알고리즘과 이 명세에 정의된 SHA 해시 함수를 사용하여 서명과 검증을 수행하는 데 사용된다.

다른 명세는 RSASSA-PKCS1-v1_5와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘의 digest 작업과 RSASSA-PKCS1-v1_5를 위한 키 가져오기 단계키 내보내기 단계를 정의해야 한다.

20.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "RSASSA-PKCS1-v1_5"이다.

작업 매개변수 결과
sign 없음 바이트 시퀀스
verify 없음 boolean
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey 없음 object

20.3 RsaKeyGenParams 딕셔너리

WebIDLdictionary RsaKeyGenParams : Algorithm {
  required [EnforceRange] unsigned long modulusLength;
  required BigInteger publicExponent;
};

modulusLength 멤버는 RSA 모듈러스의 비트 단위 길이를 포함한다.

publicExponent 멤버는 RSA 공개 지수를 포함한다.

20.4 RsaHashedKeyGenParams 딕셔너리

WebIDLdictionary RsaHashedKeyGenParams : RsaKeyGenParams {
  required HashAlgorithmIdentifier hash;
};

hash 멤버는 사용할 해시 알고리즘을 나타낸다.

20.5 RsaKeyAlgorithm 딕셔너리

WebIDLdictionary RsaKeyAlgorithm : KeyAlgorithm {
  required unsigned long modulusLength;
  required BigInteger publicExponent;
};

modulusLength 멤버는 RSA 모듈러스의 비트 단위 길이를 포함한다.

publicExponent 멤버는 RSA 공개 지수를 포함한다.

20.6 RsaHashedKeyAlgorithm 딕셔너리

WebIDLdictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
  required KeyAlgorithm hash;
};

hash 멤버는 이 키와 함께 사용되는 해시 알고리즘을 설명한다.

20.7 RsaHashedImportParams 딕셔너리

WebIDLdictionary RsaHashedImportParams : Algorithm {
  required HashAlgorithmIdentifier hash;
};

hash 멤버는 사용할 해시 알고리즘을 설명한다.

20.8 작업

20.8.1 서명

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. key[[handle]] 내부 슬롯이 나타내는 키를 서명자의 비공개 키로, messageM으로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 EMSA-PKCS1-v1_5 인코딩 메서드의 Hash 옵션으로 사용하여, [RFC3447] 8.2절에 정의된 서명 생성 작업을 수행한다.

  3. 작업을 수행한 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. signature를 작업 수행의 결과인 값 S로 둔다.

  5. signature를 반환한다.

20.8.2 검증

  1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. key[[handle]] 내부 슬롯이 나타내는 키를 서명자의 RSA 공개 키로, messageM으로, signatureS로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 EMSA-PKCS1-v1_5 인코딩 메서드의 Hash 옵션으로 사용하여, [RFC3447] 8.2절에 정의된 서명 검증 작업을 수행한다.

  3. result를 작업의 결과가 "valid signature"이면 값이 true이고, 그렇지 않으면 false인 boolean으로 둔다.

  4. result를 반환한다.

20.8.3 키 생성

  1. usages가 "sign" 또는 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmmodulusLength 속성과 같은 RSA 모듈러스 길이 및 normalizedAlgorithmpublicExponent 속성과 같은 RSA 공개 지수로, [RFC3447]에 정의된 대로 RSA 키 쌍을 생성한다.

  3. 키 쌍의 생성이 실패하면, throw하여 OperationError를 발생시킨다.

  4. algorithm을 새 RsaHashedKeyAlgorithm 딕셔너리로 둔다.

  5. algorithmname 속성을 "RSASSA-PKCS1-v1_5"로 설정한다.

  6. algorithmmodulusLength 속성을 normalizedAlgorithmmodulusLength 속성과 같게 설정한다.

  7. algorithmpublicExponent 속성을 normalizedAlgorithmpublicExponent 속성과 같게 설정한다.

  8. algorithmhash 속성을 normalizedAlgorithmhash 멤버와 같게 설정한다.

  9. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  10. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  11. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  12. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  13. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]사용법 교집합으로 설정한다.

  14. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  15. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  16. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  17. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  18. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]사용법 교집합으로 설정한다.

  19. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  20. resultpublicKey 속성을 publicKey로 설정한다.

  21. resultprivateKey 속성을 privateKey로 설정한다.

  22. result를 반환한다.

20.8.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. publicKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataspkisubjectPublicKeyInfo 필드로, structure는 [RFC3447] A.1.1절에 지정된 RSAPublicKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, publicKey가 [RFC3447]에 따른 유효한 공개 키가 아님을 판정할 수 있다면, throw하여 DataError를 발생시킨다.

    7. keypublicKey로 식별되는 RSA 공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "public"으로 설정한다

    format이 "pkcs8"인 경우:
    1. usages가 "sign"이 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. rsaPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC3447] A.1.2절에 지정된 RSAPrivateKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, rsaPrivateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니면, throw하여 DataError를 발생시킨다.

    7. keyrsaPrivateKey로 식별되는 RSA 비공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "private"로 설정한다

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      Throw하여 DataError를 발생시킨다.

    2. jwkd 필드가 존재하고 usages가 "sign"이 아닌 항목을 포함하거나, 또는 jwkd 필드가 존재하지 않고 usages가 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    3. jwkkty 필드가 "RSA"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    4. usages가 비어 있지 않고, jwkuse 필드가 존재하며 "sig"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    5. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    6. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    7. hash를 초기값이 undefined인 문자열로 둔다.

    8. jwkalg 필드가 존재하지 않는 경우:

      hash를 undefined로 둔다.

      alg 필드가 문자열 "RS1"과 같은 경우:

      hash를 문자열 "SHA-1"로 둔다.

      alg 필드가 문자열 "RS256"과 같은 경우:

      hash를 문자열 "SHA-256"로 둔다.

      alg 필드가 문자열 "RS384"과 같은 경우:

      hash를 문자열 "SHA-384"로 둔다.

      alg 필드가 문자열 "RS512"와 같은 경우:

      hash를 문자열 "SHA-512"로 둔다.

      그 밖의 경우:
      1. formatjwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    9. hash가 undefined가 아닌 경우:
      1. normalizedHashalghash로, opdigest로 설정하여 알고리즘 정규화를 수행한 결과로 둔다.

      2. normalizedHashnormalizedAlgorithmhash 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    10. jwkd 필드가 존재하는 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.2절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. privateKey가 JSON Web Algorithms [JWA] 6.3.2절에 따라 jwk를 해석하여 식별된 RSA 비공개 키를 나타내도록 둔다.

      3. privateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니면, throw하여 DataError를 발생시킨다.

      4. keyprivateKey를 나타내는 새 CryptoKey 객체로 둔다.

      5. key[[type]] 내부 슬롯을 "private"로 설정한다

      그 밖의 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.1절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.

      3. publicKey가 [RFC3447]에 따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면, throw하여 DataError를 발생시킨다.

      4. keypublicKey를 나타내는 새 CryptoKey로 둔다.

      5. key[[type]] 내부 슬롯을 "public"으로 설정한다

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. algorithm을 새 RsaHashedKeyAlgorithm 딕셔너리로 둔다.

  4. algorithmname 속성을 "RSASSA-PKCS1-v1_5"로 설정한다

  5. algorithmmodulusLength 속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.

  6. algorithmpublicExponent 속성을 RSA 공개 지수의 BigInteger 표현으로 설정한다.

  7. algorithmhash 속성을 normalizedAlgorithmhash 멤버로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

20.8.5 키 내보내기

  1. key를 내보낼 키로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • subjectPublicKey 필드를 [RFC3447] 부록 A.1.1에 정의된 RSAPublicKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 공개 키를 나타낸다

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • privateKey 필드를 [RFC3447] 부록 A.1.2에 정의된 RSAPrivateKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 비공개 키를 나타낸다

        참고
        [RFC5208]은 이 필드의 인코딩이 5절에서 ("예를 들어"로) BER 인코딩이어야 한다고 지정한다. 그러나 WebCrypto 구현이 BER 인코딩과 BER 디코딩을 지원하도록 요구하는 것을 피하기 위해, 오직 DER 인코딩만 생성되거나 허용된다.
    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "RSA"로 설정한다.

    3. hashkey[[algorithm]] 내부 슬롯의 hash 속성의 name 속성으로 둔다.

    4. hash가 "SHA-1"인 경우:

      jwkalg 속성을 문자열 "RS1"로 설정한다.

      hash가 "SHA-256"인 경우:

      jwkalg 속성을 문자열 "RS256"로 설정한다.

      hash가 "SHA-384"인 경우:

      jwkalg 속성을 문자열 "RS384"로 설정한다.

      hash가 "SHA-512"인 경우:

      jwkalg 속성을 문자열 "RS512"로 설정한다.

      그 밖의 경우:
      1. formatkey를 전달하고 alg를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 NotSupportedError를 발생시킨다.

      3. jwkalg 속성을 alg로 설정한다.

    5. jwkne 속성을 JSON Web Algorithms [JWA] 6.3.1절의 대응하는 정의에 따라 설정한다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      1. jwkd, p, q, dp, dq, 및 qi라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2절의 대응하는 정의에 따라 설정한다.

      2. key[[handle]] 내부 슬롯이 나타내는 기반 RSA 비공개 키가 두 개보다 많은 소수로 표현된다면, jwkoth라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2.7절의 대응하는 정의에 따라 설정한다

    7. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    8. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    9. resultjwk로 둔다.

    그 밖의 경우

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

21. RSA-PSS

21.1 설명

이 절은 비규범적이다.

"RSA-PSS" 알고리즘 식별자는 [RFC3447]에 지정된 RSASSA-PSS 알고리즘과 이 명세에 정의된 SHA 해시 함수, 그리고 마스크 생성 공식 MGF1을 사용하여 서명과 검증을 수행하는 데 사용된다.

다른 명세는 RSASSA-PSS와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘의 digest 작업과 RSASSA-PSS를 위한 키 가져오기 단계키 내보내기 단계를 정의해야 한다.

21.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "RSA-PSS"이다.

작업 매개변수 결과
sign RsaPssParams 바이트 시퀀스
verify RsaPssParams boolean
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey 없음 object

21.3 RsaPssParams 딕셔너리

WebIDLdictionary RsaPssParams : Algorithm {
  required [EnforceRange] unsigned long saltLength;
};

saltLength 멤버는 원하는 랜덤 salt의 길이를 바이트 단위로 나타낸다.

21.4 작업

21.4.1 서명

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. key[[handle]] 내부 슬롯이 나타내는 키를 서명자의 비공개 키 K로, message를 서명할 메시지 M으로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447] B.2.1절에 정의된 MGF1을 MGF 옵션으로, normalizedAlgorithmsaltLength 멤버를 EMSA-PSS-ENCODE 작업의 salt 길이 옵션으로 사용하여, [RFC3447] 8.1절에 정의된 서명 생성 작업을 수행한다.

  3. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. signature를 작업 수행 결과인 서명 S로 둔다.

  5. signature를 반환한다.

21.4.2 검증

  1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. key[[handle]] 내부 슬롯이 나타내는 키를 서명자의 RSA 공개 키로, messageM으로, signatureS로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447] B.2.1절에 정의된 MGF1을 MGF 옵션으로, normalizedAlgorithmsaltLength 멤버를 EMSA-PSS-VERIFY 작업의 salt 길이 옵션으로 사용하여, [RFC3447] 8.1절에 정의된 서명 검증 작업을 수행한다.

  3. result를 작업의 결과가 "valid signature"이면 값이 true이고, 그렇지 않으면 false인 boolean으로 둔다.

21.4.3 키 생성

  1. usages가 "sign" 또는 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmmodulusLength 멤버와 같은 RSA 모듈러스 길이 및 normalizedAlgorithmpublicExponent 멤버와 같은 RSA 공개 지수로, [RFC3447]에 정의된 대로 RSA 키 쌍을 생성한다.

  3. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. algorithm을 새 RsaHashedKeyAlgorithm 딕셔너리로 둔다.

  5. algorithmname 속성을 "RSA-PSS"로 설정한다.

  6. algorithmmodulusLength 속성을 normalizedAlgorithmmodulusLength 멤버와 같게 설정한다.

  7. algorithmpublicExponent 속성을 normalizedAlgorithmpublicExponent 멤버와 같게 설정한다.

  8. algorithmhash 속성을 normalizedAlgorithmhash 멤버와 같게 설정한다.

  9. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  10. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  11. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  12. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  13. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]사용법 교집합으로 설정한다.

  14. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  15. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  16. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  17. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  18. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]사용법 교집합으로 설정한다.

  19. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  20. resultpublicKey 속성을 publicKey로 설정한다.

  21. resultprivateKey 속성을 privateKey로 설정한다.

  22. result를 반환한다.

21.4.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. publicKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataspkisubjectPublicKeyInfo 필드로, structure는 [RFC3447] A.1.1절에 지정된 RSAPublicKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, publicKey가 [RFC3447]에 따른 유효한 공개 키가 아니라고 판정할 수 있다면, throw하여 DataError를 발생시킨다.

    7. keypublicKey로 식별되는 RSA 공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "public"으로 설정한다

    format이 "pkcs8"인 경우:
    1. usages가 "sign"이 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. rsaPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC3447] A.1.2절에 지정된 RSAPrivateKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, rsaPrivateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니면, throw하여 DataError를 발생시킨다.

    7. keyrsaPrivateKey로 식별되는 RSA 비공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "private"로 설정한다

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkd 필드가 존재하고 usages가 "sign"이 아닌 항목을 포함하거나, 또는 jwkd 필드가 존재하지 않고 usages가 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    3. jwkkty 필드가 "RSA"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    4. usages가 비어 있지 않고, jwkuse 필드가 존재하며 "sig"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    5. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    6. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    7. jwkalg 필드가 존재하지 않는 경우:

      hash를 undefined로 둔다.

      alg 필드가 문자열 "PS1"과 같은 경우:

      hash를 문자열 "SHA-1"로 둔다.

      alg 필드가 문자열 "PS256"과 같은 경우:

      hash를 문자열 "SHA-256"로 둔다.

      alg 필드가 문자열 "PS384"과 같은 경우:

      hash를 문자열 "SHA-384"로 둔다.

      alg 필드가 문자열 "PS512"와 같은 경우:

      hash를 문자열 "SHA-512"로 둔다.

      그 밖의 경우:
      1. formatjwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    8. hash가 undefined가 아닌 경우:
      1. normalizedHashalghash로, opdigest로 설정하여 알고리즘 정규화를 수행한 결과로 둔다.

      2. normalizedHashnormalizedAlgorithmhash 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    9. jwkd 필드가 존재하는 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.2절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. privateKey가 JSON Web Algorithms [JWA] 6.3.2절에 따라 jwk를 해석하여 식별된 RSA 비공개 키를 나타내도록 둔다.

      3. privateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니라고 판정할 수 있으면, throw하여 DataError를 발생시킨다.

      4. keyprivateKey를 나타내는 새 CryptoKey로 둔다.

      5. key[[type]] 내부 슬롯을 "private"로 설정한다

      그 밖의 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.1절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.

      3. publicKey가 [RFC3447]에 따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면, throw하여 DataError를 발생시킨다.

      4. keypublicKey를 나타내는 새 CryptoKey로 둔다.

      5. key[[type]] 내부 슬롯을 "public"으로 설정한다

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. algorithm을 새 RsaHashedKeyAlgorithm 딕셔너리로 둔다.

  4. algorithmname 속성을 "RSA-PSS"로 설정한다

  5. algorithmmodulusLength 속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.

  6. algorithmpublicExponent 속성을 RSA 공개 지수의 BigInteger 표현으로 설정한다.

  7. algorithmhash 속성을 normalizedAlgorithmhash 멤버로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다

  9. key를 반환한다.

21.4.5 키 내보내기

  1. key를 내보낼 키로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • subjectPublicKey 필드를 [RFC3447] 부록 A.1.1에 정의된 RSAPublicKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 공개 키를 나타낸다

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • privateKey 필드를 [RFC3447] 부록 A.1.2에 정의된 RSAPrivateKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 비공개 키를 나타낸다

        참고
        [RFC5208]은 이 필드의 인코딩이 5절에서 ("예를 들어"로) BER 인코딩이어야 한다고 지정한다. 그러나 WebCrypto 구현이 BER 인코딩과 BER 디코딩을 지원하도록 요구하는 것을 피하기 위해, 오직 DER 인코딩만 생성되거나 허용된다.
    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "RSA"로 설정한다.

    3. hashkey[[algorithm]] 내부 슬롯의 hash 속성의 name 속성으로 둔다.

    4. hash가 "SHA-1"인 경우:

      jwkalg 속성을 문자열 "PS1"로 설정한다.

      hash가 "SHA-256"인 경우:

      jwkalg 속성을 문자열 "PS256"로 설정한다.

      hash가 "SHA-384"인 경우:

      jwkalg 속성을 문자열 "PS384"로 설정한다.

      hash가 "SHA-512"인 경우:

      jwkalg 속성을 문자열 "PS512"로 설정한다.

      그 밖의 경우:
      1. formatkey[[algorithm]] 내부 슬롯의 hash 속성을 전달하고 alg를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

      2. jwkalg 속성을 alg로 설정한다.

    5. jwkne 속성을 JSON Web Algorithms [JWA] 6.3.1절의 대응하는 정의에 따라 설정한다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      1. jwkd, p, q, dp, dq, 및 qi라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2절의 대응하는 정의에 따라 설정한다.

      2. key[[handle]] 내부 슬롯이 나타내는 기반 RSA 비공개 키가 두 개보다 많은 소수로 표현된다면, jwkoth라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2.7절의 대응하는 정의에 따라 설정한다

    7. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    8. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    9. resultjwk로 둔다.

    그 밖의 경우

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

22. RSA-OAEP

22.1 설명

이 절은 비규범적이다.

"RSA-OAEP" 알고리즘 식별자는 [RFC3447]에 지정된 RSAES-OAEP 알고리즘에 따라 암호화와 복호화를 수행하는 데 사용되며, 이 명세에 정의된 SHA 해시 함수와 마스크 생성 함수 MGF1을 사용한다.

다른 명세는 RSAES-OAEP와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업과 RSAES-OAEP를 위한 키 가져오기 단계키 내보내기 단계를 정의해야 한다.

22.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "RSA-OAEP"이다.

작업 매개변수 결과
encrypt RsaOaepParams 바이트 시퀀스
decrypt RsaOaepParams 바이트 시퀀스
generateKey RsaHashedKeyGenParams CryptoKeyPair
importKey RsaHashedImportParams CryptoKey
exportKey 없음 object

22.3 RsaOaepParams 딕셔너리

WebIDLdictionary RsaOaepParams : Algorithm {
  BufferSource label;
};

label 멤버는 메시지와 연결할 선택적인 label/application 데이터를 나타낸다.

22.4 작업

22.4.1 암호화

  1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. labelnormalizedAlgorithmlabel 멤버로 두거나, normalizedAlgorithmlabel 멤버가 존재하지 않으면 빈 바이트 시퀀스로 둔다.

  3. key가 나타내는 키를 수신자의 RSA 공개 키로, plaintext를 암호화할 메시지 M으로, label을 레이블 L로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447] B.2.1절에 정의된 MGF1을 MGF 옵션으로 사용하여, [RFC3447] 7.1절에 정의된 암호화 작업을 수행한다.

  4. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  5. ciphertext를 작업 수행 결과인 값 C로 둔다.

  6. ciphertext를 반환한다.

22.4.2 복호화

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. labelnormalizedAlgorithmlabel 멤버로 두거나, normalizedAlgorithmlabel 멤버가 존재하지 않으면 빈 바이트 시퀀스로 둔다.

  3. key가 나타내는 키를 수신자의 RSA 비공개 키로, ciphertext를 복호화할 암호문 C로, label을 레이블 L로 사용하고, key[[algorithm]] 내부 슬롯의 hash 속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447] B.2.1절에 정의된 MGF1을 MGF 옵션으로 사용하여, [RFC3447] 7.1절에 정의된 복호화 작업을 수행한다.

  4. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  5. plaintext를 작업 수행 결과인 값 M으로 둔다.

  6. plaintext를 반환한다.

22.4.3 키 생성

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmmodulusLength 멤버와 같은 RSA 모듈러스 길이 및 normalizedAlgorithmpublicExponent 멤버와 같은 RSA 공개 지수로, [RFC3447]에 정의된 대로 RSA 키 쌍을 생성한다.

  3. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. algorithm을 새 RsaHashedKeyAlgorithm 객체로 둔다.

  5. algorithmname 속성을 "RSA-OAEP"로 설정한다.

  6. algorithmmodulusLength 속성을 normalizedAlgorithmmodulusLength 멤버와 같게 설정한다.

  7. algorithmpublicExponent 속성을 normalizedAlgorithmpublicExponent 멤버와 같게 설정한다.

  8. algorithmhash 속성을 normalizedAlgorithmhash 멤버와 같게 설정한다.

  9. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  10. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  11. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  12. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  13. publicKey[[usages]] 내부 슬롯을 usages[ "encrypt", "wrapKey" ]사용법 교집합으로 설정한다.

  14. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  15. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  16. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  17. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  18. privateKey[[usages]] 내부 슬롯을 usages[ "decrypt", "unwrapKey" ]사용법 교집합으로 설정한다.

  19. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  20. resultpublicKey 속성을 publicKey로 설정한다.

  21. resultprivateKey 속성을 privateKey로 설정한다.

  22. result를 반환한다.

22.4.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 "encrypt" 또는 "wrapKey"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. publicKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataspkisubjectPublicKeyInfo 필드로, structure는 [RFC3447] A.1.1절에 지정된 RSAPublicKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, publicKey가 [RFC3447]에 따른 유효한 공개 키가 아니라고 판정할 수 있다면, throw하여 DataError를 발생시킨다.

    7. keypublicKey로 식별되는 RSA 공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "public"으로 설정한다

    format이 "pkcs8"인 경우:
    1. usages가 "decrypt" 또는 "unwrapKey"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC3447]에 정의된 rsaEncryption object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. rsaPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC3447] A.1.2절에 지정된 RSAPrivateKey 구조로, exactData는 true로 설정한다.

    6. 파싱하는 동안 오류가 발생했거나, rsaPrivateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니면, throw하여 DataError를 발생시킨다.

    7. keyrsaPrivateKey로 식별되는 RSA 비공개 키를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "private"로 설정한다

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      Throw하여 DataError를 발생시킨다.

    2. jwkd 필드가 존재하고 usages가 "decrypt" 또는 "unwrapKey"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    3. jwkd 필드가 존재하지 않고 usages가 "encrypt" 또는 "wrapKey"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

    4. jwkkty 필드가 "RSA"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    5. usages가 비어 있지 않고, jwkuse 필드가 존재하며 "enc"와 대소문자를 구분하는 문자열 일치가 아니면, throw하여 DataError를 발생시킨다.

    6. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    7. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    8. jwkalg 필드가 존재하지 않는 경우:
      hash를 undefined로 둔다.
      jwkalg 필드가 "RSA-OAEP"와 같은 경우:
      hash를 문자열 "SHA-1"로 둔다.
      jwkalg 필드가 "RSA-OAEP-256"과 같은 경우:
      hash를 문자열 "SHA-256"로 둔다.
      jwkalg 필드가 "RSA-OAEP-384"와 같은 경우:
      hash를 문자열 "SHA-384"로 둔다.
      jwkalg 필드가 "RSA-OAEP-512"와 같은 경우:
      hash를 문자열 "SHA-512"로 둔다.
      그 밖의 경우:
      1. formatjwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    9. hash가 undefined가 아닌 경우:
      1. normalizedHashalghash로, opdigest로 설정하여 알고리즘 정규화를 수행한 결과로 둔다.

      2. normalizedHashnormalizedAlgorithmhash 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    10. jwkd 필드가 존재하는 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.2절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. privateKey가 JSON Web Algorithms [JWA] 6.3.2절에 따라 jwk를 해석하여 식별된 RSA 비공개 키를 나타내도록 둔다.

      3. privateKey가 [RFC3447]에 따른 유효한 RSA 비공개 키가 아니라고 판정할 수 있으면, throw하여 DataError를 발생시킨다.

      4. keyprivateKey를 나타내는 새 CryptoKey로 둔다.

      5. key[[type]] 내부 슬롯을 "private"로 설정한다

      그 밖의 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.3.1절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.

      3. publicKey가 [RFC3447]에 따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면, throw하여 DataError를 발생시킨다.

      4. keypublicKey를 나타내는 새 CryptoKey로 둔다.

      5. key[[type]] 내부 슬롯을 "public"으로 설정한다

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. algorithm을 새 RsaHashedKeyAlgorithm로 둔다.

  4. algorithmname 속성을 "RSA-OAEP"로 설정한다

  5. algorithmmodulusLength 속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.

  6. algorithmpublicExponent 속성을 RSA 공개 지수의 BigInteger 표현으로 설정한다.

  7. algorithmhash 속성을 normalizedAlgorithmhash 멤버로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다

  9. key를 반환한다.

22.4.5 키 내보내기

  1. key를 내보낼 키로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • subjectPublicKey 필드를 [RFC3447] 부록 A.1.1에 정의된 RSAPublicKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 공개 키를 나타낸다

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다.

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다.

        • algorithm 필드를 [RFC3447]에 정의된 OID rsaEncryption으로 설정한다.

        • params 필드를 ASN.1 타입 NULL로 설정한다.

      • privateKey 필드를 [RFC3447] 부록 A.1.2에 정의된 RSAPrivateKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 RSA 비공개 키를 나타낸다

        참고
        [RFC5208]은 이 필드의 인코딩이 5절에서 ("예를 들어"로) BER 인코딩이어야 한다고 지정한다. 그러나 WebCrypto 구현이 BER 인코딩과 BER 디코딩을 지원하도록 요구하는 것을 피하기 위해, 오직 DER 인코딩만 생성되거나 허용된다.
    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "RSA"로 설정한다.

    3. hashkey[[algorithm]] 내부 슬롯의 hash 속성의 name 속성으로 둔다.

    4. hash가 "SHA-1"인 경우:

      jwkalg 속성을 문자열 "RSA-OAEP"로 설정한다.

      hash가 "SHA-256"인 경우:

      jwkalg 속성을 문자열 "RSA-OAEP-256"로 설정한다.

      hash가 "SHA-384"인 경우:

      jwkalg 속성을 문자열 "RSA-OAEP-384"로 설정한다.

      hash가 "SHA-512"인 경우:

      jwkalg 속성을 문자열 "RSA-OAEP-512"로 설정한다.

      그 밖의 경우:
      1. formatkey[[algorithm]] 내부 슬롯의 hash 속성을 전달하고 alg를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

      2. jwkalg 속성을 alg로 설정한다.

    5. jwkne 속성을 JSON Web Algorithms [JWA] 6.3.1절의 대응하는 정의에 따라 설정한다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      1. jwkd, p, q, dp, dq, 및 qi라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2절의 대응하는 정의에 따라 설정한다.

      2. key[[handle]] 내부 슬롯이 나타내는 기반 RSA 비공개 키가 두 개보다 많은 소수로 표현된다면, jwkoth라는 이름의 속성을 JSON Web Algorithms [JWA] 6.3.2.7절의 대응하는 정의에 따라 설정한다

    7. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    8. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    9. resultjwk로 둔다.

    그 밖의 경우

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

23. ECDSA

23.1 설명

이 절은 비규범적이다.

"ECDSA" 알고리즘 식별자는 [RFC6090]에 지정된 ECDSA 알고리즘과, 이 명세에서 정의된 SHA 해시 함수 및 타원 곡선을 사용하여 서명과 검증을 수행하는 데 사용된다.

다른 명세는 ECDSA와 함께 추가 타원 곡선과 해시 알고리즘의 사용을 지정할 수 있다. ECDSA와 함께 사용할 추가 해시 알고리즘을 지정하려면, 명세는 digest 작업을 지원하는 등록된 알고리즘을 정의해야 한다. 추가 타원 곡선을 지정하려면 명세는 곡선 이름, ECDSA 서명 단계, ECDSA 검증 단계, ECDSA 생성 단계, ECDSA 키 가져오기 단계ECDSA 키 내보내기 단계를 정의해야 한다.

23.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "ECDSA"이다.

작업 매개변수 결과
sign EcdsaParams 바이트 시퀀스
verify EcdsaParams boolean
generateKey EcKeyGenParams CryptoKeyPair
importKey EcKeyImportParams CryptoKey
exportKey 없음 object

23.3 EcdsaParams 딕셔너리

WebIDLdictionary EcdsaParams : Algorithm {
  required HashAlgorithmIdentifier hash;
};

hash 멤버는 사용할 해시 알고리즘을 나타낸다.

23.4 EcKeyGenParams 딕셔너리

WebIDLtypedef DOMString NamedCurve;

dictionary EcKeyGenParams : Algorithm {
  required NamedCurve namedCurve;
};

NamedCurve 타입은 명명된 타원 곡선을 나타내며, 이는 잘 알려진 타원 곡선의 도메인 매개변수를 지정하는 편리한 방법이다. 다음 값은 이 명세에서 정의한다:

"P-256"
secp256r1로도 알려진 NIST 권장 곡선 P-256.
"P-384"
secp384r1로도 알려진 NIST 권장 곡선 P-384.
"P-521"
secp521r1로도 알려진 NIST 권장 곡선 P-521.

다른 명세추가 값을 정의할 수 있다.

EcKeyGenParams 딕셔너리의 namedCurve 멤버는 명명된 곡선을 나타낸다.

23.5 EcKeyAlgorithm 딕셔너리

WebIDLdictionary EcKeyAlgorithm : KeyAlgorithm {
  required NamedCurve namedCurve;
};

namedCurve 멤버는 키가 사용하는 명명된 곡선을 나타낸다.

23.6 EcKeyImportParams 딕셔너리

WebIDLdictionary EcKeyImportParams : Algorithm {
  required NamedCurve namedCurve;
};

namedCurve 멤버는 명명된 곡선을 나타낸다.

23.7 작업

23.7.1 서명

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. hashAlgorithmnormalizedAlgorithmhash 멤버로 둔다.

  3. Mmessage를 사용하여 hashAlgorithm이 지정한 digest 작업을 수행한 결과로 둔다.

  4. dkey와 연결된 ECDSA 비공개 키로 둔다.

  5. paramskey와 연결된 EC 도메인 매개변수로 둔다.

  6. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:
    1. [RFC6090] 5.4절에 지정된 대로 ECDSA 서명 프로세스를 수행한다. 이때 M은 메시지로, params는 EC 도메인 매개변수로 사용하고, d는 비공개 키로 사용한다.

    2. rs를 ECDSA 서명 프로세스를 수행한 결과로 나온 정수 쌍으로 둔다.

    3. result를 빈 바이트 시퀀스로 둔다.

    4. nn * 8이 params로 식별되는 타원 곡선의 기준점 차수에 대한 밑이 2인 로그보다 큰 가장 작은 정수로 둔다.

    5. r을 길이가 n인 바이트 시퀀스로 변환하고 이를 result에 추가한다.

    6. s를 길이가 n인 바이트 시퀀스로 변환하고 이를 result에 추가한다.

    그 밖의 경우, key[[algorithm]] 내부 슬롯의 namedCurve 속성이 적용 가능한 명세에 지정된 값인 경우:

    그 명세에 지정된 ECDSA 서명 단계를 수행한다. 이때 M, paramsd를 전달하고 result를 결과로 얻는다.

  7. result를 반환한다.

23.7.2 검증

  1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. hashAlgorithmnormalizedAlgorithmhash 멤버로 둔다.

  3. Mmessage를 사용하여 hashAlgorithm이 지정한 digest 작업을 수행한 결과로 둔다.

  4. Qkey와 연결된 ECDSA 공개 키로 둔다.

  5. paramskey와 연결된 EC 도메인 매개변수로 둔다.

  6. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:

    [RFC6090] 5.3절에 지정된 대로 ECDSA 검증 프로세스를 수행한다. 이때 M은 수신된 메시지로, signature는 수신된 서명으로 사용하고, params는 EC 도메인 매개변수로, Q는 공개 키로 사용한다.

    그 밖의 경우, key[[algorithm]] 내부 슬롯의 namedCurve 속성이 적용 가능한 명세에 지정된 값인 경우:

    그 명세에 지정된 ECDSA 검증 단계를 수행한다. 이때 M, signature, paramsQ를 전달하고, 주장된 서명이 유효한지 여부를 나타내는 표시를 결과로 얻는다.

  7. result를 서명이 유효하면 값이 true이고, 그렇지 않으면 값이 false인 boolean으로 둔다.

  8. result를 반환한다.

23.7.3 키 생성

  1. usages가 "sign" 또는 "verify" 중 하나가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmnamedCurve 멤버가 "P-256", "P-384" 또는 "P-521"인 경우:

    [RFC6090]에 정의된 대로, normalizedAlgorithmnamedCurve 멤버로 식별되는 곡선의 도메인 매개변수를 사용하여 타원 곡선 키 쌍을 생성한다.

    normalizedAlgorithmnamedCurve 멤버가 적용 가능한 명세에 지정된 값인 경우:

    그 명세에 지정된 ECDSA 생성 단계를 수행한다. 이때 normalizedAlgorithm을 전달하고 타원 곡선 키 쌍을 결과로 얻는다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다

  3. 키 생성 작업을 수행한 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. algorithm을 새 EcKeyAlgorithm 객체로 둔다.

  5. algorithmname 속성을 "ECDSA"로 설정한다.

  6. algorithmnamedCurve 속성을 normalizedAlgorithmnamedCurve 멤버와 같게 설정한다.

  7. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  8. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  9. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  10. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  11. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]사용법 교집합으로 설정한다.

  12. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  13. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  14. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  15. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  16. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]사용법 교집합으로 설정한다.

  17. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  18. resultpublicKey 속성을 publicKey로 설정한다.

  19. resultprivateKey 속성을 privateKey로 설정한다.

  20. result를 반환한다.

23.7.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 "verify"가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC5480]에 정의된 id-ecPublicKey object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. spkialgorithm AlgorithmIdentifier 필드의 parameters 필드가 없으면, throw하여 DataError를 발생시킨다.

    6. paramsspkialgorithm AlgorithmIdentifier 필드의 parameters 필드로 둔다.

    7. params가 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나 namedCurve를 지정하지 않으면, throw하여 DataError를 발생시킨다.

    8. namedCurve를 초기값이 undefined인 문자열로 둔다.

    9. params가 [RFC5480]에 정의된 secp256r1 object identifier와 동등한 경우:

      namedCurve를 "P-256"로 설정한다.

      params가 [RFC5480]에 정의된 secp384r1 object identifier와 동등한 경우:

      namedCurve를 "P-384"로 설정한다.

      params가 [RFC5480]에 정의된 secp521r1 object identifier와 동등한 경우:

      namedCurve를 "P-521"로 설정한다.

    10. namedCurve가 undefined가 아닌 경우:
      1. publicKeyspkisubjectPublicKey 필드를 사용하여 [SEC1] 2.3.4절에 정의된 변환 단계를 수행하여 식별된 타원 곡선 공개 키로 둔다.

        압축되지 않은 point 형식은 MUST 지원되어야 한다.

      2. 구현이 압축된 point 형식을 지원하지 않고 압축된 point가 제공되면, throw하여 DataError를 발생시킨다.

      3. 디코드 오류가 발생하거나 항등점이 발견되면, throw하여 DataError를 발생시킨다.

      4. keypublicKey를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatspki를 전달하고 namedCurvekey를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    11. namedCurve가 정의되어 있고 normalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    12. 공개 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    13. key[[type]] 내부 슬롯을 "public"으로 설정한다

    14. algorithm을 새 EcKeyAlgorithm로 둔다.

    15. algorithmname 속성을 "ECDSA"로 설정한다.

    16. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    17. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "pkcs8"인 경우:
    1. usages가 "sign"이 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생하면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC5480]에 정의된 id-ecPublicKey object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드가 없으면, throw하여 DataError를 발생시킨다.

    6. paramsprivateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드로 둔다.

    7. params가 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나 namedCurve를 지정하지 않으면, throw하여 DataError를 발생시킨다.

    8. namedCurve를 초기값이 undefined인 문자열로 둔다.

    9. params가 [RFC5480]에 정의된 secp256r1 object identifier와 동등한 경우:

      namedCurve를 "P-256"로 설정한다.

      params가 [RFC5480]에 정의된 secp384r1 object identifier와 동등한 경우:

      namedCurve를 "P-384"로 설정한다.

      params가 [RFC5480]에 정의된 secp521r1 object identifier와 동등한 경우:

      namedCurve를 "P-521"로 설정한다.

    10. namedCurve가 undefined가 아닌 경우:
      1. ecPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC5915] 3절에 지정된 ASN.1 ECPrivateKey 구조로, exactData는 true로 설정한다.

      2. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

      3. ecPrivateKeyparameters 필드가 존재하며, [RFC5480]에 정의된 namedCurve ASN.1 타입의 인스턴스가 아니거나, privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드와 같은 object identifier를 포함하지 않으면, throw하여 DataError를 발생시킨다.

      4. keyecPrivateKey를 사용하여 [RFC5915] 3절에 정의된 변환 단계를 수행하여 식별된 타원 곡선 비공개 키를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatprivateKeyInfo를 전달하고 namedCurvekey를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    11. namedCurve가 정의되어 있고 normalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    12. 비공개 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    13. key[[type]] 내부 슬롯을 "private"로 설정한다

    14. algorithm을 새 EcKeyAlgorithm로 둔다.

    15. algorithmname 속성을 "ECDSA"로 설정한다.

    16. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    17. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. d 필드가 존재하고 usages가 "sign"이 아닌 값을 포함하거나, 또는 d 필드가 존재하지 않고 usages가 "verify"가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

    3. jwkkty 필드가 "EC"가 아니면, throw하여 DataError를 발생시킨다.

    4. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sig"가 아니면, throw하여 DataError를 발생시킨다.

    5. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    6. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    7. namedCurvejwkcrv 필드와 같은 값을 가진 문자열로 둔다.

    8. namedCurvenormalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    9. namedCurve가 "P-256", "P-384" 또는 "P-521"와 같은 경우:
      1. algNamedCurve를 초기값이 undefined인 문자열로 둔다.

      2. alg 필드가 존재하지 않는 경우:
        algNamedCurve를 undefined로 둔다.
        alg 필드가 문자열 "ES256"과 같은 경우:
        algNamedCurve를 문자열 "P-256"로 둔다.
        alg 필드가 문자열 "ES384"와 같은 경우:
        algNamedCurve를 문자열 "P-384"로 둔다.
        alg 필드가 문자열 "ES512"와 같은 경우:
        algNamedCurve를 문자열 "P-521"로 둔다.
        그 밖의 경우:
        throw하여 DataError를 발생시킨다.
      3. algNamedCurve가 정의되어 있고 namedCurve와 같지 않으면, throw하여 DataError를 발생시킨다.

      4. d 필드가 존재하는 경우:
        1. jwk가 JSON Web Algorithms [JWA] 6.2.2절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

        2. key를 JSON Web Algorithms [JWA] 6.2.2절에 따라 jwk를 해석하여 식별된 타원 곡선 비공개 키를 나타내는 새 CryptoKey 객체로 둔다.

        3. Key[[type]] 내부 슬롯을 "private"로 설정한다.

        그 밖의 경우:
        1. jwk가 JSON Web Algorithms [JWA] 6.2.1절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

        2. key를 JSON Web Algorithms [JWA] 6.2.1절에 따라 jwk를 해석하여 식별된 타원 곡선 공개 키를 나타내는 새 CryptoKey 객체로 둔다.

        3. Key[[type]] 내부 슬롯을 "public"으로 설정한다.

      그 밖의 경우:
      1. formatjwk를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    10. 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    11. algorithm을 새 EcKeyAlgorithm 객체 인스턴스로 둔다.

    12. algorithmname 속성을 "ECDSA"로 설정한다.

    13. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    14. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "raw"인 경우:
    1. normalizedAlgorithmnamedCurve 멤버가 명명된 곡선이 아니면, throw하여 DataError를 발생시킨다.

    2. usages가 "verify"가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

    3. namedCurve가 "P-256", "P-384" 또는 "P-521"인 경우:
      1. QnormalizedAlgorithmnamedCurve 멤버로 식별되는 곡선 위의 타원 곡선 point로 둔다. 이 point는 keyData에 대해 [SEC1] 2.3.4절에 정의된 변환 단계를 수행하여 식별된다.

        압축되지 않은 point 형식은 MUST 지원되어야 한다.

      2. 구현이 압축된 point 형식을 지원하지 않고 압축된 point가 제공되면, throw하여 DataError를 발생시킨다.

      3. 디코드 오류가 발생하거나 항등점이 발견되면, throw하여 DataError를 발생시킨다.

      4. keyQ를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatkeyData를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    4. algorithm을 새 EcKeyAlgorithm 객체로 둔다.

    5. algorithmname 속성을 "ECDSA"로 설정한다.

    6. algorithmnamedCurve 속성을 normalizedAlgorithmnamedCurve 멤버와 같게 설정한다.

    7. key[[type]] 내부 슬롯을 "public"으로 설정한다

    8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. key를 반환한다

23.7.5 키 내보내기

  1. key를 내보낼 CryptoKey로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm 필드를 [RFC5480]에 정의된 OID id-ecPublicKey로 설정한다.

        • parameters 필드를 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스로 다음과 같이 설정한다:

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:

          keyDatakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 공개 키를 [RFC5480] 2.2절에 지정된 인코딩 규칙에 따라, 압축되지 않은 형식을 사용하여 나타내는 바이트 시퀀스로 둔다. 그리고 keyData.

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp256r1와 같은 값을 가진 namedCurve choice로 설정한다

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-384"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp384r1와 같은 값을 가진 namedCurve choice로 설정한다

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-521"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp521r1와 같은 값을 가진 namedCurve choice로 설정한다

          그 밖의 경우:
          1. formatkey[[algorithm]] 내부 슬롯의 namedCurve 속성을 전달하고 namedCurveOidkeyData를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

          2. parametersnamedCurveOid object identifier와 같은 값을 가진 namedCurve choice로 설정한다.

      • subjectPublicKey 필드를 keyData로 설정한다.

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm 필드를 [RFC5480]에 정의된 OID id-ecPublicKey로 설정한다.

        • parameters 필드를 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스로 다음과 같이 설정한다:

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:

          keyDatakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 비공개 키에 대한, [RFC5915] 3절에 정의된 ECPrivateKey 구조의 인스턴스를 DER 인코딩한 결과로 둔다. 이 인스턴스는 다음을 따른다:

          • parameters 필드는 존재하며, 이 PrivateKeyInfo ASN.1 구조의 privateKeyAlgorithm 필드의 parameters 필드와 동등하다.

          • publicKey 필드는 존재하며 key[[handle]] 내부 슬롯이 나타내는 타원 곡선 비공개 키와 연결된 타원 곡선 공개 키를 나타낸다.

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp256r1와 같은 값을 가진 namedCurve choice로 설정한다

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-384"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp384r1와 같은 값을 가진 namedCurve choice로 설정한다

          key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-521"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp521r1와 같은 값을 가진 namedCurve choice로 설정한다

          그 밖의 경우:
          1. formatkey[[algorithm]] 내부 슬롯의 namedCurve 속성을 전달하고 namedCurveOidkeyData를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

          2. parametersnamedCurveOid object identifier와 같은 값을 가진 namedCurve choice로 설정한다.

      • privateKey 필드를 keyData로 설정한다.

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 "EC"로 설정한다.

    3. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:
      1. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256"인 경우:
        jwkcrv 속성을 "P-256"으로 설정한다
        key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-384"인 경우:
        jwkcrv 속성을 "P-384"로 설정한다
        key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-521"인 경우:
        jwkcrv 속성을 "P-521"로 설정한다
      2. jwkx 속성을 JSON Web Algorithms [JWA] 6.2.1.2절의 정의에 따라 설정한다.

      3. jwky 속성을 JSON Web Algorithms [JWA] 6.2.1.3절의 정의에 따라 설정한다.

      4. key[[type]] 내부 슬롯이 "private"인 경우

        jwkd 속성을 JSON Web Algorithms [JWA] 6.2.2.1절의 정의에 따라 설정한다.

      그 밖의 경우:
      1. formatkey[[algorithm]] 내부 슬롯의 namedCurve 속성을 전달하고, namedCurvejwk의 새 값을 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

      2. jwkcrv 속성을 namedCurve로 설정한다.

    4. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    5. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    6. resultjwk로 둔다.

    format이 "raw"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:

      datakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 point Q를 [SEC1] 2.3.3절에 따라 압축되지 않은 형식을 사용하여 나타내는 바이트 시퀀스로 둔다.

      그 밖의 경우:

      formatkey[[algorithm]] 내부 슬롯의 namedCurve 속성을 전달하고, namedCurvedata를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

    3. resultdata로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

24. ECDH

24.1 설명

이 절은 비규범적이다.

이는 [RFC6090]에 지정된 대로 키 생성과 키 합의를 위해 Elliptic Curve Diffie-Hellman (ECDH)을 사용하는 것을 설명한다.

다른 명세는 ECDH와 함께 추가 타원 곡선의 사용을 지정할 수 있다. 추가 타원 곡선을 지정하려면 명세는 곡선 이름, ECDH 생성 단계, ECDH 파생 단계, ECDH 키 가져오기 단계ECDH 키 내보내기 단계를 정의해야 한다.

24.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "ECDH"이다.

작업 매개변수 결과
generateKey EcKeyGenParams CryptoKeyPair
deriveBits EcdhKeyDeriveParams 바이트 시퀀스
importKey EcKeyImportParams CryptoKey
exportKey 없음 object

24.3 EcdhKeyDeriveParams 딕셔너리

WebIDLdictionary EcdhKeyDeriveParams : Algorithm {
  required CryptoKey public;
};

public 멤버는 피어의 EC 공개 키를 나타낸다.

24.4 작업

24.4.1 키 생성

  1. usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmnamedCurve 멤버가 "P-256", "P-384" 또는 "P-521"인 경우:

    [RFC6090]에 정의된 대로, normalizedAlgorithmnamedCurve 멤버로 식별되는 곡선의 도메인 매개변수를 사용하여 타원 곡선 키 쌍을 생성한다.

    normalizedAlgorithmnamedCurve 멤버가 ECDH와 함께 그 값을 사용하는 것을 지정하는 적용 가능한 명세에 지정된 값인 경우:

    그 명세에 지정된 ECDH 생성 단계를 수행한다. 이때 normalizedAlgorithm을 전달하고 타원 곡선 키 쌍을 결과로 얻는다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다

  3. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  4. algorithm을 새 EcKeyAlgorithm 객체로 둔다.

  5. algorithmname 멤버를 "ECDH"로 설정한다.

  6. algorithmnamedCurve 속성을 normalizedAlgorithmnamedCurve 멤버와 같게 설정한다.

  7. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  8. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  9. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  10. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  11. publicKey[[usages]] 내부 슬롯을 빈 목록으로 설정한다.

  12. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  13. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  14. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  15. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  16. privateKey[[usages]] 내부 슬롯을 usages[ "deriveKey", "deriveBits" ]사용법 교집합으로 설정한다.

  17. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  18. resultpublicKey 속성을 publicKey로 설정한다.

  19. resultprivateKey 속성을 privateKey로 설정한다.

  20. result를 반환한다.

24.4.2 비트 파생

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. publicKeynormalizedAlgorithmpublic 멤버로 둔다.

  3. publicKey[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  4. publicKey[[algorithm]] 내부 슬롯의 name 속성이 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw하여 InvalidAccessError를 발생시킨다.

  5. publicKey[[algorithm]] 내부 슬롯의 namedCurve 속성이 key[[algorithm]] 내부 슬롯의 namedCurve 속성과 같지 않으면, throw하여 InvalidAccessError를 발생시킨다.

  6. key[[algorithm]] 내부 슬롯의 namedCurve 속성이 "P-256", "P-384" 또는 "P-521"인 경우:
    1. [RFC6090] 4절에 지정된 ECDH 원시 연산을 수행한다. 이때 key를 EC 비공개 키 d로, publicKey[[handle]] 내부 슬롯이 나타내는 EC 공개 키를 EC 공개 키로 사용한다.

    2. secret을 ECDH 원시 연산의 출력에 [RFC6090] 6.2절에 정의된 필드 원소를 octet 문자열로 변환하는 변환을 적용한 결과를 포함하는 바이트 시퀀스로 둔다.

    key[[algorithm]] 내부 슬롯의 namedCurve 속성이 ECDH와 함께 그 값을 사용하는 것을 지정하는 적용 가능한 명세에 지정된 값인 경우:

    그 명세에 지정된 ECDH 파생 단계를 수행한다. 이때 keypublicKey를 전달하고 secret을 결과로 얻는다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다

  7. 작업 수행 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  8. length가 null인 경우:
    secret을 반환한다
    그 밖의 경우:
    secret비트 단위 길이length보다 작은 경우:
    throw하여 OperationError를 발생시킨다.
    그 밖의 경우:
    secret의 처음 length비트를 포함하는 바이트 시퀀스를 반환한다.

24.4.3 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 비어 있지 않으면 throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC5480]에 정의된 id-ecPublicKey object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. spkialgorithm AlgorithmIdentifier 필드의 parameters 필드가 없으면, throw하여 DataError를 발생시킨다.

    6. paramsspkialgorithm AlgorithmIdentifier 필드의 parameters 필드로 둔다.

    7. params가 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나 namedCurve를 지정하지 않으면, throw하여 DataError를 발생시킨다.

    8. namedCurve를 초기값이 undefined인 문자열로 둔다.

    9. params가 [RFC5480]에 정의된 secp256r1 object identifier와 동등한 경우:

      namedCurve를 "P-256"로 설정한다.

      params가 [RFC5480]에 정의된 secp384r1 object identifier와 동등한 경우:

      namedCurve를 "P-384"로 설정한다.

      params가 [RFC5480]에 정의된 secp521r1 object identifier와 동등한 경우:

      namedCurve를 "P-521"로 설정한다.

    10. namedCurve가 undefined가 아닌 경우:
      1. publicKeyspkisubjectPublicKey 필드에 [SEC1] 2.3.4절에 정의된 변환 단계를 수행하여 식별된 타원 곡선 공개 키로 둔다.

        압축되지 않은 point 형식은 MUST 지원되어야 한다.

      2. 구현이 압축된 point 형식을 지원하지 않고 압축된 point가 제공되면, throw하여 DataError를 발생시킨다.

      3. 디코드 오류가 발생하거나 항등점이 발견되면, throw하여 DataError를 발생시킨다.

      4. keypublicKey를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatspki를 전달하고 namedCurvekey를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    11. namedCurve가 정의되어 있고 normalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    12. 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    13. key[[type]] 내부 슬롯을 "public"으로 설정한다

    14. algorithm을 새 EcKeyAlgorithm로 둔다.

    15. algorithmname 속성을 "ECDH"로 설정한다.

    16. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    17. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "pkcs8"인 경우:
    1. usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생하면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC5480]에 정의된 id-ecPublicKey object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드가 존재하지 않으면, throw하여 DataError를 발생시킨다.

    6. paramsprivateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드로 둔다.

    7. params가 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나 namedCurve를 지정하지 않으면, throw하여 DataError를 발생시킨다.

    8. namedCurve를 초기값이 undefined인 문자열로 둔다.

    9. params가 [RFC5480]에 정의된 secp256r1 object identifier와 동등한 경우:

      namedCurve를 "P-256"로 설정한다.

      params가 [RFC5480]에 정의된 secp384r1 object identifier와 동등한 경우:

      namedCurve를 "P-384"로 설정한다.

      params가 [RFC5480]에 정의된 secp521r1 object identifier와 동등한 경우:

      namedCurve를 "P-521"로 설정한다.

    10. namedCurve가 undefined가 아닌 경우:
      1. ecPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC5915] 3절에 지정된 ASN.1 ECPrivateKey 구조로, exactData는 true로 설정한다.

      2. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

      3. ecPrivateKeyparameters 필드가 존재하며, [RFC5480]에 정의된 namedCurve ASN.1 타입의 인스턴스가 아니거나, privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드와 같은 object identifier를 포함하지 않으면, throw하여 DataError를 발생시킨다.

      4. keyecPrivateKey를 사용하여 [RFC5915] 3절에 정의된 변환 단계를 수행하여 식별된 타원 곡선 비공개 키를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatprivateKeyInfo를 전달하고 namedCurvekey를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    11. namedCurve가 정의되어 있고 normalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    12. 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    13. key[[type]] 내부 슬롯을 "private"로 설정한다.

    14. algorithm을 새 EcKeyAlgorithm로 둔다.

    15. algorithmname 속성을 "ECDH"로 설정한다.

    16. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    17. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. d 필드가 존재하고 usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

    3. d 필드가 존재하지 않고 usages가 비어 있지 않으면 throw하여 SyntaxError를 발생시킨다.

    4. jwkkty 필드가 "EC"가 아니면, throw하여 DataError를 발생시킨다.

    5. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"와 같지 않으면, throw하여 DataError를 발생시킨다.

    6. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    7. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    8. namedCurvejwkcrv 필드와 같은 값을 가진 문자열로 둔다.

    9. namedCurvenormalizedAlgorithmnamedCurve 멤버와 같지 않으면, throw하여 DataError를 발생시킨다.

    10. namedCurve가 "P-256", "P-384" 또는 "P-521"인 경우:
      d 필드가 존재하는 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.2.2절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 JSON Web Algorithms [JWA] 6.2.2절에 따라 jwk를 해석하여 식별된 타원 곡선 비공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "private"로 설정한다.

      그 밖의 경우:
      1. jwk가 JSON Web Algorithms [JWA] 6.2.1절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 JSON Web Algorithms [JWA] 6.2.1절에 따라 jwk를 해석하여 식별된 타원 곡선 공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "public"으로 설정한다.

      그 밖의 경우
      1. formatjwk를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    11. 키 값이 normalizedAlgorithmnamedCurve 멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면 throw하여 DataError를 발생시킨다.

    12. algorithm을 새 EcKeyAlgorithm 객체 인스턴스로 둔다.

    13. algorithmname 속성을 "ECDH"로 설정한다.

    14. algorithmnamedCurve 속성을 namedCurve로 설정한다.

    15. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "raw"인 경우:
    1. normalizedAlgorithmnamedCurve 멤버가 명명된 곡선이 아니면, throw하여 DataError를 발생시킨다.

    2. usages가 빈 목록이 아니면, throw하여 SyntaxError를 발생시킨다.

    3. namedCurve가 "P-256", "P-384" 또는 "P-521"인 경우:
      1. QnormalizedAlgorithmnamedCurve 멤버로 식별되는 곡선 위의 타원 곡선 공개 키로 둔다. 이는 keyData에 대해 [SEC1] 2.3.4절에 정의된 변환 단계를 수행하여 식별된다.

        압축되지 않은 point 형식은 MUST 지원되어야 한다.

      2. 구현이 압축된 point 형식을 지원하지 않고 압축된 point가 제공되면, throw하여 DataError를 발생시킨다.

      3. 디코드 오류가 발생하거나 항등점이 발견되면, throw하여 DataError를 발생시킨다.

      4. keyQ를 나타내는 새 CryptoKey로 둔다.

      그 밖의 경우:
      1. formatkeyData를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.

      2. 오류가 발생했거나 적용 가능한 명세가 없으면, throw하여 DataError를 발생시킨다.

    4. algorithm을 새 EcKeyAlgorithm 객체로 둔다.

    5. algorithmname 속성을 "ECDH"로 설정한다.

    6. algorithmnamedCurve 속성을 normalizedAlgorithmnamedCurve 멤버와 같게 설정한다.

    7. key[[type]] 내부 슬롯을 "public"으로 설정한다

    8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  3. key를 반환한다

24.4.4 키 내보내기

  1. key를 내보낼 CryptoKey로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 둔다. 이 인스턴스는 다음 속성을 가진다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm 필드를 [RFC5480]에 정의된 OID id-ecPublicKey로 설정한다.

        • parameters 필드를 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스로 다음과 같이 설정한다:

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256", "P-384" 또는 "P-521"인 경우:

          keyDatakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 공개 키를 [SEC1] 2.3.3절에 지정된 인코딩 규칙에 따라, 압축되지 않은 형식을 사용하여 나타내는 바이트 시퀀스로 둔다.

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp256r1와 같은 값을 가진 namedCurve choice로 설정한다

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-384"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp384r1와 같은 값을 가진 namedCurve choice로 설정한다

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-521"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp521r1와 같은 값을 가진 namedCurve choice로 설정한다

          그 밖의 경우:
          1. formatkeynamedCurve 속성을 key[[algorithm]] 내부 슬롯에서 전달하고 namedCurveOidkeyData를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

          2. parametersnamedCurveOid object identifier와 같은 값을 가진 namedCurve choice로 설정한다.

      • subjectPublicKey 필드를 keyData로 설정한다

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm 필드를 [RFC5480]에 정의된 OID id-ecPublicKey로 설정한다.

        • parameters 필드를 [RFC5480]에 정의된 ECParameters ASN.1 타입의 인스턴스로 다음과 같이 설정한다:

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256", "P-384" 또는 "P-521"인 경우:

          keyDatakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 비공개 키에 대한, [RFC5915] 3절에 정의된 ECPrivateKey 구조의 인스턴스를 DER 인코딩한 결과로 둔다. 이 인스턴스는 다음을 따른다:

          • parameters 필드는 존재하며, 이 PrivateKeyInfo ASN.1 구조의 privateKeyAlgorithm 필드의 parameters 필드와 동등하다.

          • publicKey 필드는 존재하며, key[[handle]] 내부 슬롯이 나타내는 타원 곡선 비공개 키와 연결된 타원 곡선 공개 키를 나타낸다.

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp256r1와 같은 값을 가진 namedCurve choice로 설정한다

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-384"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp384r1와 같은 값을 가진 namedCurve choice로 설정한다

          keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-521"인 경우:

          parameters를 [RFC5480]에 정의된 object identifier secp521r1와 같은 값을 가진 namedCurve choice로 설정한다

          그 밖의 경우:
          1. formatkeynamedCurve 속성을 key[[algorithm]] 내부 슬롯에서 전달하고 namedCurveOidkeyData를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

          2. parametersnamedCurveOid object identifier와 같은 값을 가진 namedCurve choice로 설정한다.

      • privateKey 필드를 keyData로 설정한다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 "EC"로 설정한다.

    3. keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256", "P-384" 또는 "P-521"인 경우:
      1. keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256"인 경우:
        jwkcrv 속성을 "P-256"로 설정한다
        keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-384"인 경우:
        jwkcrv 속성을 "P-384"로 설정한다
        keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-521"인 경우:
        jwkcrv 속성을 "P-521"로 설정한다
      2. jwkx 속성을 JSON Web Algorithms [JWA] 6.2.1.2절의 정의에 따라 설정한다.

      3. jwky 속성을 JSON Web Algorithms [JWA] 6.2.1.3절의 정의에 따라 설정한다.

      4. key[[type]] 내부 슬롯이 "private"인 경우

        jwkd 속성을 JSON Web Algorithms [JWA] 6.2.2.1절의 정의에 따라 설정한다.

      그 밖의 경우:
      1. formatkeynamedCurve 속성을 key[[algorithm]] 내부 슬롯에서 전달하고 namedCurvejwk의 새 값을 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

      2. jwkcrv 속성을 namedCurve로 설정한다.

    4. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    5. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    6. resultjwk로 둔다.

    format이 "raw"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. keynamedCurve 속성이 key[[algorithm]] 내부 슬롯에서 "P-256", "P-384" 또는 "P-521"인 경우:

      datakey[[handle]] 내부 슬롯이 나타내는 타원 곡선 공개 키를 [SEC1] 2.3.3절에 지정된 인코딩 규칙에 따라, 압축되지 않은 형식을 사용하여 나타내는 바이트 시퀀스로 둔다.

      그 밖의 경우:

      formatkeynamedCurve 속성을 key[[algorithm]] 내부 슬롯에서 전달하고 namedCurvedata를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.

    3. resultdata로 둔다.

  4. result를 반환한다.

25. Ed25519

25.1 설명

이 절은 비규범적이다.

"Ed25519" 알고리즘 식별자는 [RFC8032]에 지정된 Ed25519 알고리즘을 사용하여 서명과 검증을 수행하는 데 사용된다.

25.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "Ed25519"이다.

작업 매개변수 결과
sign 없음 바이트 시퀀스
verify 없음 boolean
generateKey 없음 CryptoKeyPair
importKey 없음 CryptoKey
exportKey 없음 object

25.3 작업

25.3.1 서명

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. result를 [RFC8032] 5.1.6절에 지정된 Ed25519 서명 프로세스를 수행한 결과로 둔다. 이때 messageM으로, key와 연결된 Ed25519 비공개 키를 사용한다.

    이슈 1

    일부 구현은 [RFC8032]에 따른 결정적 서명 대신 draft-irtf-cfrg-det-sigs-with-noise에 따라 무작위화된 서명을 생성할 수 있다(또는 생성하기를 원할 수 있다).

    WICG/webcrypto-secure-curves 이슈 28을 참조한다.

  3. result를 반환한다.

25.3.2 검증

  1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. key의 키 데이터가 Ed25519의 타원 곡선 위의 유효하지 않은 점 또는 작은 차수 원소를 나타내면, false를 반환한다.

    이슈 2

    모든 구현이 이 검사를 수행하는 것은 아니다.

    WICG/webcrypto-secure-curves 이슈 27을 참조한다.

  3. signature의 첫 번째 절반에 인코딩된 점 R이 Ed25519의 타원 곡선 위의 유효하지 않은 점 또는 작은 차수 원소를 나타내면, false를 반환한다.

    이슈 3

    모든 구현이 이 검사를 수행하는 것은 아니다.

    WICG/webcrypto-secure-curves 이슈 27을 참조한다.

  4. [RFC8032] 5.1.7절에 지정된 Ed25519 검증 단계를 수행한다. 이때 코팩터 없는(배치 처리되지 않은) 방정식 [S]B = R + [k]A'signature에 대해 사용하고, messageM으로 하며, key와 연결된 Ed25519 공개 키를 사용한다.

  5. result를 서명이 유효하면 값이 true이고 그렇지 않으면 값이 false인 boolean으로 둔다.

  6. result를 반환한다.

25.3.3 키 생성

  1. usages가 "sign" 또는 "verify" 중 하나가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. [RFC8032] 5.1.5절에 정의된 대로 Ed25519 키 쌍을 생성한다.

  3. algorithm을 새 KeyAlgorithm 객체로 둔다.

  4. algorithmname 속성을 "Ed25519"로 설정한다.

  5. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  6. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  7. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  8. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  9. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]사용법 교집합으로 설정한다.

  10. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  11. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  12. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  13. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  14. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]사용법 교집합으로 설정한다.

  15. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  16. resultpublicKey 속성을 publicKey로 설정한다.

  17. resultprivateKey 속성을 privateKey로 설정한다.

  18. result를 반환한다.

25.3.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 "verify"가 아닌 값을 포함하면 throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC8410]에 정의된 id-Ed25519 object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. spkialgorithm AlgorithmIdentifier 필드의 parameters 필드가 존재하면, throw하여 DataError를 발생시킨다.

    6. publicKeyspkisubjectPublicKey 필드가 식별하는 Ed25519 공개 키로 둔다.

    7. keypublicKey를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "public"으로 설정한다

    9. algorithm을 새 KeyAlgorithm으로 둔다.

    10. algorithmname 속성을 "Ed25519"로 설정한다.

    11. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "pkcs8"인 경우:
    1. usages가 "sign"이 아닌 값을 포함하면 throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생하면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC8410]에 정의된 id-Ed25519 object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드가 존재하면, throw하여 DataError를 발생시킨다.

    6. curvePrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC8410] 7절에 지정된 ASN.1 CurvePrivateKey 구조로, exactData는 true로 설정한다.

    7. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    8. keycurvePrivateKey가 식별하는 Ed25519 비공개 키를 나타내는 새 CryptoKey로 둔다.

    9. key[[type]] 내부 슬롯을 "private"로 설정한다

    10. algorithm을 새 KeyAlgorithm으로 둔다.

    11. algorithmname 속성을 "Ed25519"로 설정한다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. d 필드가 존재하고 usages가 "sign"이 아닌 값을 포함하거나, d 필드가 존재하지 않고 usages가 "verify"가 아닌 값을 포함하면 throw하여 SyntaxError를 발생시킨다.

    3. jwkkty 필드가 "OKP"가 아니면, throw하여 DataError를 발생시킨다.

    4. jwkcrv 필드가 "Ed25519"가 아니면, throw하여 DataError를 발생시킨다.

    5. jwkalg 필드가 존재하고 "Ed25519" 또는 "EdDSA"가 아니면, throw하여 DataError를 발생시킨다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sig"가 아니면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    9. d 필드가 존재하는 경우:
      1. jwk가 [RFC8037] 2절에 설명된 JWK 비공개 키 형식의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 [RFC8037] 2절에 따라 jwk를 해석하여 식별된 Ed25519 비공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "private"로 설정한다.

      그 밖의 경우:
      1. jwk가 [RFC8037] 2절에 설명된 JWK 공개 키 형식의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 [RFC8037] 2절에 따라 jwk를 해석하여 식별된 Ed25519 공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "public"로 설정한다.

    10. algorithm을 새 KeyAlgorithm 객체 인스턴스로 둔다.

    11. algorithmname 속성을 "Ed25519"로 설정한다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "raw"인 경우:
    1. usages가 "verify"가 아닌 값을 포함하면 throw하여 SyntaxError를 발생시킨다.

    2. algorithm을 새 KeyAlgorithm 객체로 둔다.

    3. algorithmname 속성을 "Ed25519"로 설정한다.

    4. keykeyData에 제공된 키 데이터를 나타내는 새 CryptoKey로 둔다.

    5. key[[type]] 내부 슬롯을 "public"으로 설정한다

    6. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. key를 반환한다

25.3.5 키 내보내기

  1. key를 내보낼 CryptoKey로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm object identifier를 [RFC8410]에 정의된 id-Ed25519 OID로 설정한다.

      • subjectPublicKey 필드를 keyData로 설정한다.

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm object identifier를 [RFC8410]에 정의된 id-Ed25519 OID로 설정한다.

      • privateKey 필드를 [RFC8410] 7절에 정의된 CurvePrivateKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 Ed25519 비공개 키를 나타낸다

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 "OKP"로 설정한다.

    3. jwkalg 속성을 "Ed25519"로 설정한다.

    4. jwkcrv 속성을 "Ed25519"로 설정한다.

    5. jwkx 속성을 [RFC8037] 2절의 정의에 따라 설정한다.

    6. key[[type]] 내부 슬롯이 "private"인 경우
      jwkd 속성을 [RFC8037] 2절의 정의에 따라 설정한다.
    7. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    8. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    9. resultjwk로 둔다.

    format이 "raw"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 Ed25519 공개 키를 나타내는 바이트 시퀀스로 둔다.

    3. resultdata로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

26. X25519

26.1 설명

이 절은 비규범적이다.

"X25519" 알고리즘 식별자는 [RFC7748]에 지정된 X25519 알고리즘을 사용하여 키 합의를 수행하는 데 사용된다.

26.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "X25519"이다.

작업 매개변수 결과
deriveBits EcdhKeyDeriveParams 바이트 시퀀스
generateKey 없음 CryptoKeyPair
importKey 없음 CryptoKey
exportKey 없음 object

26.3 작업

26.3.1 비트 파생

  1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

  2. publicKeynormalizedAlgorithmpublic 멤버로 둔다.

  3. publicKey[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

  4. publicKey[[algorithm]] 내부 슬롯의 name 속성이 key[[algorithm]] 내부 슬롯의 name 속성과 같지 않으면, throw하여 InvalidAccessError를 발생시킨다.

  5. secret을 [RFC7748] 5절에 지정된 X25519 함수를 수행한 결과로 둔다. 이때 key를 X25519 비공개 키 k로 사용하고, publicKey[[handle]] 내부 슬롯이 나타내는 X25519 공개 키를 X25519 공개 키 u로 사용한다.

  6. secret이 모두 0인 값이면, throw하여 OperationError를 발생시킨다. 이 검사는 [RFC7748] 6.1절에 따라 상수 시간으로 수행되어야 한다.

  7. length가 null인 경우:
    secret을 반환한다
    그 밖의 경우:
    secret의 비트 단위 길이가 length보다 작은 경우:
    throw하여 OperationError를 발생시킨다.
    그 밖의 경우:
    secret의 처음 length비트를 포함하는 바이트 시퀀스를 반환한다.

26.3.2 키 생성

  1. usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

  2. X25519 키 쌍을 생성한다. 이때 비공개 키는 32개의 무작위 바이트이고, 공개 키는 X25519(a, 9)이며, 이는 [RFC7748] 6.1절에 정의된 바와 같다.

  3. algorithm을 새 KeyAlgorithm 객체로 둔다.

  4. algorithmname 속성을 "X25519"로 설정한다.

  5. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.

  6. publicKey[[type]] 내부 슬롯을 "public"으로 설정한다

  7. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  8. publicKey[[extractable]] 내부 슬롯을 true로 설정한다.

  9. publicKey[[usages]] 내부 슬롯을 빈 목록으로 설정한다.

  10. privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.

  11. privateKey[[type]] 내부 슬롯을 "private"로 설정한다

  12. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  13. privateKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

  14. privateKey[[usages]] 내부 슬롯을 usages[ "deriveKey", "deriveBits" ]사용법 교집합으로 설정한다.

  15. result를 새 CryptoKeyPair 딕셔너리로 둔다.

  16. resultpublicKey 속성을 publicKey로 설정한다.

  17. resultprivateKey 속성을 privateKey로 설정한다.

  18. result를 반환한다.

26.3.3 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "spki"인 경우:
    1. usages가 비어 있지 않으면 throw하여 SyntaxError를 발생시킨다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    4. spkialgorithm AlgorithmIdentifier 필드의 algorithm object identifier 필드가 [RFC8410]에 정의된 id-X25519 object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. spkialgorithm AlgorithmIdentifier 필드의 parameters 필드가 존재하면, throw하여 DataError를 발생시킨다.

    6. publicKeyspkisubjectPublicKey 필드가 식별하는 X25519 공개 키로 둔다.

    7. keypublicKey를 나타내는 새 CryptoKey로 둔다.

    8. key[[type]] 내부 슬롯을 "public"으로 설정한다

    9. algorithm을 새 KeyAlgorithm으로 둔다.

    10. algorithmname 속성을 "X25519"로 설정한다.

    11. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "pkcs8"인 경우:
    1. usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.

    3. 파싱하는 동안 오류가 발생하면, throw하여 DataError를 발생시킨다.

    4. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm object identifier 필드가 [RFC8410]에 정의된 id-X25519 object identifier와 같지 않으면, throw하여 DataError를 발생시킨다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의 parameters 필드가 존재하면, throw하여 DataError를 발생시킨다.

    6. curvePrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 둔다. 이때 dataprivateKeyInfoprivateKey 필드로, structure는 [RFC8410] 7절에 지정된 ASN.1 CurvePrivateKey 구조로, exactData는 true로 설정한다.

    7. 파싱하는 동안 오류가 발생했다면, throw하여 DataError를 발생시킨다.

    8. keycurvePrivateKey가 식별하는 X25519 비공개 키를 나타내는 새 CryptoKey로 둔다.

    9. key[[type]] 내부 슬롯을 "private"로 설정한다

    10. algorithm을 새 KeyAlgorithm으로 둔다.

    11. algorithmname 속성을 "X25519"로 설정한다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. d 필드가 존재하고 usages가 "deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면 throw하여 SyntaxError를 발생시킨다.

    3. d 필드가 존재하지 않고 usages가 비어 있지 않으면 throw하여 SyntaxError를 발생시킨다.

    4. jwkkty 필드가 "OKP"가 아니면, throw하여 DataError를 발생시킨다.

    5. jwkcrv 필드가 "X25519"가 아니면, throw하여 DataError를 발생시킨다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"와 같지 않으면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    9. d 필드가 존재하는 경우:
      1. jwk가 [RFC8037] 2절에 설명된 JWK 비공개 키 형식의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 [RFC8037] 2절에 따라 jwk를 해석하여 식별된 X25519 비공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "private"로 설정한다.

      그 밖의 경우:
      1. jwk가 [RFC8037] 2절에 설명된 JWK 공개 키 형식의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

      2. key를 [RFC8037] 2절에 따라 jwk를 해석하여 식별된 X25519 공개 키를 나타내는 새 CryptoKey 객체로 둔다.

      3. Key[[type]] 내부 슬롯을 "public"로 설정한다.

    10. algorithm을 새 KeyAlgorithm 객체 인스턴스로 둔다.

    11. algorithmname 속성을 "X25519"로 설정한다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    format이 "raw"인 경우:
    1. usages가 비어 있지 않으면 throw하여 SyntaxError를 발생시킨다.

    2. algorithm을 새 KeyAlgorithm 객체로 둔다.

    3. algorithmname 속성을 "X25519"로 설정한다.

    4. keykeyData에 제공된 키 데이터를 나타내는 새 CryptoKey로 둔다.

    5. key[[type]] 내부 슬롯을 "public"으로 설정한다

    6. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. key를 반환한다

26.3.4 키 내보내기

  1. key를 내보낼 CryptoKey로 둔다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm object identifier를 [RFC8410]에 정의된 id-X25519 OID로 설정한다.

      • subjectPublicKey 필드를 keyData로 설정한다.

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:

      • version 필드를 0으로 설정한다.

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:

        • algorithm object identifier를 [RFC8410]에 정의된 id-X25519 OID로 설정한다.

      • privateKey 필드를 [RFC8410] 7절에 정의된 CurvePrivateKey ASN.1 타입을 DER 인코딩한 결과로 설정한다. 이 타입은 key[[handle]] 내부 슬롯이 나타내는 X25519 비공개 키를 나타낸다

    3. resultdata를 DER 인코딩한 결과로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 "OKP"로 설정한다.

    3. jwkcrv 속성을 "X25519"로 설정한다.

    4. jwkx 속성을 [RFC8037] 2절의 정의에 따라 설정한다.

    5. key[[type]] 내부 슬롯이 "private"인 경우
      jwkd 속성을 [RFC8037] 2절의 정의에 따라 설정한다.
    6. jwkkey_ops 속성을 keyusages 속성으로 설정한다.

    7. jwkext 속성을 key[[extractable]] 내부 슬롯으로 설정한다.

    8. resultjwk로 둔다.

    format이 "raw"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를 발생시킨다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 X25519 공개 키를 나타내는 바이트 시퀀스로 둔다.

    3. resultdata로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  4. result를 반환한다.

27. AES-CTR

27.1 설명

이 절은 비규범적이다.

"AES-CTR" 알고리즘 식별자는 [NIST-SP800-38A]에 설명된 대로, Counter 모드에서 AES를 사용하여 암호화와 복호화를 수행하는 데 사용된다.

27.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "AES-CTR"이다.

작업 매개변수 결과
encrypt AesCtrParams 바이트 시퀀스
decrypt AesCtrParams 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 object
get key length AesDerivedKeyParams 정수

27.3 AesCtrParams 딕셔너리

WebIDLdictionary AesCtrParams : Algorithm {
  required BufferSource counter;
  required [EnforceRange] octet length;
};

counter 멤버는 카운터 블록의 초기값을 포함한다. counterMUST 16 바이트(AES 블록 크기)여야 한다. 카운터 비트는 카운터 블록의 가장 오른쪽 length 비트이다. 카운터 블록의 나머지 부분은 nonce용이다. 카운터 비트는 NIST SP 800-38A 부록 B.1에 지정된 표준 증가 함수를 사용하여 증가된다: 카운터 비트는 big-endian 정수로 해석되고 1만큼 증가된다.

length 멤버는 증가되는 카운터 블록의 가장 오른쪽 부분의 길이를 비트 단위로 포함한다.

27.4 AesKeyAlgorithm 딕셔너리

WebIDLdictionary AesKeyAlgorithm : KeyAlgorithm {
  required unsigned short length;
};

length 멤버는 키의 길이를 비트 단위로 나타낸다.

27.5 AesKeyGenParams 딕셔너리

WebIDLdictionary AesKeyGenParams : Algorithm {
  required [EnforceRange] unsigned short length;
};

length 멤버는 키의 길이를 비트 단위로 나타낸다.

27.6 AesDerivedKeyParams 딕셔너리

WebIDLdictionary AesDerivedKeyParams : Algorithm {
  required [EnforceRange] unsigned short length;
};

length 멤버는 키의 길이를 비트 단위로 나타낸다.

27.7 작업

27.7.1 암호화

  1. normalizedAlgorithmcounter 멤버가 16바이트의 길이를 가지지 않으면, throw하여 OperationError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 0이거나 128보다 크면, throw하여 OperationError를 발생시킨다.

  3. ciphertext를 [NIST-SP800-38A] 6.5절에 설명된 CTR Encryption 작업을 수행한 결과로 둔다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmcounter 멤버를 카운터 블록의 초기값으로, normalizedAlgorithmlength 멤버를 [NIST-SP800-38A] 부록 B.1에 정의된 표준 카운터 블록 증가 함수의 입력 매개변수 m으로, 그리고 plaintext를 입력 평문으로 사용한다.

  4. ciphertext를 반환한다.

27.7.2 복호화

  1. normalizedAlgorithmcounter 멤버가 16바이트의 길이를 가지지 않으면, throw하여 OperationError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 0이거나 128보다 크면, throw하여 OperationError를 발생시킨다.

  3. plaintext를 [NIST-SP800-38A] 6.5절에 설명된 CTR Decryption 작업을 수행한 결과로 둔다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmcounter 멤버를 카운터 블록의 초기값으로, normalizedAlgorithmlength 멤버를 [NIST-SP800-38A] 부록 B.1에 정의된 표준 카운터 블록 증가 함수의 입력 매개변수 m으로, 그리고 ciphertext를 입력 암호문으로 사용한다.

  4. plaintext를 반환한다.

27.7.3 키 생성

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 128, 192 또는 256 중 하나와 같지 않으면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmlength 멤버와 같은 길이의 AES 키를 생성한다.

  4. 키 생성 단계가 실패하면, throw하여 OperationError를 발생시킨다.

  5. key를 생성된 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  6. algorithm을 새 AesKeyAlgorithm으로 둔다.

  7. algorithmname 속성을 "AES-CTR"로 설정한다.

  8. algorithmlength 속성을 normalizedAlgorithmlength 멤버와 같게 설정한다.

  9. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정한다.

  12. key[[usages]] 내부 슬롯을 usages로 설정한다.

  13. key를 반환한다.

27.7.4 키 가져오기

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakeyData로 둔다.

    2. data비트 단위 길이가 128, 192 또는 256이 아니면 throw하여 DataError를 발생시킨다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkkty 필드가 "oct"가 아니면, throw하여 DataError를 발생시킨다.

    3. jwk가 JSON Web Algorithms [JWA] 6.4절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 둔다.

    5. data비트 단위 길이가 128인 경우:
      jwkalg 필드가 존재하고 "A128CTR"이 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 192인 경우:
      jwkalg 필드가 존재하고 "A192CTR"이 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 256인 경우:
      jwkalg 필드가 존재하고 "A256CTR"이 아니면, throw하여 DataError를 발생시킨다.
      그 밖의 경우:
      throw하여 DataError를 발생시킨다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. keydata 값을 가진 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  4. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  5. algorithm을 새 AesKeyAlgorithm으로 둔다.

  6. algorithmname 속성을 "AES-CTR"로 설정한다.

  7. algorithmlength 속성을 data의 비트 단위 길이로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

27.7.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 바이트 시퀀스로 둔다.

    2. resultdata로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "oct"로 설정한다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은 JSON Web Algorithms [JWA] 6.4절에 따라 인코딩된다.

    4. keylength 속성이 128인 경우:
      jwkalg 속성을 문자열 "A128CTR"로 설정한다.
      keylength 속성이 192인 경우:
      jwkalg 속성을 문자열 "A192CTR"로 설정한다.
      keylength 속성이 256인 경우:
      jwkalg 속성을 문자열 "A256CTR"로 설정한다.
    5. jwkkey_ops 속성을 key[[usages]] 내부 슬롯과 같게 설정한다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정한다.

    7. resultjwk로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. result를 반환한다.

27.7.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면, throw하여 OperationError를 발생시킨다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환한다.

28. AES-CBC

28.1 설명

이 절은 비규범적이다.

"AES-CBC" 알고리즘 식별자는 [NIST-SP800-38A]에 설명된 대로, Cipher Block Chaining 모드에서 AES를 사용하여 암호화와 복호화를 수행하는 데 사용된다.

CBC 모드에서 동작할 때, AES 블록 크기(16바이트)의 정확한 배수가 아닌 메시지는 다양한 패딩 방식에 따라 패딩될 수 있다. Web Crypto API에서 지원되는 유일한 패딩 모드는 [RFC2315]의 10.3절 2단계에 설명된 PKCS#7이다.

28.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "AES-CBC"이다.

작업 매개변수 결과
encrypt AesCbcParams 바이트 시퀀스
decrypt AesCbcParams 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 object
get key length AesDerivedKeyParams 정수

28.3 AesCbcParams 딕셔너리

WebIDLdictionary AesCbcParams : Algorithm {
  required BufferSource iv;
};

iv 멤버는 초기화 벡터를 나타낸다. 이는 MUST 16바이트여야 한다.

28.4 작업

28.4.1 암호화

  1. normalizedAlgorithmiv 멤버가 16바이트의 길이를 가지지 않으면, throw하여 OperationError를 발생시킨다.

  2. paddedPlaintext를 [RFC2315]의 10.3절 2단계에 정의된 절차에 따라 plaintext에 패딩 octet을 추가한 결과로 둔다. 이때 k의 값은 16이다.

  3. ciphertext를 [NIST-SP800-38A] 6.2절에 설명된 CBC Encryption 작업을 수행한 결과로 둔다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmiv 멤버를 입력 매개변수 IV로, paddedPlaintext를 입력 평문으로 사용한다.

  4. ciphertext를 반환한다.

28.4.2 복호화

  1. normalizedAlgorithmiv 멤버가 16바이트의 길이를 가지지 않으면, throw하여 OperationError를 발생시킨다.

  2. ciphertext의 길이가 0이거나 16바이트의 배수가 아니면, throw하여 OperationError를 발생시킨다.

  3. paddedPlaintext를 [NIST-SP800-38A] 6.2절에 설명된 CBC Decryption 작업을 수행한 결과로 둔다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmiv 멤버를 입력 매개변수 IV로, ciphertext를 입력 암호문으로 사용한다.

  4. ppaddedPlaintext의 마지막 octet 값으로 둔다.

  5. p가 0이거나 16보다 크거나, paddedPlaintext의 마지막 p개 octet 중 어느 하나라도 그 값이 p가 아니면, throw하여 OperationError를 발생시킨다.

  6. plaintextpaddedPlaintext의 끝에서 p개 octet을 제거한 결과로 둔다.

  7. plaintext를 반환한다.

28.4.3 키 생성

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 128, 192 또는 256 중 하나와 같지 않으면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmlength 멤버와 같은 길이의 AES 키를 생성한다.

  4. 키 생성 단계가 실패하면, throw하여 OperationError를 발생시킨다.

  5. key를 생성된 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  6. algorithm을 새 AesKeyAlgorithm으로 둔다.

  7. algorithmname 속성을 "AES-CBC"로 설정한다.

  8. algorithmlength 속성을 normalizedAlgorithmlength 멤버와 같게 설정한다.

  9. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정한다.

  12. key[[usages]] 내부 슬롯을 usages로 설정한다.

  13. key를 반환한다.

28.4.4 키 가져오기

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakeyData로 둔다.

    2. data비트 단위 길이가 128, 192 또는 256이 아니면 throw하여 DataError를 발생시킨다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkkty 필드가 "oct"가 아니면, throw하여 DataError를 발생시킨다.

    3. jwk가 JSON Web Algorithms [JWA] 6.4절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 둔다.

    5. data비트 단위 길이가 128인 경우:
      jwkalg 필드가 존재하고 "A128CBC"가 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 192인 경우:
      jwkalg 필드가 존재하고 "A192CBC"가 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 256인 경우:
      jwkalg 필드가 존재하고 "A256CBC"가 아니면, throw하여 DataError를 발생시킨다.
      그 밖의 경우:
      throw하여 DataError를 발생시킨다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다
  3. keydata 값을 가진 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  4. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  5. algorithm을 새 AesKeyAlgorithm으로 둔다.

  6. algorithmname 속성을 "AES-CBC"로 설정한다.

  7. algorithmlength 속성을 data의 비트 단위 길이로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

28.4.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 바이트 시퀀스로 둔다.

    2. resultdata로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "oct"로 설정한다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은 JSON Web Algorithms [JWA] 6.4절에 따라 인코딩된다.

    4. keylength 속성이 128인 경우:
      jwkalg 속성을 문자열 "A128CBC"로 설정한다.
      keylength 속성이 192인 경우:
      jwkalg 속성을 문자열 "A192CBC"로 설정한다.
      keylength 속성이 256인 경우:
      jwkalg 속성을 문자열 "A256CBC"로 설정한다.
    5. jwkkey_ops 속성을 keyusages 속성과 같게 설정한다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정한다.

    7. resultjwk로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. result를 반환한다.

28.4.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면, throw하여 OperationError를 발생시킨다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환한다.

29. AES-GCM

29.1 설명

이 절은 비규범적이다.

"AES-GCM" 알고리즘 식별자는 [NIST-SP800-38D]에 설명된 대로, Galois/Counter Mode 모드에서 AES를 사용하여 인증된 암호화와 복호화를 수행하는 데 사용된다.

29.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "AES-GCM"이다.

작업 매개변수 결과
encrypt AesGcmParams 바이트 시퀀스
decrypt AesGcmParams 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 object
get key length AesDerivedKeyParams 정수

29.3 AesGcmParams 딕셔너리

WebIDLdictionary AesGcmParams : Algorithm {
  required BufferSource iv;
  BufferSource additionalData;
  [EnforceRange] octet tagLength;
};

iv 멤버는 사용할 초기화 벡터를 나타낸다. 최대 2^64-1바이트 길이일 수 있다.

additionalData 멤버는 포함할 추가 인증 데이터를 나타낸다.

tagLength 멤버는 원하는 인증 태그의 길이를 나타낸다. 0 - 128일 수 있다.

29.4 작업

29.4.1 암호화

  1. plaintext길이가 2^39 - 256바이트보다 크면, throw하여 OperationError를 발생시킨다.

  2. normalizedAlgorithmiv 멤버의 길이가 2^64 - 1바이트보다 크면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmadditionalData 멤버가 존재하고 그 길이가 2^64 - 1바이트보다 크면, throw하여 OperationError를 발생시킨다.

  4. normalizedAlgorithmtagLength 멤버가 존재하지 않는 경우:
    tagLength를 128로 둔다.
    normalizedAlgorithmtagLength 멤버가 32, 64, 96, 104, 112, 120 또는 128 중 하나인 경우:
    tagLengthnormalizedAlgorithmtagLength 멤버와 같게 둔다
    그 밖의 경우:
    throw하여 OperationError를 발생시킨다.
  5. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 그 멤버로, 그렇지 않으면 빈 바이트 시퀀스로 둔다.

  6. CT를 [NIST-SP800-38D] 7.1절에 설명된 Authenticated Encryption Function을 수행한 결과로 나오는 출력들로 둔다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmiv 멤버를 입력 매개변수 IV로, additionalData를 입력 매개변수 A로, tagLength를 사전 요구사항 t로, plaintext를 입력 평문으로 사용한다.

  7. ciphertextC | T와 같게 둔다. 여기서 '|'는 연결을 나타낸다.

  8. ciphertext를 반환한다.

29.4.2 복호화

  1. normalizedAlgorithmtagLength 멤버가 존재하지 않는 경우:
    tagLength를 128로 둔다.
    normalizedAlgorithmtagLength 멤버가 32, 64, 96, 104, 112, 120 또는 128 중 하나인 경우:
    tagLengthnormalizedAlgorithmtagLength 멤버와 같게 둔다
    그 밖의 경우:
    throw하여 OperationError를 발생시킨다.
  2. ciphertext비트 단위 길이tagLength보다 작으면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmiv 멤버의 길이가 2^64 - 1바이트보다 크면, throw하여 OperationError를 발생시킨다.

  4. normalizedAlgorithmadditionalData 멤버가 존재하고 그 길이가 2^64 - 1바이트보다 크면, throw하여 OperationError를 발생시킨다.

  5. tagciphertext의 마지막 tagLength비트로 둔다.

  6. actualCiphertextciphertext에서 마지막 tagLength비트를 제거한 결과로 둔다.

  7. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 그 멤버로, 그렇지 않으면 빈 바이트 시퀀스로 둔다.

  8. [NIST-SP800-38D] 7.2절에 설명된 Authenticated Decryption Function을 수행한다. 이때 AES를 블록 암호로 사용하고, normalizedAlgorithmiv 멤버를 입력 매개변수 IV로, additionalData를 입력 매개변수 A로, tagLength를 사전 요구사항 t로, actualCiphertext를 입력 암호문 C로, tag를 인증 태그 T로 사용한다.

    알고리즘의 결과가 진위성 없음 표시인 "FAIL"인 경우:
    throw하여 OperationError를 발생시킨다
    그 밖의 경우:
    plaintext를 Authenticated Decryption Function의 출력 P로 둔다.
  9. plaintext를 반환한다.

29.4.3 키 생성

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 128, 192 또는 256 중 하나와 같지 않으면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmlength 멤버와 같은 길이의 AES 키를 생성한다.

  4. 키 생성 단계가 실패하면, throw하여 OperationError를 발생시킨다.

  5. key를 생성된 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  6. algorithm을 새 AesKeyAlgorithm으로 둔다.

  7. algorithmname 속성을 "AES-GCM"로 설정한다.

  8. algorithmlength 속성을 normalizedAlgorithmlength 멤버와 같게 설정한다.

  9. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정한다.

  12. key[[usages]] 내부 슬롯을 usages로 설정한다.

  13. key를 반환한다.

29.4.4 키 가져오기

  1. usages가 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakeyData로 둔다.

    2. data비트 단위 길이가 128, 192 또는 256이 아니면 throw하여 DataError를 발생시킨다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkkty 필드가 "oct"가 아니면, throw하여 DataError를 발생시킨다.

    3. jwk가 JSON Web Algorithms [JWA] 6.4절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 둔다.

    5. data비트 단위 길이가 128인 경우:
      jwkalg 필드가 존재하고 "A128GCM"이 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 192인 경우:
      jwkalg 필드가 존재하고 "A192GCM"이 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 256인 경우:
      jwkalg 필드가 존재하고 "A256GCM"이 아니면, throw하여 DataError를 발생시킨다.
      그 밖의 경우:
      throw하여 DataError를 발생시킨다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. keydata 값을 가진 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  4. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  5. algorithm을 새 AesKeyAlgorithm으로 둔다.

  6. algorithmname 속성을 "AES-GCM"로 설정한다.

  7. algorithmlength 속성을 data의 비트 단위 길이로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

29.4.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 바이트 시퀀스로 둔다.

    2. resultdata로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "oct"로 설정한다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은 JSON Web Algorithms [JWA] 6.4절에 따라 인코딩된다.

    4. keylength 속성이 128인 경우:
      jwkalg 속성을 문자열 "A128GCM"로 설정한다.
      keylength 속성이 192인 경우:
      jwkalg 속성을 문자열 "A192GCM"로 설정한다.
      keylength 속성이 256인 경우:
      jwkalg 속성을 문자열 "A256GCM"로 설정한다.
    5. jwkkey_ops 속성을 keyusages 속성과 같게 설정한다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정한다.

    7. resultjwk로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. result를 반환한다.

29.4.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면, throw하여 OperationError를 발생시킨다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환한다.

30. AES-KW

30.1 설명

이 절은 비규범적이다.

"AES-KW" 알고리즘 식별자는 [RFC3394]에 설명된 대로, AES를 사용하여 키 래핑을 수행하는 데 사용된다.

30.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "AES-KW"이다.

작업 매개변수 결과
wrapKey 없음 바이트 시퀀스
unwrapKey 없음 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 object
get key length AesDerivedKeyParams 정수

30.3 작업

30.3.1 키 래핑

  1. plaintext의 길이가 64비트의 배수가 아니면, throw하여 OperationError를 발생시킨다.

  2. ciphertext를 [RFC3394] 2.2.1절에 설명된 Key Wrap 작업을 수행한 결과로 둔다. 이때 plaintext를 래핑될 평문으로 사용하고, 같은 문서의 2.2.3.1절에 정의된 기본 Initial Value를 사용한다.

  3. ciphertext를 반환한다.

30.3.2 키 언래핑

  1. plaintext를 [RFC3394] 2.2.2절에 설명된 Key Unwrap 작업을 수행한 결과로 둔다. 이때 ciphertext를 입력 암호문으로 사용하고, 같은 문서의 2.2.3.1절에 정의된 기본 Initial Value를 사용한다.

  2. Key Unwrap 작업이 오류를 반환하면, throw하여 OperationError를 발생시킨다.

  3. plaintext를 반환한다.

30.3.3 키 생성

  1. usages가 "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmlength 속성이 128, 192 또는 256 중 하나와 같지 않으면, throw하여 OperationError를 발생시킨다.

  3. normalizedAlgorithmlength 멤버와 같은 길이의 AES 키를 생성한다.

  4. 키 생성 단계가 실패하면, throw하여 OperationError를 발생시킨다.

  5. key를 생성된 AES 키를 나타내는 새 CryptoKey 객체로 둔다.

  6. algorithm을 새 AesKeyAlgorithm으로 둔다.

  7. algorithmname 속성을 "AES-KW"로 설정한다.

  8. algorithmlength 속성을 normalizedAlgorithmlength 속성과 같게 설정한다.

  9. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정한다.

  12. key[[usages]] 내부 슬롯을 usages로 설정한다.

  13. key를 반환한다.

30.3.4 키 가져오기

  1. usages가 "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakeyData로 둔다.

    2. data비트 단위 길이가 128, 192 또는 256이 아니면 throw하여 DataError를 발생시킨다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkkty 필드가 "oct"가 아니면, throw하여 DataError를 발생시킨다.

    3. jwk가 JSON Web Algorithms [JWA] 6.4절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 둔다.

    5. data비트 단위 길이가 128인 경우:
      jwkalg 필드가 존재하고 "A128KW"가 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 192인 경우:
      jwkalg 필드가 존재하고 "A192KW"가 아니면, throw하여 DataError를 발생시킨다.
      data비트 단위 길이가 256인 경우:
      jwkalg 필드가 존재하고 "A256KW"가 아니면, throw하여 DataError를 발생시킨다.
      그 밖의 경우:
      throw하여 DataError를 발생시킨다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, throw하여 DataError를 발생시킨다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  3. keydata 값을 가진 AES 키를 나타내는 새 CryptoKey로 둔다.

  4. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  5. algorithm을 새 AesKeyAlgorithm으로 둔다.

  6. algorithmname 속성을 "AES-KW"로 설정한다.

  7. algorithmlength 속성을 data의 비트 단위 길이로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

30.3.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  2. format이 "raw"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 바이트 시퀀스로 둔다.

    2. resultdata로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "oct"로 설정한다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은 JSON Web Algorithms [JWA] 6.4절에 따라 인코딩된다.

    4. keylength 속성이 128인 경우:
      jwkalg 속성을 문자열 "A128KW"로 설정한다.
      keylength 속성이 192인 경우:
      jwkalg 속성을 문자열 "A192KW"로 설정한다.
      keylength 속성이 256인 경우:
      jwkalg 속성을 문자열 "A256KW"로 설정한다.
    5. jwkkey_ops 속성을 keyusages 속성과 같게 설정한다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정한다.

    7. resultjwk로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  3. result를 반환한다.

30.3.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면, throw하여 OperationError를 발생시킨다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환한다.

31. HMAC

31.1 설명

이 절은 비규범적이다.

HMAC 알고리즘은 이 명세에 정의된 SHA 해시 함수를 사용하여, [FIPS-198-1]에 따라 해시 기반 메시지 인증 코드를 계산하고 검증한다.

다른 명세는 HMAC과 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업과, HMAC에 대한 키 가져오기 단계키 내보내기 단계를 정의해야 한다.

31.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "HMAC"이다.

작업 매개변수 결과
sign 없음 바이트 시퀀스
verify 없음 boolean
generateKey HmacKeyGenParams CryptoKey
importKey HmacImportParams CryptoKey
exportKey 없음 object
get key length HmacImportParams 정수

31.3 HmacImportParams 딕셔너리

WebIDLdictionary HmacImportParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  [EnforceRange] unsigned long length;
};

hash 멤버는 사용할 내부 해시 함수를 나타낸다.

length 멤버는 키의 길이를 비트 단위로 나타낸다.

31.4 HmacKeyAlgorithm 딕셔너리

WebIDLdictionary HmacKeyAlgorithm : KeyAlgorithm {
  required KeyAlgorithm hash;
  required unsigned long length;
};

hash 멤버는 사용할 내부 해시 함수를 나타낸다.

length 멤버는 키의 길이를 비트 단위로 나타낸다.

31.5 HmacKeyGenParams 딕셔너리

WebIDLdictionary HmacKeyGenParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  [EnforceRange] unsigned long length;
};

hash 멤버는 사용할 내부 해시 함수를 나타낸다.

length 멤버는 생성할 키의 길이를 비트 단위로 나타낸다. 지정하지 않으면 권장 길이가 사용되며, 이는 연결된 해시 함수의 블록 크기의 크기이다.

31.6 작업

31.6.1 서명

  1. mac을 [FIPS-198-1] 4절에 설명된 MAC Generation 작업을 수행한 결과로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키와, key[[algorithm]] 내부 슬롯의 hash 속성이 식별하는 해시 함수, 그리고 message를 입력 데이터 text로 사용한다.

  2. mac을 반환한다.

31.6.2 검증

  1. mac을 [FIPS-198-1] 4절에 설명된 MAC Generation 작업을 수행한 결과로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키와, key[[algorithm]] 내부 슬롯의 hash 속성이 식별하는 해시 함수, 그리고 message를 입력 데이터 text로 사용한다.

  2. macsignature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환한다.

31.6.3 키 생성

  1. usages가 "sign" 또는 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  2. normalizedAlgorithmlength 멤버가 존재하지 않는 경우:
    lengthnormalizedAlgorithmhash 멤버가 식별하는 해시 함수의 블록 크기를 비트 단위로 나타낸 값으로 둔다.
    그 밖에, normalizedAlgorithmlength 멤버가 0이 아닌 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 둔다.
    그 밖의 경우:
    throw하여 OperationError를 발생시킨다.
  3. length비트 길이의 키를 생성한다.

  4. 키 생성 단계가 실패하면, throw하여 OperationError를 발생시킨다.

  5. key를 생성된 키를 나타내는 새 CryptoKey 객체로 둔다.

  6. algorithm을 새 HmacKeyAlgorithm으로 둔다.

  7. algorithmname 속성을 "HMAC"으로 설정한다.

  8. algorithmlength 속성을 length로 설정한다.

  9. hash를 새 KeyAlgorithm으로 둔다.

  10. hashname 속성을 normalizedAlgorithmhash 멤버의 name 멤버와 같게 설정한다.

  11. algorithmhash 속성을 hash로 설정한다.

  12. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  13. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  14. key[[extractable]] 내부 슬롯을 extractable로 설정한다.

  15. key[[usages]] 내부 슬롯을 usages로 설정한다.

  16. key를 반환한다.

31.6.4 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. usages가 "sign" 또는 "verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를 발생시킨다.

  3. hash를 새 KeyAlgorithm으로 둔다.

  4. format이 "raw"인 경우:
    1. datakeyData로 둔다.

    2. hashnormalizedAlgorithmhash 멤버와 같게 설정한다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그 밖의 경우:

      throw하여 DataError를 발생시킨다.

    2. jwkkty 필드가 "oct"가 아니면, throw하여 DataError를 발생시킨다.

    3. jwk가 JSON Web Algorithms [JWA] 6.4절의 요구사항을 충족하지 않으면, throw하여 DataError를 발생시킨다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 둔다.

    5. hashnormalizedAlgorithmhash 멤버와 같게 설정한다.

    6. hashname 속성이 "SHA-1"인 경우:
      jwkalg 필드가 존재하고 "HS1"이 아니면, throw하여 DataError를 발생시킨다.
      hashname 속성이 "SHA-256"인 경우:
      jwkalg 필드가 존재하고 "HS256"이 아니면, throw하여 DataError를 발생시킨다.
      hashname 속성이 "SHA-384"인 경우:
      jwkalg 필드가 존재하고 "HS384"이 아니면, throw하여 DataError를 발생시킨다.
      hashname 속성이 "SHA-512"인 경우:
      jwkalg 필드가 존재하고 "HS512"이 아니면, throw하여 DataError를 발생시킨다.
      그 밖에, hashname 속성이 다른 적용 가능한 명세에 정의된 경우:
      다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다. 이때 format, jwkhash를 전달하고 hash를 얻는다.
    7. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sign"이 아니면, throw하여 DataError를 발생시킨다.

    8. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면, throw하여 DataError를 발생시킨다.

    9. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, throw하여 DataError를 발생시킨다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.
  5. lengthdata비트 단위 길이로 둔다.

  6. length가 0이면 throw하여 DataError를 발생시킨다.

  7. normalizedAlgorithmlength 멤버가 존재하는 경우:
    normalizedAlgorithmlength 멤버가 length보다 큰 경우:
    throw하여 DataError를 발생시킨다.
    normalizedAlgorithmlength 멤버가 length에서 8을 뺀 값보다 작거나 같은 경우:
    throw하여 DataError를 발생시킨다.
    그 밖의 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 설정한다.
  8. keydata의 처음 length비트를 가진 HMAC 키를 나타내는 새 CryptoKey 객체로 둔다.

  9. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  10. algorithm을 새 HmacKeyAlgorithm으로 둔다.

  11. algorithmname 속성을 "HMAC"으로 설정한다.

  12. algorithmlength 속성을 length로 설정한다.

  13. algorithmhash 속성을 hash로 설정한다.

  14. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  15. key를 반환한다.

31.6.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면, throw하여 OperationError를 발생시킨다.

  2. bitskey[[handle]] 내부 슬롯이 나타내는 키의 원시 비트로 둔다.

  3. databits포함하는 바이트 시퀀스로 둔다.

  4. format이 "raw"인 경우:
    1. resultdata로 둔다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 딕셔너리로 둔다.

    2. jwkkty 속성을 문자열 "oct"로 설정한다.

    3. jwkk 속성을 data를 포함하는 문자열로 설정한다. 이 문자열은 JSON Web Algorithms [JWA] 6.4절에 따라 인코딩된다.

    4. algorithmkey[[algorithm]] 내부 슬롯으로 둔다.

    5. hashalgorithmhash 속성으로 둔다.

    6. hashname 속성이 "SHA-1"인 경우:
      jwkalg 속성을 문자열 "HS1"로 설정한다.
      hashname 속성이 "SHA-256"인 경우:
      jwkalg 속성을 문자열 "HS256"로 설정한다.
      hashname 속성이 "SHA-384"인 경우:
      jwkalg 속성을 문자열 "HS384"로 설정한다.
      hashname 속성이 "SHA-512"인 경우:
      jwkalg 속성을 문자열 "HS512"로 설정한다.
      그 밖에, hashname 속성이 다른 적용 가능한 명세에 정의된 경우:
      1. 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다. 이때 formatkey를 전달하고 alg를 얻는다.

      2. jwkalg 속성을 alg로 설정한다.

    7. jwkkey_ops 속성을 keyusages 속성과 같게 설정한다.

    8. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정한다.

    9. resultjwk로 둔다.

    그 밖의 경우:

    throw하여 NotSupportedError를 발생시킨다.

  5. result를 반환한다.

31.6.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 존재하지 않는 경우:

    lengthnormalizedDerivedKeyAlgorithmhash 멤버가 식별하는 해시 함수의 블록 크기를 비트 단위로 나타낸 값으로 둔다.

    그 밖에, normalizedDerivedKeyAlgorithmlength 멤버가 0이 아닌 경우:
    lengthnormalizedDerivedKeyAlgorithmlength 멤버와 같게 둔다.
    그 밖의 경우:
    throw하여 TypeError를 발생시킨다.
  2. length를 반환한다.

32. SHA

32.1 설명

이 절은 비규범적이다.

이는 [FIPS-180-4]에 지정된 SHA-1 및 SHA-2 계열을 설명한다.

32.2 등록

각 SHA 알고리즘에 대한 인식된 알고리즘 이름은 "SHA-1", "SHA-256", "SHA-384", 및 "SHA-512"이다.

작업 매개변수 결과
digest 없음 바이트 시퀀스

32.3 작업

32.3.1 Digest

  1. normalizedAlgorithmname 멤버가 "SHA-1"과 대소문자를 구분하는 문자열 일치인 경우:
    result를 [FIPS-180-4] 6.1절에 정의된 SHA-1 해시 함수를 수행한 결과로 둔다. 이때 message를 입력 메시지 M으로 사용한다.
    normalizedAlgorithmname 멤버가 "SHA-256"과 대소문자를 구분하는 문자열 일치인 경우:
    result를 [FIPS-180-4] 6.2절에 정의된 SHA-256 해시 함수를 수행한 결과로 둔다. 이때 message를 입력 메시지 M으로 사용한다.
    normalizedAlgorithmname 멤버가 "SHA-384"과 대소문자를 구분하는 문자열 일치인 경우:
    result를 [FIPS-180-4] 6.5절에 정의된 SHA-384 해시 함수를 수행한 결과로 둔다. 이때 message를 입력 메시지 M으로 사용한다.
    normalizedAlgorithmname 멤버가 "SHA-512"과 대소문자를 구분하는 문자열 일치인 경우:
    result를 [FIPS-180-4] 6.4절에 정의된 SHA-512 해시 함수를 수행한 결과로 둔다. 이때 message를 입력 메시지 M으로 사용한다.
  2. 작업을 수행한 결과 오류가 발생하면, throw하여 OperationError를 발생시킨다.

  3. result를 반환한다.

33. HKDF

33.1 설명

이 절은 비규범적이다.

"HKDF" 알고리즘 식별자는 [RFC5869]에 설명된 추출 후 확장 접근 방식을 사용하고, 이 명세에 정의된 SHA 해시 함수를 사용하여 키 파생을 수행하는 데 사용된다.

다른 명세는 HKDF와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업을 정의해야 한다.

33.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "HKDF"이다.

작업 매개변수 결과
deriveBits HkdfParams 바이트 시퀀스
importKey 없음 CryptoKey
Get key length 없음 null

33.3 HkdfParams 딕셔너리

WebIDLdictionary HkdfParams : Algorithm {
  required HashAlgorithmIdentifier hash;
  required BufferSource salt;
  required BufferSource info;
};

hash 멤버는 HMAC과 함께 사용할 알고리즘을 나타낸다 (예: SHA-256).

salt 멤버는 extract 단계에서 사용되는 salt를 나타낸다.

info 멤버는 파생된 키 자료에 대한 애플리케이션별 컨텍스트를 나타낸다.

33.4 작업

33.4.1 비트 파생

  1. length가 null이거나 8의 배수가 아니면, throw하여 OperationError를 발생시킨다.

  2. keyDerivationKeykey[[handle]] 내부 슬롯이 나타내는 secret으로 둔다.

  3. result를 [RFC5869] 2절에 설명된 HKDF extract 단계와 그 뒤의 HKDF expand 단계를 수행한 결과로 둔다. 이때 다음을 사용한다:

    • normalizedAlgorithmhash 멤버를 Hash로,

    • keyDerivationKey를 입력 키 자료 IKM으로,

    • normalizedAlgorithmsalt 멤버를 salt로,

    • normalizedAlgorithminfo 멤버를 info로,

    • length를 8로 나눈 값을 L의 값으로,

  4. 키 파생 작업이 실패하면, throw하여 OperationError를 발생시킨다.

  5. result를 반환한다.

33.4.2 키 가져오기

  1. keyData를 가져올 키 데이터로 둔다.

  2. format이 "raw"인 경우:
    1. usages가 "deriveKey" 또는 "deriveBits"가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

    2. extractablefalse가 아니면, throw하여 SyntaxError를 발생시킨다.

    3. keykeyData에 제공된 키 데이터를 나타내는 새 CryptoKey로 둔다.

    4. key[[type]] 내부 슬롯을 "secret"로 설정한다.

    5. algorithm을 새 KeyAlgorithm 객체로 둔다.

    6. algorithmname 속성을 "HKDF"로 설정한다.

    7. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

    8. key를 반환한다.

    그 밖의 경우:
    throw하여 NotSupportedError를 발생시킨다.

33.4.3 키 길이 가져오기

  1. null을 반환한다.

34. PBKDF2

34.1 설명

이 절은 비규범적이다.

"PBKDF2" 알고리즘 식별자는 이 명세에 정의된 SHA 해시 함수를 사용하고 HMAC을 의사 난수 함수로 사용하여, [RFC8018]에 정의된 PKCS#5 비밀번호 기반 키 파생 함수 버전 2를 사용해 키 파생을 수행하는 데 사용된다.

다른 명세는 PBKDF2와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업을 정의해야 한다.

34.2 등록

이 알고리즘의 인식된 알고리즘 이름은 "PBKDF2"이다.

작업 매개변수 결과
deriveBits Pbkdf2Params 바이트 시퀀스
importKey 없음 CryptoKey
Get key length 없음 null

34.3 Pbkdf2Params 딕셔너리

WebIDLdictionary Pbkdf2Params : Algorithm {
  required BufferSource salt;
  required [EnforceRange] unsigned long iterations;
  required HashAlgorithmIdentifier hash;
};

Pbkdf2Params 딕셔너리는 salt 멤버, iterations 멤버, 그리고 hash 멤버를 가진다.

34.4 작업

34.4.1 비트 파생

  1. length가 null이거나 8의 배수가 아니면, throw하여 OperationError를 발생시킨다.

  2. normalizedAlgorithmiterations 멤버가 0이면, throw하여 OperationError를 발생시킨다.

  3. length가 0이면, 빈 바이트 시퀀스를 반환한다.

  4. prf를 [FIPS-198-1] 4절에 설명된 MAC Generation 함수로 둔다. 이때 normalizedAlgorithmhash 멤버가 설명하는 해시 함수를 사용한다.

  5. result를 [RFC8018] 5.2절에 정의된 PBKDF2 작업을 수행한 결과로 둔다. 이때 prf를 의사 난수 함수 PRF로, key[[handle]] 내부 슬롯이 나타내는 비밀번호를 비밀번호 P로, normalizedAlgorithmsalt 속성을 salt S로, normalizedAlgorithmiterations 속성의 값을 반복 횟수 c로, 그리고 length를 8로 나눈 값을 의도된 키 길이 dkLen으로 사용한다.

  6. 키 파생 작업이 실패하면, throw하여 OperationError를 발생시킨다.

  7. result를 반환한다.

34.4.2 키 가져오기

  1. format이 "raw"가 아니면, throw하여 NotSupportedError를 발생시킨다

  2. usages가 "deriveKey" 또는 "deriveBits"가 아닌 값을 포함하면, throw하여 SyntaxError를 발생시킨다.

  3. extractablefalse가 아니면, throw하여 SyntaxError를 발생시킨다.

  4. keykeyData를 나타내는 새 CryptoKey로 둔다.

  5. key[[type]] 내부 슬롯을 "secret"로 설정한다.

  6. algorithm을 새 KeyAlgorithm 객체로 둔다.

  7. algorithmname 속성을 "PBKDF2"로 설정한다.

  8. key[[algorithm]] 내부 슬롯을 algorithm으로 설정한다.

  9. key를 반환한다.

34.4.3 키 길이 가져오기

  1. null을 반환한다.

35. JavaScript 예제 코드

35.1 두 키 쌍을 생성하고, 공유 키를 파생하며, 일부 데이터를 암호화하기

이 예제는 Alice용과 Bob용 X25519 키 쌍 두 개를 생성하고, 이들 사이에서 키 합의를 수행하며, SHA-256을 사용하는 HKDF로 그 결과에서 256비트 AES-GCM 키를 파생한 다음, 그 키로 일부 데이터를 암호화하고 복호화한다.

예제 1: X25519 키 합의
// Alice용 키 쌍을 생성한다.
const alice_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const alice_private_key = alice_x25519_key.privateKey;

// 일반적으로 공개 키는 사전에 Bob이 인증된 채널을 통해 Alice에게 전송한다.
// 이 예제에서는 다른 키 쌍을 생성하고 그 공개 키를 대신 사용한다.
const bob_x25519_key = await crypto.subtle.generateKey('X25519', false /* extractable */, ['deriveKey']);
const bob_public_key = bob_x25519_key.publicKey;

// 키 합의를 수행한다.
const alice_x25519_params = { name: 'X25519', public: bob_public_key };
const alice_shared_key = await crypto.subtle.deriveKey(alice_x25519_params, alice_private_key, 'HKDF', false /* extractable */, ['deriveKey']);

// 그 결과에서 대칭 키를 파생한다.
const salt = crypto.getRandomValues(new Uint8Array(32));
const info = new TextEncoder().encode('X25519 key agreement for an AES-GCM-256 key');
const hkdf_params = { name: 'HKDF', hash: 'SHA-256', salt, info };
const gcm_params = { name: 'AES-GCM', length: 256 };
const alice_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, alice_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);

// 대칭 키로 일부 데이터를 암호화하고 Bob에게 보낸다. IV도 함께 전달해야 한다.
const iv = crypto.getRandomValues(new Uint8Array(12));
const message = new TextEncoder().encode('Hi Bob!');
const encrypted = await crypto.subtle.encrypt({ ...gcm_params, iv }, alice_symmetric_key, message);

// Bob 쪽에서는 대신 Alice의 공개 키와 Bob의 비공개 키가 사용된다.
// 같은 결과를 얻으려면 Alice와 Bob은 같은 salt와 info를 사용하기로 합의해야 한다.
const alice_public_key = alice_x25519_key.publicKey;
const bob_private_key = bob_x25519_key.privateKey;
const bob_x25519_params = { name: 'X25519', public: alice_public_key };
const bob_shared_key = await crypto.subtle.deriveKey(bob_x25519_params, bob_private_key, 'HKDF', false /* extractable */, ['deriveKey']);
const bob_symmetric_key = await crypto.subtle.deriveKey(hkdf_params, bob_shared_key, gcm_params, false /* extractable */, ['encrypt', 'decrypt']);

// Bob 쪽에서 데이터를 복호화할 수 있다.
const decrypted = await crypto.subtle.decrypt({ ...gcm_params, iv }, bob_symmetric_key, encrypted);
const decrypted_message = new TextDecoder().decode(decrypted);

35.2 서명용 키 쌍을 생성하고, 일부 데이터에 서명하기

예제 2: Ed25519 서명
const data = new TextEncoder().encode('Hello, world!');
const key = await crypto.subtle.generateKey('Ed25519', false, ['sign']);
const signature = await crypto.subtle.sign('Ed25519', key.privateKey, data);

35.3 대칭 키를 생성하고, 일부 데이터를 암호화하기

예제 3: AES-GCM 암호화
const data = new TextEncoder().encode('Hello, world!');
const aesAlgorithmKeyGen = {
  name: 'AES-GCM',
  // AesKeyGenParams
  length: 256
};
const aesAlgorithmEncrypt = {
  name: 'AES-GCM',
  // AesGcmParams
  iv: crypto.getRandomValues(new Uint8Array(16))
};
const key = await crypto.subtle.generateKey(aesAlgorithmKeyGen, false, ['encrypt']);
const encrypted = await crypto.subtle.encrypt(aesAlgorithmEncrypt, key, data);

35.4 다운로드용 고유 이름 생성하기

예제 4: 무작위 UUID 생성
const filename = `${crypto.randomUUID()}.txt`;

36. IANA 고려사항

36.1 JSON Web Signature 및 Encryption Algorithms 등록

이 절은 JSON Web Key와 함께 사용하기 위해 다음 알고리즘 식별자를 IANA JSON Web Signature and Encryption Algorithms Registry에 등록한다. 템플릿의 'Implementation Requirements' 필드는 특히 JSON Web Signature 및 JSON Web Encryption과 함께 사용하는 경우를 가리키며, 이 경우 인증되지 않은 암호화의 사용은 금지된다는 점에 유의한다.

36.2 JSON Web Key Parameters 등록

37. 감사의 말

원저자이자 편집자인 Ryan Sleevi와 이 문서의 전 편집자인 Mark Watson에게 특히 감사를 표한다.

기술적 피드백과 지원을 제공한 Adam Barth, Alex Russell, Ali Asad, Arun Ranganathan, Brian Smith, Brian Warner, Channy Yun, Charles Engelke, Eric Roman, Glenn Adams, Jim Schaad, Kai Engert, Michael Hutchinson, Michael B. Jones, Nick Van den Bleeken, Richard Barnes, Ryan Hurst, Tim Taubert, Vijay Bharadwaj, Virginie Galindo, Wan-Teh Chang에게 감사한다.

W3C Web Cryptography WG와 public-webcrypto@w3.org 메일링 리스트의 참여자들에게 감사한다.

W3CW3C/MIT를 지원한 Northrop Grumman Cybersecurity Research Consortium에 감사를 표한다.

getRandomValues 메서드는 Crypto 인터페이스에서 Adam Barth가 WHATWG에 처음 제안했다.

A. JSON Web Key / JSON Web Algorithm 사이의 매핑

이 절은 비규범적이다.

JWK 가져오기 및 내보내기의 규범적 요구사항은 알고리즘별 절을 참조한다.

A.1 알고리즘 매핑

JSON Web Key AlgorithmIdentifier
{ kty: "RSA",
  alg: "RS1" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-1" }
}
{ kty: "RSA",
  alg: "RS256" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "RS384" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "RS512" }
{ name: "RSASSA-PKCS1-v1_5",
  hash: { name: "SHA-512" }
}
{ kty: "RSA",
  alg: "PS256" }
{ name: "RSA-PSS",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "PS384" }
{ name: "RSA-PSS",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "PS512" }
{ name: "RSA-PSS",
  hash: { name: "SHA-512" }
}
{ kty: "RSA",
  alg: "RSA-OAEP" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-1" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-256" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-256" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-384" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-384" }
}
{ kty: "RSA",
  alg: "RSA-OAEP-512" }
{ name: "RSA-OAEP",
  hash: { name: "SHA-512" }
}
{ kty: "EC",
  alg: "ES256" }
{ name: "ECDSA",
  namedCurve: "P-256",
  hash: { name: "SHA-256" }
}
{ kty: "EC",
  alg: "ES384" }
{ name: "ECDSA",
  namedCurve: "P-384",
  hash: { name: "SHA-384" }
}
{ kty: "EC",
  alg: "ES512" }
{ name: "ECDSA",
  namedCurve: "P-521",
  hash: { name: "SHA-512" }
}
{ kty: "OKP",
  crv: "Ed25519",
  alg: "Ed25519" }
{ name: "Ed25519" }
{ kty: "OKP",
  crv: "X25519" }
{ name: "X25519" }
{ kty: "oct",
  alg: "A128CTR" }
{ name: "AES-CTR",
  length: 128 }
{ kty: "oct",
  alg: "A192CTR" }
{ name: "AES-CTR",
  length: 192 }
{ kty: "oct",
  alg: "A256CTR" }
{ name: "AES-CTR",
  length: 256 }
{ kty: "oct",
  alg: "A128CBC" }
{ name: "AES-CBC",
  length: 128 }
{ kty: "oct",
  alg: "A192CBC" }
{ name: "AES-CBC",
  length: 192 }
{ kty: "oct",
  alg: "A256CBC" }
{ name: "AES-CBC",
  length: 256 }
{ kty: "oct",
  alg: "A128KW" }
{ name: "AES-KW",
  length: 128 }
{ kty: "oct",
  alg: "A192KW" }
{ name: "AES-KW",
  length: 192 }
{ kty: "oct",
  alg: "A256KW" }
{ name: "AES-KW",
  length: 256 }
{ kty: "oct",
  alg: "A128GCM" }
{ name: "AES-GCM",
  length: 128 }
{ kty: "oct",
  alg: "A192GCM" }
{ name: "AES-GCM",
  length: 192 }
{ kty: "oct",
  alg: "A256GCM" }
{ name: "AES-GCM",
  length: 256 }
{ kty: "oct",
  alg: "A128GCMKW" }
{ name: "AES-GCM",
  length: 128 }
{ kty: "oct",
  alg: "A192GCMKW" }
{ name: "AES-GCM",
  length: 192 }
{ kty: "oct",
  alg: "A256GCMKW" }
{ name: "AES-GCM",
  length: 256 }
{ kty: "oct",
  alg: "HS1" }
{ name: "HMAC",
  hash: { name: "SHA-1" }
}
{ kty: "oct",
  alg: "HS256" }
{ name: "HMAC",
  hash: { name: "SHA-256" }
}
{ kty: "oct",
  alg: "HS384" }
{ name: "HMAC",
  hash: { name: "SHA-384" }
}
{ kty: "oct",
  alg: "HS512" }
{ name: "HMAC",
  hash: "SHA-512" }

B. Algorithm과 SubjectPublicKeyInfo 사이의 매핑

이 절은 비규범적이다.

SPKI 가져오기 및 내보내기의 규범적 요구사항은 알고리즘별 절을 참조한다.

Algorithm OID subjectPublicKey ASN.1 구조 AlgorithmIdentifier 참조
rsaEncryption (1.2.840.113549.1.1.1) RSAPublicKey "RSASSA-PKCS1-v1_5", "RSA-PSS", 또는 "RSA-OAEP" [RFC3447]
id-ecPublicKey (1.2.840.10045.2.1) ECPoint "ECDH" 또는 "ECDSA" [RFC5480]
id-Ed25519 (1.3.101.112) BIT STRING "Ed25519" [RFC8410]
id-X25519 (1.3.101.110) BIT STRING "X25519" [RFC8410]
참고

이 명세에서 사용하는 object identifier는 키가 사용될 특정 알고리즘 및 해시에 관한 정보를 포함하지 않는다. 이것이 필요한 경우, 대신 "jwk" 키 형식을 사용하는 것이 권장된다.

C. Algorithm과 PKCS#8 PrivateKeyInfo 사이의 매핑

이 절은 비규범적이다.

PKCS#8 PrivateKeyInfo 가져오기 및 내보내기의 규범적 요구사항은 알고리즘별 절을 참조한다.

privateKeyAlgorithm privateKey 형식 AlgorithmIdentifier 참조
rsaEncryption (1.2.840.113549.1.1.1) RSAPrivateKey "RSASSA-PKCS1-v1_5", "RSA-PSS", 또는 "RSA-OAEP" [RFC3447]
id-ecPublicKey (1.2.840.10045.2.1) ECPrivateKey "ECDH" 또는 "ECDSA" [RFC5480]
id-Ed25519 (1.3.101.112) CurvePrivateKey "Ed25519" [RFC8410]
id-X25519 (1.3.101.110) CurvePrivateKey "X25519" [RFC8410]

D. 참조

D.1 규범적 참조

[DOM]
DOM Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://dom.spec.whatwg.org/
[ECMA-262]
ECMAScript Language Specification. Ecma International. URL: https://tc39.es/ecma262/multipage/
[encoding]
Encoding Standard. Anne van Kesteren. WHATWG. Living Standard. URL: https://encoding.spec.whatwg.org/
[FIPS-180-4]
FIPS PUB 180-4: Secure Hash Standard (SHS). U.S. Department of Commerce/National Institute of Standards and Technology. August 2015. National Standard. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.180-4.pdf
[FIPS-198-1]
The Keyed-Hash Message Authentication Code (HMAC). NIST. July 2008. URL: http://csrc.nist.gov/publications/fips/fips198-1/FIPS-198-1_final.pdf
[HTML]
HTML Standard. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. Living Standard. URL: https://html.spec.whatwg.org/multipage/
[Infra]
Infra Standard. Anne van Kesteren; Domenic Denicola. WHATWG. Living Standard. URL: https://infra.spec.whatwg.org/
[JWA]
JSON Web Algorithms (JWA). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7518
[JWK]
JSON Web Key (JWK). M. Jones. IETF. May 2015. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc7517
[NIST-SP800-38A]
NIST Special Publication 800-38A: Recommendation for Block Cipher Modes of Operation, Methods and Techniques. NIST. December 2001. URL: http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf
[NIST-SP800-38D]
NIST Special Publication 800-38D: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC. NIST. November 2007. URL: http://csrc.nist.gov/publications/nistpubs/800-38D/SP-800-38D.pdf
[RFC2119]
Key words for use in RFCs to Indicate Requirement Levels. S. Bradner. IETF. March 1997. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc2119
[RFC2141]
URN Syntax. R. Moats. IETF. May 1997. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc2141
[RFC2315]
PKCS #7: Cryptographic Message Syntax Version 1.5. B. Kaliski. IETF. March 1998. Informational. URL: https://www.rfc-editor.org/rfc/rfc2315
[RFC3394]
Advanced Encryption Standard (AES) Key Wrap Algorithm. J. Schaad; R. Housley. IETF. September 2002. Informational. URL: https://www.rfc-editor.org/rfc/rfc3394
[RFC3447]
Public-Key Cryptography Standards (PKCS) #1: RSA Cryptography Specifications Version 2.1. J. Jonsson; B. Kaliski. IETF. February 2003. Informational. URL: https://www.rfc-editor.org/rfc/rfc3447
[RFC4122]
A Universally Unique IDentifier (UUID) URN Namespace. P. Leach; M. Mealling; R. Salz. IETF. July 2005. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc4122
[RFC5208]
Public-Key Cryptography Standards (PKCS) #8: Private-Key Information Syntax Specification Version 1.2. B. Kaliski. IETF. May 2008. Informational. URL: https://www.rfc-editor.org/rfc/rfc5208
[RFC5280]
Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. May 2008. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5280
[RFC5480]
Elliptic Curve Cryptography Subject Public Key Information. S. Turner; D. Brown; K. Yiu; R. Housley; T. Polk. IETF. March 2009. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc5480
[RFC5869]
HMAC-based Extract-and-Expand Key Derivation Function (HKDF). H. Krawczyk; P. Eronen. IETF. May 2010. Informational. URL: https://www.rfc-editor.org/rfc/rfc5869
[RFC5915]
Elliptic Curve Private Key Structure. S. Turner; D. Brown. IETF. June 2010. Informational. URL: https://www.rfc-editor.org/rfc/rfc5915
[RFC6090]
Fundamental Elliptic Curve Cryptography Algorithms. D. McGrew; K. Igoe; M. Salter. IETF. February 2011. Informational. URL: https://www.rfc-editor.org/rfc/rfc6090
[RFC7748]
Elliptic Curves for Security. A. Langley; M. Hamburg; S. Turner. IETF. January 2016. Informational. URL: https://www.rfc-editor.org/rfc/rfc7748
[RFC8018]
PKCS #5: Password-Based Cryptography Specification Version 2.1. K. Moriarty, Ed.; B. Kaliski; A. Rusch. IETF. January 2017. Informational. URL: https://www.rfc-editor.org/rfc/rfc8018
[RFC8032]
Edwards-Curve Digital Signature Algorithm (EdDSA). S. Josefsson; I. Liusvaara. IETF. January 2017. Informational. URL: https://www.rfc-editor.org/rfc/rfc8032
[RFC8037]
CFRG Elliptic Curve Diffie-Hellman (ECDH) and Signatures in JSON Object Signing and Encryption (JOSE). I. Liusvaara. IETF. January 2017. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8037
[RFC8174]
Ambiguity of Uppercase vs Lowercase in RFC 2119 Key Words. B. Leiba. IETF. May 2017. Best Current Practice. URL: https://www.rfc-editor.org/rfc/rfc8174
[RFC8410]
Algorithm Identifiers for Ed25519, Ed448, X25519, and X448 for Use in the Internet X.509 Public Key Infrastructure. S. Josefsson; J. Schaad. IETF. August 2018. Proposed Standard. URL: https://www.rfc-editor.org/rfc/rfc8410
[SEC1]
SEC 1: Elliptic Curve Cryptography. Certicom Research. URL: http://www.secg.org/sec1-v2.pdf
[WebIDL]
Web IDL Standard. Edgar Chen; Timothy Gu. WHATWG. Living Standard. URL: https://webidl.spec.whatwg.org/
[X690]
Information technology - ASN.1 encoding rules: Specification of Basic Encoding Rules (BER), Canonical Encoding Rules (CER) and Distinguished Encoding Rules (DER). Justin Uberti; Cullen Jennings; Eric Rescorla. ITU-T. November 2008. ITU-T Recommendation. URL: https://tools.ietf.org/html/draft-ietf-rtcweb-jsep/

D.2 정보성 참조

[INDEXEDDB]
Indexed Database API. Nikunj Mehta; Jonas Sicking; Eliot Graff; Andrei Popescu; Jeremy Orlow; Joshua Bell. W3C. 8 January 2015. W3C Recommendation. URL: https://www.w3.org/TR/IndexedDB/