Copyright © 2026 the Contributors to the Modern Algorithms in the Web Cryptography API Specification, published by the Web Platform Incubator Community Group under the W3C Community Contributor License Agreement (CLA). A human-readable summary is available.
이 명세는 Web 암호화 API를 위한 여러 포스트 양자 보안 및 최신 암호화 알고리즘을 정의합니다. 구체적으로 ML-KEM, Hybrid KEMs, ML-DSA, SLH-DSA, AES-OCB, ChaCha20-Poly1305, SHA-3, cSHAKE, TurboSHAKE, KangarooTwelve, KMAC, 그리고 Argon2입니다.
이 명세는 Web Platform Incubator 커뮤니티 그룹에서 게시했다. 이 문서는 W3C 표준이 아니며 W3C 표준화 과정에 포함되지도 않는다. 다음 W3C 커뮤니티 기여자 라이선스 계약 (CLA)에 따라 제한적인 참여 철회가 가능하며 기타 조건이 적용됨에 유의한다. W3C 커뮤니티 및 비즈니스 그룹에 대해 자세히 알아볼 수 있다.
이 문서는 비공식 제안이다.
이 명세에 관한 논의에는 GitHub 이슈를 사용하는 것이 권장된다.
이 절은 비규범적이다.
이 제안은 Web 암호화 API에서 사용할 수 있는 암호화 알고리즘 집합을 현대화하여, 웹 애플리케이션이 포스트 양자 보안 및 고성능 암호화 알고리즘을 사용할 수 있도록 하는 것을 목표로 합니다. 이를 위해 다음 암호화 알고리즘이 추가됩니다:
ML-KEM, 하이브리드 KEM 및 향후 추가될 수 있는 다른 KEM의 사용을 지원하기 위해,
이 제안은 키 캡슐화 및 캡슐화 해제를 위한 함수를 도입합니다;
SubtleCrypto.encapsulateKey,
SubtleCrypto.encapsulateBits,
SubtleCrypto.decapsulateKey 및
SubtleCrypto.decapsulateBits입니다.
또한 이 제안은 SubtleCrypto.getPublicKey 함수를 도입하며,
이 함수는 비대칭 개인 키에서 공개 키를 파생하는 편리한 방법을 제공하여,
개인 키만 필요한 경우 공개 키와 개인 키를 모두 별도로 저장할 필요를
없애 줍니다.
마지막으로 이 제안은 기능 감지를 더 쉽게 하는 것을 목표로 하며,
SubtleCrypto.supports 함수를 추가합니다.
이 함수는 주어진 알고리즘 식별자
(모든 매개변수 포함)가 주어진 연산에서 지원되는지 감지하는 데 사용할 수 있습니다.
이 명세는 [webcrypto]의 18.3절에 규정된 규칙을 따른다. 여기에서 정의하는 알고리즘은 어떠한 것도 반드시 구현해야 하는 것은 아니지만, 적합한 사용자 에이전트가 알고리즘을 구현하는 경우 이 문서에 명시된 지원되는 모든 연산을 반드시 구현해야 하며, 지원되는 각 연산에 대해 [webcrypto]의 18.4.3절에 명시된 알고리즘 정의 단계를 수행해야 한다.
[webcrypto]에 정의된 지원되는 연산에 더해, 이 명세에서는 다음 연산을 사용한다:
이 절은 [webcrypto]의
SubtleCrypto 인터페이스를
확장한다.
WebIDL[SecureContext,Exposed=(Window,Worker)]
partial interface SubtleCrypto {
Promise<EncapsulatedBits> encapsulateBits(
AlgorithmIdentifier encapsulationAlgorithm,
CryptoKey encapsulationKey
);
Promise<ArrayBuffer> decapsulateBits(
AlgorithmIdentifier decapsulationAlgorithm,
CryptoKey decapsulationKey,
BufferSource ciphertext
);
Promise<CryptoKey> getPublicKey(
CryptoKey key,
sequence<KeyUsage> keyUsages
);
static boolean supports(DOMString operation,
AlgorithmIdentifier algorithm,
optional [EnforceRange] unsigned long? length = null);
static boolean supports(DOMString operation,
AlgorithmIdentifier algorithm,
AlgorithmIdentifier additionalAlgorithm);
};
이 명세는 [webcrypto]의 KeyFormat
정의를 다음으로 대체한다.
WebIDLenum KeyFormat { "raw-public", "raw-private", "raw-seed", "raw-secret", "raw", "spki", "pkcs8", "jwk" };
이 명세는 여러 새로운 인식되는 키 형식 값을 명시한다.
raw-publicraw-privateraw-seedraw-secret
[webcrypto]의
기존 모든 대칭 알고리즘에서 "raw-secret"은 "raw"의 별칭으로 동작한다.
[webcrypto]의
기존 모든 비대칭 알고리즘에서 "raw-public"은 "raw"의 별칭으로 동작한다.
deriveKey()
메서드의 키 가져오기 단계에서는 "raw" 대신
"raw-secret"을 형식으로 사용해야 한다.
이 명세는 [webcrypto]의 KeyUsage
정의를 다음으로 대체한다.
WebIDLenum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" };
이 명세는 여러 새로운 인식되는 키 용도 값을 명시한다.
encapsulateKeySubtleCrypto.encapsulateKey에서
키를 사용할 수 있도록 한다.encapsulateBitsSubtleCrypto.encapsulateBits에서
키를 사용할 수 있도록 한다.
decapsulateKeySubtleCrypto.decapsulateKey에서
키를 사용할 수 있도록 한다.decapsulateBitsSubtleCrypto.decapsulateBits에서
키를 사용할 수 있도록 한다.
encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages)
메서드는 키를 캡슐화하고 EncapsulatedKey 객체를
반환한다.
다음과 같이 동작한다.
encapsulationAlgorithm, encapsulationKey,
sharedKeyAlgorithm,
extractable 및 usages를 각각
encapsulateKey()
메서드에 전달된 encapsulationAlgorithm,
encapsulationKey,
sharedKeyAlgorithm, extractable 및 keyUsages
매개변수로 둔다.
alg를 encapsulationAlgorithm로 설정하고 op를
"encapsulate"로 설정하여
알고리즘을
정규화한 결과를 normalizedEncapsulationAlgorithm로 둔다.
오류가 발생한 경우 normalizedEncapsulationAlgorithm로 거부된 Promise를 반환한다.
alg를 sharedKeyAlgorithm로 설정하고 op를
"importKey"로 설정하여
알고리즘을
정규화한 결과를 normalizedSharedKeyAlgorithm로 둔다.
오류가 발생한 경우 normalizedSharedKeyAlgorithm로 거부된 Promise를 반환한다.
promise를 새로운 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.
normalizedEncapsulationAlgorithm의
name
멤버가 encapsulationKey의
[[algorithm]]
내부 슬롯에 있는
name
속성과 같지 않으면 InvalidAccessError를
발생시킨다.
encapsulationKey의
[[usages]]
내부 슬롯에 "encapsulateKey"인 항목이 포함되어 있지 않으면
InvalidAccessError를
발생시킨다.
encapsulationKey을 사용하여
encapsulationKey의
[[algorithm]]
내부 슬롯에서 지정한 캡슐화 연산을 수행한 결과를
encapsulatedBits로 둔다.
normalizedSharedKeyAlgorithm에서 지정한 키 가져오기 연산을 수행한 결과를
sharedKey로 둔다. 이때 "raw-secret"을
format으로, encapsulatedBits의
sharedKey 필드를
keyData로, sharedKeyAlgorithm을
algorithm으로 사용하고
extractable 및 usages를 사용한다.
sharedKey의
[[extractable]]
내부 슬롯을 extractable로 설정한다.
sharedKey의
[[usages]]
내부 슬롯을 usages의
정규화된 값으로
설정한다.
새로운 EncapsulatedKey
딕셔너리를
encapsulatedKey로 둔다. 이 딕셔너리의
sharedKey는
sharedKey로 설정하고,
ciphertext는
encapsulatedBits의
ciphertext 필드로
설정한다.
realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.
[WebIDL]에 정의된 대로 encapsulatedKey를 realm의 ECMAScript 객체로 변환한 결과를 result로 둔다.
promise를 result로 이행한다.
encapsulateBits(encapsulationAlgorithm, encapsulationKey)
메서드는 키를 캡슐화하고 EncapsulatedBits 객체를
반환한다.
다음과 같이 동작한다.
encapsulationAlgorithm 및 encapsulationKey을 각각
encapsulateBits()
메서드에 전달된 encapsulationAlgorithm
및 encapsulationKey 매개변수로 둔다.
alg를 encapsulationAlgorithm로 설정하고 op를
"encapsulate"로 설정하여
알고리즘을
정규화한 결과를 normalizedEncapsulationAlgorithm로 둔다.
오류가 발생한 경우 normalizedEncapsulationAlgorithm로 거부된 Promise를 반환한다.
promise를 새로운 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.
normalizedEncapsulationAlgorithm의
name
멤버가 encapsulationKey의
[[algorithm]]
내부 슬롯에 있는
name
속성과 같지 않으면 InvalidAccessError를
발생시킨다.
encapsulationKey의
[[usages]]
내부 슬롯에 "encapsulateBits"인 항목이 포함되어 있지 않으면
InvalidAccessError를
발생시킨다.
encapsulationKey을 사용하여
encapsulationKey의
[[algorithm]]
내부 슬롯에서 지정한 캡슐화 연산을 수행한 결과를
encapsulatedBits로 둔다.
realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.
[WebIDL]에 정의된 대로 encapsulatedBits를 realm의 ECMAScript 객체로 변환한 결과를 result로 둔다.
promise를 result로 이행한다.
decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages)
메서드는 키의 캡슐화를 해제하고 CryptoKey 객체를 반환한다.
다음과 같이 동작한다.
decapsulationAlgorithm, decapsulationKey,
sharedKeyAlgorithm,
extractable 및 usages를 각각
decapsulateKey()
메서드에 전달된 decapsulationAlgorithm,
decapsulationKey, sharedKeyAlgorithm, extractable 및
keyUsages 매개변수로 둔다.
alg를 decapsulationAlgorithm로 설정하고 op를
"decapsulate"로 설정하여
알고리즘을
정규화한 결과를 normalizedDecapsulationAlgorithm로 둔다.
오류가 발생한 경우 normalizedDecapsulationAlgorithm로 거부된 Promise를 반환한다.
alg를 sharedKeyAlgorithm로 설정하고 op를
"importKey"로 설정하여
알고리즘을
정규화한 결과를 normalizedSharedKeyAlgorithm로 둔다.
오류가 발생한 경우 normalizedSharedKeyAlgorithm로 거부된 Promise를 반환한다.
ciphertext를 decapsulateKey()
메서드에 전달된 ciphertext 매개변수가 보유한
바이트의 복사본을
가져온 결과로 둔다.
promise를 새로운 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.
normalizedDecapsulationAlgorithm의
name
멤버가 decapsulationKey의
[[algorithm]]
내부 슬롯에 있는
name
속성과 같지 않으면 InvalidAccessError를
발생시킨다.
decapsulationKey의
[[usages]]
내부 슬롯에 "decapsulateKey"인 항목이 포함되어 있지 않으면
InvalidAccessError를
발생시킨다.
decapsulationKey 및 ciphertext를 사용하여
decapsulationKey의
[[algorithm]]
내부 슬롯에서 지정한 캡슐화 해제 연산을 수행한 결과를
decapsulatedBits로 둔다.
normalizedSharedKeyAlgorithm에서 지정한 키 가져오기 연산을 수행한 결과를
sharedKey로 둔다. 이때 "raw-secret"을
format으로, decapsulatedBits를 keyData로,
sharedKeyAlgorithm을
algorithm으로 사용하고
extractable 및 usages를 사용한다.
sharedKey의
[[extractable]]
내부 슬롯을 extractable로 설정한다.
sharedKey의
[[usages]]
내부 슬롯을 usages의
정규화된 값으로
설정한다.
realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.
[WebIDL]에 정의된 대로 sharedKey를 realm의 ECMAScript 객체로 변환한 결과를 result로 둔다.
promise를 result로 이행한다.
decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext)
메서드는 키의 캡슐화를 해제하고 ArrayBuffer 객체를 반환한다.
다음과 같이 동작한다.
decapsulationAlgorithm 및 decapsulationKey을 각각
decapsulateBits()
메서드에 전달된 decapsulationAlgorithm 및
decapsulationKey 매개변수로 둔다.
alg를 decapsulationAlgorithm로 설정하고 op를
"decapsulate"로 설정하여
알고리즘을
정규화한 결과를 normalizedDecapsulationAlgorithm로 둔다.
오류가 발생한 경우 normalizedDecapsulationAlgorithm로 거부된 Promise를 반환한다.
ciphertext를 decapsulateBits()
메서드에 전달된 ciphertext 매개변수가 보유한
바이트의 복사본을
가져온 결과로 둔다.
promise를 새로운 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.
normalizedDecapsulationAlgorithm의
name
멤버가 decapsulationKey의
[[algorithm]]
내부 슬롯에 있는
name
속성과 같지 않으면 InvalidAccessError를
발생시킨다.
decapsulationKey의
[[usages]]
내부 슬롯에 "decapsulateBits"인 항목이 포함되어 있지 않으면
InvalidAccessError를
발생시킨다.
decapsulationKey 및 ciphertext를 사용하여
decapsulationKey의
[[algorithm]]
내부 슬롯에서 지정한 캡슐화 해제 연산을 수행한 결과를
decapsulatedBits로 둔다.
realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.
realm에서 decapsulatedBits를 포함하는
ArrayBuffer를
생성한 결과를
result로 둔다.
promise를 result로 이행한다.
getPublicKey(key, usages)
메서드는 지정된 비밀 키에 대응하는 공개 키를 반환한다.
다음과 같이 동작한다.
key 및 usages를 각각
getPublicKey()
메서드에 전달된 key 및 keyUsages
매개변수로 둔다.
algorithm을 key의
[[algorithm]]
내부 슬롯으로 둔다.
algorithm이 식별하는 암호 알고리즘이 비밀 키에서 공개 키를
파생하는 기능을 지원하지 않으면 NotSupportedError로
거부된 Promise를 반환한다.
promise를 새로운 Promise로 둔다.
promise를 반환하고 나머지 단계를 병렬로 수행한다.
다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.
key의
[[type]]
내부 슬롯이 "private"이
아니면 InvalidAccessError를
발생시킨다.
usages에 algorithm이 식별하는 알고리즘이
공개 키에 대해 지원하지 않는 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
key의
[[handle]]
내부 슬롯이 나타내는 비밀 키에 대응하는 공개 키를 나타내는 새로운
CryptoKey를
publicKey로 둔다.
오류가 발생한 경우 OperationError를
발생시킨다.
publicKey의
[[algorithm]]
내부 슬롯을 algorithm으로 설정한다.
publicKey의
[[extractable]]
내부 슬롯을 true로 설정한다.
publicKey의
[[usages]]
내부 슬롯을 usages로 설정한다.
realm의 전역 객체를 지정하여 암호화 작업 소스에 전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.
[WebIDL]에 정의된 대로 publicKey를 realm의 ECMAScript 객체로 변환한 결과를 result로 둔다.
promise를 result로 이행한다.
supports(operation, algorithm, length)
메서드는 지정된 AlgorithmIdentifier를
사용하여 주어진 연산을
구현이 지원하는지 여부를 나타내는 불리언 값을 반환하며,
operation이 "deriveBits"일 때 파생할 비트 수를 나타내는 선택적
length 매개변수를 사용한다.
다음과 같이 동작한다:
operation이 다음 중 하나가 아니면
"encrypt", "decrypt", "sign", "verify",
"digest", "generateKey", "deriveKey",
"deriveBits",
"importKey", "exportKey", "wrapKey",
"unwrapKey",
"encapsulateKey", "encapsulateBits",
"decapsulateKey", "decapsulateBits" 또는
"getPublicKey",
false를 반환한다.
알고리즘 지원 여부를
확인한 결과를 반환한다.
이때 op는 operation으로, alg는
algorithm으로,
length는 length로 설정한다.
supports(operation, algorithm, additionalAlgorithm)
메서드는 지정된 AlgorithmIdentifier를
사용하여 주어진 연산을
구현이 지원하는지 여부를 나타내는 불리언 값을 반환한다.
추가 알고리즘은 operation이
"deriveKey"일 때 파생할 키의 유형,
operation이
"wrapKey"일 때 래핑하기 전에 내보낼 키의 유형,
그리고 operation이
"unwrapKey"일 때 언래핑한 후 가져올 키의 유형을 나타낸다.
다음과 같이 동작한다:
operation이 다음 중 하나가 아니면
"encrypt", "decrypt", "sign", "verify",
"digest", "generateKey", "deriveKey",
"deriveBits",
"importKey", "exportKey", "wrapKey",
"unwrapKey",
"encapsulateKey", "encapsulateBits",
"decapsulateKey", "decapsulateBits" 또는
"getPublicKey",
false를 반환한다.
deriveKey" 또는 "unwrapKey"인 경우:
알고리즘
지원 여부를 확인한 결과가
op를 "importKey"로 설정하고
alg를 additionalAlgorithm으로 설정했을 때
false이면,
false를 반환한다.
wrapKey"인 경우:
알고리즘
지원 여부를 확인한 결과가
op를 "exportKey"로 설정하고
alg를 additionalAlgorithm으로 설정했을 때
false이면,
false를 반환한다.
encapsulateKey" 또는
"decapsulateKey"인 경우:
normalizedAlgorithm을
알고리즘을
정규화한 결과로 설정한다. 이때
alg는 algorithm으로, op는
"get shared key length"로 설정한다.
오류가 발생한 경우 false를 반환한다.
sharedKeyLength를 normalizedAlgorithm이 지정한 공유 키 길이 가져오기 알고리즘을 algorithm을 사용하여 수행한 결과로 설정한다.
normalizedAdditionalAlgorithm을
알고리즘을
정규화한 결과로 설정한다. 이때
alg는 additionalAlgorithm으로, op는
"importKey"로
설정한다.
오류가 발생한 경우 false를 반환한다.
연산 단계에서
지원 여부를 결정한 결과가
op를 "importKey"로 설정하고
normalizedAlgorithm을
normalizedAdditionalAlgorithm으로 설정하며, length를
null로 설정했을 때 false이면,
false를 반환한다.
normalizedAdditionalAlgorithm이 지정한 키 가져오기 연산이
format이 "raw-secret"일 때
비트 단위 길이가 sharedKeyLength인
바이트 시퀀스인
모든 keyData 값에 대해 오류를
발생시키는 경우,
false를 반환한다.
length를 null로 설정한다.
deriveKey"인 경우:
알고리즘
지원 여부를 확인한 결과가
op를 "get key length"로 설정하고
alg를 additionalAlgorithm으로 설정했을 때
false이면,
false를 반환한다.
normalizedAdditionalAlgorithm을
알고리즘을
정규화한 결과로 설정한다. 이때
alg는 additionalAlgorithm으로, op는
"get key length"로
설정한다.
length를 additionalAlgorithm이 지정한 키 길이 가져오기 알고리즘을 normalizedAdditionalAlgorithm을 사용하여 수행한 결과로 설정한다.
operation을 "deriveBits"로 설정한다.
알고리즘 지원 여부를
확인한 결과를 반환한다.
이때 op는 operation으로, alg는
algorithm으로,
length는 length로 설정한다.
알고리즘
지원 여부 확인 알고리즘은
주어진 연산에 대해 주어진 알고리즘이 지원되는지 확인하는 프로세스를 정의한다.
입력은 연산 이름 op, AlgorithmIdentifier
alg,
그리고 length 매개변수이다. 출력은 불리언이다.
다음과 같이 동작한다:
op가 "encapsulateKey" 또는 "encapsulateBits"이면,
op를 "encapsulate"로 설정한다.
op가 "decapsulateKey" 또는 "decapsulateBits"이면,
op를 "decapsulate"로 설정한다.
getPublicKey"인 경우:
normalizedAlgorithm을
알고리즘을
정규화한 결과로 설정한다. 이때
alg는 alg로, op는
"exportKey"로 설정한다.
오류가 발생한 경우 false를 반환한다.
normalizedAlgorithm이 식별하는 암호화 알고리즘이 개인 키에서 공개 키를 파생하는 것을 지원하지 않으면, false를 반환한다.
그렇지 않으면 true를 반환한다.
normalizedAlgorithm을
알고리즘을
정규화한 결과로 설정한다. 이때
alg는 alg로, op는 op로 설정한다.
op가 "wrapKey"이면,
알고리즘 지원 여부를
확인한 결과를 반환한다.
이때 op는 "encrypt"로,
alg는 alg로 설정한다.
op가 "unwrapKey"이면,
알고리즘 지원 여부를
확인한 결과를 반환한다.
이때 op는 "decrypt"로,
alg는 alg로 설정한다.
그렇지 않으면 false를 반환한다.
연산 단계에서 지원 여부를
결정한 결과를 반환한다.
이때 op는 op로, normalizedAlgorithm은
normalizedAlgorithm로,
length는 length로 설정한다.
연산 단계에서 지원 여부 결정 알고리즘은
정규화된 알고리즘의 연산 단계가 지원을 나타내는지 여부를 결정한다.
입력은 연산 이름 op, Algorithm
normalizedAlgorithm,
그리고 length 매개변수이다. 출력은 불리언이다.
다음과 같이 동작한다:
지정된 연산 또는 정규화된 알고리즘(또는 그 매개변수 값 중 하나)이 구현별 이유로 (어떤 키 및/또는 데이터에 대해서도) 실패할 것으로 예상되는 경우 (예: 명세를 준수하지 않는 것으로 알려진 경우), false를 반환한다.
op가 "generateKey" 또는 "importKey"이면,
usages를 빈 목록으로 설정한다.
normalizedAlgorithm이 지정한 알고리즘에서 op가 지정한 연산의 각 단계에 대해:
key,
plaintext 또는 ciphertext와 같이 사용할 수 없는 매개변수에 의존하는 경우:
참조된 알고리즘의 단계는 이 컨텍스트의 normalizedAlgorithm, length, 그리고 usages 변수에 접근할 수 있다.
단언: 이 단계에는 절대로 도달하지 않는다. 연산의 단계 중 하나가 값을 반환하거나 오류를 발생시키라고 했을 것이므로, 각각 true 또는 false를 반환하게 되기 때문이다.
WebIDLdictionary EncapsulatedKey {
ArrayBuffer ciphertext;
};
dictionary EncapsulatedBits {
ArrayBuffer ciphertext;
};
EncapsulatedKey 딕셔너리는 sharedKey와 ciphertext로 구성된 캡슐화된 키를 나타낸다.
EncapsulatedBits 딕셔너리는 sharedKey와 ciphertext로 구성된 캡슐화된 키 비트를 나타낸다.
WebIDLpartial dictionary JsonWebKey {
// 다음 필드는 RFC 9964에 정의되어 있다
DOMString pub;
DOMString priv;
};
[webcrypto]에 정의된 JsonWebKey 딕셔너리의
이 확장은 [RFC9964]에 정의된 "AKP" 키
형식으로 키를 나타내는
방법을 제공한다.
이 섹션은 비규범적입니다.
여기에서는 [FIPS-203]에 명시된 대로, 키 캡슐화 및 캡슐화 해제에 ML-KEM을 사용하는 방법을 설명합니다.
이 알고리즘에 대해 인식되는 알고리즘
이름은
"ML-KEM-512", "ML-KEM-768" 및 "ML-KEM-1024"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encapsulate | 없음 | EncapsulatedBits |
| decapsulate | 없음 | 바이트 시퀀스 |
| 공유 키 길이 가져오기 | 없음 | 정수 |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
ML-KEM 키는 JWK 표현에 [RFC9964]에 정의된 "AKP"(Algorithm Key Pair) 키 유형을 사용합니다. "alg"(algorithm) 매개변수는 특정 ML-KEM 매개변수 세트를 식별합니다. 공개 키는 "pub" 매개변수에 담깁니다. 비공개 키가 포함된 경우에는 "priv" 매개변수를 사용하여 표현합니다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩됩니다.
key의 [[type]]
내부 슬롯이
"public"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
[FIPS-203]의
섹션 7.2에 설명된 캡슐화 키 검사를 수행합니다. 이때
algorithm의 name
멤버가 나타내는 매개변수 세트를 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.
성능을 위해 필요하다면 이 검사의 결과를
CryptoKey
객체에 대해 캐시하거나 미리 계산할 수 있습니다.
캡슐화 키 검사가 실패한 경우 OperationError를
반환합니다.
sharedKey와 ciphertext를
[FIPS-203]의
섹션 7.2에 설명된 ML-KEM.Encaps 함수를 수행하여 얻은 출력이라고 합니다.
이때 algorithm의 name
멤버가 나타내는 매개변수 세트를 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.
ML-KEM.Encaps 함수가 오류를 반환한 경우 OperationError를
반환합니다.
result를 새 EncapsulatedBits
사전이라고 합니다.
result의 sharedKey 속성을
sharedKey를 포함하는
ArrayBuffer를
생성한
결과로 설정합니다.
result의 ciphertext 속성을
ciphertext를 포함하는
ArrayBuffer를
생성한
결과로 설정합니다.
result를 반환합니다.
key의 [[type]]
내부 슬롯이
"private"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
[FIPS-203]의
섹션 7.3에 설명된 캡슐화 해제 입력 검사를 수행합니다.
이때 algorithm의 name
멤버가 나타내는 매개변수 세트를 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 dk 입력 매개변수로,
ciphertext를 c 입력 매개변수로 사용합니다.
성능을 위해 필요하다면 캡슐화 해제 키 유형 검사와 해시 검사의 결과를
CryptoKey
객체에 대해 캐시하거나 미리 계산할 수 있습니다.
캡슐화 해제 키 검사가 실패한 경우 OperationError를
반환합니다.
sharedKey를
[FIPS-203]의
섹션 7.3에 설명된 ML-KEM.Decaps 함수를 수행하여 얻은 출력이라고 합니다.
이때 algorithm의 name
멤버가 나타내는 매개변수 세트를 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 dk 입력 매개변수로,
ciphertext를 c 입력 매개변수로 사용합니다.
sharedKey를 반환합니다.
usages에
"encapsulateKey", "encapsulateBits",
"decapsulateKey" 또는 "decapsulateBits" 중 하나가 아닌 항목이
포함되어 있는 경우 예외를
발생시켜
SyntaxError로
처리합니다.
[FIPS-203]의
섹션 7.1에 설명된 대로 ML-KEM 키 쌍을 생성하며,
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 세트를 사용합니다.
시드 (d, z)를 내보낼 수 있도록 하려면,
d와 z를 생성된 키 자료의 일부로 저장해야 합니다.
키 생성 단계가 실패한 경우
예외를 발생시켜
OperationError로
처리합니다.
algorithm을 새 KeyAlgorithm
객체라고 합니다.
publicKey를 생성된 키 쌍의 캡슐화 키를 나타내는 새
CryptoKey라고
합니다.
publicKey의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
publicKey의 [[extractable]]
내부 슬롯을 true로 설정합니다.
publicKey의 [[usages]]
내부 슬롯을
usages와 [ "encapsulateKey", "encapsulateBits" ]의
용도
교집합으로 설정합니다.
privateKey를 생성된 키 쌍의 캡슐화 해제 키를 나타내는 새
CryptoKey라고
합니다.
privateKey의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
privateKey의 [[extractable]]
내부 슬롯을 extractable로 설정합니다.
privateKey의 [[usages]]
내부 슬롯을
usages와 [ "decapsulateKey", "decapsulateBits" ]의
용도
교집합으로 설정합니다.
result를 새 CryptoKeyPair
사전이라고 합니다.
result의 publicKey
속성을 publicKey로 설정합니다.
result의 privateKey
속성을 privateKey로 설정합니다.
result를 반환합니다.
keyData를 가져올 키 데이터라고 합니다.
spki"인 경우:
usages에
"encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
spki를 keyData에 대해 subjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과라고 합니다.
name
멤버가 "ML-KEM-512"인 경우:
expectedOid를 id-alg-ml-kem-512
(2.16.840.1.101.3.4.4.1)라고 합니다.
name
멤버가 "ML-KEM-768"인 경우:
expectedOid를 id-alg-ml-kem-768
(2.16.840.1.101.3.4.4.2)라고 합니다.
name
멤버가 "ML-KEM-1024"인 경우:
expectedOid를 id-alg-ml-kem-1024
(2.16.840.1.101.3.4.4.3)라고 합니다.
예외를 발생시켜
NotSupportedError로
처리합니다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm 객체 식별자 필드가
expectedOid와 같지 않은 경우
예외를
발생시켜
DataError로
처리합니다.
spki의 algorithm
AlgorithmIdentifier 필드에 parameters 필드가 존재하는 경우
예외를
발생시켜
DataError로
처리합니다.
publicKey를 spki의
subjectPublicKey 필드가 식별하는 ML-KEM 공개 키라고 합니다.
key를 publicKey를 나타내는 새
CryptoKey라고
합니다.
algorithm을 새 KeyAlgorithm이라고
합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
pkcs8"인 경우:
usages에
"decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 구문 분석 알고리즘을 실행한 결과라고 합니다.
name
멤버가 "ML-KEM-512"인 경우:
expectedOid를 id-alg-ml-kem-512
(2.16.840.1.101.3.4.4.1)라고 합니다.
asn1Structure를 ASN.1
ML-KEM-512-PrivateKey 구조라고 합니다.
name
멤버가 "ML-KEM-768"인 경우:
expectedOid를 id-alg-ml-kem-768
(2.16.840.1.101.3.4.4.2)라고 합니다.
asn1Structure를 ASN.1
ML-KEM-768-PrivateKey 구조라고 합니다.
name
멤버가 "ML-KEM-1024"인 경우:
expectedOid를 id-alg-ml-kem-1024
(2.16.840.1.101.3.4.4.3)라고 합니다.
asn1Structure를 ASN.1
ML-KEM-1024-PrivateKey 구조라고 합니다.
예외를 발생시켜
NotSupportedError로
처리합니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm 객체 식별자 필드가 expectedOid와 같지 않은 경우
예외를
발생시켜
DataError로
처리합니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에
parameters 필드가 존재하는 경우
예외를
발생시켜
DataError로
처리합니다.
mlKemPrivateKey를
data에는 privateKeyInfo의 privateKey 필드를,
structure에는 asn1Structure를 지정하고
exactData를 true로 설정하여
ASN.1
구조
구문 분석
알고리즘을 수행한 결과라고 합니다.
mlKemPrivateKey가 expandedKey 형식의 ML-KEM 키를
나타내거나,
mlKemPrivateKey가 both 형식의 ML-KEM 키를 나타내고
both 형식이 지원되지 않는 경우 NotSupportedError
예외를 발생시킵니다.
mlKemPrivateKey가 both 형식의 ML-KEM 키를 나타내고,
seed 필드가 expandedKey 필드와 일치하지 않는 경우
DataError
예외를 발생시킵니다.
key를 mlKemPrivateKey가 식별하는
ML-KEM 비공개 키를 나타내는 새 CryptoKey라고
합니다.
algorithm을 새 KeyAlgorithm이라고
합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-public"인 경우:
usages에
"encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
data를 keyData라고 합니다.
key를 data의 ML-KEM 공개 키 데이터를 나타내는 새
CryptoKey라고
합니다.
algorithm을 새 KeyAlgorithm이라고
합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-seed"인 경우:
usages에
"decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
data를 keyData라고 합니다.
privateKey를
[FIPS-203]의
섹션 6.1에 설명된 ML-KEM.KeyGen_internal 함수를 수행한 결과라고 합니다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 세트를 사용하고,
data의 처음 256비트를 d로,
마지막 256비트를 z로 사용합니다.
key를 privateKey가 식별하는 ML-KEM 비공개 키를 나타내는 새
CryptoKey라고
합니다.
algorithm을 새 KeyAlgorithm이라고
합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
jwk"인 경우:JsonWebKey
사전인 경우:jwk를 keyData와 같다고 합니다.
jwk의 priv 필드가 존재하고
usages에
"decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
jwk의 priv 필드가 존재하지 않고
usages에
"encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이
포함되어 있는 경우 예외를 발생시켜
SyntaxError로
처리합니다.
jwk의 alg
필드가 존재하지 않거나, 그 값이
normalizedAlgorithm의 name
멤버가 나타내는 ML-KEM 매개변수 세트를 식별하지 않는 경우
예외를
발생시켜
DataError로
처리합니다.
이 명세에서 정의한 ML-KEM 매개변수 세트에 대해
IANA
JSON 웹 서명 및 암호화 알고리즘 레지스트리에
등록된 "alg" 값은 ML-KEM-512, ML-KEM-768,
ML-KEM-1024입니다.
구현은 동일한 ML-KEM 매개변수 세트를 사용하는 JWE 알고리즘을 식별하는
이 레지스트리의 다른 값도 허용해야 합니다. 단, 해당 JWE 알고리즘의
JWK 표현은 "alg" 값을 제외하고 여기서 정의한 표현과 호환되어야 합니다.
예로는 등록된 이후의
[draft-ietf-jose-hpke-pq-pqt]에서
제안한 값이 있습니다.
usages가 비어 있지 않고 jwk의
use
필드가 존재하며
"enc"와 같지 않은 경우 예외를 발생시켜
DataError로
처리합니다.
jwk의 key_ops
필드가 존재하면서 JSON 웹 키
[JWK]의 요구사항에 따라 유효하지 않거나,
지정된 usages 값을 모두 포함하지 않는 경우
예외를
발생시켜
DataError로
처리합니다.
jwk의 ext
필드가 존재하고 그 값이 false이며 extractable이 true인 경우
예외를
발생시켜
DataError로
처리합니다.
priv 필드가
존재하는 경우:
algorithm을 새 KeyAlgorithm
객체의 인스턴스라고 합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
NotSupportedError로
처리합니다.
key를 반환합니다.
key를 내보낼 CryptoKey라고
합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기반 암호화 키 자료에
접근할 수 없는 경우 예외를
발생시켜
OperationError로
처리합니다.
spki"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯이라고 합니다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 하며 다음 속성을 갖도록 합니다.
algorithm 필드를 다음 속성을 갖는
AlgorithmIdentifier ASN.1 유형으로 설정합니다.
name
멤버가
"ML-KEM-512"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-512
(2.16.840.1.101.3.4.4.1) OID로 설정합니다.
name
멤버가
"ML-KEM-768"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-768
(2.16.840.1.101.3.4.4.2) OID로 설정합니다.
name
멤버가
"ML-KEM-1024"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-1024
(2.16.840.1.101.3.4.4.3) OID로 설정합니다.
예외를
발생시켜
NotSupportedError로
처리합니다.
subjectPublicKey 필드를 keyData로 설정합니다.
result를 data를 DER 인코딩한 결과라고 합니다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯이라고 합니다.
data를 [RFC5208]에
정의된 PrivateKeyInfo
ASN.1 구조의 인스턴스로 하며 다음 속성을 갖도록 합니다.
version 필드를 0으로 설정합니다.
privateKeyAlgorithm 필드를 다음 속성을 갖는
PrivateKeyAlgorithmIdentifier ASN.1 유형으로
설정합니다.
name
멤버가
"ML-KEM-512"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-512
(2.16.840.1.101.3.4.4.1) OID로 설정합니다.
name
멤버가
"ML-KEM-768"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-768
(2.16.840.1.101.3.4.4.2) OID로 설정합니다.
name
멤버가
"ML-KEM-1024"인 경우:
algorithm 객체 식별자를
id-alg-ml-kem-1024
(2.16.840.1.101.3.4.4.3) OID로 설정합니다.
예외를
발생시켜
NotSupportedError로
처리합니다.
privateKey 필드를 다음과 같이 설정합니다.
name
멤버가
"ML-KEM-512"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를
시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는
컨텍스트별 [0] 기본 태그 사용)으로 나타내는
ML-KEM-512-PrivateKey ASN.1 유형을
DER 인코딩한 결과로 설정합니다.
name
멤버가
"ML-KEM-768"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를
시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는
컨텍스트별 [0] 기본 태그 사용)으로 나타내는
ML-KEM-768-PrivateKey ASN.1 유형을
DER 인코딩한 결과로 설정합니다.
name
멤버가
"ML-KEM-1024"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를
시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는
컨텍스트별 [0] 기본 태그 사용)으로 나타내는
ML-KEM-1024-PrivateKey ASN.1 유형을
DER 인코딩한 결과로 설정합니다.
예외를
발생시켜
NotSupportedError로
처리합니다.
result를 data를 DER 인코딩한 결과라고 합니다.
raw-public"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는
바이트 시퀀스라고
합니다.
result를 data라고 합니다.
raw-seed"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아닌 경우 예외를 발생시켜
InvalidAccessError로
처리합니다.
data를 key의 [[handle]]
내부 슬롯이 나타내는 키의 d 및 z
시드 변수를 연결한 값을 포함하는 바이트 시퀀스라고
합니다.
d 및 z 시드 변수는 [FIPS-203]의 섹션 7.1에 설명된 대로 ML-KEM.KeyGen 함수에서 샘플링되었습니다.
result를 data라고 합니다.
jwk"인 경우:
jwk를 새 JsonWebKey
사전이라고 합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯이라고 합니다.
jwk의 kty 속성을
"AKP"로 설정합니다.
jwk의 alg 속성을
keyAlgorithm의 name
멤버로 설정합니다.
jwk의 pub 속성을
key의 [[handle]]
내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.
[[type]]
내부 슬롯이
"private"인
경우:
priv 속성을
key의 [[handle]]
내부 슬롯이 나타내는 base64url 인코딩 시드로 설정합니다.
jwk의 key_ops 속성을
key의 usages
속성으로 설정합니다.
jwk의 ext 속성을
key의 [[extractable]]
내부 슬롯으로 설정합니다.
result를 jwk라고 합니다.
예외를
발생시켜
NotSupportedError로
처리합니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 키 캡슐화 및 캡슐화 해제를 위해 하이브리드 포스트 양자/전통적 키 캡슐화 메커니즘을 사용하는 방법을 설명하며, [draft-irtf-cfrg-concrete-hybrid-kems-04]에 명시되어 있습니다.
이 알고리즘의 인식되는 알고리즘
이름은
"MLKEM768-P256", "MLKEM768-X25519" 및
"MLKEM1024-P384"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encapsulate | 없음 | EncapsulatedBits |
| decapsulate | 없음 | 바이트 시퀀스 |
| 공유 키 길이 가져오기 | 없음 | 정수 |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
하이브리드 KEM 키는 JWK 표현에 [RFC9964]에서 정의된 "AKP"(Algorithm Key Pair) 키 유형을 사용합니다. "alg"(algorithm) 매개변수는 특정 하이브리드 KEM 인스턴스를 식별합니다. 공개 키는 "pub" 매개변수에 저장됩니다. 개인 키가 포함되는 경우에는 "priv" 매개변수를 사용하여 표현됩니다. JWK로 표현될 때 모든 키 매개변수는 base64url로 인코딩됩니다.
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
sharedKey 및 ciphertext를
[draft-irtf-cfrg-concrete-hybrid-kems-04]의
섹션 4에서 algorithm의 name
멤버가 나타내는 하이브리드
KEM 인스턴스에 대해 Encaps 함수를 수행하여 얻은 출력으로 설정하며,
key의 [[handle]]
내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.
Encaps 함수가 오류를 반환한 경우 OperationError를
반환합니다.
result를 새로운 EncapsulatedBits
사전으로 설정합니다.
result의 sharedKey 속성을
sharedKey를 포함하는
ArrayBuffer를
생성한 결과로 설정합니다.
result의 ciphertext 속성을
ciphertext를 포함하는
ArrayBuffer를
생성한 결과로 설정합니다.
result를 반환합니다.
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
sharedKey를
[draft-irtf-cfrg-concrete-hybrid-kems-04]의
섹션 4에서 algorithm의
name
멤버가 나타내는 하이브리드 KEM 인스턴스에 대해
Decaps 함수를 수행하여 얻은 출력으로 설정하며,
key의 [[handle]]
내부 슬롯이 나타내는 키를 dk 입력 매개변수로 사용하고,
ciphertext를 ct 입력 매개변수로 사용합니다.
Decaps 함수가 오류를 반환한 경우 OperationError를
반환합니다.
sharedKey를 반환합니다.
usages에
"encapsulateKey", "encapsulateBits",
"decapsulateKey" 또는 "decapsulateBits" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
[draft-irtf-cfrg-hybrid-kems-12]의
섹션 5.2에 설명된
GenerateKeyPair 함수를 normalizedAlgorithm의
name
멤버가 나타내는 하이브리드
KEM 인스턴스로 수행하여 하이브리드 KEM 키 쌍을 생성합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
publicKey를 생성된 키 쌍의 캡슐화 키를 나타내는 새로운
CryptoKey로
설정합니다.
publicKey의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
publicKey의 [[extractable]]
내부
슬롯을 true로 설정합니다.
publicKey의 [[usages]]
내부 슬롯을
usages와 [ "encapsulateKey", "encapsulateBits" ]의
용도
교집합으로 설정합니다.
privateKey를 생성된 키 쌍의 캡슐화 해제 키를 나타내는 새로운
CryptoKey로
설정합니다.
privateKey의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
privateKey의 [[extractable]]
내부
슬롯을 extractable로 설정합니다.
privateKey의 [[usages]]
내부 슬롯을
usages와 [ "decapsulateKey", "decapsulateBits" ]의
용도
교집합으로 설정합니다.
result를 새로운 CryptoKeyPair
사전으로 설정합니다.
result의 publicKey
속성을
publicKey로 설정합니다.
result의 privateKey
속성을
privateKey로 설정합니다.
result를 반환합니다.
keyData를 가져올 키 데이터로 설정합니다.
raw-public"인 경우:
usages에
"encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어
있으면
SyntaxError를
던집니다.
data를 keyData로 설정합니다.
data의 바이트 단위 길이가
[draft-irtf-cfrg-concrete-hybrid-kems-04]의
섹션 4에서 normalizedAlgorithm의
name
멤버가 나타내는 하이브리드 KEM 인스턴스의 원시 공개 키
길이 Nek와 같지 않으면,
DataError를
던집니다.
key를 data의 하이브리드 KEM 공개 키 데이터를 나타내는 새로운
CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-seed"인 경우:
usages에
"decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어
있으면
SyntaxError를
던집니다.
data를 keyData로 설정합니다.
keyPair를
[draft-irtf-cfrg-hybrid-kems-12]의
섹션 5.5에 설명된 DeriveKeyPair 함수를
normalizedAlgorithm의 name
멤버가 나타내는 하이브리드 KEM 인스턴스로 수행한 결과로 설정하며,
data를
seed 입력 매개변수로 사용합니다.
DeriveKeyPair 함수가 오류를 반환한 경우,
OperationError를
던집니다.
key를
keyPair의 캡슐화 해제 키로 식별되는
하이브리드 KEM 개인 키를 나타내는 새로운 CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
jwk"인 경우:JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
jwk의 priv 필드가 존재하고,
usages에
"decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어
있으면
SyntaxError를
던집니다.
jwk의 priv 필드가 존재하지 않고,
usages에
"encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어
있으면
SyntaxError를
던집니다.
jwk의 alg
필드가 존재하지 않거나,
그 값이 normalizedAlgorithm의
name
멤버가 나타내는 하이브리드 KEM 인스턴스를 식별하지 않으면,
DataError를
던집니다.
이 명세에서 정의한 하이브리드 KEM 인스턴스에 대해
IANA
JSON 웹 서명 및 암호화 알고리즘 레지스트리에
등록된 "alg" 값은 MLKEM768-P256, MLKEM768-X25519 및
MLKEM1024-P384입니다. 구현은 동일한 하이브리드 KEM 인스턴스를
사용하는 JWE 알고리즘을 식별하는 이 레지스트리의 다른 값도
허용해야 합니다. 단, 해당 JWE
알고리즘의 JWK 표현은 "alg" 값을 제외하고 여기에서 정의한
표현과 호환되어야 합니다.
예로는 등록된 이후의
[draft-ietf-jose-hpke-pq-pqt]에서
제안한 값이 있습니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"enc"와 같지 않으면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하며, JSON Web
Key [JWK]의 요구사항에 따라 유효하지 않거나,
지정된 모든 usages
값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하며
값이 false이고 extractable이 true이면,
DataError를
던집니다.
priv 필드가
존재하는 경우:
algorithm을 새로운 KeyAlgorithm
객체의 인스턴스로 설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
NotSupportedError를
던집니다.
key를 반환합니다.
key를 내보낼 CryptoKey로
설정합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
raw-public"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을
포함하는 바이트 시퀀스로 설정합니다.
result를 data로 설정합니다.
raw-seed"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 32바이트 시드를 포함하는
바이트 시퀀스로 설정합니다.
result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
jwk의 kty 속성을
"AKP"로 설정합니다.
jwk의 alg 속성을
keyAlgorithm의 name
멤버로 설정합니다.
jwk의 pub 속성을
key의 [[handle]]
내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.
[[type]]
내부 슬롯이
"private"인
경우:
priv 속성을
key의 [[handle]]
내부 슬롯이 나타내는 base64url 인코딩 32바이트 시드로 설정합니다.
jwk의 key_ops 속성을 key의 usages
속성으로 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 서명 및 검증에 ML-DSA를 사용하는 방법을 설명하며, [FIPS-204]에 명시되어 있습니다.
이 알고리즘의 인식되는 알고리즘
이름은
"ML-DSA-44", "ML-DSA-65" 및 "ML-DSA-87"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| sign | ContextParams |
바이트 시퀀스 |
| verify | ContextParams |
불리언 |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
WebIDLdictionary ContextParams : Algorithm {
BufferSource context;
};
context 멤버는 메시지와 연결할 선택적 컨텍스트 데이터를
나타냅니다.
ContextParams
사전은 [webcrypto-secure-curves]의
Ed448Params
사전과 동일하며,
이 제안을 병합할 때 후자를 전자로 대체할 수 있습니다.
normalizedAlgorithm의 context
멤버가
존재하고 길이가 255
바이트보다 크면, OperationError를
던집니다.
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
context를 normalizedAlgorithm의
context
멤버로 설정하거나, normalizedAlgorithm의
context
멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.
result를 [FIPS-204]의 섹션 5.2에 명시된
ML-DSA.Sign 서명 알고리즘을 수행한 결과로 설정합니다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key와 연결된 ML-DSA 개인 키를 sk로,
message를 M으로, context를 ctx로 사용합니다.
ML-DSA.Sign 알고리즘이 오류를 반환한 경우 OperationError를
반환합니다.
result를 반환합니다.
normalizedAlgorithm의 context
멤버가
존재하고 길이가 255
바이트보다 크면, OperationError를
던집니다.
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
context를 normalizedAlgorithm의
context
멤버로 설정하거나, normalizedAlgorithm의
context
멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.
result를 [FIPS-204]의 섹션 5.3에 명시된
ML-DSA.Verify 검증 알고리즘을 수행한 결과로 설정합니다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key와 연결된 ML-DSA 공개 키를 pk로,
message를 M으로, signature를 σ로,
context를 ctx로 사용합니다.
ML-DSA.Verify 알고리즘이 오류를 반환한 경우 OperationError를
반환합니다.
result를 반환합니다.
usages에
"sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
[FIPS-204]의
섹션 5.1에 설명된 대로,
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하여 ML-DSA 키 쌍을 생성합니다.
시드 ξ를 내보낼 수 있도록 하려면,
생성된 키 재료의 일부로 저장해야 합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새로운
CryptoKey로
설정합니다.
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"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 설정합니다.
name
멤버가 "ML-DSA-44"인 경우:
expectedOid를 id-ml-dsa-44
(2.16.840.1.101.3.4.3.17)로 설정합니다.
name
멤버가 "ML-DSA-65"인 경우:
expectedOid를 id-ml-dsa-65
(2.16.840.1.101.3.4.3.18)로 설정합니다.
name
멤버가 "ML-DSA-87"인 경우:
expectedOid를 id-ml-dsa-87
(2.16.840.1.101.3.4.3.19)로 설정합니다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm 객체 식별자 필드가
expectedOid와 같지 않으면,
DataError를
던집니다.
spki의 algorithm
AlgorithmIdentifier 필드에 parameters 필드가 존재하면,
DataError를
던집니다.
publicKey를 spki의
subjectPublicKey 필드가 식별하는 ML-DSA 공개 키로 설정합니다.
key를 publicKey를 나타내는 새로운
CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
pkcs8"인 경우:
usages에
"sign"이 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 설정합니다.
name
멤버가 "ML-DSA-44"인 경우:
expectedOid를 id-ml-dsa-44
(2.16.840.1.101.3.4.3.17)로 설정합니다.
asn1Structure를 ASN.1
ML-DSA-44-PrivateKey 구조로 설정합니다.
name
멤버가 "ML-DSA-65"인 경우:
expectedOid를 id-ml-dsa-65
(2.16.840.1.101.3.4.3.18)로 설정합니다.
asn1Structure를 ASN.1
ML-DSA-65-PrivateKey 구조로 설정합니다.
name
멤버가 "ML-DSA-87"인 경우:
expectedOid를 id-ml-dsa-87
(2.16.840.1.101.3.4.3.19)로 설정합니다.
asn1Structure를 ASN.1
ML-DSA-87-PrivateKey 구조로 설정합니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm 객체 식별자 필드가 expectedOid와 같지 않으면,
DataError를
던집니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에
parameters 필드가 존재하면,
DataError를
던집니다.
mlDsaPrivateKey를
ASN.1
구조
파싱
알고리즘을 수행한 결과로 설정합니다. 이때 data에는
privateKeyInfo의 privateKey 필드를,
structure에는 asn1Structure를 사용하고,
exactData는 true로 설정합니다.
mlDsaPrivateKey가
expandedKey 형식의 ML-DSA 키를 나타내거나,
mlDsaPrivateKey가 both 형식의 ML-DSA 키를 나타내며
both 형식이 지원되지 않는 경우,
NotSupportedError를
던집니다.
mlDsaPrivateKey가
both 형식의 ML-DSA 키를 나타내고,
seed 필드가
expandedKey 필드에 대응하지 않으면,
DataError를
던집니다.
key를 mlDsaPrivateKey가 식별하는
ML-DSA 개인 키를 나타내는 새로운 CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-public"인 경우:
usages에
"verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
key를 keyData에 제공된 키 데이터를 나타내는 새로운
CryptoKey로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-seed"인 경우:
usages에
"sign"이 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
data를 keyData로 설정합니다.
privateKey를
[FIPS-204]의
섹션 6.1에 설명된
ML-DSA.KeyGen_internal 함수를
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로 수행한 결과로 설정하며,
data를 ξ로 사용합니다.
key를 privateKey가 식별하는 ML-DSA 개인 키를 나타내는 새로운
CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
jwk"인 경우:JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
priv 필드가
존재하고 usages에
"sign"이 아닌 항목이 포함되어 있거나,
priv 필드가
존재하지 않고 usages에
"verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
jwk의 alg
필드가 normalizedAlgorithm의
name
멤버와 같지 않으면,
DataError를
던집니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"sig"와 같지 않으면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하며 JSON Web
Key [JWK]의 요구사항에 따라 유효하지 않거나,
지정된 모든 usages
값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하고
값이 false이며 extractable이 true이면,
DataError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체의 인스턴스로 설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
key를 내보낼 CryptoKey로
설정합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
spki"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:
algorithm 필드를 다음
속성을 가진 AlgorithmIdentifier ASN.1 유형으로 설정합니다:
name
멤버가
"ML-DSA-44"인 경우:
algorithm 객체 식별자를
id-ml-dsa-44
(2.16.840.1.101.3.4.3.17) OID로 설정합니다.
name
멤버가
"ML-DSA-65"인 경우:
algorithm 객체 식별자를
id-ml-dsa-65
(2.16.840.1.101.3.4.3.18) OID로 설정합니다.
name
멤버가
"ML-DSA-87"인 경우:
algorithm 객체 식별자를
id-ml-dsa-87
(2.16.840.1.101.3.4.3.19) OID로 설정합니다.
subjectPublicKey 필드를 keyData로 설정합니다.
result를 data를 DER 인코딩한 결과로 설정합니다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
data를 [RFC5208]에
정의된 PrivateKeyInfo
ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:
version 필드를 0으로 설정합니다.
privateKeyAlgorithm 필드를 다음
속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 유형으로 설정합니다:
name
멤버가
"ML-DSA-44"인 경우:
algorithm 객체 식별자를
id-ml-dsa-44
(2.16.840.1.101.3.4.3.17) OID로 설정합니다.
name
멤버가
"ML-DSA-65"인 경우:
algorithm 객체 식별자를
id-ml-dsa-65
(2.16.840.1.101.3.4.3.18) OID로 설정합니다.
name
멤버가
"ML-DSA-87"인 경우:
algorithm 객체 식별자를
id-ml-dsa-87
(2.16.840.1.101.3.4.3.19) OID로 설정합니다.
privateKey 필드를 다음과 같이 설정합니다:
name
멤버가
"ML-DSA-44"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA
개인 키 시드를 seed-only
형식으로 나타내는 ML-DSA-44-PrivateKey ASN.1
유형을
DER 인코딩한 결과로 설정합니다
(OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).
name
멤버가
"ML-DSA-65"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA
개인 키 시드를 seed-only
형식으로 나타내는 ML-DSA-65-PrivateKey ASN.1
유형을
DER 인코딩한 결과로 설정합니다
(OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).
name
멤버가
"ML-DSA-87"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA
개인 키 시드를 seed-only
형식으로 나타내는 ML-DSA-87-PrivateKey ASN.1
유형을
DER 인코딩한 결과로 설정합니다
(OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).
result를 data를 DER 인코딩한 결과로 설정합니다.
raw-public"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA
공개 키를 포함하는 바이트 시퀀스로
설정합니다.
result를 data로 설정합니다.
raw-seed"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 ξ 시드 변수를
포함하는 바이트 시퀀스로 설정합니다.
ξ 시드 변수는 [FIPS-204]의 섹션 5.1에 설명된 대로 ML-DSA.KeyGen 함수에서 샘플링되었습니다.
result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
jwk의 kty 속성을
"AKP"로 설정합니다.
jwk의 alg 속성을
keyAlgorithm의 name
멤버로 설정합니다.
jwk의 pub 속성을
key의 [[handle]]
내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.
[[type]]
내부 슬롯이
"private"인
경우:
priv 속성을
key의 [[handle]]
내부 슬롯이 나타내는 base64url 인코딩 시드로 설정합니다.
jwk의 key_ops 속성을 key의 usages
속성으로 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 서명 및 검증에 SLH-DSA를 사용하는 방법을 설명하며, [FIPS-205]에 명시되어 있습니다.
이 알고리즘의 인식되는 알고리즘
이름은 "SLH-DSA-SHA2-128s", "SLH-DSA-SHAKE-128s",
"SLH-DSA-SHA2-128f", "SLH-DSA-SHAKE-128f",
"SLH-DSA-SHA2-192s", "SLH-DSA-SHAKE-192s",
"SLH-DSA-SHA2-192f", "SLH-DSA-SHAKE-192f",
"SLH-DSA-SHA2-256s", "SLH-DSA-SHAKE-256s",
"SLH-DSA-SHA2-256f" 및 "SLH-DSA-SHAKE-256f"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| sign | ContextParams |
바이트 시퀀스 |
| verify | ContextParams |
불리언 |
| generateKey | 없음 | CryptoKeyPair
|
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
SLH-DSA 키는 JWK 표현에 [RFC9964]에서 정의된 "AKP"(알고리즘 키 쌍) 키 유형을 사용합니다. "alg"(알고리즘) 매개변수는 특정 SLH-DSA 매개변수 집합을 식별합니다. 공개 키는 "pub" 매개변수에 저장됩니다. 개인 키가 포함된 경우에는 "priv" 매개변수를 사용하여 표현됩니다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩됩니다.
normalizedAlgorithm의 context
멤버가
존재하고 길이가 255
바이트보다 크면, OperationError를
던집니다.
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
context를 normalizedAlgorithm의
context
멤버로 설정하거나, normalizedAlgorithm의
context
멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.
result를 [FIPS-205]의 섹션 10.2.1에 명시된
slh_sign 서명 알고리즘을 수행한 결과로 설정합니다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key와 연결된 SLH-DSA 개인 키를 SK로,
message를 M으로, context를 ctx로 사용합니다.
slh_sign 알고리즘이 오류를 반환한 경우 OperationError를
반환합니다.
result를 반환합니다.
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
context를 normalizedAlgorithm의
context
멤버로 설정하거나, normalizedAlgorithm의
context
멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.
result를 [FIPS-205]의 섹션 10.3에 명시된
slh_verify 검증 알고리즘을 수행한 결과로 설정합니다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key와 연결된 SLH-DSA 공개 키를 PK로,
message를 M으로, signature를 SIG로,
context를 ctx로 사용합니다.
slh_verify 알고리즘이 오류를 반환한 경우 OperationError를
반환합니다.
result를 반환합니다.
usages에
"sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
[FIPS-205]의
섹션 10.1에 설명된 대로,
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하여 SLH-DSA 키 쌍을 생성합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
publicKey를 생성된 키 쌍의 공개 키를 나타내는 새로운
CryptoKey로
설정합니다.
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"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
spki를 keyData에 대해 subjectPublicKeyInfo 파싱 알고리즘을 실행한 결과로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128s"인 경우:
expectedOid를 id-slh-dsa-sha2-128s
(2.16.840.1.101.3.4.3.20)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128f"인 경우:
expectedOid를 id-slh-dsa-sha2-128f
(2.16.840.1.101.3.4.3.21)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192s"인 경우:
expectedOid를 id-slh-dsa-sha2-192s
(2.16.840.1.101.3.4.3.22)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192f"인 경우:
expectedOid를 id-slh-dsa-sha2-192f
(2.16.840.1.101.3.4.3.23)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256s"인 경우:
expectedOid를 id-slh-dsa-sha2-256s
(2.16.840.1.101.3.4.3.24)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256f"인 경우:
expectedOid를 id-slh-dsa-sha2-256f
(2.16.840.1.101.3.4.3.25)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128s"인 경우:
expectedOid를 id-slh-dsa-shake-128s
(2.16.840.1.101.3.4.3.26)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128f"인 경우:
expectedOid를 id-slh-dsa-shake-128f
(2.16.840.1.101.3.4.3.27)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192s"인 경우:
expectedOid를 id-slh-dsa-shake-192s
(2.16.840.1.101.3.4.3.28)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192f"인 경우:
expectedOid를 id-slh-dsa-shake-192f
(2.16.840.1.101.3.4.3.29)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256s"인 경우:
expectedOid를 id-slh-dsa-shake-256s
(2.16.840.1.101.3.4.3.30)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256f"인 경우:
expectedOid를 id-slh-dsa-shake-256f
(2.16.840.1.101.3.4.3.31)로 설정합니다.
spki의 algorithm AlgorithmIdentifier 필드의
algorithm 객체 식별자 필드가
expectedOid와 같지 않으면,
DataError를
던집니다.
spki의 algorithm
AlgorithmIdentifier 필드에 parameters 필드가 존재하면,
DataError를
던집니다.
publicKey를 spki의
subjectPublicKey 필드가 식별하는 SLH-DSA 공개 키로 설정합니다.
key를 publicKey를 나타내는 새로운
CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
pkcs8"인 경우:
usages에
"sign"이 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
privateKeyInfo를 keyData에 대해 privateKeyInfo 파싱 알고리즘을 실행한 결과로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128s"인 경우:
expectedOid를 id-slh-dsa-sha2-128s
(2.16.840.1.101.3.4.3.20)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128f"인 경우:
expectedOid를 id-slh-dsa-sha2-128f
(2.16.840.1.101.3.4.3.21)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192s"인 경우:
expectedOid를 id-slh-dsa-sha2-192s
(2.16.840.1.101.3.4.3.22)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192f"인 경우:
expectedOid를 id-slh-dsa-sha2-192f
(2.16.840.1.101.3.4.3.23)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256s"인 경우:
expectedOid를 id-slh-dsa-sha2-256s
(2.16.840.1.101.3.4.3.24)로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256f"인 경우:
expectedOid를 id-slh-dsa-sha2-256f
(2.16.840.1.101.3.4.3.25)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128s"인 경우:
expectedOid를 id-slh-dsa-shake-128s
(2.16.840.1.101.3.4.3.26)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128f"인 경우:
expectedOid를 id-slh-dsa-shake-128f
(2.16.840.1.101.3.4.3.27)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192s"인 경우:
expectedOid를 id-slh-dsa-shake-192s
(2.16.840.1.101.3.4.3.28)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192f"인 경우:
expectedOid를 id-slh-dsa-shake-192f
(2.16.840.1.101.3.4.3.29)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256s"인 경우:
expectedOid를 id-slh-dsa-shake-256s
(2.16.840.1.101.3.4.3.30)로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256f"인 경우:
expectedOid를 id-slh-dsa-shake-256f
(2.16.840.1.101.3.4.3.31)로 설정합니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드의
algorithm 객체 식별자 필드가 expectedOid와 같지 않으면,
DataError를
던집니다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에
parameters 필드가 존재하면,
DataError를
던집니다.
slhDsaPrivateKey를
ASN.1
구조
파싱
알고리즘을 수행한 결과로 설정합니다. 이때 data에는
privateKeyInfo의 privateKey 필드를,
structure에는 OCTET STRING을 사용하고,
exactData는 true로 설정합니다.
key를 slhDsaPrivateKey가 식별하는
SLH-DSA 개인 키를 나타내는 새로운 CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-public"인 경우:
usages에
"verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
keyData의 길이가
[FIPS-205]의 표 2에서
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합에 대해 명시한 pk length와 같지 않으면,
DataError를
던집니다.
key를 keyData에 제공된 키 데이터를 나타내는 새로운
CryptoKey로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
raw-private"인 경우:
usages에
"sign"이 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
keyData의 길이가
[FIPS-205]의 표 2에서
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합에 대해 명시한 pk length의 2배와 같지 않으면,
DataError를
던집니다.
key를 keyData에 제공된 키 데이터를 나타내는 새로운
CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm으로
설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
jwk"인 경우:JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
priv 필드가
존재하고 usages에
"sign"이 아닌 항목이 포함되어 있거나,
priv 필드가
존재하지 않고 usages에
"verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
jwk의 alg
필드가 normalizedAlgorithm의
name
멤버와 같지 않으면,
DataError를
던집니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"sig"와 같지 않으면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하며 JSON Web
Key [JWK]의 요구사항에 따라 유효하지 않거나,
지정된 모든 usages
값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하고
값이 false이며 extractable이 true이면,
DataError를
던집니다.
algorithm을 새로운 KeyAlgorithm
객체의 인스턴스로 설정합니다.
key의 [[algorithm]]
내부 슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
key를 내보낼 CryptoKey로
설정합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
spki"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
data를 [RFC5280]에
정의된 SubjectPublicKeyInfo
ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:
algorithm 필드를 다음
속성을 가진 AlgorithmIdentifier ASN.1 유형으로 설정합니다:
name
멤버가
"SLH-DSA-SHA2-128s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-128s
(2.16.840.1.101.3.4.3.20) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-128f
(2.16.840.1.101.3.4.3.21) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-192s
(2.16.840.1.101.3.4.3.22) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-192f
(2.16.840.1.101.3.4.3.23) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-256s
(2.16.840.1.101.3.4.3.24) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-256f
(2.16.840.1.101.3.4.3.25) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-128s
(2.16.840.1.101.3.4.3.26) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-128f
(2.16.840.1.101.3.4.3.27) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-192s
(2.16.840.1.101.3.4.3.28) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-192f
(2.16.840.1.101.3.4.3.29) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-256s
(2.16.840.1.101.3.4.3.30) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-256f
(2.16.840.1.101.3.4.3.31) OID로 설정합니다.
subjectPublicKey 필드를 keyData로 설정합니다.
result를 data를 DER 인코딩한 결과로 설정합니다.
pkcs8"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
data를 [RFC5208]에
정의된 PrivateKeyInfo
ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:
version 필드를 0으로 설정합니다.
privateKeyAlgorithm 필드를 다음
속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 유형으로 설정합니다:
name
멤버가
"SLH-DSA-SHA2-128s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-128s
(2.16.840.1.101.3.4.3.20) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-128f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-128f
(2.16.840.1.101.3.4.3.21) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-192s
(2.16.840.1.101.3.4.3.22) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-192f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-192f
(2.16.840.1.101.3.4.3.23) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-256s
(2.16.840.1.101.3.4.3.24) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHA2-256f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-sha2-256f
(2.16.840.1.101.3.4.3.25) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-128s
(2.16.840.1.101.3.4.3.26) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-128f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-128f
(2.16.840.1.101.3.4.3.27) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-192s
(2.16.840.1.101.3.4.3.28) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-192f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-192f
(2.16.840.1.101.3.4.3.29) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256s"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-256s
(2.16.840.1.101.3.4.3.30) OID로 설정합니다.
name
멤버가
"SLH-DSA-SHAKE-256f"인 경우:
algorithm 객체 식별자를
id-slh-dsa-shake-256f
(2.16.840.1.101.3.4.3.31) OID로 설정합니다.
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 SLH-DSA 개인 키를 나타내는
OCTET STRING ASN.1 유형을 DER 인코딩한 결과로 설정합니다.
result를 data를 DER 인코딩한 결과로 설정합니다.
raw-public"인 경우:
key의 [[type]]
내부 슬롯이
"public"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 SLH-DSA
공개 키를 포함하는 바이트 시퀀스로
설정합니다.
result를 data로 설정합니다.
raw-private"인 경우:
key의 [[type]]
내부 슬롯이
"private"이
아니면,
InvalidAccessError를
던집니다.
data를
key의 [[handle]]
내부 슬롯이 나타내는 SLH-DSA
개인 키를 포함하는 바이트 시퀀스로
설정합니다.
result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
jwk의 kty 속성을
"AKP"로 설정합니다.
jwk의 alg 속성을
keyAlgorithm의 name
멤버로 설정합니다.
jwk의 pub 속성을
key의 [[handle]]
내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.
[[type]]
내부 슬롯이
"private"인
경우:
priv 속성을
key의 [[handle]]
내부 슬롯이 나타내는 base64url 인코딩 개인 키로 설정합니다.
jwk의 key_ops 속성을 key의 usages
속성으로 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯으로 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
"AES-OCB" 알고리즘 식별자는 OCB 모드의 AES를 사용하여
인증된 암호화 및 복호화를 수행하는 데 사용되며,
[RFC7253]에 설명되어 있습니다.
이 알고리즘의 인식되는 알고리즘 이름은
"AES-OCB"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AeadParams |
바이트 시퀀스 |
| decrypt | AeadParams |
바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
| 키 길이 가져오기 | AesDerivedKeyParams
|
정수 |
WebIDLdictionary AeadParams : Algorithm {
required BufferSource iv;
BufferSource additionalData;
[EnforceRange] octet tagLength;
};
iv 멤버는 사용할 초기화 벡터를 나타냅니다.
additionalData 멤버는 포함할
추가 인증 데이터를 나타냅니다.
tagLength 멤버는 원하는
인증 태그 길이를 나타냅니다.
AeadParams 사전은 [webcrypto]의 AesGcmParams
사전과 동일하며,
이 제안을 병합할 때 후자를 전자로 대체할 수 있습니다.
normalizedAlgorithm의 iv 멤버의 길이가 15
바이트보다 크면,
OperationError를
던집니다.
tagLength 멤버가
존재하지 않는 경우:
tagLength 멤버가
64, 96 또는 128 중 하나인 경우:
tagLength 멤버와
같게 설정합니다.
OperationError를
던집니다.
additionalData를 normalizedAlgorithm의 additionalData 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
C를 [RFC7253]의 섹션 4.2에
설명된 OCB-ENCRYPT 함수를 수행하여 얻은 출력으로 설정합니다.
이때 AES를 블록 암호로 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
N 입력 매개변수로,
additionalData를 A 입력 매개변수로,
plaintext를 P 입력 매개변수로, 그리고
tagLength를 TAGLEN 전역 매개변수로 사용합니다.
C를 반환합니다.
normalizedAlgorithm의 iv 멤버의 길이가 15
바이트보다 크면,
OperationError를
던집니다.
tagLength 멤버가
존재하지 않는 경우:
tagLength 멤버가
64, 96 또는 128 중 하나인 경우:
tagLength 멤버와
같게 설정합니다.
OperationError를
던집니다.
ciphertext의 길이가 tagLength 비트보다 작으면,
OperationError를
던집니다.
additionalData를 normalizedAlgorithm의 additionalData 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
[RFC7253]의 섹션 4.3에
설명된 OCB-DECRYPT 함수를 수행합니다. 이때 AES를 블록 암호로 사용하고,
key의 [[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
N 입력 매개변수로,
additionalData를 A 입력 매개변수로,
ciphertext를 C 입력 매개변수로, 그리고
tagLength를 TAGLEN 전역 매개변수로 사용합니다.
OperationError를
던집니다.
plaintext를 반환합니다.
usages에
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
normalizedAlgorithm의 length
멤버가
128, 192 또는 256 중 하나와 같지 않으면,
OperationError를
던집니다.
normalizedAlgorithm의 length
멤버와 동일한 길이의
AES 키를 생성합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
key를
생성된 AES 키를 나타내는 새로운
CryptoKey
객체로 설정합니다.
algorithm을 새로운
AesKeyAlgorithm으로
설정합니다.
algorithm의 name
속성을
"AES-OCB"로 설정합니다.
algorithm의 length
속성을
normalizedAlgorithm의
length
멤버와 같게 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key의 [[extractable]]
내부
슬롯을 extractable로 설정합니다.
key의 [[usages]]
내부 슬롯을 usages의 정규화된 값으로
설정합니다.
key를 반환합니다.
keyData를 가져올 키 데이터로 설정합니다.
usages에
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
raw-secret"인 경우:jwk"인 경우:JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
jwk가 JSON Web Algorithms [JWA]의
섹션 6.4 요구사항을 충족하지 않으면,
DataError를
던집니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"enc"가 아니면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하고,
JSON Web Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하고
값이 false이며 extractable이 true이면,
DataError를
던집니다.
NotSupportedError를
던집니다.
key를 값이 data인 AES 키를 나타내는 새로운
CryptoKey
객체로 설정합니다.
algorithm을 새로운
AesKeyAlgorithm으로
설정합니다.
algorithm의 name
속성을
"AES-OCB"로 설정합니다.
algorithm의 length
속성을
data의 비트 단위 길이로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
raw-secret"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을
포함하는 바이트 시퀀스로 설정합니다.
result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
jwk의 kty 속성을
문자열 "oct"로 설정합니다.
jwk의 k
속성을 key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고,
JSON Web Algorithms [JWA]의
섹션 6.4에 따라 인코딩된
문자열로 설정합니다.
jwk의 key_ops 속성을
key의 usages
속성과 같게 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
normalizedDerivedKeyAlgorithm의 length
멤버가 128, 192 또는 256이 아니면,
OperationError를
던집니다.
normalizedDerivedKeyAlgorithm의 length
멤버를 반환합니다.
이 섹션은 비규범적입니다.
"ChaCha20-Poly1305" 알고리즘 식별자는 AEAD_CHACHA20_POLY1305를 사용하여
인증된 암호화 및 복호화를 수행하는 데 사용되며,
[RFC8439]에 설명되어 있습니다.
이 알고리즘의 인식되는 알고리즘 이름은
"ChaCha20-Poly1305"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AeadParams |
바이트 시퀀스 |
| decrypt | AeadParams |
바이트 시퀀스 |
| generateKey | 없음 | CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
| 키 길이 가져오기 | 없음 | 정수 |
normalizedAlgorithm의 iv 멤버의 길이가 12바이트가
아니면,
OperationError를
던집니다.
normalizedAlgorithm의 tagLength
멤버가
존재하고 128이 아니면,
OperationError를
던집니다.
additionalData를 normalizedAlgorithm의 additionalData 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
ciphertext를 [RFC8439]의 섹션 2.8에
설명된 AEAD_CHACHA20_POLY1305 암호화 알고리즘을
수행하여 얻은 출력으로 설정합니다. 이때
key의 [[handle]]
내부 슬롯이 나타내는 키를 키 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
nonce 입력 매개변수로,
plaintext를 평문 입력 매개변수로, 그리고
additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용합니다.
ciphertext를 반환합니다.
normalizedAlgorithm의 iv 멤버의 길이가 12바이트가
아니면,
OperationError를
던집니다.
normalizedAlgorithm의 tagLength
멤버가
존재하고 128이 아니면,
OperationError를
던집니다.
ciphertext의 길이가 128비트보다 작으면,
OperationError를
던집니다.
additionalData를 normalizedAlgorithm의 additionalData 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
[RFC8439]의 섹션 2.8에
설명된 AEAD_CHACHA20_POLY1305 복호화 알고리즘을 수행합니다. 이때
key의 [[handle]]
내부 슬롯이 나타내는 키를 키 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
nonce 입력 매개변수로,
ciphertext를 암호문 입력 매개변수로, 그리고
additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용합니다.
OperationError를
던집니다
plaintext를 반환합니다.
usages에
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
256비트 키를 생성합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
key를
생성된 키를 나타내는 새로운
CryptoKey
객체로 설정합니다.
algorithm을 새로운
KeyAlgorithm으로
설정합니다.
algorithm의 name
속성을
"ChaCha20-Poly1305"로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key의 [[extractable]]
내부
슬롯을 extractable로 설정합니다.
key의 [[usages]]
내부 슬롯을 usages의 정규화된 값으로
설정합니다.
key를 반환합니다.
keyData를 가져올 키 데이터로 설정합니다.
usages에
"encrypt", "decrypt",
"wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
raw-secret"인 경우:jwk"인 경우:
JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
jwk가 JSON Web Algorithms [JWA]의
섹션 6.4 요구사항을 충족하지 않으면,
DataError를
던집니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"enc"가 아니면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하고,
JSON Web Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하고
값이 false이며 extractable이 true이면,
DataError를
던집니다.
NotSupportedError를
던집니다.
key를 값이 data인 키를 나타내는 새로운
CryptoKey
객체로 설정합니다.
algorithm을 새로운
KeyAlgorithm으로
설정합니다.
algorithm의 name
속성을
"ChaCha20-Poly1305"로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
raw-secret"인 경우:
data를
key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을
포함하는 바이트 시퀀스로 설정합니다.
result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
jwk의 kty 속성을
문자열 "oct"로 설정합니다.
jwk의 k
속성을 key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고,
JSON Web Algorithms
[JWA]의 섹션 6.4에 따라 인코딩된
문자열로 설정합니다.
jwk의 alg 속성을
문자열 "C20P"로 설정합니다.
jwk의 key_ops 속성을
key의 usages
속성과 같게 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
256을 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 [FIPS-202]에 명시된 SHA-3 해시 함수 계열을 설명합니다.
각 SHA-3 알고리즘의 인식되는 알고리즘
이름은
"SHA3-256",
"SHA3-384" 및
"SHA3-512"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| digest | 없음 | 바이트 시퀀스 |
name
멤버가
"SHA3-256"과 대소문자를 구분하여 문자열이 일치하는 경우:
name
멤버가
"SHA3-384"과 대소문자를 구분하여 문자열이 일치하는 경우:
name
멤버가
"SHA3-512"과 대소문자를 구분하여 문자열이 일치하는 경우:
연산을 수행한 결과 오류가 발생하면, OperationError를
던집니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 [NIST-SP800-185]에 명시된 cSHAKE128 및 cSHAKE256을 설명합니다.
functionName 및 customization
매개변수가 모두 비어 있거나 제공되지 않은 경우, cSHAKE는
[FIPS-202]의 섹션 6.2에 정의된
SHAKE와 기능적으로 동일합니다.
인식되는 알고리즘
이름은
"cSHAKE128" 및
"cSHAKE256"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| digest | CShakeParams |
바이트 시퀀스 |
WebIDLdictionary CShakeParams : Algorithm {
required [EnforceRange] unsigned long outputLength;
BufferSource functionName;
BufferSource customization;
};
outputLength 멤버는 요청된
비트 단위 출력 길이를 나타냅니다.
functionName 멤버는 NIST가 cSHAKE를 기반으로
함수를 정의할 때 사용하는 함수 이름을 나타냅니다. 사용하는 경우 NIST가 정의한 값으로만
설정해야 합니다.
customization 멤버는
사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다.
outputLength를 normalizedAlgorithm의 outputLength 멤버로
설정합니다.
functionName을 normalizedAlgorithm의 functionName 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
customization을 normalizedAlgorithm의 customization 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
name
멤버가
"cSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
name
멤버가
"cSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
연산을 수행한 결과 오류가 발생하면, OperationError를
던집니다.
result를 포함하는 바이트 시퀀스를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 [RFC9861]에 명시된 TurboSHAKE128 및 TurboSHAKE256을 설명합니다.
TurboSHAKE는 SHA-3에서 사용되는 Keccak 순열의 라운드 수를 줄인 버전에 기반한 확장 가능 출력 함수(XOF) 계열로, 동일한 보안 강도를 유지하면서 SHAKE 함수보다 약 두 배 빠릅니다.
128비트 충돌 보안을 위해 TurboSHAKE128 출력은 최소 256비트여야 합니다. 256비트 충돌 보안을 위해 TurboSHAKE256 출력은 최소 512비트여야 합니다. 이러한 출력 길이는 대응하는 원상 및 제2 원상 보안 요구사항도 초과합니다 (이러한 요구사항에는 목표 보안 수준과 동일한 출력 길이만 필요합니다). 출력 길이가 이러한 임계값을 충족하면 TurboSHAKE128은 NIST 포스트 양자 보안 수준 2를 달성하고, TurboSHAKE256은 수준 5를 달성합니다. [RFC9861]의 섹션 7을 참조하십시오.
인식되는 알고리즘
이름은
"TurboSHAKE128" 및
"TurboSHAKE256"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| digest | TurboShakeParams |
바이트 시퀀스 |
WebIDLdictionary TurboShakeParams : Algorithm {
required [EnforceRange] unsigned long outputLength;
[EnforceRange] octet domainSeparation;
};
outputLength 멤버는 요청된
비트 단위 출력 길이를 나타냅니다.
domainSeparation 멤버는 도메인
분리 바이트를 나타냅니다. 지정하지 않으면 기본값은 0x1F입니다. 유효한 값은
0x01부터 0x7F까지의 범위입니다.
KangarooTwelve와 TurboSHAKE를 모두 사용하는 프로토콜은 도메인 분리에
0x06, 0x07 및 0x0B 값을 사용하지 않아야 합니다.
이러한 값은 KangarooTwelve에서 내부적으로 사용되기 때문입니다.
outputLength를 normalizedAlgorithm의 outputLength 멤버로
설정합니다.
outputLength가 0이거나 8의 배수가 아니면,
OperationError를
던집니다.
domainSeparation을 normalizedAlgorithm의 domainSeparation
멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 0x1F로 설정합니다.
domainSeparation이 0x01보다 작거나
0x7F보다 크면,
OperationError를
던집니다.
name
멤버가
"TurboSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
name
멤버가
"TurboSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
연산을 수행한 결과 오류가 발생하면, OperationError를
던집니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 [RFC9861]에 명시된 KT128 및 KT256을 설명합니다.
KangarooTwelve는 TurboSHAKE 위에 트리 해싱을 적용하여 입력 데이터를 병렬로 처리할 수 있도록 하는 확장 가능 출력 함수(XOF) 계열입니다. KT128은 내부적으로 TurboSHAKE128을 사용하고, KT256은 TurboSHAKE256을 사용합니다.
128비트 충돌 보안을 위해 KT128 출력은 최소 256비트여야 합니다. 256비트 충돌 보안을 위해 KT256 출력은 최소 512비트여야 합니다. 이러한 출력 길이는 대응하는 원상 및 제2 원상 보안 요구사항도 초과합니다 (이러한 요구사항에는 목표 보안 수준과 동일한 출력 길이만 필요합니다). 출력 길이가 이러한 임계값을 충족하면 KT128은 NIST 포스트 양자 보안 수준 2를 달성하고, KT256은 수준 5를 달성합니다. [RFC9861]의 섹션 7을 참조하십시오.
인식되는 알고리즘
이름은
"KT128" 및
"KT256"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| digest | KangarooTwelveParams |
바이트 시퀀스 |
WebIDLdictionary KangarooTwelveParams : Algorithm {
required [EnforceRange] unsigned long outputLength;
BufferSource customization;
};
outputLength 멤버는 요청된
비트 단위 출력 길이를 나타냅니다.
customization 멤버는
사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다. 지정하지
않으면 기본값은 빈 문자열입니다.
outputLength를 normalizedAlgorithm의 outputLength
멤버로
설정합니다.
outputLength가 0이거나 8의 배수가 아니면,
OperationError를
던집니다.
customization을 normalizedAlgorithm의 customization
멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
name
멤버가
"KT128"과 대소문자를 구분하여 문자열이 일치하는 경우:
name
멤버가
"KT256"과 대소문자를 구분하여 문자열이 일치하는 경우:
연산을 수행한 결과 오류가 발생하면, OperationError를
던집니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 [NIST-SP800-185]에 명시된 KMAC128 및 KMAC256을 설명합니다.
인식되는 알고리즘
이름은
"KMAC128" 및
"KMAC256"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| sign | KmacParams |
바이트 시퀀스 |
| verify | KmacParams |
불리언 |
| generateKey | KmacKeyGenParams |
CryptoKey |
| importKey | KmacImportParams |
CryptoKey |
| exportKey | 없음 | 객체 |
| 키 길이 가져오기 | KmacImportParams |
정수 |
WebIDLdictionary KmacKeyGenParams : Algorithm {
[EnforceRange] unsigned long length;
};
length 멤버는 생성할 키의 길이(비트 단위)를
나타냅니다. 지정하지 않으면 권장 길이가 사용되며, KMAC128의 경우 128,
KMAC256의 경우 256입니다.
WebIDLdictionary KmacImportParams : Algorithm {
[EnforceRange] unsigned long length;
};
length 멤버는 키의 길이(비트 단위)를
나타냅니다.
WebIDLdictionary KmacKeyAlgorithm : KeyAlgorithm {
required [EnforceRange] unsigned long length;
};
length 멤버는 키의 길이(비트 단위)를
나타냅니다.
WebIDLdictionary KmacParams : Algorithm {
required [EnforceRange] unsigned long outputLength;
BufferSource customization;
};
outputLength 멤버는 요청된
비트 단위 출력 길이를 나타냅니다.
customization 멤버는
사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다.
customization을 normalizedAlgorithm의 customization 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
name
멤버가
"KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로, 그리고
customization을
S 입력 매개변수로 사용합니다.
name
멤버가
"KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로, 그리고
customization을
S 입력 매개변수로 사용합니다.
mac을 포함하는 바이트 시퀀스를 반환합니다.
customization을 normalizedAlgorithm의 customization 멤버가
존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟
문자열로 설정합니다.
name
멤버가
"KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로, 그리고
customization을
S 입력 매개변수로 사용합니다.
name
멤버가
"KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로, 그리고
customization을
S 입력 매개변수로 사용합니다.
computedMac을 mac을 포함하는 바이트 시퀀스로 설정합니다.
computedMac이 signature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 이 비교는 상수 시간으로 수행해야 합니다.
usages에 "sign" 또는
"verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
길이가 length비트인 키를 생성합니다.
키 생성 단계가 실패하면,
OperationError를
던집니다.
key를 생성된 키를 나타내는 새로운
CryptoKey
객체로 설정합니다.
algorithm을 새로운
KmacKeyAlgorithm으로 설정합니다.
algorithm의 length
속성을
length로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key의 [[extractable]]
내부
슬롯을 extractable로 설정합니다.
key의 [[usages]]
내부 슬롯을 usages의 정규화된 값으로
설정합니다.
key를 반환합니다.
keyData를 가져올 키 데이터로 설정합니다.
usages에
"sign" 또는 "verify"가 아닌 항목이 포함되어 있으면,
SyntaxError를
던집니다.
raw-secret"인 경우:data를 keyData로 설정합니다.
jwk"인 경우:
JsonWebKey
사전인 경우:jwk를 keyData와 같게 설정합니다.
jwk가 JSON Web Algorithms [JWA]의
섹션 6.4 요구사항을 충족하지 않으면,
DataError를
던집니다.
usages가 비어 있지 않고 jwk의 use
필드가 존재하며
"sig"가 아니면,
DataError를
던집니다.
jwk의 key_ops
필드가 존재하고,
JSON Web Key [JWK]의 요구사항에 따라
유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면,
DataError를
던집니다.
jwk의 ext
필드가 존재하고
값이 false이며 extractable이 true이면,
DataError를
던집니다.
NotSupportedError를
던집니다.
length를 data의 비트 단위 길이로 설정합니다.
key를 data의 처음 length
비트를 사용하는 KMAC 키를 나타내는 새로운 CryptoKey
객체로 설정합니다.
algorithm을 새로운
KmacKeyAlgorithm으로 설정합니다.
algorithm의 length
속성을
length로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
key의 [[handle]]
내부 슬롯이 나타내는 기본 암호화 키 재료에
접근할 수 없으면,
OperationError를
던집니다.
bits를 key의 [[handle]]
내부 슬롯이 나타내는 키의 원시 비트로 설정합니다.
data를 bits를 포함하는 바이트 시퀀스로 설정합니다.
raw-secret"인 경우:result를 data로 설정합니다.
jwk"인 경우:
jwk를 새로운 JsonWebKey
사전으로 설정합니다.
jwk의 kty 속성을
문자열 "oct"로 설정합니다.
jwk의 k
속성을 data를 포함하며 JSON Web
Algorithms [JWA]의 섹션 6.4에 따라 인코딩된
문자열로 설정합니다.
keyAlgorithm을 key의 [[algorithm]]
내부 슬롯으로 설정합니다.
jwk의 key_ops 속성을
key의 usages
속성과 같게 설정합니다.
jwk의 ext 속성을 key의 [[extractable]]
내부 슬롯과 같게 설정합니다.
result를 jwk로 설정합니다.
result를 반환합니다.
이 섹션은 비규범적입니다.
여기에서는 비밀번호 해싱 및 키 파생을 위한 Argon2 함수를 설명하며, [RFC9106]에 정의되어 있습니다.
각 Argon2 유형의 인식되는 알고리즘
이름은
"Argon2d",
"Argon2i" 및
"Argon2id"입니다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| deriveBits | Argon2Params |
바이트 시퀀스 |
| importKey | 없음 | CryptoKey |
| 키 길이 가져오기 | 없음 | null |
WebIDLdictionary Argon2Params : Algorithm {
required BufferSource nonce;
required [EnforceRange] unsigned long parallelism;
required [EnforceRange] unsigned long memory;
required [EnforceRange] unsigned long passes;
[EnforceRange] octet version;
BufferSource secretValue;
BufferSource associatedData;
};
nonce 멤버는 nonce를 나타내며, 이는
비밀번호 해싱 애플리케이션에서 솔트입니다.
parallelism 멤버는
병렬성의 정도를 나타냅니다.
memory 멤버는 키비바이트 단위의 메모리 크기를
나타냅니다. 병렬성 정도의 최소 8배여야 합니다.
passes 멤버는
패스 횟수를 나타냅니다.
version 멤버는 버전 번호를 나타냅니다. 기본값이자
현재 유일하게 정의된 버전은 19(0x13)입니다.
secretValue 멤버는 선택적
비밀 값을 나타냅니다.
associatedData 멤버는 선택적
연관 데이터를 나타냅니다.
권장 매개변수 값은 [RFC9106]의 섹션 4를 참조하십시오.
length가 null이거나, 32(4*8)보다 작거나, 8의 배수가 아니면,
OperationError를
던집니다.
normalizedAlgorithm의 version 멤버가
존재하고 19(0x13)가 아니면,
OperationError를
던집니다.
normalizedAlgorithm의 parallelism 멤버가 0이거나,
16777215(2^24-1)보다 크면,
OperationError를
던집니다.
normalizedAlgorithm의 memory 멤버가
normalizedAlgorithm의 parallelism 멤버의
8배보다 작으면,
OperationError를
던집니다.
normalizedAlgorithm의 passes 멤버가
0이면,
OperationError를
던집니다.
secretValue를 normalizedAlgorithm의 secretValue 멤버가
존재하는 경우 해당 멤버로 설정합니다.
associatedData를 normalizedAlgorithm의 associatedData 멤버가
존재하는 경우 해당 멤버로 설정합니다.
result를 [RFC9106]의
섹션 3에 정의된 Argon2 함수를 수행한 결과로 설정하며,
key의 [[handle]]
내부 슬롯이 나타내는 비밀번호를
메시지 P로,
normalizedAlgorithm의 nonce 속성을
nonce S로,
normalizedAlgorithm의 parallelism 속성 값을
병렬성 정도 p로,
normalizedAlgorithm의 memory 속성 값을
메모리 크기 m으로,
normalizedAlgorithm의 passes 속성 값을
패스 횟수 t로,
0x13을 버전 번호 v로,
secretValue가 존재하는 경우 이를 비밀 값 K로,
associatedData가 존재하는 경우 이를 연관 데이터 X로,
type을 유형 y로, 그리고
length를 8로 나눈 값을 태그 길이 T로 사용합니다.
키 파생 연산이 실패하면,
OperationError를
던집니다.
result를 반환합니다.
keyData를 가져올 키 데이터로 설정합니다.
format이 "raw-secret"이 아니면, NotSupportedError를
던집니다
usages에
"deriveKey" 또는 "deriveBits"가 아닌 값이 포함되어 있으면,
SyntaxError를 던집니다.
extractable이 false가 아니면,
SyntaxError를
던집니다.
key를 keyData를 나타내는 새로운 CryptoKey로
설정합니다.
algorithm을 새로운 KeyAlgorithm
객체로 설정합니다.
key의 [[algorithm]]
내부
슬롯을 algorithm으로 설정합니다.
key를 반환합니다.
null을 반환합니다.
이 섹션에서는 JSON 웹 키와 함께 사용하기 위해 IANA JSON 웹 서명 및 암호화 알고리즘 레지스트리에 다음 알고리즘 식별자를 등록합니다.
이러한 등록에서는 "JWK"를 유일한 알고리즘 사용 위치로 사용합니다.
이 명세에서 정의한 JSON 웹 키 표현에 안정적인 alg 값을
제공하므로, Web Cryptography API 구현은
exportKey()
및 importKey()를
"jwk"와 함께 사용하여 이러한 키를
직렬화하고 구문 분석할 수 있습니다. 이 명세에서는 이러한
식별자를 JSON 웹 서명 또는 JSON 웹 암호화 알고리즘으로 사용하는 방법을 정의하지 않습니다.
이 섹션에서는 JSON Web Key와 함께 사용하기 위해 다음 키 연산을 IANA JSON Web Key Operations 레지스트리에 등록합니다.
이 섹션은 비규범적입니다.
이 명세는 많은 알고리즘과 연산을 정의합니다. 구현자에게 지침을 제공하고 Web 플랫폼의 포스트 양자 전환을 가속하기 위해, 이 섹션에서는 구현 시 우선시할 알고리즘과 연산을 권장합니다.
SubtleCrypto.supports
메서드는 기능 감지, 우아한
폴백 및 점진적 향상을 가능하게 하여 이 명세의 다른 모든 알고리즘과
연산을 신속하게 도입하는 과정을 단순화합니다.
SubtleCrypto.getPublicKey
메서드는 이 명세와 [webcrypto]에 정의된 비대칭 알고리즘을
실용적으로 사용하는 데 중요합니다. 애플리케이션이 해당 공개 키 없이 개인 키만
저장할 수 있게 하고, 개인 키와 공개 키가 실제로 서로 대응하는지
확인할 필요도 없게 하여 키 관리를 단순화합니다. 또한 라이브러리
작성자가 공개 키 값을 출력에 커밋하는 프로토콜의 입력으로
추출할 수 없는 개인 키를 허용할 수 있게 합니다.
알고리즘 측면에서는 다음 항목이 포스트 양자 전환과 Web에서 최신 암호화 프로토콜을 사용할 수 있게 하는 데 가장 높은 우선순위를 갖는 것으로 간주되며, 우선순위 순서는 다음과 같습니다:
customization
매개변수가 존재하고
비어 있지 않은 경우 NotSupportedError를 던지고
SubtleCrypto.supports에서
false를 반환해야 합니다.
SLH-DSA는 NIST [FIPS-204]에서 표준화한 상태 비저장 해시 기반 디지털 서명 알고리즘입니다. 지금까지 ML-DSA보다 도입이 적었지만, ML-DSA의 대안이 필요해지는 경우 구현하는 것이 유용할 수 있습니다.
이 밖에도 AES-OCB, TurboSHAKE, KangarooTwelve 및 KMAC은 모두 가치 있는 추가 항목이지만 포스트 양자 전환에 즉각적으로 중요한 정도는 상대적으로 낮습니다.
이 예시는 사용할 수 있는 경우 Argon2를, 그렇지 않으면 PBKDF2를 사용하여 비밀번호에서 키를 파생하고, 사용할 수 있는 경우 AES-OCB를, 그렇지 않으면 AES-GCM을 사용하여 일부 텍스트를 암호화하고 복호화합니다.
const password = 'correct horse battery staple';
const derivationAlg =
SubtleCrypto.supports?.('importKey', 'Argon2id') ?
'Argon2id' :
'PBKDF2';
const encryptionAlg =
SubtleCrypto.supports?.('importKey', 'AES-OCB') ?
'AES-OCB' :
'AES-GCM';
const passwordKey = await crypto.subtle.importKey(
derivationAlg === 'Argon2id' ? 'raw-secret' : 'raw',
new TextEncoder().encode(password),
derivationAlg,
/* 추출 가능 여부: */ false,
['deriveKey']
);
const nonce = crypto.getRandomValues(new Uint8Array(16));
const derivationParams =
derivationAlg === 'Argon2id' ?
{
nonce,
parallelism: 4,
memory: 2 ** 21,
passes: 1
} :
{
salt: nonce,
iterations: 100_000,
hash: 'SHA-256'
};
const key = await crypto.subtle.deriveKey(
{
name: derivationAlg,
...derivationParams
},
passwordKey,
{
name: encryptionAlg,
length: 256
},
/* 추출 가능 여부: */ false,
['encrypt', 'decrypt']
);
const plaintext = 'Hello, world!';
const iv = crypto.getRandomValues(new Uint8Array(16));
const encrypted = await crypto.subtle.encrypt(
{ name: encryptionAlg, iv },
key,
new TextEncoder().encode(plaintext)
);
// 파생 및 암호화 알고리즘과 매개변수를 저장하고
// 암호문도 함께(예: IndexedDB 또는 데이터베이스에) 저장한 다음,
// 나중에 이를 가져옵니다. 그런 다음 원래 매개변수와
// 비밀번호를 사용하여 키를 파생합니다. 여기에서는 즉시
// 동일한 키 객체를 사용하여 다시 복호화합니다.
const decrypted = new TextDecoder().decode(await crypto.subtle.decrypt(
{ name: encryptionAlg, iv },
key,
encrypted
));
이 절은 비규범적이다.
JWK 가져오기 및 내보내기의 규범적 요구 사항은 알고리즘별 절을 참조한다.
| JSON Web Key | AlgorithmIdentifier |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
이 절은 비규범적이다.
PKCS#8 PrivateKeyInfo 가져오기 및 내보내기의 규범적 요구 사항은 알고리즘별 절을 참조한다.
| privateKeyAlgorithm | privateKey 형식 | AlgorithmIdentifier | 참조 |
|---|---|---|---|
| id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) | ML-DSA-44-PrivateKey |
"ML-DSA-44"
|
[CSOR], [RFC9881] |
| id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) | ML-DSA-65-PrivateKey |
"ML-DSA-65"
|
[CSOR], [RFC9881] |
| id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) | ML-DSA-87-PrivateKey |
"ML-DSA-87"
|
[CSOR], [RFC9881] |
| id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) | ML-KEM-512-PrivateKey |
"ML-KEM-512"
|
[CSOR], [RFC9935] |
| id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) | ML-KEM-768-PrivateKey |
"ML-KEM-768"
|
[CSOR], [RFC9935] |
| id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) | ML-KEM-1024-PrivateKey |
"ML-KEM-1024"
|
[CSOR], [RFC9935] |
| id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) | OCTET STRING |
"SLH-DSA-SHA2-128s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) | OCTET STRING |
"SLH-DSA-SHA2-128f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) | OCTET STRING |
"SLH-DSA-SHA2-192s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) | OCTET STRING |
"SLH-DSA-SHA2-192f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) | OCTET STRING |
"SLH-DSA-SHA2-256s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) | OCTET STRING |
"SLH-DSA-SHA2-256f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) | OCTET STRING |
"SLH-DSA-SHAKE-128s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) | OCTET STRING |
"SLH-DSA-SHAKE-128f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) | OCTET STRING |
"SLH-DSA-SHAKE-192s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) | OCTET STRING |
"SLH-DSA-SHAKE-192f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) | OCTET STRING |
"SLH-DSA-SHAKE-256s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) | OCTET STRING |
"SLH-DSA-SHAKE-256f"
|
[CSOR], [RFC9814] |
이 절은 비규범적이다.
SPKI 가져오기 및 내보내기의 규범적 요구 사항은 알고리즘별 절을 참조한다.
| 알고리즘 OID | subjectPublicKey ASN.1 구조 | AlgorithmIdentifier | 참조 |
|---|---|---|---|
| id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) | BIT STRING |
"ML-DSA-44"
|
[CSOR], [RFC9881] |
| id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) | BIT STRING |
"ML-DSA-65"
|
[CSOR], [RFC9881] |
| id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) | BIT STRING |
"ML-DSA-87"
|
[CSOR], [RFC9881] |
| id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) | BIT STRING |
"ML-KEM-512"
|
[CSOR], [RFC9935] |
| id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) | BIT STRING |
"ML-KEM-768"
|
[CSOR], [RFC9935] |
| id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) | BIT STRING |
"ML-KEM-1024"
|
[CSOR], [RFC9935] |
| id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) | BIT STRING |
"SLH-DSA-SHA2-128s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) | BIT STRING |
"SLH-DSA-SHA2-128f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) | BIT STRING |
"SLH-DSA-SHA2-192s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) | BIT STRING |
"SLH-DSA-SHA2-192f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) | BIT STRING |
"SLH-DSA-SHA2-256s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) | BIT STRING |
"SLH-DSA-SHA2-256f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) | BIT STRING |
"SLH-DSA-SHAKE-128s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) | BIT STRING |
"SLH-DSA-SHAKE-128f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) | BIT STRING |
"SLH-DSA-SHAKE-192s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) | BIT STRING |
"SLH-DSA-SHAKE-192f"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) | BIT STRING |
"SLH-DSA-SHAKE-256s"
|
[CSOR], [RFC9814] |
| id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) | BIT STRING |
"SLH-DSA-SHAKE-256f"
|
[CSOR], [RFC9814] |
비규범적으로 표시된 절과 마찬가지로 이 명세의 모든 작성 지침, 다이어그램, 예 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.
이 문서의 핵심어 MUST는 여기에서와 같이 모두 대문자로 표시된 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.
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: