Copyright © 2025 World Wide Web Consortium. W3C® liability, trademark and permissive document license rules apply.
이 명세는 웹 애플리케이션에서 해싱, 서명 생성 및 검증, 암호화 및 복호화와 같은 기본적인 암호화 작업을 수행하기 위한 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의 적용을 받는다.
이 절은 비규범적이다.
Web Cryptography API는 사용자 에이전트가 관리하거나 노출하는 암호화 키 자료와 상호작용하기 위한 저수준 인터페이스를 정의한다. API 자체는 기반 키 저장소 구현과 무관하지만, 풍부한 웹 애플리케이션이 원시 키 자료에 접근할 필요 없이 서명 생성 및 검증, 해싱 및 검증, 암호화 및 복호화와 같은 작업을 수행할 수 있게 하는 공통 인터페이스 집합을 제공한다.
암호화 변환은
SubtleCrypto 인터페이스를 통해 노출되며, 이 인터페이스는 일반적인
암호화 작업을 수행하기 위한 메서드 집합을 정의한다. 서명 생성 및 검증,
해싱 및 검증, 암호화 및 복호화와 같은 작업 외에도,
이 API는 키 생성, 키 파생, 키 가져오기 및 내보내기를 위한 인터페이스를 제공한다.
이 절은 비규범적이다.
웹 애플리케이션은 기존의 사용자 이름/비밀번호 기반 인증 체계를, 사용자가 어떤 비밀 키 자료에 접근할 수 있음을 증명하는 데 기반한 인증 방법으로 확장하거나 대체하고자 할 수 있다. TLS 클라이언트 인증서와 같은 전송 계층 인증을 사용하는 대신, 웹 애플리케이션은 애플리케이션 자체 내에서 인증함으로써 제공되는 더 풍부한 사용자 경험을 선호할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 적절한 클라이언트 키를 찾을 수 있으며, 이 키는 이전에 사용자 에이전트를 통해 생성되었거나 웹 애플리케이션에 의해 대역 외 방식으로 미리 제공되었을 수 있다. 그런 다음 인증 챌린지를 복호화하고 이어서 인증 응답에 서명하는 것과 같은 암호화 작업을 수행할 수 있다.
이 교환은 클라이언트가 인증 중인 TLS 세션에 인증을 결합함으로써, 기반 전송의 속성을 바탕으로 키를 파생하여 더욱 강화될 수 있다.
사용자가 아직 자신의 계정과 연결된 키를 가지고 있지 않은 경우, 웹 애플리케이션은 사용자 에이전트가 새 키를 생성하거나 사용자가 선택한 기존 키를 재사용하도록 지시할 수 있다.
웹 애플리케이션은 민감하거나 개인정보를 포함하는 문서가 TLS를 통해서와 같이 안전하게 수신된 경우에도, 그 문서를 볼 수 있는 사람을 제한하고자 할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 문서를 비밀 키로 암호화한 다음, 그 키를 권한 있는 뷰어와 연결된 공개 키로 래핑함으로써 이를 수행할 수 있다. 사용자 에이전트가 이러한 웹 애플리케이션으로 이동하면, 애플리케이션은 문서의 암호화된 형태를 전송한다. 그런 다음 사용자 에이전트는 사용자의 개인 키를 사용해 암호화 키를 언래핑하도록 지시받고, 이후 그 키로 문서를 복호화하여 표시한다.
웹 애플리케이션은 원격 서비스 제공자에게 업로드하기 전에 사용자가 데이터와 문서의 기밀성을 보호할 수 있도록 허용하고자 할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 사용자가 개인 키 또는 비밀 키를 선택하게 하고, 선택한 키에서 선택적으로 암호화 키를 파생한 다음, 문서를 암호화하고, 기존 API를 사용하여 암호화된 데이터를 서비스 제공자에게 업로드할 수 있다.
이 사용 사례는 보호된 문서 교환 사용 사례와 유사하며, 문서의 열람자는 사용자 자신으로 제한된다.
웹 애플리케이션은 물리적 서명을 요구하는 대신 문서에 대한 전자 서명을 수락하고자 할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 사용자에게 키를 선택하도록 지시할 수 있으며, 이 키는 대역 외 방식으로 미리 제공되었거나 웹 애플리케이션을 위해 특별히 생성되었을 수 있다. 이 키를 사용하여 애플리케이션은 사용자가 문서를 수락한다는 증거로 어떤 데이터에 대한 서명 작업을 수행할 수 있다.
웹 애플리케이션은 데이터를 로컬에 캐시하면서, 이 데이터가 오프라인 공격에서 수정될 수 없도록 보장하고자 할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 애플리케이션 안에 포함된 공개 키를 사용하여 데이터 캐시의 내용을 검증할 수 있다. 이전에 데이터가 캐시에 추가될 때, 해당 개인 키로 서버가 그 데이터에 서명했을 것이다. 캐시에서 데이터를 복원할 때 서명을 검증함으로써, 클라이언트는 캐시된 데이터가 변조되지 않았음을 보장한다.
웹 애플리케이션은 메시지가 TLS를 통해서와 같이 안전하게 수신된 경우에도, off-the-record (OTR) 메시징과 같은 방식을 사용하여 메시지 계층 보안을 적용하고자 할 수 있다.
Web Cryptography API는 키 합의를 수행할 수 있게 함으로써 OTR 및 유사한 메시지 서명 방식을 가능하게 한다. 두 당사자는 메시지의 암호화와 복호화를 허용하고 변조를 방지하기 위해 공유 암호화 키와 메시지 인증 코드(MAC) 키를 협상할 수 있다.
웹 애플리케이션은 IETF JavaScript Object Signing and Encryption (JOSE) Working Group이 정의한 구조와 메시지 형식과 상호작용하고자 할 수 있다.
Web Cryptography API를 사용하면, 애플리케이션은 JSON 키 형식(JWK)으로 인코딩된 키를 읽고 가져오거나, 디지털 서명 또는 MAC을 사용하여 무결성이 보호된 메시지(JWS)를 검증하거나, 암호화된 메시지(JWE)를 복호화할 수 있다.
비규범적이라고 표시된 절뿐만 아니라, 이 명세의 모든 작성 지침, 다이어그램, 예제 및 참고는 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.
이 문서의 핵심 단어 MUST, REQUIRED, SHALL은 여기에 표시된 것처럼 모두 대문자로 나타날 때에만, BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.
이 명세는 다음 적합성 클래스를 정의한다.
사용자 에이전트는 구현에 적용되는 이 명세의 모든 MUST-, REQUIRED- 및 SHALL-수준 기준을 만족하는 경우 적합한 사용자 에이전트로 간주된다. 이 명세는 이 제품 클래스를 가리키기 위해 "적합한 사용자 에이전트"와 "사용자 에이전트"라는 용어를 모두 사용한다.
알고리즘이나 특정 단계로 표현된 적합성 요구사항은 최종 결과가 동등하다면 어떤 방식으로든 구현될 수 있다. (특히, 이 명세에 정의된 알고리즘은 따라가기 쉽도록 의도된 것이며, 성능이 뛰어나도록 의도된 것은 아니다.)
이 명세에 정의된 API를 구현하기 위해 ECMAScript를 사용하는 사용자 에이전트는, 이 명세가 해당 명세와 용어를 사용하므로 Web IDL 명세 [WebIDL]에 정의된 ECMAScript 바인딩과 일관된 방식으로 이를 구현해야 MUST 한다.
달리 명시되지 않는 한, 문자열 비교는
대소문자를 구분하는 방식으로 수행된다. 이 명세에서
"this"와 같이 고정폭 글꼴로 작성된 문자열 리터럴에는 둘러싼 따옴표가 포함되지 않는다.
이 명세에 대한 벤더별 독점 확장은 강력히 권장되지 않는다. 작성자는 그러한 확장을 사용해서는 안 된다. 그렇게 하면 상호운용성이 저하되고 사용자 기반이 분열되어, 특정 사용자 에이전트의 사용자만 해당 콘텐츠에 접근할 수 있게 되기 때문이다.
벤더별 확장이 필요한 경우, 이 명세의 향후 버전과 충돌하는 것을 방지하기 위해 멤버에는 벤더별 문자열을 접두사로 붙여야 한다. 확장은 확장의 사용이 이 명세에 정의된 기능과 모순되지도 않고, 그 기능의 부적합을 야기하지도 않도록 정의되어야 한다.
이 명세에 대한 벤더 중립적 확장이 필요한 경우, 이 명세를 그에 맞게 갱신하거나, 이 명세의 요구사항을 재정의하는 확장 명세를 작성할 수 있다. 이 명세를 자신의 활동에 적용하는 누군가가 그러한 확장 명세의 요구사항을 인정하기로 결정하면, 그것은 이 명세의 적합성 요구사항 목적상 적용 가능한 명세가 된다. W3C Web Cryptography Working Group이 정의한 적용 가능한 명세는 아래 표에 나열되어 있다.
| 명세 | 참조 |
이 절은 비규범적이다.
이 명세는 다양한 플랫폼별 또는 표준화된 암호화 API 사이의 공통 기능과 특징에 초점을 맞추고, 하나 또는 두 구현에만 특정된 특징과 기능을 피하려고 시도한다. 따라서 이 API는 개발자가 기반 키 저장소의 구현을 신경 쓸 필요가 없도록 하는 추상화 수준에서 키 생성, 관리 및 교환을 허용한다. 이 API는 기반 원시 암호화 키 자료에 대한 추상화로서 CryptoKey 객체를 중심으로 특별히 초점을 맞춘다. 그 의도는, 적합한 사용자 에이전트가 사용자 에이전트가 직접 저장하고 관리하는 키, 일부 운영 체제가 제공하는 사용자별 키 저장소와 같은 격리된 저장소 API를 사용하여 저장되거나 관리될 수 있는 키, 또는 보안 요소와 같은 키 저장 장치 안의 키를 노출할 수 있을 만큼 충분히 일반적인 API를 허용하면서, 풍부한 웹 애플리케이션이 키를 조작할 수 있게 하고 웹 애플리케이션이 기반 키 저장소의 성격을 알 필요가 없도록 하는 것이다.
기반 암호화 구현은 적합한 사용자 에이전트마다 다를 것이며, 정부 또는 산업 규제, 보안 모범 사례, 지적 재산권 문제, 제한된 운영 환경과 같은 사항을 포함하되 이에 한정되지 않는 지역 정책의 적용을 받을 수 있으므로, 이 명세는 구현해야 MUST 하는 필수 알고리즘 집합을 지시하지 않는다. 대신, 알고리즘에 독립적인 방식으로 사용할 수 있는 공통 바인딩 집합, 사용자 에이전트나 키 핸들이 기반 알고리즘을 지원하는지 발견하기 위한 공통 프레임워크, 그리고 구현된 경우 개별 알고리즘의 동작에 대한 적합성 요구사항 집합을 정의한다.
이 API는 애플리케이션이 키 자료를 생성, 검색 및 조작할 수 있게 하지만, 보안 요소나 스마트 카드와 같은 특정 유형의 키 저장소에 키를 프로비저닝하는 것은 구체적으로 다루지 않는다. 이는 그러한 프로비저닝 작업이 벤더별 세부 사항을 수반하는 경우가 많아, 벤더에 구애받지 않는 인터페이스를 정의하는 일을 부적절하게 한정 없는 작업으로 만들기 때문이다. 또한, 이 API는 암호화 모듈의 발견을 처리하거나 다루지 않는다. 그러한 개념은 기반 사용자 에이전트에 의존하며 공통 운영 체제, 암호화 라이브러리 및 구현 간에 이식 가능한 개념이 아니기 때문이다.
이 절은 비규범적이다.
이 명세는 적합한 사용자 에이전트가 사용자 에이전트 자체 안에서 암호화 작업을 직접 구현하지 않으며, 앞으로도 직접 구현하지 않을 것이라고 가정하지만, 이를 요구하지는 않는다. 역사적으로 많은 사용자 에이전트는 TLS 내에서 사용되는 것과 같은 암호화 작업을, 기반 운영 체제의 일부로 제공되는 기존 API나 사용자 에이전트와 독립적으로 관리되는 서드파티 모듈에 위임해 왔다.
CryptoKey 객체는
[[handle]]이라는
내부 슬롯을 사용하여 JavaScript 실행 환경과 이러한 기반 라이브러리 사이의 다리를 나타낸다.
이 핸들은 구현에 특정된 불투명 타입을 나타내며, JavaScript 타입 안에서 표현되지 않을 수 있고
스크립트 작성자에게 결코 노출되지 않는다. 이런 방식으로,
CryptoKey 객체는 JavaScript 실행 환경에 대해
개념적으로,
[[handle]]이 기반 암호화
구현에 대해 갖는 관계와 동등하다.
이러한 API는 전통적으로 암호화 제공자라는 개념을 중심으로 구축된다. 이는 알고리즘 집합의 특정 구현에 대한 추상화이다. 운영 체제나 라이브러리는 기본 제공자를 포함할 수 있으며, 사용자는 추가 제공자를 추가하거나, 활성화된 알고리즘 집합을 재구성하거나, 암호화 서비스가 제공되는 방식을 달리 사용자 지정할 수 있는 경우가 많다.
대부분의 사용자 에이전트는 순수하게 소프트웨어로 구현된 암호화 제공자와 상호작용할 것이라고 가정되지만, 이 명세가 이를 요구하지는 않는다. 그 결과 일부 구현의 기능은 기반 하드웨어의 기능에 의해 제한될 수 있으며, 사용자가 기반 암호화 라이브러리를 구성한 방식에 따라 이는 사용자 에이전트에 완전히 불투명할 수 있다.
이 명세는
CryptoKey 객체를 위한 새로운 저장소 메커니즘을
명시적으로 제공하지 않는다. 대신
직렬화 및 역직렬화 단계를
CryptoKey 객체에 대해 정의함으로써,
직렬화 가능한 객체 저장을 지원하는
기존 또는 미래의 모든 웹 저장소 메커니즘을 사용하여 CryptoKey 객체를 저장할 수 있다.
실제로는 대부분의 작성자가 Indexed Database API [INDEXEDDB]를 사용할 것으로 예상된다.
이는 키/값 쌍의 연관 저장을 허용하며, 여기서 키는 애플리케이션에 의미 있는
어떤 문자열 식별자이고, 값은 CryptoKey 객체이다. 이를 통해
키 자료를 애플리케이션이나 JavaScript 환경에 전혀 노출하지 않고도
키 자료를 저장하고 검색할 수 있다. 또한 이는 작성자에게
CryptoKey 자체와 함께
추가 메타데이터를 저장할 수 있는 완전한 유연성을 제공한다.
이 절은 비규범적이다.
명시적인 저장소 메커니즘을 제공하지 않음으로써, 이 명세는
CryptoKey 객체가 현재 실행
환경과 그 환경에서 사용할 수 있는 모든 저장소 메커니즘(예:
Indexed Database API)으로 범위가 한정된다고 가정한다. 애플리케이션 작성자는
자신의 애플리케이션 보안을 위해 이에 의존한다. 동일한
CryptoKey 객체를 가진 두 출처는 기반 키에
완전한 접근 권한을 가지며,
따라서 이러한 애플리케이션의 메시지는 구별될 수 없고, 이러한 애플리케이션으로 전송된
메시지는 완전히 복구될 수 있다. 구현자는 작성자가 명시적으로 공유하기로 선택한 경우
(예: postMessage 사용을 통해) 외에는
CryptoKey 객체가 두 출처 간에 공유되지 않도록
보장해야 한다
이 명세에 지정된 여러 알고리즘은 상당히 큰 소수의 생성이나 특정 작업의 반복적 수행과 같은 계산 집약적인 작업을 수행한다. 따라서 악의적인 애플리케이션은 이 API를 오용하여 구현이 상당한 양의 작업을 수행하게 하려 할 수 있으며, 실행 중인 다른 애플리케이션의 접근 또는 서비스를 거부하게 만들 수 있다. 구현은 구현이 동시에 수행하는 작업 수를 제한하거나, 실행 환경을 방해할 수 있다고 알려진 작업에 대해 사용자 동의를 요구하거나, 키 크기 또는 반복 횟수와 같은 속성에 대해 장치별 제한을 정의하는 등 이러한 위험을 완화하기 위한 조치를 취해야 한다.
이 명세에는 다양한 암호화 작업에 대한 설명이 포함되어 있으며, 그중 일부는 부적절하게 사용될 경우 알려진 약점을 가진다. 애플리케이션 개발자는 이러한 문제를 이해하고 완화하기 위해 주의를 기울이고 적절하며 최신인 암호화 문헌을 검토해야 한다. 일반적으로 애플리케이션 개발자는 새로운 암호화 프로토콜을 고안하는 것을 강력히 권장받지 않는다. 모든 애플리케이션과 마찬가지로, 이 명세의 사용자는 기존 프로토콜을 사용함으로써 가장 큰 이점을 얻을 수 있으며, 이 명세는 그러한 프로토콜을 구현하는 데 필요한 구성 요소를 제공한다.
이 명세에 정의된 API를 사용하여 의미 있는 암호화 보장을 제공하려면, 작성자는 웹 애플리케이션에 대한 기존 위협과 사용되는 기반 보안 모델에 익숙해야 한다. 개념적으로 스크립트 삽입과 같은 문제는 다른 운영 환경의 원격 코드 실행과 동등하며, 악의적인 스크립트의 삽입을 허용하면 키 또는 데이터의 유출이 가능해질 수 있다. 스크립트 삽입은 다른 애플리케이션에서 발생할 수 있으며, 이 경우 Content Security Policy를 신중하게 사용하여 완화할 수 있고, 악의적인 네트워크 중개자에서 발생할 수 있으며, 이 경우 Transport Layer Security를 사용하여 완화할 수 있다.
이 명세는 암호화 키의 저장을 위한 어떤 특정 메커니즘도 정의하지 않는다.
기본적으로, Indexed Database API 사용 등을 통해 키를 지속시키기 위한
특정 노력을 작성자가 기울이지 않는 한, 이 API로 생성된 키는 현재 페이지의
지속 시간 동안만 유효하다(예: 탐색 이벤트가 발생할 때까지).
서로 다른 페이지나 여러 브라우징 세션에 걸쳐 동일한 키를 사용하려는 작성자는
기존 웹 저장소 기술을 사용해야 한다. 작성자는 동일 출처 보안 모델과 같은
이러한 기술의 보안 가정을 인식해야 한다. 즉, 동일한 스킴, 호스트 및 포트를
공유하는 모든 애플리케이션은 경로와 같은 다른 정보가 다르더라도 동일한 저장소
파티션에 접근할 수 있다. 작성자는 postMessage와 같은 출처 간 공유를
사용하여 이 보안을 명시적으로 완화하도록 선택할 수 있다.
작성자는 이 명세가 기반 암호화 키 자료가 저장되는 방식에 대해 구현에
어떠한 규범적 요구사항도 부과하지 않는다는 점을 인식해야 한다. 유일한
요구사항은 키 자료가
exportKey 및 wrapKey 작업을 사용하는 경우를
제외하고는 스크립트에 노출되지 않는다는 것이다. 특히,
기반 암호화 키 자료가 디스크에 지속되지 않을 것이라고 보장하지 않으며,
암호화되지 않은 상태로 지속될 가능성도 있다. 또한 사용자나 User Agent와 동일한
권한으로 실행되는 다른 애플리케이션이 접근할 수 없다고 보장하지도 않는다.
장치 저장소에 접근할 수 있는 모든 애플리케이션 또는 사용자는, 스크립트를 통한
접근이 금지되어 있더라도 키 자료를 복구할 수 있을 수 있다.
이 명세는 모든 참조가 사라진 후 구현이 키 자료를 어떻게 처리하는지에 대해
어떠한 규범적 요구사항도 부과하지 않는다. 즉, 적합한 사용자 에이전트는
키 자료를 영점화할 필요가 없으며, CryptoKey에
대한 모든 참조가 사라진 후에도 키 자료가 장치 저장소나
장치 메모리에서 여전히 접근 가능할 수 있다.
애플리케이션은 구조화된 복제 알고리즘과 postMessage와 같은 API를
사용하여 출처와 같은 보안 경계를 넘어 CryptoKey 객체를 공유할 수 있다.
기반 암호화 키 자료에 대한 접근은 extractable
속성에 따라 제한될 수 있지만, 키가 대상 출처와 공유되면 원본 출처는
이후에 그 키에 대한 접근을 제한하거나 취소할 수 없다. 따라서 작성자는
대상 출처가 원본 출처가 사용하는 것과 동일한 악의적 스크립트 완화 조치를
취한다고 신뢰할 수 있는지 주의 깊게 보장해야 한다. 또한 원본 출처에서
스크립트 삽입이 발생하면, 공격자는 공격자가 제어하는 출처로 키를 게시할 수 있다.
사용자 에이전트가 공격자의 출처를 방문할 때마다, 사용자 에이전트는 기존 메시지의
복호화나 새로운 사기성 메시지의 생성과 같은 암호화 작업을 그 키를 사용하여
수행하도록 지시받을 수 있다.
작성자는 사용자가 언제든지 어떤 출처와 연결된 저장소를 지우도록 선택할 수 있으며, 이로 인해 키가 파괴될 수 있다는 점을 인식해야 한다. 서버에서와 같이 장기 저장을 제공하도록 의도된 애플리케이션은 이러한 데이터가 접근 불가능해지는 것을 방지하기 위해 키 에스크로와 같은 기술을 고려해야 한다. 작성자는 키가 무기한 사용 가능하다고 가정해서는 안 된다.
이 명세에 정의된 API를 사용하는 애플리케이션의 사용자는, 이러한 애플리케이션이 사용된 암호화 방식과 관계없이 교환되는 모든 메시지에 완전히 접근할 수 있음을 인식해야 한다. 즉, 암호화된 메시지의 경우에도 이러한 API를 사용하는 애플리케이션은 복호화된 메시지에도 완전히 접근할 수 있다.
이 절은 비규범적이다.
randomUUID를 사용자 ID로 사용
randomUUID는 사용자
ID를 생성하는 데 유용하지만, 전역
식별자를 생성할 수 있는 능력을 직접 제공하지는 않는다.
이 명세는 기반 명세에 의존한다.
적합한 사용자 에이전트는 이 명세가 의존하는
DOM에 정의된 기능의 적어도 하위 집합을 지원해야 MUST 하며,
특히 Promise와
DOMException을
지원해야 MUST 한다.
[DOM]
적합한 사용자 에이전트는 이 명세가 의존하는
HTML에 정의된 기능의 적어도 하위 집합을 지원해야 MUST 하며,
특히
ArrayBufferView typedef와
직렬화 가능한 객체를 지원해야 MUST 한다.
[HTML]
적합한 사용자 에이전트는 Web IDL 명세에 설명된 대로, 이 명세의 IDL 조각에 대한 적합한 구현이어야 MUST 한다. [WebIDL]
용어
ArrayBuffer,
ArrayBufferView 및
직렬화 가능한
객체는
HTML 명세 [HTML]에 정의되어 있다.
용어 DOMString 및
BufferSource는
[WEBIDL]에 정의되어 있다.
바이트 시퀀스의 비트 단위 길이는 그 길이에 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 구조를 파싱하라고 말할 때, 사용자 에이전트는 다음 단계를 수행해야 한다.
data를 파싱할 바이트 시퀀스로 둔다.
structure를 파싱할 ASN.1 구조로 둔다.
exactData를 선택적 불리언 값으로 둔다. 제공되지 않은 경우,
true로 초기화한다.
[X690]의 Distinguished Encoding Rules에 따라 data를 파싱하며, structure를 디코딩할 ASN.1 구조로 사용한다.
exactData가 지정되었고, 파싱 단계 중에 data의 모든 바이트가
소비되지 않았다면,
throw a
DataError.
파싱된 ASN.1 구조를 반환한다.
이 명세가 subjectPublicKeyInfo를
파싱하라고 말할 때, 사용자 에이전트는
data를 파싱할 바이트 시퀀스로, structure를 [RFC5280]에
지정된
subjectPublicKeyInfo의 ASN.1 구조로, exactData를 true로 설정하여
ASN.1 구조를 파싱해야 한다.
이 명세가 PrivateKeyInfo를
파싱하라고 말할 때, 사용자 에이전트는 ASN.1 구조를 파싱해야 하며,
data는
파싱할 바이트 시퀀스로 설정하고,
structure는 [RFC5208]에
지정된
PrivateKeyInfo의 ASN.1 구조로 설정하며,
exactData는 true로 설정한다.
이 명세가 JWK를 파싱하라고 말할 때, 사용자 에이전트는 다음 단계를 실행해야 한다.
data를 파싱할 바이트 시퀀스로 둔다.
json을 data를 UTF-8에 따라 해석한 결과인 Unicode 문자열로 둔다.
json을 UTF-16으로 변환한다.
result를 새 전역 객체의 컨텍스트에서
JSON.parse 내부 함수를 실행한 결과인 객체 리터럴로 두며,
text 인수는 json을 포함하는 JavaScript String으로 설정한다.
key를 result를
JsonWebKey의 IDL 딕셔너리 타입으로 변환한
결과로 둔다.
key를 반환한다.
이 명세가 두 시퀀스 a와 b의 사용법 교집합을 계산하라고 말할 때, 결과는 인식된 키 사용법 값 목록에 나열된 순서대로, a와 b 모두에 나타나는 각 인식된 키 사용법 값을 포함하는 시퀀스여야 한다. 여기서 어떤 값은 그 값과 대소문자를 구분하는 문자열 일치를 하는 요소가 시퀀스에 존재하면 그 시퀀스에 나타난다고 말한다.
이 명세가 usages의 사용법 목록의 정규화된 값을 계산하라고 말할 때, 결과는 usages와 모든 인식된 키 사용법 값을 포함하는 시퀀스의 사용법 교집합이어야 한다.
이 명세가 object의 내부 슬롯 [[slot]]과 연결된 캐시된 ECMAScript 객체를 참조할 때, 사용자 에이전트는 다음 단계를 실행해야 한다.
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();
};
getRandomValues
메서드는 암호학적으로 강력한 난수 값을 생성한다. 이는 다음과 같이 동작해야 한다.
array가 Int8Array, Uint8Array, Uint8ClampedArray,
Int16Array, Uint16Array, Int32Array, Uint32Array,
BigInt64Array
또는 BigUint64Array가
아니면, throw a
TypeMismatchError
하고
알고리즘을 종료한다.
byteLength를 array의 바이트 길이로 둔다.
byteLength가 65536보다 크면, throw a
QuotaExceededError
하고
알고리즘을 종료한다.
bytes를 길이 byteLength의 바이트 시퀀스로 둔다.
bytes를 암호학적으로 안전한 난수 바이트로 채운다.
bytes를 array에 쓴다.
array를 반환한다.
getRandomValues 메서드를 사용하여 키를 생성하지 말라. 대신
generateKey 메서드를
사용하라.
randomUUID
메서드는 새 버전 4
UUID를 생성하고,
[RFC4122]의
3절에 설명된 대로 그
네임스페이스별
문자열 표현을 반환한다.
무작위 UUID를 생성하려면:
0100으로 설정한다.
10으로 설정한다.
«의 문자열 연결을 반환한다.
-",
-",
-",
-",
».
무작위 UUID를 생성하기 위한 알고리즘에
설명된 단계에서, 바이트 value의
16진수 표현은
ASCII 소문자 16진수
숫자를 사용하여 value를 16진수로 표현하고,
두 개의 ASCII 소문자
16진수
숫자가 되도록 왼쪽에 "0"을 채워 만든 두 문자 문자열이다.
subtle 속성은
저수준 암호화 프리미티브와 알고리즘을 제공하는
SubtleCrypto 인터페이스의
인스턴스를 제공한다.
Algorithm
객체는 알고리즘과 원하는 작업을 완전히 지정하는 데 필요한 추가 매개변수를
지정하는 데 사용되는 딕셔너리 객체 [WEBIDL]이다.
WebIDLtypedef (object or DOMString) AlgorithmIdentifier;
typedef AlgorithmIdentifier HashAlgorithmIdentifier;
dictionary Algorithm {
required DOMString name;
};
Algorithm 딕셔너리 멤버name
KeyAlgorithm 딕셔너리는 주어진
CryptoKey 객체의 내용에 관한 정보를 나타낸다.
WebIDLdictionary KeyAlgorithm {
required DOMString name;
};
이 절은 비규범적이다.
KeyAlgorithm 딕셔너리는
CryptoKey의
고정된 공개 속성이 애플리케이션에 어떻게 다시 반영되는지를 문서화하는 데 도움을 주기 위해
제공된다. 실제 딕셔너리 타입은 애플리케이션에 결코 노출되지 않는다.
nameCryptoKey를 생성하는 데 사용된 알고리즘의 이름
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;
};
이 절은 비규범적이다.
이 명세는 사용자 에이전트가 관리하는 다양한 종류의 키 자료에 대한 균일한 인터페이스를 제공한다. 여기에는 사용자 에이전트가 생성한 키, 사용자 에이전트가 다른 키에서 파생한 키, 사용자 작업을 통해 또는 이 API를 사용하여 사용자 에이전트로 가져온 키, 사용자 에이전트가 접근할 수 있는 소프트웨어나 하드웨어 안에 미리 제공된 키, 또는 다른 방식으로 사용자 에이전트가 사용할 수 있게 된 키가 포함될 수 있다. 키라는 용어는 암호화 작업을 위한 실제 키와 키 파생 또는 교환 작업 안에서 얻은 비밀 값을 포함한 모든 키 자료를 넓게 가리킨다.
CryptoKey 객체는 기반 키 저장소 메커니즘과 직접 인터페이스할 필요가 없으며, 대신 암호화 작업을 수행할 때와 같이 필요한 경우 사용자 에이전트가 키 자료를 얻는 방법을 이해하기 위한 참조일 수 있다.
KeyTypepublic", "private" 및 "secret"이다.
대칭 알고리즘에 사용되는 것을 포함한 불투명 키 자료는
secret으로 표현되며, public/private 키 쌍으로
구성된 비대칭 알고리즘의 일부로 사용되는 키는
public 또는 private이다.
KeyUsageencrypt,
decrypt,
sign,
verify,
deriveKey,
deriveBits,
wrapKey 및
unwrapKey이다.
모든 CryptoKey 객체는 키에 관한 정보를
저장하는 내부 슬롯 집합을 가진다. 이러한 슬롯은 이 명세의 일부로 노출되지 않는다.
이 슬롯들은 구현이 이 명세를 구현하는 데 사용하는 내부 상태를 나타낸다.
[ECMA-262]에서 사용하는 표기 관례를
여기서 재사용한다. 내부 슬롯은 이중 대괄호 [[ ]]로 둘러싸인 이름으로 식별된다.
모든 CryptoKey 객체는
[[type]],
[[extractable]],
[[algorithm]],
[[algorithm_cached]],
[[usages]],
[[usages_cached]],
및
[[handle]]이라는
내부 슬롯을 가진다.
[[algorithm]] 내부
슬롯의 내용은 KeyAlgorithm이거나, 그것에서 파생되어야 한다.
[[usages]] 내부
슬롯의 내용은 Sequence<KeyUsage> 타입이어야 한다.
[[handle]] 슬롯은
기반 암호화 구현이 논리적 키를 나타내는 데 사용하는 임의의 데이터를 포함하는
불투명 타입이다. 서로 다른 암호화 구현은 정수로 표현되는 불투명 식별자,
포인터 타입, 또는 식별 정보를 제공하는 구조에 이르기까지 서로 다른 타입을
사용할 수 있다. 이러한 핸들은 애플리케이션에 결코 노출되지 않는다.
type[[type]] 내부
슬롯을 반영한다.
extractable[[extractable]] 내부
슬롯을 반영한다.
algorithm[[algorithm]]
내부 슬롯과
연결된
캐시된 ECMAScript 객체를 반환한다.
usages[[usages]] 내부 슬롯과
연결된
캐시된 ECMAScript 객체를 반환한다.
CryptoKey 객체는 직렬화 가능한 객체이다.
value와 serialized가 주어졌을 때, 이들의
직렬화
단계는 다음과 같다.
[[type]] 내부 슬롯으로
설정한다.
[[extractable]] 내부 슬롯으로
설정한다.
[[algorithm]]
내부 슬롯의
하위 직렬화로
설정한다.
[[usages]]
내부 슬롯의
하위 직렬화로
설정한다.
[[handle]] 내부 슬롯으로
설정한다.
serialized와 value가 주어졌을 때, 이들의 역직렬화 단계는 다음과 같다.
[[type]] 내부
슬롯을 serialized.[[Type]]으로 초기화한다.
[[extractable]] 내부 슬롯을
serialized.[[Extractable]]로 초기화한다.
[[algorithm]] 내부 슬롯을
serialized.[[Algorithm]]의
하위
역직렬화로
초기화한다.
[[usages]]
내부 슬롯을
serialized.[[Usages]]의
하위
역직렬화로
초기화한다.
[[handle]]
내부 슬롯을 serialized.[[Handle]]로 초기화한다.
CryptoKey 객체를
역직렬화할 때, 객체가 다른 타입으로 역직렬화되지 않는 것이 중요하다.
이는 역직렬화
단계의 정의에 의해 규범적으로 요구되지만, 특정한 주의를 기울일 가치가 있다.
그러한 역직렬화는 키 자료의 내용을 노출할 수 있으며, 어떤 경우에는
([[extractable]] 내부 슬롯이
false인 경우와 같이) 애플리케이션에 노출되어서는 안 되기 때문이다.
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 인터페이스를 사용하는 개발자는 제공되는 여러 알고리즘의 설계와 구현 모두와 관련된 보안 문제를 인식하고 있을 것으로 기대된다. 원시 알고리즘은 개발자가 다양한 프로토콜과 애플리케이션을 구현할 때 최대한의 유연성을 가질 수 있도록 제공되며, 이들 각각은 원시 알고리즘의 사용을 필요로 하는 고유한 방식으로 구성과 보안 매개변수를 나타낼 수 있다.
KeyFormatrawpkcs8spkijwkJsonWebKey 딕셔너리이다
SubtleCrypto의 메서드 호출에 대한 응답으로
생성된 promise를 resolve하거나 reject하기 위한 태스크를 큐에 넣는 데 사용된다.
SubtleCrypto 메서드 호출에 대한 응답의
순서에 대해, 여러 호출 사이에서도 호출과 다른
태스크 소스의
태스크 사이에서도 어떤 구체적인 요구사항도 두지 않는다.
이 태스크 소스는 암호화 작업이 완료될 때마다 관련 promise를 resolve하거나
reject하기 위해 태스크를 큐에 넣는
데 사용될 뿐이며, 이는
경쟁
상태를 방지하기 위한 것이다.
모든 오류는 반환된 Promise를 reject함으로써 비동기적으로 보고된다. 여기에는 Web IDL 타입 매핑 오류도 포함된다.
encrypt
메서드는 제공된
CryptoKey와 함께 지정된
AlgorithmIdentifier를
사용하여 데이터를 암호화할 새 Promise 객체를 반환한다. 이는
다음과 같이 동작해야 한다.
algorithm과 key를 각각
encrypt()
메서드에 전달된
algorithm 및 key 매개변수로 둔다.
data를
encrypt()
메서드에 전달된 data 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"encrypt"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
key의
[[algorithm]] 내부 슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
key의
[[usages]]
내부 슬롯에 "encrypt"인 항목이 포함되어 있지 않으면,
throw an InvalidAccessError.
ciphertext를 normalizedAlgorithm에 의해 지정된 encrypt 작업을 algorithm 및 key를 사용하고, data를 plaintext로 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 ciphertext를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
decrypt
메서드는 제공된 CryptoKey와 함께 지정된
AlgorithmIdentifier를
사용하여 데이터를 복호화할 새 Promise 객체를 반환한다. 이는
다음과 같이 동작해야 한다.
algorithm과 key를 각각
decrypt()
메서드에 전달된
algorithm 및 key 매개변수로 둔다.
data를
decrypt()
메서드에 전달된 data 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"decrypt"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
key의
[[algorithm]] 내부 슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
key의
[[usages]]
내부 슬롯에 "decrypt"인 항목이 포함되어 있지 않으면,
throw an InvalidAccessError.
plaintext를 normalizedAlgorithm에 의해 지정된 decrypt 작업을 key와 algorithm을 사용하고 data를 ciphertext로 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 plaintext를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
sign 메서드는 제공된
CryptoKey와 함께 지정된
AlgorithmIdentifier를 사용하여 데이터에
서명할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.
algorithm과 key를 각각
sign() 메서드에
전달된 algorithm 및 key 매개변수로 둔다.
data를
sign() 메서드에
전달된 data 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"sign"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
key의
[[algorithm]] 내부 슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
key의
[[usages]]
내부 슬롯에 "sign"인 항목이 포함되어 있지 않으면,
throw an InvalidAccessError.
signature를 normalizedAlgorithm에 의해 지정된 sign 작업을 key와 algorithm을 사용하고 data를 message로 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 signature를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
verify 메서드는 제공된
CryptoKey와 함께 지정된
AlgorithmIdentifier를 사용하여 데이터를
검증할 새 Promise 객체를 반환한다. 이는 다음과 같이 동작해야 한다.
algorithm과 key를 각각
verify()
메서드에 전달된 algorithm 및 key 매개변수로 둔다.
signature를
verify()
메서드에 전달된 signature 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
data를
verify()
메서드에 전달된 data 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"verify"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
key의
[[algorithm]] 내부 슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
key의
[[usages]]
내부 슬롯에 "verify"인 항목이 포함되어 있지 않으면,
throw an InvalidAccessError.
result를 normalizedAlgorithm에 의해 지정된 verify 작업을 key, algorithm 및 signature를 사용하고 data를 message로 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
promise를 result로 resolve한다.
digest 메서드는 지정된
AlgorithmIdentifier를 사용하여
데이터를 다이제스트할 새 Promise 객체를 반환한다.
이는 다음과 같이 동작해야 한다.
algorithm을
digest()
메서드에 전달된 algorithm 매개변수로 둔다.
data를
digest()
메서드에 전달된 data 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"digest"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
digest를 normalizedAlgorithm에 의해 지정된 digest 작업을 algorithm을 사용하고, data를 message로 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 digest를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
호출될 때, generateKey는 다음 단계를 수행해야
MUST 한다.
algorithm, extractable 및 usages를 각각
generateKey()
메서드에 전달된
algorithm, extractable 및 keyUsages
매개변수로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"generateKey"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
result를 normalizedAlgorithm에 의해 지정된 generate key 작업을 algorithm, extractable 및 usages를 사용하여 수행한 결과로 둔다.
CryptoKey 객체인 경우:
result의
[[type]] 내부 슬롯이
"secret"
또는 "private"이고
usages가 비어 있으면, throw a SyntaxError.
CryptoKeyPair 객체인 경우:
result의
privateKey
속성의
[[usages]] 내부
슬롯이 빈 시퀀스이면,
throw a
SyntaxError.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.
promise를 result로 resolve한다.
호출될 때, deriveKey는
다음 단계를 수행해야 MUST 한다.
algorithm, baseKey, derivedKeyType,
extractable 및 usages를 각각
deriveKey()
메서드에 전달된 algorithm,
baseKey, derivedKeyType, extractable 및
keyUsages 매개변수로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"deriveBits"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
normalizedDerivedKeyAlgorithmImport를
alg를 derivedKeyType으로, op를
"importKey"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedDerivedKeyAlgorithmImport로 reject된 Promise를 반환한다.
normalizedDerivedKeyAlgorithmLength를
alg를 derivedKeyType으로, op를
"get key length"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedDerivedKeyAlgorithmLength로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
baseKey의
[[algorithm]] 내부 슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
baseKey의
[[usages]] 내부 슬롯에
"deriveKey"인 항목이 포함되어 있지 않으면,
throw an
InvalidAccessError.
length를 normalizedDerivedKeyAlgorithmLength에 의해 지정된 get key length 알고리즘을 derivedKeyType을 사용하여 수행한 결과로 둔다.
secret을 normalizedAlgorithm에 의해 지정된 derive bits 작업을 key, algorithm 및 length를 사용하여 수행한 결과로 둔다.
result를 normalizedDerivedKeyAlgorithmImport에 의해 지정된
import key 작업을, "raw"를 format으로,
secret을 keyData로,
derivedKeyType을 algorithm으로 사용하고,
extractable과 usages를 사용하여 수행한 결과로 둔다.
result의
[[type]]
내부 슬롯이
"secret" 또는 "private"이고
usages가 비어 있으면, throw a SyntaxError.
result의
[[extractable]] 내부
슬롯을 extractable로 설정한다.
result의
[[usages]] 내부
슬롯을 usages의 정규화된 값으로 설정한다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.
promise를 result로 resolve한다.
호출될 때, deriveBits는
다음 단계를 수행해야 MUST 한다.
algorithm, baseKey 및 length를 각각
deriveBits()
메서드에 전달된
algorithm,
baseKey 및 length
매개변수로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"deriveBits"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
baseKey의
[[algorithm]] 내부
슬롯의
name 속성과 같지 않으면,
throw an InvalidAccessError.
baseKey의
[[usages]] 내부 슬롯에
"deriveBits"인 항목이 포함되어 있지 않으면,
throw an
InvalidAccessError.
bits를 normalizedAlgorithm에 의해 지정된 derive bits 작업을 baseKey, algorithm 및 length를 사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 bits를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
호출될 때, importKey 메서드는 다음 단계를 수행해야
MUST 한다.
format, algorithm, extractable 및
usages를 각각
importKey()
메서드에 전달된 format, algorithm,
extractable 및 keyUsages 매개변수로 둔다.
raw",
"pkcs8", 또는 "spki"와 같은 경우:
importKey()
메서드에 전달된 keyData 매개변수가
JsonWebKey 딕셔너리이면,
throw a
TypeError.
keyData를
importKey()
메서드에 전달된
keyData 매개변수가
보유한
바이트의 복사본을 얻은 결과로 둔다.
jwk"와 같은 경우:
importKey()
메서드에 전달된 keyData 매개변수가
JsonWebKey 딕셔너리가 아니면,
throw a
TypeError.
keyData를
importKey()
메서드에 전달된 keyData 매개변수로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"importKey"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
result를 normalizedAlgorithm에 의해 지정된 import key 작업을
keyData,
algorithm,
format, extractable 및 usages를 사용하여 수행한
결과인 CryptoKey 객체로 둔다.
result의
[[type]]
내부 슬롯이
"secret" 또는 "private"이고
usages가 비어 있으면, throw a SyntaxError.
result의
[[extractable]] 내부
슬롯을 extractable로 설정한다.
result의
[[usages]] 내부
슬롯을 usages의 정규화된 값으로 설정한다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.
promise를 result로 resolve한다.
상호운용성을 위해 "raw" 키 형식 지원이 권장된다.
웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해
테스트 스위트를 참조해야 한다.
호출될 때, exportKey 메서드는 다음 단계를 수행해야
MUST 한다.
format과 key를 각각
exportKey()
메서드에 전달된 format 및
key 매개변수로 둔다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
key의
[[algorithm]] 내부
슬롯의 name 멤버가
export key 작업을 지원하는 등록된 알고리즘을 식별하지 않으면,
throw a NotSupportedError.
key의
[[extractable]] 내부
슬롯이 false이면, throw an InvalidAccessError.
result를 key의
[[algorithm]]
내부 슬롯에 의해 지정된 export key 작업을 key와 format을
사용하여 수행한 결과로 둔다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
promise를 result로 resolve한다.
상호운용성을 위해 "raw" 키 형식 지원이 권장된다.
웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해
테스트 스위트를 참조해야 한다.
호출될 때, wrapKey 메서드는 다음 단계를 수행해야
MUST 한다.
format, key, wrappingKey 및
algorithm을 각각
wrapKey()
메서드에 전달된 format, key,
wrappingKey 및 wrapAlgorithm 매개변수로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"wrapKey"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm을
alg를 algorithm으로, op를
"encrypt"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
wrappingKey의
[[algorithm]] 내부
슬롯의 name 속성과 같지 않으면,
throw an InvalidAccessError.
wrappingKey의
[[usages]] 내부 슬롯에
"wrapKey"인 항목이 포함되어 있지 않으면,
throw an
InvalidAccessError.
key의
[[algorithm]] 내부
슬롯에 의해 식별되는 알고리즘이 export key 작업을 지원하지 않으면,
throw a NotSupportedError.
key의
[[extractable]] 내부
슬롯이 false이면, throw an InvalidAccessError.
exportedKey를 key의
[[algorithm]] 내부
슬롯에 의해 지정된 export key 작업을 key와 format을
사용하여 수행한 결과로 둔다.
일부 알고리즘의 키 래핑 작업은 페이로드 크기에 제약을 둔다. 예를 들어 AES-KW는 페이로드 길이가 8바이트의 배수일 것을 요구하고 RSA-OAEP는 길이에 제한을 둔다. 주어진 키의 직렬화에 유연성을 제공하는 키 형식(예: JWK)의 경우, 구현은 래핑 알고리즘의 제약에 맞게 직렬화를 조정하도록 선택할 수 있다. 이것이 JSON.stringify가 규범적으로 요구되지 않는 이유이다. 그렇지 않으면 구현이 추가 패딩을 도입하는 것을 금지하게 되기 때문이다.
result를 normalizedAlgorithm에 의해 지정된 wrap key 작업을 algorithm을 사용하고, wrappingKey를 key로, bytes를 plaintext로 사용하여 수행한 결과로 둔다.
result를 normalizedAlgorithm에 의해 지정된 encrypt 작업을 algorithm을 사용하고, wrappingKey를 key로, bytes를 plaintext로 사용하여 수행한 결과로 둔다.
NotSupportedError.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 realm 안에서 result를 포함하는
ArrayBuffer를
생성한 결과로 둔다.
promise를 result로 resolve한다.
상호운용성을 위해 "raw" 키 형식 지원이 권장된다.
웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해
테스트 스위트를 참조해야 한다.
호출될 때, unwrapKey 메서드는
다음 단계를 수행해야 MUST 한다.
format, unwrappingKey,
algorithm, unwrappedKeyAlgorithm,
extractable 및 usages를 각각
unwrapKey()
메서드에 전달된
format, unwrappingKey,
unwrapAlgorithm, unwrappedKeyAlgorithm,
extractable 및 keyUsages
매개변수로 둔다.
wrappedKey를
unwrapKey()
메서드에 전달된
wrappedKey 매개변수가
보유한 바이트의 복사본을
얻은 결과로 둔다.
normalizedAlgorithm을
alg를 algorithm으로, op를
"unwrapKey"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm을
alg를 algorithm으로, op를
"decrypt"로 설정하여
알고리즘을
정규화한 결과로 둔다.
오류가 발생했다면, normalizedAlgorithm으로 reject된 Promise를 반환한다.
normalizedKeyAlgorithm을
alg를 unwrappedKeyAlgorithm으로, op를
"importKey"로 설정하여 알고리즘을 정규화한 결과로 둔다.
오류가 발생했다면, normalizedKeyAlgorithm으로 reject된 Promise를 반환한다.
promise를 새 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차가 오류를 throw하라고 하면, realm의 전역 객체가 주어진 상태에서 crypto 태스크 소스에 전역 태스크를 큐에 넣어 반환된 오류로 promise를 reject하고, 그런 다음 알고리즘을 종료한다.
normalizedAlgorithm의
name 멤버가
unwrappingKey의
[[algorithm]] 내부
슬롯의 name 속성과 같지 않으면,
throw an InvalidAccessError.
unwrappingKey의
[[usages]] 내부 슬롯에
"unwrapKey"인 항목이 포함되어 있지 않으면,
throw an InvalidAccessError.
NotSupportedError.
result를 normalizedKeyAlgorithm에 의해 지정된 import key 작업을 unwrappedKeyAlgorithm을 algorithm으로, format, usages 및 extractable을 사용하고, key를 keyData로 사용하여 수행한 결과로 둔다.
result의
[[type]]
내부 슬롯이
"secret" 또는 "private"이고
usages가 비어 있으면, throw a SyntaxError.
result의
[[extractable]] 내부
슬롯을 extractable로 설정한다.
result의
[[usages]] 내부
슬롯을 usages의 정규화된 값으로 설정한다.
realm의 전역 객체가 주어진 상태에서, 나머지 단계를 수행하기 위해 전역 태스크를 큐에 넣는다. 이 태스크는 crypto 태스크 소스에 넣는다.
result를 [WebIDL]에 정의된 대로, realm 안의 ECMAScript Object로 변환한 결과로 둔다.
promise를 result로 resolve한다.
상호운용성을 위해 "raw" 키 형식 지원이 권장된다.
웹 개발자는 다른 키 형식에 대한 구현 지원에 관한 자세한 정보를 위해
테스트 스위트를 참조해야 한다.
SubtleCrypto 인터페이스의 메서드는
ECMAScript
[ECMA-262] 또는
DOMException에 정의된
미리 정의된 예외로 반환된 promise를 reject함으로써
오류를 반환한다. 다음의
미리 정의된 예외가
사용된다: TypeError.
[DOM]의
다음 DOMException 타입이
사용된다:
| 이름 | 설명 |
|---|---|
NotSupportedError
|
알고리즘이 지원되지 않는다 |
SyntaxError |
필수 매개변수가 누락되었거나 범위를 벗어났다 |
InvalidAccessError
|
요청된 작업이 제공된 키에 대해 유효하지 않다 |
DataError |
작업에 제공된 데이터가 요구사항을 충족하지 않는다 |
OperationError
|
작업별 이유로 작업이 실패했다 |
이 명세가 오류를 throw하라고 말할 때, 사용자 에이전트는 [WebIDL]에 설명된 대로 오류를 throw해야 한다. 이것이 하위 알고리즘에서 발생하면, 예외를 잡는 절차를 명시적으로 설명하는 알고리즘에 도달할 때까지 해당 하위 알고리즘과 모든 상위 알고리즘의 실행이 종료된다. throw된 오류 객체는 관련 realm of this와 연결되어야 한다.
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절에 정의되어 있다.
WebIDLtypedef Uint8Array BigInteger;
BigInteger typedef는 임의 크기의 부호 없는
정수를
빅 엔디언 순서로 보유하는 Uint8Array이다.
API에서 읽은 값은 최소 typed array 길이를 가져야 SHALL 한다
(즉, 앞쪽 0비트가 최대 7개이며,
길이가 8비트여야 하는 값 0은 제외한다). API는 빈 배열을 포함하여,
앞쪽 0비트가 임의 개수인 값을 받아들여야 SHALL 하며, 빈 배열은 0을 나타낸다.
WebIDLdictionary CryptoKeyPair {
CryptoKey publicKey;
CryptoKey privateKey;
};
CryptoKeyPair 딕셔너리는 공개
(publicKey) 키와 비공개
(privateKey) 키 둘 모두로 구성된 비대칭 키 쌍을 나타낸다.
이 절은 비규범적이다.
이 명세는 SubtleCrypto 인터페이스를 통해 암호화 작업을
수행하기 위한 공통 인터페이스를 제공하는 것 외에도, 작성자가 사용하고자 할 수 있고
User Agent가 구현하기로 선택할 수 있는 다양한 알고리즘에 대한 설명도 제공한다.
여기에는 널리 배포된 대칭 및 비대칭 알고리즘, 키 파생 메커니즘, 그리고 키를
래핑하고 언래핑하기 위한 메서드의 선택이 포함된다. 또한 이 명세는 추가 명세가
추가 암호화 알고리즘을 도입할 수 있도록 하는 프로세스를 정의한다.
Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은 고유한 이름을 가져야 MUST 하며, 이를 그 알고리즘의 인식된 알고리즘 이름이라고 한다. 이 이름은 다른 어떤 명세도 Web Cryptography API와 함께 사용하기 위해 동일한 대소문자 구분 없는 문자열을 정의하지 않도록 해야 한다.
Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은
원하는 암호화 작업을 수행하기 위해 SubtleCrypto
인터페이스가 호출할 하위 알고리즘들의 집합인
지원되는 작업 목록을 가진다.
이 명세는 다음 작업을 사용한다.
주어진 알고리즘 명세가 특정 작업을 지원되는 것으로 나열하지 않거나, 명시적으로 어떤 작업을 지원되지 않는 것으로 나열하면, User Agent는 그 하위 알고리즘의 호출이 NotSupportedError를 throw한 것처럼 동작해야 MUST 한다.
Web Cryptography API와 함께 사용하도록 정의된 모든 암호화 알고리즘은 지원되는 작업마다 알고리즘 정규화에 사용할 IDL 타입과, 하위 알고리즘 반환값의 IDL 타입 또는 타입들을 정의해야 MUST 한다.
이 명세 안의 모든 암호화 알고리즘 정의는 다음 명세 관례를 따른다. "Registration"이라는 제목의 절은 인식된 알고리즘 이름을 포함한다. 또한 여기에는 각 지원되는 작업을 행으로 나열하는 표가 포함되며, 각 행은 Operation 열로 식별된다. 주어진 행의 Parameters 열의 내용은 그 작업에 대해 알고리즘 정규화에 사용할 IDL 타입을 포함하고, 그 행의 Result 열의 내용은 지원되는 작업을 수행한 결과가 되는 IDL 타입을 나타낸다.
적합한 User Agent가 어떤 알고리즘을 구현한다면, 모든 지원되는 작업을 구현해야 MUST 하며, 지정된 IDL 타입을 반환해야 MUST 한다.
또한 초기화 시, 적합한 User Agent는 지원되는 각 작업에 대해 알고리즘 정의 단계를 수행하여, 표시된 대로 그 IDL 매개변수 타입을 등록해야 한다.
달리 명시되지 않는 한, 이 명세에서 정의한 작업이 생성한 객체는 관련 realm of this와 연결되어야 한다.
이 절은 비규범적이다.
AlgorithmIdentifier
typedef는 알고리즘을 DOMString 또는 객체로
지정할 수 있게 한다. DOMString을 사용하는 것은
매개변수가 없는 알고리즘(예: SHA-1)을 작성자가 간단히 표기할 수 있게 하기 위한 것이다.
객체를 사용하는 것은 객체와 관련된 모든 매개변수를 포함하는
Algorithm(또는 적절한
서브클래스)를 지정할 수 있게 하기 위한 것이다.
이 때문에 AlgorithmIdentifier를 이 API에서
사용할 수 있는 적절한 딕셔너리로 변환하는 알고리즘을 정의할 필요가 있다.
이 알고리즘은 새로운 암호화 알고리즘을 추가할 수 있도록 확장 가능해야 하며,
호출 스크립트로 제어가 반환되기 전에 Web IDL 타입 매핑이 일어날 수 있도록
일관적이어야 한다. 그렇지 않으면 매개변수나 스크립트 환경의 변이가
잠재적으로 허용될 수 있다.
이 명세는 내부 객체인 supportedAlgorithms를 사용한다. 이 내부 객체는 애플리케이션에 노출되지 않는다.
이 값은 애플리케이션에 노출되지 않으므로, 정확한 타입은 지정되지 않는다. 다만 키 비교가 대소문자를 구분하는 방식으로 수행되는 키/값 쌍의 연관 컨테이너처럼 동작해야 한다는 것만 요구된다.
이 내부 객체의 초기 내용은 다음과 같다.
지원되는 작업 목록의 각 값
v에 대해, 내부 객체 supportedAlgorithms의
v 키를 새 연관 컨테이너로 설정한다.
알고리즘 정의 알고리즘은 특정 알고리즘에 대해 사용자 에이전트가 인수를 어떻게 정규화해야 하는지를 명세 작성자가 나타내기 위해 사용된다. 그 입력은 DOMString으로 표현되는 알고리즘 이름 alg, DOMString으로 표현되는 작업 이름 op, 그리고 원하는 IDL 딕셔너리 타입 type이다. 알고리즘은 다음과 같이 동작한다.
supportedAlgorithms의
op 키에 저장된 연관 컨테이너로 둔다.
알고리즘
정규화 알고리즘은 Web IDL 변환이 일어난 뒤 입력을
대상 IDL 딕셔너리 타입으로 강제 변환하는 프로세스를 정의한다.
이 알고리즘은 향후 명세가 추가 알고리즘을 정의할 수 있도록 확장 가능하고,
Promise와 함께 사용하기에 안전하도록 설계되어 있다. 그 입력은 작업 이름
op와 AlgorithmIdentifier
alg이다.
그 출력은 IDL 딕셔너리 타입 또는 오류이다. 이는 다음과 같이 동작한다.
alg를, name 속성이
alg인 새 Algorithm
딕셔너리로 설정하고, op를 op로 설정하여
알고리즘
정규화 알고리즘을 실행한 결과를 반환한다.
supportedAlgorithms의
op 키에 저장된 연관 컨테이너로 둔다.
Algorithm으로 변환한
결과로 둔다.
name
속성 값으로 둔다.
algName을 일치하는 키의 값으로 설정한다.
desiredType을 registeredAlgorithms의 algName에 저장된 IDL 딕셔너리 타입으로 둔다.
NotSupportedError를 반환하고 이 알고리즘을 종료한다.
name 속성을
algName으로 설정한다.
dictionaries 안의 각 딕셔너리 dictionary에 대해:
dictionary에 선언된 각 딕셔너리 멤버 member에 대해, 순서대로:
BufferSource이고
존재하는 경우:
HashAlgorithmIdentifier인
경우:
alg를 idlValue로, op를
"digest"로 설정하여
알고리즘을
정규화한 결과로 설정한다.
AlgorithmIdentifier인
경우:
alg를 idlValue로 설정하고,
op를 algName으로 식별되는 알고리즘을
정의한 명세가 정의한 작업으로 설정하여
알고리즘을
정규화한 결과로 설정한다.
이 절은 비규범적이다.
개발자를 위한 상호운용성을 촉진하기 위해, 이 명세는 권장 알고리즘 목록을 포함한다. 이들은 작성 시점에 실제로 가장 널리 사용되는 알고리즘으로 간주되며, 따라서 이 명세의 초기 구현을 위한 좋은 출발점을 제공한다. 권장 알고리즘은 다음과 같다.
이 절은 비규범적이다.
아래 표는 이 명세에서 설명하는 알고리즘의 개요와, 해당 알고리즘을 사용할 수 있는 SubtleCrypto 메서드 집합을 포함한다. 알고리즘이 어떤 메서드와 함께 사용되려면, 그 메서드의 절차에서 정의된 대응하는 작업 또는 작업들이 알고리즘 명세에 정의되어 있어야 한다. 메서드에서 기반 작업으로의 이 매핑은 일대일이 아니라는 점에 유의하라.
encrypt 메서드는
encrypt 작업을 필요로 한다.
decrypt 메서드는
decrypt 작업을 필요로 한다.
sign 메서드는 sign
작업을 필요로 한다.
verify 메서드는 verify
작업을 필요로 한다.
generateKey 메서드는
generateKey 작업을 필요로 한다.
importKey 메서드는
importKey 작업을 필요로 한다.
exportKey 메서드는
exportKey 작업을 필요로 한다.
deriveKey 메서드는
키 파생 알고리즘에 대해 deriveBits 작업을 필요로 하고, 파생된 키 알고리즘에 대해
get key length 및 importKey 작업을
필요로 한다.
deriveBits 메서드는
키 파생 알고리즘에 대해
deriveBits 작업을 필요로 한다.
digest 메서드는 digest
작업을 필요로 한다.
wrapKey 메서드는 래핑 알고리즘에 대해
encrypt 또는 wrapKey 작업 중 하나를 필요로 하고, 래핑되는 키 알고리즘에 대해 exportKey 작업을
필요로 한다.
unwrapKey 메서드는
언래핑 알고리즘에 대해
decrypt 또는 unwrapKey 작업 중 하나를 필요로 하고, 언래핑되는 키 알고리즘에 대해 importKey 작업을
필요로 한다.
애플리케이션 개발자와 스크립트 작성자는 이 표를 특정 알고리즘 사용에 대한 권장사항으로 해석해서는 안 된다. 대신 이 표는 단순히 어떤 메서드가 지원되는지를 문서화한다. 작성자는 특정 알고리즘을 사용할 때 발생할 수 있는 위험과 우려를 더 잘 이해하기 위해 이 문서의 작성자를 위한 보안 고려사항 절을 참조해야 한다.
| 알고리즘 이름 | 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 | ✔ | ✔ | ✔ |
이 절은 비규범적이다.
"RSASSA-PKCS1-v1_5" 알고리즘 식별자는
[RFC3447]에
지정된 RSASSA-PKCS1-v1_5 알고리즘과 이 명세에 정의된 SHA 해시 함수를 사용하여
서명과 검증을 수행하는 데 사용된다.
다른 명세는 RSASSA-PKCS1-v1_5와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘의 digest 작업과 RSASSA-PKCS1-v1_5를 위한 키 가져오기 단계 및 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"RSASSA-PKCS1-v1_5"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| sign | 없음 | 바이트 시퀀스 |
| verify | 없음 | boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 없음 | object |
WebIDLdictionary RsaKeyGenParams : Algorithm {
required [EnforceRange] unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLength 멤버는 RSA 모듈러스의
비트 단위 길이를 포함한다.
publicExponent 멤버는 RSA 공개
지수를 포함한다.
WebIDLdictionary RsaHashedKeyGenParams : RsaKeyGenParams {
required HashAlgorithmIdentifier hash;
};
hash 멤버는 사용할 해시 알고리즘을
나타낸다.
WebIDLdictionary RsaKeyAlgorithm : KeyAlgorithm {
required unsigned long modulusLength;
required BigInteger publicExponent;
};
modulusLength 멤버는 RSA 모듈러스의
비트 단위 길이를 포함한다.
publicExponent 멤버는 RSA 공개
지수를 포함한다.
WebIDLdictionary RsaHashedKeyAlgorithm : RsaKeyAlgorithm {
required KeyAlgorithm hash;
};
hash 멤버는 이 키와 함께 사용되는 해시 알고리즘을
설명한다.
WebIDLdictionary RsaHashedImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hash 멤버는 사용할 해시 알고리즘을
설명한다.
key의
[[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
key의 [[handle]] 내부 슬롯이
나타내는 키를 서명자의 비공개 키로, message를
M으로 사용하고, key의
[[algorithm]] 내부
슬롯의 hash 속성에 지정된
해시 함수를 EMSA-PKCS1-v1_5 인코딩 메서드의 Hash 옵션으로 사용하여,
[RFC3447]
8.2절에 정의된 서명 생성 작업을 수행한다.
작업을 수행한 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
signature를 작업 수행의 결과인 값 S로 둔다.
signature를 반환한다.
key의
[[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
key의
[[handle]]
내부 슬롯이 나타내는 키를 서명자의 RSA 공개 키로, message를
M으로, signature를 S로 사용하고,
key의 [[algorithm]] 내부
슬롯의 hash 속성에 지정된
해시 함수를 EMSA-PKCS1-v1_5 인코딩 메서드의 Hash 옵션으로 사용하여,
[RFC3447]
8.2절에 정의된 서명 검증 작업을 수행한다.
result를 작업의 결과가 "valid signature"이면 값이 true이고, 그렇지 않으면 false인 boolean으로 둔다.
result를 반환한다.
usages가 "sign" 또는 "verify"가 아닌 항목을
포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의
modulusLength
속성과 같은 RSA 모듈러스 길이 및
normalizedAlgorithm의
publicExponent
속성과 같은 RSA 공개 지수로,
[RFC3447]에
정의된 대로 RSA 키 쌍을 생성한다.
키 쌍의 생성이 실패하면,
throw하여
OperationError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm
딕셔너리로 둔다.
algorithm의 name 속성을
"RSASSA-PKCS1-v1_5"로 설정한다.
algorithm의
modulusLength
속성을 normalizedAlgorithm의
modulusLength
속성과 같게 설정한다.
algorithm의
publicExponent
속성을 normalizedAlgorithm의
publicExponent
속성과 같게 설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새
CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
usages와 [ "verify" ]의
사용법 교집합으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새
CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "sign" ]의
사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가 "verify"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
publicKey를
ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
spki의 subjectPublicKeyInfo 필드로,
structure는 [RFC3447]
A.1.1절에 지정된 RSAPublicKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, publicKey가
[RFC3447]에
따른 유효한 공개 키가 아님을 판정할 수 있다면,
throw하여
DataError를
발생시킨다.
key를 publicKey로 식별되는 RSA 공개 키를
나타내는 새 CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
pkcs8"인 경우:
usages가 "sign"이 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
rsaPrivateKey를
ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC3447]
A.1.2절에 지정된 RSAPrivateKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, rsaPrivateKey가
[RFC3447]에
따른 유효한 RSA 비공개 키가 아니면,
throw하여
DataError를
발생시킨다.
key를 rsaPrivateKey로 식별되는 RSA 비공개 키를
나타내는 새 CryptoKey로 둔다.
jwk"인 경우:JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk의 d
필드가 존재하고
usages가 "sign"이 아닌 항목을 포함하거나, 또는
jwk의 d
필드가 존재하지 않고
usages가 "verify"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
jwk의 kty 필드가
"RSA"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고, jwk의 use 필드가
존재하며 "sig"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의
요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두
포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
hash를 초기값이 undefined인 문자열로 둔다.
alg 필드가
존재하지 않는 경우:
hash를 undefined로 둔다.
alg 필드가
문자열 "RS1"과 같은 경우:
hash를 문자열 "SHA-1"로 둔다.
alg 필드가
문자열 "RS256"과 같은 경우:
hash를 문자열 "SHA-256"로 둔다.
alg 필드가
문자열 "RS384"과 같은 경우:
hash를 문자열 "SHA-384"로 둔다.
alg 필드가
문자열 "RS512"와 같은 경우:
hash를 문자열 "SHA-512"로 둔다.
format과 jwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
d 필드가
존재하는 경우:
jwk가 JSON Web Algorithms [JWA]
6.3.1절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.
publicKey가
[RFC3447]에
따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면,
throw하여
DataError를
발생시킨다.
key를 publicKey를 나타내는 새
CryptoKey로
둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
NotSupportedError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm
딕셔너리로 둔다.
algorithm의 name 속성을
"RSASSA-PKCS1-v1_5"로 설정한다
algorithm의 modulusLength
속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.
algorithm의 publicExponent 속성을 RSA 공개 지수의 BigInteger 표현으로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key를 내보낼 키로 둔다.
key의 [[handle]]
내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우
key의 [[type]]
내부 슬롯이 "public"이 아니면,
throw하여 InvalidAccessError를
발생시킨다.
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 공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
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 비공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을 문자열
"RSA"로 설정한다.
hash를 key의
[[algorithm]]
내부 슬롯의 hash
속성의 name
속성으로 둔다.
SHA-1"인 경우:
jwk의 alg 속성을 문자열
"RS1"로 설정한다.
SHA-256"인 경우:
jwk의 alg 속성을 문자열
"RS256"로 설정한다.
SHA-384"인 경우:
jwk의 alg 속성을 문자열
"RS384"로 설정한다.
SHA-512"인 경우:
jwk의 alg 속성을 문자열
"RS512"로 설정한다.
format과 key를 전달하고 alg를 얻어, 다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다.
오류가 발생했거나
적용 가능한
명세가 없으면,
throw하여
NotSupportedError를
발생시킨다.
jwk의 alg 속성을
alg로 설정한다.
jwk의 n
및 e 속성을
JSON Web Algorithms [JWA]
6.3.1절의
대응하는 정의에 따라 설정한다.
jwk의 key_ops 속성을 key의 usages 속성으로 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"RSA-PSS" 알고리즘 식별자는
[RFC3447]에
지정된 RSASSA-PSS 알고리즘과 이 명세에 정의된 SHA 해시 함수,
그리고 마스크 생성 공식 MGF1을 사용하여
서명과 검증을 수행하는 데 사용된다.
다른 명세는 RSASSA-PSS와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘의 digest 작업과 RSASSA-PSS를 위한 키 가져오기 단계 및 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"RSA-PSS"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| sign | RsaPssParams |
바이트 시퀀스 |
| verify | RsaPssParams |
boolean |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 없음 | object |
WebIDLdictionary RsaPssParams : Algorithm {
required [EnforceRange] unsigned long saltLength;
};
saltLength 멤버는 원하는 랜덤 salt의 길이를
바이트 단위로 나타낸다.
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
key의 [[handle]] 내부 슬롯이
나타내는 키를 서명자의 비공개 키 K로, message를 서명할 메시지
M으로 사용하고, key의
[[algorithm]] 내부
슬롯의 hash 속성에 지정된
해시 함수를 Hash 옵션으로, [RFC3447]
B.2.1절에 정의된 MGF1을 MGF 옵션으로,
normalizedAlgorithm의 saltLength 멤버를
EMSA-PSS-ENCODE 작업의 salt 길이 옵션으로 사용하여,
[RFC3447]
8.1절에 정의된 서명 생성 작업을 수행한다.
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
signature를 작업 수행 결과인 서명 S로 둔다.
signature를 반환한다.
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
key의
[[handle]] 내부 슬롯이
나타내는 키를 서명자의 RSA 공개 키로, message를
M으로, signature를 S로 사용하고,
key의 [[algorithm]] 내부
슬롯의 hash 속성에 지정된
해시 함수를 Hash 옵션으로, [RFC3447]
B.2.1절에 정의된 MGF1을 MGF 옵션으로,
normalizedAlgorithm의 saltLength 멤버를
EMSA-PSS-VERIFY 작업의 salt 길이 옵션으로 사용하여,
[RFC3447]
8.1절에 정의된 서명 검증 작업을 수행한다.
result를 작업의 결과가 "valid signature"이면 값이 true이고, 그렇지 않으면 false인 boolean으로 둔다.
usages가 "sign" 또는 "verify"가 아닌 항목을
포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의
modulusLength 멤버와
같은 RSA 모듈러스 길이 및
normalizedAlgorithm의
publicExponent 멤버와
같은 RSA 공개 지수로,
[RFC3447]에
정의된 대로 RSA 키 쌍을 생성한다.
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm
딕셔너리로 둔다.
algorithm의 name 속성을
"RSA-PSS"로 설정한다.
algorithm의
modulusLength
속성을 normalizedAlgorithm의
modulusLength
멤버와 같게 설정한다.
algorithm의
publicExponent
속성을 normalizedAlgorithm의
publicExponent
멤버와 같게 설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
usages와 [ "verify" ]의 사용법 교집합으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "sign" ]의 사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가 "verify"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
publicKey를 ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
spki의 subjectPublicKeyInfo 필드로,
structure는 [RFC3447]
A.1.1절에 지정된 RSAPublicKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, publicKey가
[RFC3447]에
따른 유효한 공개 키가 아니라고 판정할 수 있다면,
throw하여
DataError를
발생시킨다.
key를 publicKey로 식별되는 RSA 공개 키를
나타내는 새 CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
pkcs8"인 경우:
usages가 "sign"이 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
rsaPrivateKey를 ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC3447]
A.1.2절에 지정된 RSAPrivateKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, rsaPrivateKey가
[RFC3447]에
따른 유효한 RSA 비공개 키가 아니면,
throw하여
DataError를
발생시킨다.
key를 rsaPrivateKey로 식별되는 RSA 비공개 키를
나타내는 새 CryptoKey로 둔다.
jwk"인 경우:JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk의 d
필드가 존재하고
usages가 "sign"이 아닌 항목을 포함하거나, 또는
jwk의 d
필드가
존재하지 않고
usages가 "verify"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
jwk의 kty 필드가
"RSA"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고, jwk의 use 필드가
존재하며 "sig"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의
요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두
포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
alg 필드가
존재하지 않는 경우:
hash를 undefined로 둔다.
alg 필드가
문자열 "PS1"과 같은 경우:
hash를 문자열 "SHA-1"로 둔다.
alg 필드가
문자열 "PS256"과 같은 경우:
hash를 문자열 "SHA-256"로 둔다.
alg 필드가
문자열 "PS384"과 같은 경우:
hash를 문자열 "SHA-384"로 둔다.
alg 필드가
문자열 "PS512"와 같은 경우:
hash를 문자열 "SHA-512"로 둔다.
format과 jwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
d 필드가
존재하는 경우:
jwk가 JSON Web Algorithms [JWA]
6.3.1절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.
publicKey가
[RFC3447]에
따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면,
throw하여
DataError를
발생시킨다.
key를 publicKey를 나타내는 새 CryptoKey로
둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
NotSupportedError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm
딕셔너리로 둔다.
algorithm의 name 속성을
"RSA-PSS"로 설정한다
algorithm의 modulusLength
속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.
algorithm의 publicExponent
속성을 RSA 공개 지수의 BigInteger
표현으로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다
key를 반환한다.
key를 내보낼 키로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우
key의 [[type]]
내부 슬롯이 "public"이 아니면,
throw하여 InvalidAccessError를
발생시킨다.
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 공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
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 비공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey 딕셔너리로
둔다.
jwk의 kty 속성을 문자열
"RSA"로 설정한다.
hash를 key의
[[algorithm]]
내부 슬롯의 hash
속성의 name
속성으로 둔다.
SHA-1"인 경우:
jwk의 alg 속성을 문자열
"PS1"로 설정한다.
SHA-256"인 경우:
jwk의 alg 속성을 문자열
"PS256"로 설정한다.
SHA-384"인 경우:
jwk의 alg 속성을 문자열
"PS384"로 설정한다.
SHA-512"인 경우:
jwk의 alg 속성을 문자열
"PS512"로 설정한다.
format과 key의
[[algorithm]]
내부 슬롯의
hash
속성을 전달하고 alg를 얻어,
다른 적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
jwk의 alg 속성을
alg로 설정한다.
jwk의 n
및 e 속성을
JSON Web Algorithms [JWA]
6.3.1절의
대응하는 정의에 따라 설정한다.
jwk의 key_ops 속성을 key의
usages 속성으로
설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로
설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"RSA-OAEP" 알고리즘 식별자는
[RFC3447]에
지정된 RSAES-OAEP 알고리즘에 따라 암호화와 복호화를 수행하는 데 사용되며,
이 명세에 정의된 SHA 해시 함수와 마스크
생성 함수 MGF1을 사용한다.
다른 명세는 RSAES-OAEP와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업과 RSAES-OAEP를 위한 키 가져오기 단계 및 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"RSA-OAEP"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| encrypt | RsaOaepParams |
바이트 시퀀스 |
| decrypt | RsaOaepParams |
바이트 시퀀스 |
| generateKey | RsaHashedKeyGenParams |
CryptoKeyPair |
| importKey | RsaHashedImportParams |
CryptoKey |
| exportKey | 없음 | object |
WebIDLdictionary RsaOaepParams : Algorithm {
BufferSource label;
};
label 멤버는 메시지와 연결할 선택적인 label/application
데이터를 나타낸다.
key의 [[type]]
내부 슬롯이 "public"이 아니면,
throw하여
InvalidAccessError를
발생시킨다.
label을
normalizedAlgorithm의 label 멤버로
두거나, normalizedAlgorithm의
label 멤버가 존재하지 않으면
빈 바이트 시퀀스로 둔다.
key가 나타내는 키를 수신자의 RSA 공개 키로, plaintext를
암호화할 메시지 M으로, label을 레이블 L로 사용하고,
key의
[[algorithm]] 내부
슬롯의 hash
속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447]
B.2.1절에 정의된 MGF1을 MGF 옵션으로 사용하여,
[RFC3447]
7.1절에 정의된 암호화 작업을 수행한다.
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
ciphertext를 작업 수행 결과인 값 C로 둔다.
ciphertext를 반환한다.
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여
InvalidAccessError를
발생시킨다.
label을
normalizedAlgorithm의 label 멤버로
두거나, normalizedAlgorithm의
label 멤버가 존재하지 않으면
빈 바이트 시퀀스로 둔다.
key가 나타내는 키를 수신자의 RSA 비공개 키로, ciphertext를
복호화할 암호문 C로, label을 레이블 L로 사용하고,
key의
[[algorithm]] 내부
슬롯의 hash
속성에 지정된 해시 함수를 Hash 옵션으로, [RFC3447]
B.2.1절에 정의된 MGF1을 MGF 옵션으로 사용하여,
[RFC3447]
7.1절에 정의된 복호화 작업을 수행한다.
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
plaintext를 작업 수행 결과인 값 M으로 둔다.
plaintext를 반환한다.
usages가 "encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의
modulusLength 멤버와
같은 RSA 모듈러스 길이 및
normalizedAlgorithm의
publicExponent 멤버와
같은 RSA 공개 지수로,
[RFC3447]에
정의된 대로 RSA 키 쌍을 생성한다.
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm
객체로 둔다.
algorithm의 name 속성을
"RSA-OAEP"로 설정한다.
algorithm의
modulusLength
속성을 normalizedAlgorithm의
modulusLength
멤버와 같게 설정한다.
algorithm의
publicExponent
속성을 normalizedAlgorithm의
publicExponent
멤버와 같게 설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
usages와 [ "encrypt", "wrapKey" ]의
사용법 교집합으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "decrypt", "unwrapKey" ]의
사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가 "encrypt" 또는
"wrapKey"가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
publicKey를 ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
spki의 subjectPublicKeyInfo 필드로,
structure는 [RFC3447]
A.1.1절에 지정된 RSAPublicKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, publicKey가
[RFC3447]에
따른 유효한 공개 키가 아니라고 판정할 수 있다면,
throw하여
DataError를
발생시킨다.
key를 publicKey로 식별되는 RSA 공개 키를
나타내는 새 CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
pkcs8"인 경우:
usages가 "decrypt" 또는 "unwrapKey"가
아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC3447]에
정의된 rsaEncryption object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
rsaPrivateKey를 ASN.1
구조 파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC3447]
A.1.2절에 지정된 RSAPrivateKey 구조로,
exactData는 true로 설정한다.
파싱하는 동안 오류가 발생했거나, rsaPrivateKey가
[RFC3447]에
따른 유효한 RSA 비공개 키가 아니면,
throw하여
DataError를
발생시킨다.
key를 rsaPrivateKey로 식별되는 RSA 비공개 키를
나타내는 새 CryptoKey로 둔다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk의 d
필드가 존재하고
usages가 "decrypt" 또는 "unwrapKey"가
아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
jwk의 d
필드가 존재하지 않고
usages가 "encrypt" 또는 "wrapKey"가
아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
jwk의 kty 필드가
"RSA"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고, jwk의 use 필드가
존재하며 "enc"와 대소문자를 구분하는 문자열 일치가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의
요구사항에 따라 유효하지 않거나 지정된 usages 값을 모두
포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
alg 필드가 존재하지 않는 경우:alg 필드가
"RSA-OAEP"와 같은 경우:
SHA-1"로 둔다.alg 필드가
"RSA-OAEP-256"과 같은 경우:
SHA-256"로 둔다.alg 필드가
"RSA-OAEP-384"와 같은 경우:
SHA-384"로 둔다.alg 필드가
"RSA-OAEP-512"와 같은 경우:
SHA-512"로 둔다.format과 jwk를 전달하고 hash를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
d 필드가
존재하는 경우:
jwk가 JSON Web Algorithms [JWA]
6.3.1절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
publicKey가 JSON Web Algorithms [JWA] 6.3.1절에 따라 jwk를 해석하여 식별된 RSA 공개 키를 나타내도록 둔다.
publicKey가
[RFC3447]에
따른 유효한 RSA 공개 키가 아니라고 판정할 수 있으면,
throw하여
DataError를
발생시킨다.
key를 publicKey를 나타내는 새 CryptoKey로
둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
NotSupportedError를
발생시킨다.
algorithm을 새
RsaHashedKeyAlgorithm로 둔다.
algorithm의 name 속성을
"RSA-OAEP"로 설정한다
algorithm의 modulusLength
속성을 RSA 공개 모듈러스의 비트 단위 길이로 설정한다.
algorithm의 publicExponent
속성을 RSA 공개 지수의 BigInteger
표현으로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다
key를 반환한다.
key를 내보낼 키로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
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 공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를
발생시킨다.
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 비공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을 문자열
"RSA"로 설정한다.
hash를 key의
[[algorithm]]
내부 슬롯의 hash
속성의 name
속성으로 둔다.
SHA-1"인 경우:
jwk의 alg 속성을 문자열
"RSA-OAEP"로 설정한다.
SHA-256"인 경우:
jwk의 alg 속성을 문자열
"RSA-OAEP-256"로 설정한다.
SHA-384"인 경우:
jwk의 alg 속성을 문자열
"RSA-OAEP-384"로 설정한다.
SHA-512"인 경우:
jwk의 alg 속성을 문자열
"RSA-OAEP-512"로 설정한다.
format과 key의
[[algorithm]]
내부 슬롯의
hash
속성을 전달하고 alg를 얻어,
다른 적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
jwk의 alg 속성을
alg로 설정한다.
jwk의 n
및 e 속성을
JSON Web Algorithms [JWA]
6.3.1절의
대응하는 정의에 따라 설정한다.
jwk의 key_ops 속성을 key의
usages 속성으로
설정한다.
jwk의 ext 속성을 key의
[[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"ECDSA" 알고리즘 식별자는
[RFC6090]에 지정된
ECDSA 알고리즘과, 이 명세에서 정의된 SHA
해시 함수 및 타원
곡선을 사용하여 서명과 검증을 수행하는 데 사용된다.
다른 명세는 ECDSA와 함께 추가 타원 곡선과 해시 알고리즘의 사용을 지정할 수 있다. ECDSA와 함께 사용할 추가 해시 알고리즘을 지정하려면, 명세는 digest 작업을 지원하는 등록된 알고리즘을 정의해야 한다. 추가 타원 곡선을 지정하려면 명세는 곡선 이름, ECDSA 서명 단계, ECDSA 검증 단계, ECDSA 생성 단계, ECDSA 키 가져오기 단계 및 ECDSA 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"ECDSA"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| sign | EcdsaParams |
바이트 시퀀스 |
| verify | EcdsaParams |
boolean |
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | 없음 | object |
WebIDLdictionary EcdsaParams : Algorithm {
required HashAlgorithmIdentifier hash;
};
hash 멤버는 사용할 해시 알고리즘을 나타낸다.
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 멤버는 명명된
곡선을 나타낸다.
WebIDLdictionary EcKeyAlgorithm : KeyAlgorithm {
required NamedCurve namedCurve;
};
namedCurve 멤버는 키가 사용하는 명명된 곡선을
나타낸다.
WebIDLdictionary EcKeyImportParams : Algorithm {
required NamedCurve namedCurve;
};
namedCurve 멤버는 명명된 곡선을 나타낸다.
key의
[[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
hashAlgorithm을 normalizedAlgorithm의 hash
멤버로 둔다.
M을 message를 사용하여 hashAlgorithm이 지정한 digest 작업을 수행한 결과로 둔다.
d를 key와 연결된 ECDSA 비공개 키로 둔다.
params를 key와 연결된 EC 도메인 매개변수로 둔다.
[[algorithm]] 내부
슬롯의
namedCurve 속성이
"P-256", "P-384" 또는 "P-521"인 경우:
[RFC6090] 5.4절에 지정된 대로 ECDSA 서명 프로세스를 수행한다. 이때 M은 메시지로, params는 EC 도메인 매개변수로 사용하고, d는 비공개 키로 사용한다.
r과 s를 ECDSA 서명 프로세스를 수행한 결과로 나온 정수 쌍으로 둔다.
result를 빈 바이트 시퀀스로 둔다.
n을 n * 8이 params로 식별되는 타원 곡선의 기준점 차수에 대한 밑이 2인 로그보다 큰 가장 작은 정수로 둔다.
r을 길이가 n인 바이트 시퀀스로 변환하고 이를 result에 추가한다.
s를 길이가 n인 바이트 시퀀스로 변환하고 이를 result에 추가한다.
[[algorithm]] 내부
슬롯의
namedCurve 속성이
적용
가능한 명세에 지정된 값인 경우:
그 명세에 지정된 ECDSA 서명 단계를 수행한다. 이때 M, params 및 d를 전달하고 result를 결과로 얻는다.
result를 반환한다.
key의
[[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
hashAlgorithm을 normalizedAlgorithm의 hash
멤버로
둔다.
M을 message를 사용하여 hashAlgorithm이 지정한 digest 작업을 수행한 결과로 둔다.
Q를 key와 연결된 ECDSA 공개 키로 둔다.
params를 key와 연결된 EC 도메인 매개변수로 둔다.
[[algorithm]] 내부
슬롯의
namedCurve 속성이
"P-256", "P-384" 또는 "P-521"인 경우:
[RFC6090] 5.3절에 지정된 대로 ECDSA 검증 프로세스를 수행한다. 이때 M은 수신된 메시지로, signature는 수신된 서명으로 사용하고, params는 EC 도메인 매개변수로, Q는 공개 키로 사용한다.
[[algorithm]] 내부
슬롯의
namedCurve 속성이
적용
가능한 명세에 지정된 값인 경우:
그 명세에 지정된 ECDSA 검증 단계를 수행한다. 이때 M, signature, params 및 Q를 전달하고, 주장된 서명이 유효한지 여부를 나타내는 표시를 결과로 얻는다.
result를 서명이 유효하면 값이 true이고,
그렇지 않으면 값이 false인 boolean으로 둔다.
result를 반환한다.
usages가
"sign" 또는 "verify" 중 하나가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
namedCurve 멤버가
"P-256", "P-384"
또는 "P-521"인 경우:
[RFC6090]에
정의된 대로, normalizedAlgorithm의
namedCurve 멤버로
식별되는 곡선의 도메인 매개변수를 사용하여
타원 곡선 키 쌍을 생성한다.
namedCurve 멤버가
적용
가능한 명세에 지정된 값인 경우:
그 명세에 지정된 ECDSA 생성 단계를 수행한다. 이때 normalizedAlgorithm을 전달하고 타원 곡선 키 쌍을 결과로 얻는다.
throw하여
NotSupportedError를
발생시킨다
키 생성 작업을 수행한 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
algorithm을 새
EcKeyAlgorithm
객체로 둔다.
algorithm의 name 속성을
"ECDSA"로 설정한다.
algorithm의 namedCurve
속성을 normalizedAlgorithm의
namedCurve 멤버와 같게
설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의
[[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
usages와 [ "verify" ]의
사용법 교집합으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "sign" ]의
사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가
"verify"가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC5480]에
정의된 id-ecPublicKey
object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
spki의 algorithm
AlgorithmIdentifier 필드의 parameters 필드가 없으면,
throw하여
DataError를
발생시킨다.
params를 spki의 algorithm
AlgorithmIdentifier 필드의 parameters 필드로 둔다.
params가
[RFC5480]에
정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나
namedCurve를 지정하지 않으면, throw하여 DataError를
발생시킨다.
namedCurve를 초기값이 undefined인 문자열로 둔다.
format과 spki를 전달하고 namedCurve와 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
namedCurve가 정의되어 있고 normalizedAlgorithm의 namedCurve
멤버와 같지 않으면,
throw하여 DataError를
발생시킨다.
공개 키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
algorithm을 새 EcKeyAlgorithm로 둔다.
algorithm의 name 속성을
"ECDSA"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
pkcs8"인 경우:
usages가
"sign"이 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC5480]에
정의된 id-ecPublicKey object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드가 없으면,
throw하여
DataError를
발생시킨다.
params를 privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드로 둔다.
params가
[RFC5480]에
정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나
namedCurve를 지정하지 않으면, throw하여 DataError를
발생시킨다.
namedCurve를 초기값이 undefined인 문자열로 둔다.
ecPrivateKey를
ASN.1 구조
파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC5915]
3절에 지정된 ASN.1
ECPrivateKey 구조로,
exactData는 true로 설정한다.
ecPrivateKey의 parameters 필드가
존재하며,
[RFC5480]에
정의된 namedCurve ASN.1 타입의 인스턴스가
아니거나,
privateKeyInfo의
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifier 필드의
parameters 필드와 같은 object identifier를
포함하지 않으면,
throw하여
DataError를
발생시킨다.
key를 ecPrivateKey를 사용하여
[RFC5915]
3절에 정의된 변환 단계를 수행하여 식별된 타원 곡선
비공개 키를 나타내는 새 CryptoKey로
둔다.
format과 privateKeyInfo를 전달하고 namedCurve와 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
namedCurve가 정의되어 있고 normalizedAlgorithm의 namedCurve
멤버와 같지 않으면,
throw하여 DataError를
발생시킨다.
비공개 키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
algorithm을 새 EcKeyAlgorithm로 둔다.
algorithm의 name 속성을
"ECDSA"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
d 필드가 존재하고
usages가
"sign"이 아닌 값을 포함하거나, 또는
d 필드가 존재하지 않고
usages가
"verify"가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며 "sig"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고, JSON Web
Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 usages
값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
namedCurve를 jwk의
crv 필드와 같은
값을 가진 문자열로 둔다.
namedCurve가
normalizedAlgorithm의 namedCurve
멤버와 같지 않으면,
throw하여 DataError를
발생시킨다.
P-256",
"P-384" 또는 "P-521"와 같은 경우:
format과 jwk를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
algorithm을 새 EcKeyAlgorithm
객체 인스턴스로 둔다.
algorithm의 name 속성을
"ECDSA"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
raw"인 경우:
normalizedAlgorithm의 namedCurve
멤버가
명명된 곡선이 아니면,
throw하여
DataError를
발생시킨다.
usages가
"verify"가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
P-256",
"P-384" 또는 "P-521"인 경우:
Q를 normalizedAlgorithm의
namedCurve
멤버로 식별되는 곡선 위의 타원 곡선 point로 둔다. 이 point는
keyData에 대해
[SEC1]
2.3.4절에 정의된 변환 단계를 수행하여 식별된다.
압축되지 않은 point 형식은 MUST 지원되어야 한다.
구현이 압축된 point 형식을 지원하지 않고
압축된 point가 제공되면,
throw하여
DataError를
발생시킨다.
key를 Q를 나타내는 새 CryptoKey로
둔다.
format과 keyData를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
algorithm을 새 EcKeyAlgorithm
객체로 둔다.
algorithm의 name 속성을
"ECDSA"로 설정한다.
algorithm의 namedCurve
속성을 normalizedAlgorithm의 namedCurve
멤버와 같게 설정한다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
throw하여
NotSupportedError를
발생시킨다.
key를 반환한다
key를 내보낼 CryptoKey로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:
algorithm 필드를 다음 속성을 가진
AlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm 필드를
[RFC5480]에
정의된 OID id-ecPublicKey로 설정한다.
parameters 필드를
[RFC5480]에
정의된 ECParameters ASN.1 타입의
인스턴스로 다음과 같이 설정한다:
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256",
"P-384" 또는 "P-521"인 경우:
keyData를
key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선 공개 키를
[RFC5480]
2.2절에 지정된 인코딩 규칙에 따라, 압축되지 않은
형식을 사용하여 나타내는
바이트
시퀀스로 둔다. 그리고 keyData.
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp256r1와 같은 값을 가진
namedCurve choice로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-384"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp384r1와 같은 값을 가진
namedCurve choice로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-521"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp521r1와 같은 값을 가진
namedCurve choice로 설정한다
format과
key의 [[algorithm]]
내부 슬롯의 namedCurve
속성을 전달하고
namedCurveOid와
keyData를 얻어,
다른
적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
parameters를
namedCurveOid object identifier와
같은 값을 가진
namedCurve choice로 설정한다.
subjectPublicKey 필드를 keyData로 설정한다.
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5208]에
정의된 PrivateKeyInfo
ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:
version 필드를 0으로 설정한다.
privateKeyAlgorithm 필드를 다음 속성을 가진
PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm 필드를
[RFC5480]에
정의된 OID id-ecPublicKey로 설정한다.
parameters 필드를
[RFC5480]에
정의된 ECParameters ASN.1 타입의
인스턴스로 다음과 같이 설정한다:
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256",
"P-384" 또는 "P-521"인 경우:
keyData를
key의 [[handle]]
내부 슬롯이 나타내는 타원
곡선 비공개 키에 대한, [RFC5915]
3절에 정의된 ECPrivateKey
구조의 인스턴스를 DER 인코딩한 결과로 둔다. 이 인스턴스는
다음을 따른다:
parameters 필드는 존재하며,
이 PrivateKeyInfo ASN.1 구조의
privateKeyAlgorithm 필드의
parameters 필드와 동등하다.
publicKey 필드는 존재하며
key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선 비공개 키와
연결된 타원 곡선 공개 키를 나타낸다.
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp256r1와 같은 값을 가진
namedCurve choice로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-384"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp384r1와 같은 값을 가진
namedCurve choice로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-521"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp521r1와 같은 값을 가진
namedCurve choice로 설정한다
format과
key의 [[algorithm]]
내부 슬롯의 namedCurve
속성을 전달하고
namedCurveOid와
keyData를 얻어,
다른
적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
parameters를
namedCurveOid object identifier와
같은 값을 가진
namedCurve choice로 설정한다.
privateKey 필드를 keyData로 설정한다.
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
"EC"로 설정한다.
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256", "P-384" 또는
"P-521"인 경우:
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256"인 경우:
crv
속성을
"P-256"으로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-384"인 경우:
crv
속성을
"P-384"로 설정한다
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-521"인 경우:
crv
속성을
"P-521"로 설정한다
format과
key의
[[algorithm]]
내부 슬롯의 namedCurve
속성을 전달하고,
namedCurve와 jwk의 새 값을 얻어,
다른 적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
jwk의 crv
속성을 namedCurve로 설정한다.
jwk의 key_ops 속성을 key의 usages 속성으로
설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
raw"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
[[algorithm]]
내부 슬롯의 namedCurve
속성이 "P-256", "P-384"
또는 "P-521"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선
point Q를 [SEC1]
2.3.3절에 따라 압축되지 않은 형식을 사용하여 나타내는
바이트
시퀀스로 둔다.
format과
key의 [[algorithm]]
내부 슬롯의 namedCurve
속성을 전달하고,
namedCurve와 data를 얻어,
다른 적용 가능한
명세가 정의한
키 내보내기
단계를 수행한다.
result를 data로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
이는 [RFC6090]에 지정된 대로 키 생성과 키 합의를 위해 Elliptic Curve Diffie-Hellman (ECDH)을 사용하는 것을 설명한다.
다른 명세는 ECDH와 함께 추가 타원 곡선의 사용을 지정할 수 있다. 추가 타원 곡선을 지정하려면 명세는 곡선 이름, ECDH 생성 단계, ECDH 파생 단계, ECDH 키 가져오기 단계 및 ECDH 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"ECDH"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| generateKey | EcKeyGenParams
|
CryptoKeyPair
|
| deriveBits | EcdhKeyDeriveParams |
바이트 시퀀스 |
| importKey | EcKeyImportParams |
CryptoKey |
| exportKey | 없음 | object |
WebIDLdictionary EcdhKeyDeriveParams : Algorithm {
required CryptoKey public;
};
public 멤버는 피어의 EC 공개 키를 나타낸다.
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면
throw하여
SyntaxError를
발생시킨다.
namedCurve 멤버가
"P-256", "P-384"
또는 "P-521"인 경우:
[RFC6090]에
정의된 대로, normalizedAlgorithm의
namedCurve 멤버로
식별되는 곡선의 도메인 매개변수를 사용하여
타원 곡선 키 쌍을 생성한다.
namedCurve 멤버가
ECDH와 함께 그 값을 사용하는 것을 지정하는
적용
가능한 명세에 지정된 값인 경우:
그 명세에 지정된 ECDH 생성 단계를 수행한다. 이때 normalizedAlgorithm을 전달하고 타원 곡선 키 쌍을 결과로 얻는다.
throw하여
NotSupportedError를
발생시킨다
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
algorithm을 새
EcKeyAlgorithm
객체로 둔다.
algorithm의 name 멤버를
"ECDH"로 설정한다.
algorithm의 namedCurve
속성을 normalizedAlgorithm의
namedCurve 멤버와 같게
설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
빈 목록으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "deriveKey", "deriveBits" ]의
사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
publicKey를
normalizedAlgorithm의
public 멤버로
둔다.
publicKey의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
publicKey의
[[algorithm]] 내부
슬롯의 name 속성이
key의
[[algorithm]] 내부
슬롯의 name 속성과 같지 않으면,
throw하여 InvalidAccessError를
발생시킨다.
publicKey의
[[algorithm]] 내부
슬롯의 namedCurve 속성이
key의
[[algorithm]] 내부
슬롯의 namedCurve 속성과
같지 않으면, throw하여
InvalidAccessError를
발생시킨다.
[[algorithm]] 내부
슬롯의
namedCurve 속성이
"P-256", "P-384"
또는 "P-521"인 경우:
[RFC6090]
4절에 지정된 ECDH 원시 연산을 수행한다. 이때 key를
EC 비공개 키 d로, publicKey의 [[handle]]
내부 슬롯이 나타내는 EC 공개 키를 EC 공개 키로 사용한다.
secret을 ECDH 원시 연산의 출력에 [RFC6090] 6.2절에 정의된 필드 원소를 octet 문자열로 변환하는 변환을 적용한 결과를 포함하는 바이트 시퀀스로 둔다.
[[algorithm]] 내부
슬롯의 namedCurve 속성이
ECDH와 함께 그 값을 사용하는 것을 지정하는
적용
가능한 명세에 지정된 값인 경우:
그 명세에 지정된 ECDH 파생 단계를 수행한다. 이때 key와 publicKey를 전달하고 secret을 결과로 얻는다.
throw하여
NotSupportedError를
발생시킨다
작업 수행 결과 오류가 발생하면,
throw하여
OperationError를
발생시킨다.
OperationError를
발생시킨다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가 비어 있지 않으면
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC5480]에
정의된 id-ecPublicKey
object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
spki의 algorithm AlgorithmIdentifier 필드의
parameters 필드가 없으면,
throw하여
DataError를
발생시킨다.
params를 spki의 algorithm
AlgorithmIdentifier 필드의 parameters 필드로 둔다.
params가
[RFC5480]에
정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나
namedCurve를 지정하지 않으면, throw하여 DataError를
발생시킨다.
namedCurve를 초기값이 undefined인 문자열로 둔다.
format과 spki를 전달하고 namedCurve와 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
namedCurve가 정의되어 있고 normalizedAlgorithm의 namedCurve
멤버와 같지 않으면, throw하여 DataError를
발생시킨다.
키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
algorithm을 새 EcKeyAlgorithm로 둔다.
algorithm의 name 속성을
"ECDH"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
pkcs8"인 경우:
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC5480]에
정의된 id-ecPublicKey object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드가 존재하지 않으면,
throw하여
DataError를
발생시킨다.
params를 privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드로 둔다.
params가
[RFC5480]에
정의된 ECParameters ASN.1 타입의 인스턴스가 아니거나
namedCurve를 지정하지 않으면, throw하여 DataError를
발생시킨다.
namedCurve를 초기값이 undefined인 문자열로 둔다.
ecPrivateKey를
ASN.1 구조
파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는
[RFC5915]
3절에 지정된 ASN.1
ECPrivateKey 구조로,
exactData는 true로 설정한다.
ecPrivateKey의 parameters 필드가
존재하며,
[RFC5480]에
정의된 namedCurve ASN.1 타입의 인스턴스가
아니거나,
privateKeyInfo의
privateKeyAlgorithm
PrivateKeyAlgorithmIdentifier 필드의
parameters 필드와 같은 object identifier를
포함하지 않으면,
throw하여
DataError를
발생시킨다.
key를 ecPrivateKey를 사용하여
[RFC5915]
3절에 정의된 변환 단계를 수행하여 식별된 타원 곡선
비공개 키를 나타내는 새 CryptoKey로
둔다.
format과 privateKeyInfo를 전달하고 namedCurve와 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
namedCurve가 정의되어 있고 normalizedAlgorithm의 namedCurve
멤버와 같지 않으면, throw하여 DataError를
발생시킨다.
키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
algorithm을 새 EcKeyAlgorithm로 둔다.
algorithm의 name 속성을
"ECDH"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
d 필드가 존재하고
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을
포함하면
throw하여
SyntaxError를
발생시킨다.
d 필드가 존재하지 않고
usages가 비어 있지 않으면
throw하여
SyntaxError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며 "enc"와 같지 않으면, throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고, JSON Web
Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 usages
값을 모두 포함하지 않으면,
throw하여 DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
namedCurve를 jwk의
crv 필드와 같은
값을 가진 문자열로 둔다.
namedCurve가 normalizedAlgorithm의
namedCurve
멤버와 같지 않으면, throw하여 DataError를
발생시킨다.
P-256",
"P-384" 또는 "P-521"인 경우:
d 필드가
존재하는 경우:format과 jwk를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
키 값이 normalizedAlgorithm의
namedCurve
멤버로 식별되는 타원 곡선 위의 유효한 점이 아니면
throw하여 DataError를
발생시킨다.
algorithm을 새 EcKeyAlgorithm
객체 인스턴스로 둔다.
algorithm의 name 속성을
"ECDH"로 설정한다.
algorithm의 namedCurve
속성을 namedCurve로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
raw"인 경우:
normalizedAlgorithm의 namedCurve
멤버가 명명된 곡선이
아니면,
throw하여
DataError를
발생시킨다.
usages가 빈 목록이 아니면,
throw하여
SyntaxError를
발생시킨다.
P-256",
"P-384" 또는 "P-521"인 경우:
Q를 normalizedAlgorithm의
namedCurve
멤버로 식별되는 곡선 위의 타원 곡선 공개 키로 둔다.
이는 keyData에 대해
[SEC1]
2.3.4절에 정의된 변환 단계를 수행하여 식별된다.
압축되지 않은 point 형식은 MUST 지원되어야 한다.
구현이 압축된 point 형식을 지원하지 않고
압축된 point가 제공되면,
throw하여
DataError를
발생시킨다.
key를 Q를 나타내는 새 CryptoKey로
둔다.
format과 keyData를 전달하고 key를 얻어, 다른 적용 가능한 명세가 정의한 키 가져오기 단계를 수행한다.
algorithm을 새 EcKeyAlgorithm
객체로 둔다.
algorithm의 name 속성을
"ECDH"로 설정한다.
algorithm의 namedCurve
속성을 normalizedAlgorithm의 namedCurve
멤버와 같게 설정한다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
key를 반환한다
key를 내보낼 CryptoKey로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 둔다. 이 인스턴스는 다음 속성을 가진다:
algorithm 필드를 다음 속성을 가진
AlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm 필드를
[RFC5480]에
정의된 OID id-ecPublicKey로 설정한다.
parameters 필드를
[RFC5480]에
정의된 ECParameters ASN.1 타입의
인스턴스로 다음과 같이 설정한다:
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-256",
"P-384" 또는 "P-521"인 경우:
keyData를
key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선 공개 키를
[SEC1]
2.3.3절에 지정된 인코딩 규칙에 따라, 압축되지 않은
형식을 사용하여 나타내는
바이트
시퀀스로 둔다.
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-256"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp256r1와 같은 값을 가진
namedCurve choice로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-384"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp384r1와 같은 값을 가진
namedCurve choice로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-521"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp521r1와 같은 값을 가진
namedCurve choice로 설정한다
format과
key의
namedCurve
속성을 key의
[[algorithm]]
내부 슬롯에서 전달하고
namedCurveOid와
keyData를 얻어,
다른
적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
parameters를
namedCurveOid object identifier와
같은 값을 가진
namedCurve choice로 설정한다.
subjectPublicKey 필드를 keyData로 설정한다
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5208]에
정의된 PrivateKeyInfo
ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:
version 필드를 0으로 설정한다.
privateKeyAlgorithm 필드를 다음 속성을 가진
PrivateKeyAlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm 필드를
[RFC5480]에
정의된 OID id-ecPublicKey로 설정한다.
parameters 필드를
[RFC5480]에
정의된 ECParameters ASN.1 타입의
인스턴스로 다음과 같이 설정한다:
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-256",
"P-384" 또는 "P-521"인 경우:
keyData를
key의 [[handle]]
내부 슬롯이 나타내는 타원
곡선 비공개 키에 대한, [RFC5915]
3절에 정의된 ECPrivateKey
구조의 인스턴스를 DER 인코딩한 결과로 둔다. 이 인스턴스는
다음을 따른다:
parameters 필드는 존재하며,
이 PrivateKeyInfo ASN.1 구조의
privateKeyAlgorithm 필드의
parameters 필드와 동등하다.
publicKey 필드는 존재하며,
key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선 비공개 키와
연결된 타원 곡선 공개 키를 나타낸다.
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-256"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp256r1와 같은 값을 가진
namedCurve choice로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-384"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp384r1와 같은 값을 가진
namedCurve choice로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서
"P-521"인 경우:
parameters를
[RFC5480]에
정의된 object identifier
secp521r1와 같은 값을 가진
namedCurve choice로 설정한다
format과
key의
namedCurve
속성을 key의
[[algorithm]]
내부 슬롯에서 전달하고
namedCurveOid와
keyData를 얻어,
다른
적용 가능한
명세가 정의한
키
내보내기 단계를 수행한다.
parameters를
namedCurveOid object identifier와
같은 값을 가진
namedCurve choice로 설정한다.
privateKey 필드를 keyData로 설정한다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
"EC"로 설정한다.
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-256", "P-384"
또는 "P-521"인 경우:
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-256"인 경우:
crv
속성을
"P-256"로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-384"인 경우:
crv
속성을
"P-384"로 설정한다
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-521"인 경우:
crv
속성을
"P-521"로 설정한다
format과
key의
namedCurve
속성을
key의 [[algorithm]]
내부 슬롯에서 전달하고
namedCurve와 jwk의 새 값을 얻어,
다른
적용 가능한
명세가 정의한
키 내보내기
단계를 수행한다.
jwk의 crv
속성을 namedCurve로 설정한다.
jwk의 key_ops 속성을 key의
usages 속성으로
설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
raw"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
namedCurve
속성이 key의 [[algorithm]]
내부 슬롯에서 "P-256", "P-384"
또는 "P-521"인 경우:
data를 key의 [[handle]]
내부 슬롯이 나타내는 타원 곡선 공개 키를
[SEC1]
2.3.3절에 지정된 인코딩 규칙에 따라, 압축되지 않은
형식을 사용하여 나타내는
바이트
시퀀스로 둔다.
format과
key의 namedCurve
속성을
key의 [[algorithm]]
내부 슬롯에서 전달하고
namedCurve와 data를 얻어,
다른 적용 가능한
명세가 정의한
키 내보내기
단계를 수행한다.
result를 data로 둔다.
result를 반환한다.
이 절은 비규범적이다.
"Ed25519" 알고리즘 식별자는
[RFC8032]에 지정된
Ed25519 알고리즘을 사용하여 서명과 검증을 수행하는 데 사용된다.
이 알고리즘의 인식된 알고리즘 이름은
"Ed25519"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| sign | 없음 | 바이트 시퀀스 |
| verify | 없음 | boolean |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
result를 [RFC8032] 5.1.6절에 지정된 Ed25519 서명 프로세스를 수행한 결과로 둔다. 이때 message는 M으로, key와 연결된 Ed25519 비공개 키를 사용한다.
일부 구현은 [RFC8032]에 따른 결정적 서명 대신 draft-irtf-cfrg-det-sigs-with-noise에 따라 무작위화된 서명을 생성할 수 있다(또는 생성하기를 원할 수 있다).
result를 반환한다.
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
key의 키 데이터가 Ed25519의 타원 곡선 위의 유효하지 않은 점 또는 작은 차수 원소를
나타내면, false를 반환한다.
모든 구현이 이 검사를 수행하는 것은 아니다.
signature의 첫 번째 절반에 인코딩된 점 R이
Ed25519의 타원 곡선 위의 유효하지 않은 점 또는 작은 차수 원소를
나타내면, false를 반환한다.
모든 구현이 이 검사를 수행하는 것은 아니다.
[RFC8032]
5.1.7절에 지정된 Ed25519 검증 단계를 수행한다. 이때 코팩터 없는(배치 처리되지 않은)
방정식
[S]B = R + [k]A'를 signature에 대해 사용하고,
message를 M으로 하며,
key와 연결된 Ed25519 공개 키를 사용한다.
result를 서명이 유효하면 값이 true이고
그렇지 않으면 값이 false인 boolean으로 둔다.
result를 반환한다.
usages가
"sign" 또는 "verify" 중 하나가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
[RFC8032] 5.1.5절에 정의된 대로 Ed25519 키 쌍을 생성한다.
algorithm을 새 KeyAlgorithm 객체로 둔다.
algorithm의 name 속성을
"Ed25519"로 설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
usages와 [ "verify" ]의 사용법 교집합으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "sign" ]의 사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가
"verify"가 아닌 값을 포함하면
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC8410]에
정의된 id-Ed25519
object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
spki의 algorithm
AlgorithmIdentifier 필드의 parameters 필드가 존재하면,
throw하여
DataError를
발생시킨다.
publicKey를 spki의
subjectPublicKey 필드가 식별하는 Ed25519 공개 키로 둔다.
key를 publicKey를 나타내는 새 CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
algorithm을 새 KeyAlgorithm으로 둔다.
algorithm의 name 속성을
"Ed25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
pkcs8"인 경우:
usages가
"sign"이 아닌 값을 포함하면
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC8410]에
정의된 id-Ed25519 object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드가 존재하면,
throw하여
DataError를
발생시킨다.
curvePrivateKey를
ASN.1 구조
파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC8410]
7절에 지정된 ASN.1
CurvePrivateKey 구조로,
exactData는 true로 설정한다.
key를 curvePrivateKey가 식별하는 Ed25519 비공개 키를
나타내는 새 CryptoKey로 둔다.
algorithm을 새 KeyAlgorithm으로 둔다.
algorithm의 name 속성을
"Ed25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
d 필드가 존재하고
usages가
"sign"이 아닌 값을 포함하거나,
d 필드가 존재하지 않고
usages가
"verify"가 아닌 값을 포함하면
throw하여
SyntaxError를
발생시킨다.
jwk의 alg 필드가 존재하고
"Ed25519" 또는 "EdDSA"가 아니면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며
"sig"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고, JSON Web
Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 usages
값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
d 필드가
존재하는 경우:
algorithm을 새 KeyAlgorithm
객체 인스턴스로 둔다.
algorithm의 name 속성을
"Ed25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
raw"인 경우:
usages가
"verify"가 아닌 값을 포함하면
throw하여
SyntaxError를
발생시킨다.
algorithm을 새 KeyAlgorithm 객체로 둔다.
algorithm의 name 속성을
"Ed25519"로 설정한다.
key를 keyData에 제공된 키 데이터를 나타내는 새
CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
throw하여
NotSupportedError를
발생시킨다.
key를 반환한다
key를 내보낼 CryptoKey로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:
algorithm 필드를 다음 속성을 가진
AlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm object identifier를
[RFC8410]에
정의된 id-Ed25519 OID로 설정한다.
subjectPublicKey 필드를 keyData로 설정한다.
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를
발생시킨다.
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 비공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
"OKP"로 설정한다.
jwk의 alg 속성을
"Ed25519"로 설정한다.
jwk의 crv 속성을
"Ed25519"로 설정한다.
jwk의 key_ops 속성을 key의 usages 속성으로
설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
raw"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 key의 [[handle]]
내부 슬롯이 나타내는 Ed25519
공개 키를 나타내는
바이트 시퀀스로
둔다.
result를 data로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"X25519" 알고리즘 식별자는
[RFC7748]에 지정된
X25519 알고리즘을 사용하여 키 합의를 수행하는 데 사용된다.
이 알고리즘의 인식된 알고리즘 이름은
"X25519"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| deriveBits | EcdhKeyDeriveParams |
바이트 시퀀스 |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
key의 [[type]]
내부 슬롯이 "private"가 아니면,
throw하여 InvalidAccessError를
발생시킨다.
publicKey를
normalizedAlgorithm의
public 멤버로
둔다.
publicKey의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
publicKey의
[[algorithm]] 내부
슬롯의 name 속성이
key의
[[algorithm]] 내부
슬롯의 name 속성과 같지 않으면,
throw하여 InvalidAccessError를
발생시킨다.
secret을 [RFC7748] 5절에 지정된 X25519 함수를
수행한 결과로 둔다. 이때 key를 X25519 비공개 키 k로 사용하고,
publicKey의 [[handle]]
내부 슬롯이 나타내는 X25519 공개 키를 X25519 공개 키 u로 사용한다.
secret이 모두 0인 값이면,
throw하여 OperationError를
발생시킨다.
이 검사는 [RFC7748] 6.1절에 따라 상수 시간으로
수행되어야 한다.
OperationError를
발생시킨다.
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면
throw하여
SyntaxError를
발생시킨다.
X25519 키 쌍을 생성한다. 이때 비공개 키는 32개의 무작위 바이트이고,
공개 키는 X25519(a, 9)이며,
이는 [RFC7748] 6.1절에 정의된 바와 같다.
algorithm을 새 KeyAlgorithm 객체로 둔다.
algorithm의 name 속성을
"X25519"로 설정한다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새 CryptoKey로 둔다.
publicKey의 [[type]]
내부 슬롯을 "public"으로 설정한다
publicKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
publicKey의 [[extractable]] 내부
슬롯을 true로 설정한다.
publicKey의 [[usages]] 내부 슬롯을
빈 목록으로 설정한다.
privateKey를 생성된 키 쌍의 비공개 키를 나타내는 새 CryptoKey로 둔다.
privateKey의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
privateKey의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
privateKey의 [[usages]] 내부 슬롯을
usages와 [ "deriveKey", "deriveBits" ]의
사용법 교집합으로 설정한다.
result를 새 CryptoKeyPair
딕셔너리로 둔다.
result의 publicKey 속성을
publicKey로 설정한다.
result의 privateKey 속성을
privateKey로 설정한다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
spki"인 경우:
usages가 비어 있지 않으면
throw하여
SyntaxError를
발생시킨다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm object identifier 필드가
[RFC8410]에
정의된 id-X25519
object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
spki의 algorithm
AlgorithmIdentifier 필드의 parameters 필드가 존재하면,
throw하여
DataError를
발생시킨다.
publicKey를 spki의
subjectPublicKey 필드가 식별하는 X25519 공개 키로 둔다.
key를 publicKey를 나타내는 새 CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
algorithm을 새 KeyAlgorithm으로 둔다.
algorithm의 name 속성을
"X25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
pkcs8"인 경우:
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면
throw하여
SyntaxError를
발생시킨다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 둔다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm object identifier 필드가
[RFC8410]에
정의된 id-X25519 object identifier와 같지 않으면,
throw하여
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드의
parameters 필드가 존재하면,
throw하여
DataError를
발생시킨다.
curvePrivateKey를
ASN.1 구조
파싱
알고리즘을 수행한 결과로 둔다. 이때 data는
privateKeyInfo의 privateKey 필드로,
structure는 [RFC8410]
7절에 지정된 ASN.1
CurvePrivateKey 구조로,
exactData는 true로 설정한다.
key를 curvePrivateKey가 식별하는 X25519 비공개 키를
나타내는 새 CryptoKey로 둔다.
algorithm을 새 KeyAlgorithm으로 둔다.
algorithm의 name 속성을
"X25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
d 필드가 존재하고
usages가
"deriveKey" 또는 "deriveBits"가 아닌 항목을 포함하면
throw하여
SyntaxError를
발생시킨다.
d 필드가 존재하지 않고
usages가 비어 있지 않으면
throw하여
SyntaxError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며 "enc"와 같지 않으면, throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고, JSON Web
Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 usages
값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
d 필드가
존재하는 경우:
algorithm을 새 KeyAlgorithm
객체 인스턴스로 둔다.
algorithm의 name 속성을
"X25519"로 설정한다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
raw"인 경우:
usages가 비어 있지 않으면
throw하여
SyntaxError를
발생시킨다.
algorithm을 새 KeyAlgorithm 객체로 둔다.
algorithm의 name 속성을
"X25519"로 설정한다.
key를 keyData에 제공된 키 데이터를 나타내는 새
CryptoKey로 둔다.
key의 [[type]]
내부 슬롯을 "public"으로 설정한다
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
throw하여
NotSupportedError를
발생시킨다.
key를 반환한다
key를 내보낼 CryptoKey로 둔다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
spki"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 두며, 다음 속성을 가진다:
algorithm 필드를 다음 속성을 가진
AlgorithmIdentifier ASN.1 타입으로 설정한다:
algorithm object identifier를
[RFC8410]에
정의된 id-X25519 OID로 설정한다.
subjectPublicKey 필드를 keyData로 설정한다.
result를 data를 DER 인코딩한 결과로 둔다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이 "private"가 아니면, throw하여 InvalidAccessError를
발생시킨다.
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 비공개 키를 나타낸다
result를 data를 DER 인코딩한 결과로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
"OKP"로 설정한다.
jwk의 crv 속성을
"X25519"로 설정한다.
jwk의 key_ops 속성을 key의 usages 속성으로
설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
raw"인 경우:
key의 [[type]]
내부 슬롯이 "public"이 아니면, throw하여 InvalidAccessError를
발생시킨다.
data를 key의 [[handle]]
내부 슬롯이 나타내는 X25519
공개 키를 나타내는
바이트 시퀀스로
둔다.
result를 data로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"AES-CTR" 알고리즘 식별자는
[NIST-SP800-38A]에
설명된 대로, Counter 모드에서 AES를 사용하여 암호화와 복호화를 수행하는 데 사용된다.
이 알고리즘의 인식된 알고리즘 이름은
"AES-CTR"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AesCtrParams |
바이트 시퀀스 |
| decrypt | AesCtrParams |
바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
| get key length | AesDerivedKeyParams |
정수 |
WebIDLdictionary AesCtrParams : Algorithm {
required BufferSource counter;
required [EnforceRange] octet length;
};
counter 멤버는
카운터 블록의 초기값을 포함한다. counter는 MUST 16
바이트(AES 블록 크기)여야 한다. 카운터 비트는 카운터 블록의 가장 오른쪽 length
비트이다. 카운터 블록의 나머지 부분은
nonce용이다. 카운터 비트는 NIST SP 800-38A 부록 B.1에 지정된 표준
증가 함수를 사용하여 증가된다:
카운터 비트는 big-endian 정수로 해석되고
1만큼 증가된다.
length 멤버는 증가되는 카운터 블록의
가장 오른쪽 부분의 길이를 비트 단위로 포함한다.
WebIDLdictionary AesKeyAlgorithm : KeyAlgorithm {
required unsigned short length;
};
length 멤버는 키의 길이를 비트 단위로
나타낸다.
WebIDLdictionary AesKeyGenParams : Algorithm {
required [EnforceRange] unsigned short length;
};
length 멤버는 키의 길이를 비트 단위로
나타낸다.
WebIDLdictionary AesDerivedKeyParams : Algorithm {
required [EnforceRange] unsigned short length;
};
length 멤버는 키의 길이를 비트 단위로
나타낸다.
normalizedAlgorithm의 counter 멤버가
16바이트의 길이를 가지지 않으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 length 멤버가
0이거나
128보다 크면,
throw하여
OperationError를
발생시킨다.
ciphertext를 [NIST-SP800-38A]
6.5절에 설명된 CTR Encryption 작업을 수행한 결과로 둔다. 이때 AES를
블록 암호로 사용하고, normalizedAlgorithm의 counter
멤버를 카운터 블록의 초기값으로,
normalizedAlgorithm의 length 멤버를
[NIST-SP800-38A]
부록 B.1에 정의된 표준 카운터 블록 증가 함수의 입력 매개변수 m으로,
그리고 plaintext를 입력 평문으로 사용한다.
ciphertext를 반환한다.
normalizedAlgorithm의 counter 멤버가
16바이트의 길이를 가지지 않으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 length 멤버가
0이거나
128보다 크면,
throw하여
OperationError를
발생시킨다.
plaintext를 [NIST-SP800-38A]
6.5절에 설명된 CTR Decryption 작업을 수행한 결과로 둔다. 이때 AES를
블록 암호로 사용하고, normalizedAlgorithm의 counter
멤버를 카운터 블록의 초기값으로,
normalizedAlgorithm의 length 멤버를
[NIST-SP800-38A]
부록 B.1에 정의된 표준 카운터 블록 증가 함수의 입력 매개변수 m으로,
그리고 ciphertext를 입력 암호문으로 사용한다.
plaintext를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의 length
멤버가
128, 192 또는 256 중 하나와 같지 않으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의
length 멤버와 같은
길이의 AES 키를 생성한다.
키 생성 단계가 실패하면,
throw하여
OperationError를
발생시킨다.
key를 생성된 AES 키를 나타내는 새
CryptoKey 객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-CTR"로 설정한다.
algorithm의 length
속성을
normalizedAlgorithm의
length 멤버와 같게
설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
key의 [[usages]] 내부 슬롯을
usages로 설정한다.
key를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
raw"인 경우:
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk가 JSON Web Algorithms [JWA]
6.4절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며
"enc"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
NotSupportedError를
발생시킨다.
key를 data 값을 가진 AES 키를 나타내는 새 CryptoKey 객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-CTR"로 설정한다.
algorithm의 length
속성을 data의
비트 단위 길이로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
raw"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는
바이트 시퀀스로
둔다.
result를 data로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
문자열 "oct"로 설정한다.
jwk의 k
속성을
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은
JSON Web Algorithms [JWA]
6.4절에 따라
인코딩된다.
jwk의 key_ops 속성을
key의
[[usages]]
내부 슬롯과 같게 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
normalizedDerivedKeyAlgorithm의 length 멤버가
128, 192 또는 256이 아니면,
throw하여
OperationError를
발생시킨다.
normalizedDerivedKeyAlgorithm의
length 멤버를
반환한다.
이 절은 비규범적이다.
"AES-CBC" 알고리즘 식별자는
[NIST-SP800-38A]에
설명된 대로, Cipher Block Chaining 모드에서 AES를 사용하여 암호화와 복호화를
수행하는 데 사용된다.
CBC 모드에서 동작할 때, AES 블록 크기(16바이트)의 정확한 배수가 아닌 메시지는 다양한 패딩 방식에 따라 패딩될 수 있다. Web Crypto API에서 지원되는 유일한 패딩 모드는 [RFC2315]의 10.3절 2단계에 설명된 PKCS#7이다.
이 알고리즘의 인식된 알고리즘 이름은
"AES-CBC"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AesCbcParams |
바이트 시퀀스 |
| decrypt | AesCbcParams |
바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
| get key length | AesDerivedKeyParams |
정수 |
WebIDLdictionary AesCbcParams : Algorithm {
required BufferSource iv;
};
iv 멤버는 초기화 벡터를 나타낸다. 이는 MUST
16바이트여야 한다.
normalizedAlgorithm의 iv 멤버가
16바이트의 길이를 가지지 않으면,
throw하여
OperationError를
발생시킨다.
paddedPlaintext를 [RFC2315]의 10.3절 2단계에 정의된 절차에 따라 plaintext에 패딩 octet을 추가한 결과로 둔다. 이때 k의 값은 16이다.
ciphertext를 [NIST-SP800-38A]
6.2절에 설명된 CBC Encryption 작업을 수행한 결과로 둔다. 이때 AES를
블록 암호로 사용하고, normalizedAlgorithm의 iv 멤버를
입력 매개변수 IV로, paddedPlaintext를
입력 평문으로 사용한다.
ciphertext를 반환한다.
normalizedAlgorithm의 iv 멤버가
16바이트의 길이를 가지지 않으면,
throw하여
OperationError를
발생시킨다.
ciphertext의 길이가 0이거나 16바이트의 배수가 아니면,
throw하여 OperationError를
발생시킨다.
paddedPlaintext를 [NIST-SP800-38A]
6.2절에 설명된 CBC Decryption 작업을 수행한 결과로 둔다. 이때 AES를
블록 암호로 사용하고, normalizedAlgorithm의 iv 멤버를
입력 매개변수 IV로, ciphertext를
입력 암호문으로 사용한다.
p를 paddedPlaintext의 마지막 octet 값으로 둔다.
p가 0이거나 16보다 크거나, paddedPlaintext의 마지막
p개 octet 중 어느 하나라도 그 값이 p가 아니면,
throw하여
OperationError를
발생시킨다.
plaintext를 paddedPlaintext의 끝에서 p개 octet을 제거한 결과로 둔다.
plaintext를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의 length
멤버가
128, 192 또는 256 중 하나와 같지 않으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의
length 멤버와 같은
길이의 AES 키를 생성한다.
키 생성 단계가 실패하면,
throw하여
OperationError를
발생시킨다.
key를 생성된 AES 키를 나타내는 새
CryptoKey 객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-CBC"로 설정한다.
algorithm의 length
속성을
normalizedAlgorithm의
length 멤버와 같게
설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
key의 [[usages]] 내부 슬롯을
usages로 설정한다.
key를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
raw"인 경우:
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk가 JSON Web Algorithms [JWA]
6.4절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며
"enc"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의 요구사항에
따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
NotSupportedError를
발생시킨다
key를 data 값을 가진 AES 키를 나타내는 새 CryptoKey
객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-CBC"로 설정한다.
algorithm의 length
속성을 data의
비트 단위 길이로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
raw"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는
바이트 시퀀스로
둔다.
result를 data로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey 딕셔너리로 둔다.
jwk의 kty 속성을
문자열 "oct"로 설정한다.
jwk의 k
속성을
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은
JSON Web Algorithms [JWA]
6.4절에 따라
인코딩된다.
jwk의 key_ops 속성을
key의 usages 속성과
같게 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
normalizedDerivedKeyAlgorithm의 length 멤버가
128, 192 또는 256이 아니면,
throw하여
OperationError를
발생시킨다.
normalizedDerivedKeyAlgorithm의
length 멤버를
반환한다.
이 절은 비규범적이다.
"AES-GCM" 알고리즘 식별자는
[NIST-SP800-38D]에
설명된 대로, Galois/Counter Mode 모드에서 AES를 사용하여 인증된 암호화와 복호화를
수행하는 데 사용된다.
이 알고리즘의 인식된 알고리즘 이름은
"AES-GCM"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AesGcmParams |
바이트 시퀀스 |
| decrypt | AesGcmParams |
바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
| get key length | AesDerivedKeyParams |
정수 |
WebIDLdictionary AesGcmParams : Algorithm {
required BufferSource iv;
BufferSource additionalData;
[EnforceRange] octet tagLength;
};
iv 멤버는 사용할 초기화 벡터를 나타낸다. 최대
2^64-1바이트 길이일 수 있다.
additionalData 멤버는 포함할
추가 인증 데이터를 나타낸다.
tagLength 멤버는 원하는 인증 태그의 길이를
나타낸다. 0 - 128일 수 있다.
plaintext의 길이가
2^39 - 256바이트보다 크면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 iv 멤버의 길이가
2^64 - 1바이트보다 크면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하고 그 길이가
2^64 - 1바이트보다 크면,
throw하여
OperationError를
발생시킨다.
tagLength 멤버가
존재하지 않는 경우:
tagLength 멤버가
32, 64, 96, 104, 112, 120 또는 128 중 하나인 경우:
tagLength 멤버와
같게 둔다
OperationError를
발생시킨다.
additionalData를 normalizedAlgorithm의
additionalData 멤버가
존재하면 그 멤버로, 그렇지 않으면 빈
바이트 시퀀스로 둔다.
C와 T를
[NIST-SP800-38D]
7.1절에 설명된 Authenticated Encryption Function을 수행한 결과로 나오는
출력들로 둔다. 이때 AES를 블록 암호로 사용하고,
normalizedAlgorithm의 iv 멤버를
입력 매개변수 IV로,
additionalData를 입력 매개변수 A로,
tagLength를 사전 요구사항 t로,
plaintext를 입력 평문으로 사용한다.
ciphertext를 C | T와 같게 둔다. 여기서 '|'는 연결을 나타낸다.
ciphertext를 반환한다.
tagLength 멤버가
존재하지 않는 경우:
tagLength 멤버가
32, 64, 96, 104, 112, 120 또는 128 중 하나인 경우:
tagLength 멤버와
같게 둔다
OperationError를
발생시킨다.
ciphertext의 비트
단위 길이가 tagLength보다 작으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 iv 멤버의 길이가
2^64 - 1바이트보다 크면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하고 그 길이가
2^64 - 1바이트보다 크면,
throw하여
OperationError를
발생시킨다.
tag를 ciphertext의 마지막 tagLength비트로 둔다.
actualCiphertext를 ciphertext에서 마지막 tagLength비트를 제거한 결과로 둔다.
additionalData를 normalizedAlgorithm의
additionalData 멤버가
존재하면 그 멤버로, 그렇지 않으면 빈
바이트 시퀀스로 둔다.
[NIST-SP800-38D]
7.2절에 설명된 Authenticated Decryption Function을 수행한다. 이때 AES를 블록 암호로
사용하고,
normalizedAlgorithm의 iv 멤버를
입력 매개변수 IV로,
additionalData를 입력 매개변수 A로,
tagLength를 사전 요구사항 t로,
actualCiphertext를 입력 암호문 C로, tag를
인증 태그 T로 사용한다.
OperationError를
발생시킨다
plaintext를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
normalizedAlgorithm의 length
멤버가
128, 192 또는 256 중 하나와 같지 않으면,
throw하여
OperationError를
발생시킨다.
normalizedAlgorithm의
length 멤버와 같은
길이의 AES 키를 생성한다.
키 생성 단계가 실패하면,
throw하여
OperationError를
발생시킨다.
key를 생성된 AES 키를 나타내는 새
CryptoKey 객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-GCM"로 설정한다.
algorithm의 length
속성을
normalizedAlgorithm의
length 멤버와 같게
설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
key의 [[usages]] 내부 슬롯을
usages로 설정한다.
key를 반환한다.
usages가
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
raw"인 경우:
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk가 JSON Web Algorithms [JWA]
6.4절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며
"enc"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의 요구사항에
따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
NotSupportedError를
발생시킨다.
key를 data 값을 가진 AES 키를 나타내는 새 CryptoKey
객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-GCM"로 설정한다.
algorithm의 length
속성을 data의
비트 단위 길이로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
raw"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는
바이트 시퀀스로
둔다.
result를 data로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
문자열 "oct"로 설정한다.
jwk의 k
속성을
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은
JSON Web Algorithms [JWA]
6.4절에 따라
인코딩된다.
jwk의 key_ops 속성을
key의 usages 속성과
같게 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
normalizedDerivedKeyAlgorithm의 length 멤버가
128, 192 또는 256이 아니면, throw하여 OperationError를
발생시킨다.
normalizedDerivedKeyAlgorithm의
length 멤버를
반환한다.
이 절은 비규범적이다.
"AES-KW" 알고리즘 식별자는
[RFC3394]에
설명된 대로, AES를 사용하여 키 래핑을 수행하는 데 사용된다.
이 알고리즘의 인식된 알고리즘 이름은
"AES-KW"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| wrapKey | 없음 | 바이트 시퀀스 |
| unwrapKey | 없음 | 바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | object |
| get key length | AesDerivedKeyParams |
정수 |
plaintext의 길이가 64비트의 배수가 아니면,
throw하여
OperationError를
발생시킨다.
ciphertext를 [RFC3394] 2.2.1절에 설명된 Key Wrap 작업을 수행한 결과로 둔다. 이때 plaintext를 래핑될 평문으로 사용하고, 같은 문서의 2.2.3.1절에 정의된 기본 Initial Value를 사용한다.
ciphertext를 반환한다.
plaintext를 [RFC3394] 2.2.2절에 설명된 Key Unwrap 작업을 수행한 결과로 둔다. 이때 ciphertext를 입력 암호문으로 사용하고, 같은 문서의 2.2.3.1절에 정의된 기본 Initial Value를 사용한다.
Key Unwrap 작업이 오류를 반환하면,
throw하여
OperationError를
발생시킨다.
plaintext를 반환한다.
usages가 "wrapKey" 또는 "unwrapKey" 중 하나가
아닌 항목을 포함하면, throw하여 SyntaxError를
발생시킨다.
normalizedAlgorithm의 length
속성이
128, 192 또는 256 중 하나와 같지 않으면, throw하여 OperationError를
발생시킨다.
normalizedAlgorithm의 length
멤버와 같은
길이의 AES 키를 생성한다.
키 생성 단계가 실패하면,
throw하여
OperationError를
발생시킨다.
key를 생성된 AES 키를 나타내는 새
CryptoKey 객체로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-KW"로 설정한다.
algorithm의 length
속성을
normalizedAlgorithm의
length 속성과 같게
설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
key의 [[usages]] 내부 슬롯을
usages로 설정한다.
key를 반환한다.
usages가
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
raw"인 경우:
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk가 JSON Web Algorithms [JWA]
6.4절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
usages가 비어 있지 않고 jwk의 use 필드가
존재하며
"enc"가 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의 요구사항에
따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
NotSupportedError를
발생시킨다.
key를 data 값을 가진 AES 키를 나타내는 새 CryptoKey로 둔다.
algorithm을 새
AesKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"AES-KW"로 설정한다.
algorithm의 length
속성을 data의
비트 단위 길이로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
raw"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는
바이트 시퀀스로
둔다.
result를 data로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
문자열 "oct"로 설정한다.
jwk의 k
속성을
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 octet을 포함하는 문자열로 설정한다. 이 문자열은
JSON Web Algorithms [JWA]
6.4절에 따라
인코딩된다.
jwk의 key_ops 속성을
key의 usages 속성과
같게 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
normalizedDerivedKeyAlgorithm의 length 멤버가
128, 192 또는 256이 아니면, throw하여 OperationError를
발생시킨다.
normalizedDerivedKeyAlgorithm의
length 멤버를
반환한다.
이 절은 비규범적이다.
HMAC 알고리즘은 이 명세에 정의된 SHA 해시 함수를 사용하여,
[FIPS-198-1]에 따라
해시 기반 메시지 인증 코드를 계산하고 검증한다.
다른 명세는 HMAC과 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업과, HMAC에 대한 키 가져오기 단계 및 키 내보내기 단계를 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"HMAC"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| sign | 없음 | 바이트 시퀀스 |
| verify | 없음 | boolean |
| generateKey | HmacKeyGenParams |
CryptoKey |
| importKey | HmacImportParams |
CryptoKey |
| exportKey | 없음 | object |
| get key length | HmacImportParams |
정수 |
WebIDLdictionary HmacImportParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hash 멤버는 사용할 내부 해시
함수를 나타낸다.
length 멤버는 키의 길이를
비트 단위로 나타낸다.
WebIDLdictionary HmacKeyAlgorithm : KeyAlgorithm {
required KeyAlgorithm hash;
required unsigned long length;
};
hash 멤버는 사용할 내부 해시 함수를 나타낸다.
length 멤버는 키의 길이를
비트 단위로 나타낸다.
WebIDLdictionary HmacKeyGenParams : Algorithm {
required HashAlgorithmIdentifier hash;
[EnforceRange] unsigned long length;
};
hash 멤버는 사용할 내부 해시
함수를 나타낸다.
length 멤버는 생성할 키의 길이를
비트 단위로 나타낸다. 지정하지 않으면 권장 길이가 사용되며, 이는 연결된 해시 함수의
블록 크기의 크기이다.
mac을 [FIPS-198-1]
4절에 설명된 MAC Generation 작업을 수행한 결과로 둔다. 이때
key의 [[handle]]
내부 슬롯이 나타내는 키와, key의
[[algorithm]] 내부
슬롯의 hash 속성이 식별하는 해시 함수,
그리고 message를 입력 데이터 text로 사용한다.
mac을 반환한다.
mac을 [FIPS-198-1]
4절에 설명된 MAC Generation 작업을 수행한 결과로 둔다. 이때
key의 [[handle]]
내부 슬롯이 나타내는 키와, key의
[[algorithm]] 내부
슬롯의 hash 속성이 식별하는 해시 함수,
그리고 message를 입력 데이터 text로 사용한다.
mac이 signature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환한다.
usages가 "sign" 또는
"verify"가 아닌 항목을 포함하면, throw하여 SyntaxError를
발생시킨다.
length비트 길이의 키를 생성한다.
키 생성 단계가 실패하면,
throw하여
OperationError를
발생시킨다.
key를 생성된 키를 나타내는 새
CryptoKey 객체로 둔다.
algorithm을 새
HmacKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"HMAC"으로 설정한다.
algorithm의 length
속성을
length로 설정한다.
hash를 새
KeyAlgorithm으로 둔다.
hash의 name 속성을
normalizedAlgorithm의
hash
멤버의 name
멤버와 같게 설정한다.
algorithm의 hash 속성을
hash로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key의 [[extractable]] 내부
슬롯을 extractable로 설정한다.
key의 [[usages]] 내부 슬롯을
usages로 설정한다.
key를 반환한다.
keyData를 가져올 키 데이터로 둔다.
usages가 "sign" 또는 "verify"가
아닌 항목을 포함하면,
throw하여
SyntaxError를
발생시킨다.
hash를 새 KeyAlgorithm으로 둔다.
raw"인 경우:
data를 keyData로 둔다.
hash를 normalizedAlgorithm의
hash
멤버와 같게 설정한다.
jwk"인 경우:
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk가 JSON Web Algorithms [JWA]
6.4절의 요구사항을 충족하지 않으면,
throw하여
DataError를
발생시킨다.
hash를 normalizedAlgorithm의 hash 멤버와
같게 설정한다.
name
속성이 "SHA-1"인 경우:
alg 필드가
존재하고 "HS1"이 아니면,
throw하여
DataError를
발생시킨다.
name
속성이 "SHA-256"인 경우:
alg 필드가
존재하고 "HS256"이 아니면,
throw하여
DataError를
발생시킨다.
name
속성이 "SHA-384"인 경우:
alg 필드가
존재하고 "HS384"이 아니면,
throw하여
DataError를
발생시킨다.
name
속성이 "SHA-512"인 경우:
alg 필드가
존재하고 "HS512"이 아니면,
throw하여
DataError를
발생시킨다.
name
속성이
다른 적용 가능한
명세에 정의된 경우:
usages가 비어 있지 않고 jwk의 use 필드가
존재하며 "sign"이 아니면,
throw하여
DataError를
발생시킨다.
jwk의 key_ops 필드가
존재하고,
JSON Web Key [JWK]의 요구사항에
따라 유효하지 않거나 지정된 usages 값을 모두 포함하지 않으면,
throw하여
DataError를
발생시킨다.
jwk의 ext 필드가 존재하고
값이 false이며 extractable이 true이면,
throw하여
DataError를
발생시킨다.
NotSupportedError를
발생시킨다.
length를 data의 비트 단위 길이로 둔다.
key를 data의 처음 length비트를 가진 HMAC 키를
나타내는 새 CryptoKey
객체로 둔다.
algorithm을 새
HmacKeyAlgorithm으로 둔다.
algorithm의 name 속성을
"HMAC"으로 설정한다.
algorithm의 length
속성을
length로 설정한다.
algorithm의 hash 속성을
hash로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
key의 [[handle]] 내부 슬롯이
나타내는 기반 암호화 키 자료에 접근할 수 없으면,
throw하여 OperationError를
발생시킨다.
bits를 key의 [[handle]] 내부 슬롯이
나타내는 키의 원시 비트로 둔다.
data를 bits를 포함하는 바이트 시퀀스로 둔다.
raw"인 경우:
result를 data로 둔다.
jwk"인 경우:
jwk를 새 JsonWebKey
딕셔너리로 둔다.
jwk의 kty 속성을
문자열 "oct"로 설정한다.
jwk의 k
속성을
data를 포함하는 문자열로 설정한다. 이 문자열은 JSON Web
Algorithms [JWA] 6.4절에 따라
인코딩된다.
algorithm을 key의
[[algorithm]]
내부 슬롯으로 둔다.
hash를 algorithm의
hash 속성으로
둔다.
name
속성이 "SHA-1"인 경우:
alg 속성을
문자열 "HS1"로 설정한다.name
속성이 "SHA-256"인 경우:
alg 속성을
문자열 "HS256"로 설정한다.name
속성이 "SHA-384"인 경우:
alg 속성을
문자열 "HS384"로 설정한다.name
속성이 "SHA-512"인 경우:
alg 속성을
문자열 "HS512"로 설정한다.name
속성이
다른 적용 가능한
명세에 정의된 경우:
다른 적용 가능한 명세가 정의한 키 내보내기 단계를 수행한다. 이때 format과 key를 전달하고 alg를 얻는다.
jwk의 alg 속성을
alg로 설정한다.
jwk의 key_ops 속성을 key의
usages 속성과
같게 설정한다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정한다.
result를 jwk로 둔다.
throw하여
NotSupportedError를
발생시킨다.
result를 반환한다.
length를 반환한다.
이 절은 비규범적이다.
이는 [FIPS-180-4]에 지정된 SHA-1 및 SHA-2 계열을 설명한다.
각 SHA 알고리즘에 대한 인식된 알고리즘
이름은
"SHA-1",
"SHA-256",
"SHA-384", 및
"SHA-512"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| digest | 없음 | 바이트 시퀀스 |
name 멤버가
"SHA-1"과 대소문자를 구분하는 문자열 일치인 경우:
name 멤버가
"SHA-256"과 대소문자를 구분하는 문자열 일치인 경우:
name 멤버가
"SHA-384"과 대소문자를 구분하는 문자열 일치인 경우:
name 멤버가
"SHA-512"과 대소문자를 구분하는 문자열 일치인 경우:
작업을 수행한 결과 오류가 발생하면, throw하여 OperationError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"HKDF" 알고리즘 식별자는
[RFC5869]에
설명된 추출 후 확장 접근 방식을 사용하고, 이 명세에 정의된 SHA 해시 함수를 사용하여
키 파생을 수행하는 데 사용된다.
다른 명세는 HKDF와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업을 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"HKDF"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| deriveBits | HkdfParams |
바이트 시퀀스 |
| importKey | 없음 | CryptoKey |
| Get key length | 없음 | null |
WebIDLdictionary HkdfParams : Algorithm {
required HashAlgorithmIdentifier hash;
required BufferSource salt;
required BufferSource info;
};
hash 멤버는 HMAC과 함께 사용할 알고리즘을 나타낸다
(예: SHA-256).
salt 멤버는 extract 단계에서 사용되는 salt를 나타낸다.
info 멤버는 파생된 키 자료에 대한 애플리케이션별 컨텍스트를
나타낸다.
length가 null이거나 8의 배수가 아니면, throw하여 OperationError를
발생시킨다.
keyDerivationKey를 key의 [[handle]] 내부 슬롯이
나타내는 secret으로 둔다.
result를 [RFC5869] 2절에 설명된 HKDF extract 단계와 그 뒤의 HKDF expand 단계를 수행한 결과로 둔다. 이때 다음을 사용한다:
키 파생 작업이 실패하면,
throw하여
OperationError를
발생시킨다.
result를 반환한다.
keyData를 가져올 키 데이터로 둔다.
raw"인 경우:
usages가
"deriveKey" 또는 "deriveBits"가 아닌 값을 포함하면,
throw하여
SyntaxError를
발생시킨다.
extractable이 false가 아니면,
throw하여
SyntaxError를
발생시킨다.
key를 keyData에 제공된 키 데이터를 나타내는 새
CryptoKey로 둔다.
algorithm을 새
KeyAlgorithm 객체로 둔다.
algorithm의 name 속성을
"HKDF"로 설정한다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
NotSupportedError를
발생시킨다.
null을 반환한다.
이 절은 비규범적이다.
"PBKDF2" 알고리즘 식별자는
이 명세에 정의된 SHA 해시 함수를 사용하고 HMAC을 의사 난수 함수로 사용하여,
[RFC8018]에
정의된 PKCS#5 비밀번호 기반 키
파생 함수 버전 2를 사용해 키 파생을 수행하는 데 사용된다.
다른 명세는 PBKDF2와 함께 추가 해시 알고리즘의 사용을 지정할 수 있다. 그러한 명세는 추가 해시 알고리즘에 대한 digest 작업을 정의해야 한다.
이 알고리즘의 인식된 알고리즘 이름은
"PBKDF2"이다.
| 작업 | 매개변수 | 결과 |
|---|---|---|
| deriveBits | Pbkdf2Params |
바이트 시퀀스 |
| importKey | 없음 | CryptoKey |
| Get key length | 없음 | null |
WebIDLdictionary Pbkdf2Params : Algorithm {
required BufferSource salt;
required [EnforceRange] unsigned long iterations;
required HashAlgorithmIdentifier hash;
};
Pbkdf2Params 딕셔너리는 salt 멤버, iterations 멤버, 그리고 hash 멤버를 가진다.
length가 null이거나 8의 배수가 아니면, throw하여 OperationError를
발생시킨다.
normalizedAlgorithm의 iterations 멤버가 0이면,
throw하여
OperationError를
발생시킨다.
length가 0이면, 빈 바이트 시퀀스를 반환한다.
prf를 [FIPS-198-1]
4절에 설명된 MAC Generation 함수로 둔다. 이때
normalizedAlgorithm의 hash 멤버가
설명하는 해시 함수를 사용한다.
result를 [RFC8018]
5.2절에 정의된 PBKDF2 작업을 수행한 결과로 둔다.
이때 prf를 의사 난수 함수 PRF로,
key의 [[handle]] 내부 슬롯이
나타내는 비밀번호를 비밀번호 P로,
normalizedAlgorithm의 salt 속성을 salt
S로,
normalizedAlgorithm의 iterations 속성의 값을
반복 횟수 c로, 그리고
length를 8로 나눈 값을 의도된 키 길이 dkLen으로 사용한다.
키 파생 작업이 실패하면,
throw하여
OperationError를
발생시킨다.
result를 반환한다.
format이 "raw"가 아니면, throw하여 NotSupportedError를
발생시킨다
usages가
"deriveKey" 또는 "deriveBits"가 아닌 값을 포함하면,
throw하여 SyntaxError를
발생시킨다.
extractable이 false가 아니면,
throw하여
SyntaxError를
발생시킨다.
key를 keyData를 나타내는 새 CryptoKey로 둔다.
algorithm을 새 KeyAlgorithm
객체로 둔다.
algorithm의 name 속성을
"PBKDF2"로 설정한다.
key의 [[algorithm]] 내부
슬롯을 algorithm으로 설정한다.
key를 반환한다.
null을 반환한다.
이 예제는 Alice용과 Bob용 X25519 키 쌍 두 개를 생성하고, 이들 사이에서 키 합의를 수행하며, SHA-256을 사용하는 HKDF로 그 결과에서 256비트 AES-GCM 키를 파생한 다음, 그 키로 일부 데이터를 암호화하고 복호화한다.
// 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);
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);
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);
const filename = `${crypto.randomUUID()}.txt`;
이 절은 JSON Web Key와 함께 사용하기 위해 다음 알고리즘 식별자를 IANA JSON Web Signature and Encryption Algorithms Registry에 등록한다. 템플릿의 'Implementation Requirements' 필드는 특히 JSON Web Signature 및 JSON Web Encryption과 함께 사용하는 경우를 가리키며, 이 경우 인증되지 않은 암호화의 사용은 금지된다는 점에 유의한다.
원저자이자 편집자인 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 메일링 리스트의 참여자들에게 감사한다.
W3C는 W3C/MIT를 지원한 Northrop Grumman Cybersecurity Research Consortium에 감사를 표한다.
getRandomValues
메서드는 Crypto 인터페이스에서 Adam Barth가
WHATWG에 처음 제안했다.
이 절은 비규범적이다.
JWK 가져오기 및 내보내기의 규범적 요구사항은 알고리즘별 절을 참조한다.
| JSON Web Key | AlgorithmIdentifier |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
이 절은 비규범적이다.
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"
키 형식을 사용하는 것이 권장된다.
이 절은 비규범적이다.
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] |
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in:
Referenced in: