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 Cryptography API를 위한 여러 양자 내성 및 현대 암호 알고리즘, 즉 ML-KEM, 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 Cryptography API에서 사용할 수 있는 암호 알고리즘 집합을 현대화하여 웹 애플리케이션이 양자 내성 및 고성능 암호 알고리즘을 사용할 수 있도록 하는 것을 목표로 한다. 이를 위해 다음 암호 알고리즘을 추가한다.
ML-KEM과 향후 추가될 수 있는 다른 KEM의 사용을 수용하기 위해
이 제안은 키 캡슐화 및 캡슐화 해제 함수를 도입한다.
SubtleCrypto.encapsulateKey,
SubtleCrypto.encapsulateBits,
SubtleCrypto.decapsulateKey 및
SubtleCrypto.decapsulateBits이다.
또한 이 제안은 비대칭 비밀 키에서 공개 키를 파생하는 편리한 방법을 제공하는
SubtleCrypto.getPublicKey 함수를 도입하여,
비밀 키만 필요한 경우 공개 키와 비밀 키를 모두 별도로 저장할 필요를 없앤다.
마지막으로 이 제안은 지정된 알고리즘 식별자
(모든 매개변수 포함)가 지정된 연산에서 지원되는지 감지하는 데 사용할 수 있는
SubtleCrypto.supports 함수를 추가하여
기능 감지를 더 쉽게 하는 것을 목표로 한다.
이 명세는 [webcrypto]의 18.3절에 규정된 규칙을 따른다. 여기에서 정의하는 알고리즘은 어떠한 것도 반드시 구현해야 하는 것은 아니지만, 적합한 사용자 에이전트가 알고리즘을 구현하는 경우 이 문서에 명시된 지원되는 모든 연산을 반드시 구현해야 하며, 지원되는 각 연산에 대해 [webcrypto]의 18.4.3절에 명시된 알고리즘 정의 단계를 수행해야 한다.
이 절은 [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 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",
"encapsulateKey" 또는 "decapsulateKey"인 경우:
op를 "importKey"로,
alg를 additionalAlgorithm로 설정하여
알고리즘
지원 여부를 확인한 결과가 false이면 false를 반환한다.
wrapKey"인 경우:
op를 "exportKey"로,
alg를 additionalAlgorithm로 설정하여
알고리즘
지원 여부를 확인한 결과가 false이면 false를 반환한다.
length를 null로 둔다.
deriveKey"인 경우:
op를 "get key length"로,
alg를 additionalAlgorithm로 설정하여
알고리즘 지원 여부를
확인한 결과가 false이면 false를 반환한다.
alg를 additionalAlgorithm로 설정하고
op를 "get key length"로 설정하여
알고리즘을
정규화한 결과를 normalizedAdditionalAlgorithm로 둔다.
additionalAlgorithm이 지정한 키 길이 가져오기 알고리즘을 normalizedAdditionalAlgorithm을 사용하여 수행한 결과를 length로 둔다.
operation을 "deriveBits"로 설정한다.
op를 operation으로, alg를
algorithm로, length를 length로 설정하여
알고리즘 지원 여부를
확인한 결과를 반환한다.
알고리즘
지원 여부 확인 알고리즘은 지정된 알고리즘이
지정된 연산에서 지원되는지 확인하는 절차를 정의한다.
입력은 연산 이름 op, AlgorithmIdentifier
alg 및 length 매개변수이다. 출력은 불리언이다.
다음과 같이 동작한다.
op가 "encapsulateKey" 또는 "encapsulateBits"이면
op를 "encapsulate"로 설정한다.
op가 "decapsulateKey" 또는 "decapsulateBits"이면
op를 "decapsulate"로 설정한다.
getPublicKey"인 경우:
alg를 alg로 설정하고 op를
"exportKey"로 설정하여
알고리즘을
정규화한 결과를 normalizedAlgorithm로 둔다.
오류가 발생한 경우 false를 반환한다.
normalizedAlgorithm이 식별하는 암호 알고리즘이 비밀 키에서 공개 키를 파생하는 기능을 지원하지 않으면 false를 반환한다.
그렇지 않으면 true를 반환한다.
alg를 alg로 설정하고 op를 op로
설정하여 알고리즘을
정규화한 결과를 normalizedAlgorithm로 둔다.
op가 "wrapKey"이면
op를 "encrypt"로,
alg를 alg로 설정하여
알고리즘 지원 여부를
확인한 결과를 반환한다.
op가 "unwrapKey"이면
op를 "decrypt"로,
alg를 alg로 설정하여
알고리즘 지원 여부를
확인한 결과를 반환한다.
그렇지 않으면 false를 반환한다.
지정된 연산이나 알고리즘 또는 그 매개변수 값 중 하나가 구현별 이유 (예: 알려진 명세 부적합)로 인해 모든 키 및/또는 데이터에서 실패할 것으로 예상되면 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 | 없음 | 객체 |
key의
[[type]]
내부 슬롯이 "public"이
아니면 InvalidAccessError를
발생시킨다.
algorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
7.2절에 설명된 캡슐화 키 검사를 수행한다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용한다.
성능상 바람직한 경우 이 검사 결과를 CryptoKey
객체에 대해 캐시하거나 미리 계산할 수 있다.
캡슐화 키 검사에 실패한 경우 OperationError를
반환한다.
algorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
7.2절에 설명된 ML-KEM.Encaps 함수를 수행하여 얻은 출력을
sharedKey 및 ciphertext로 둔다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용한다.
ML-KEM.Encaps 함수가 오류를 반환한 경우 OperationError를
반환한다.
result를 새로운 EncapsulatedBits
딕셔너리로 둔다.
result의 sharedKey 속성을
sharedKey를 포함하는
ArrayBuffer를
생성한 결과로 설정한다.
result의 ciphertext 속성을
ciphertext를 포함하는
ArrayBuffer를
생성한 결과로 설정한다.
result를 반환한다.
key의
[[type]]
내부 슬롯이 "private"이
아니면 InvalidAccessError를
발생시킨다.
algorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
7.3절에 설명된 캡슐화 해제 입력 검사를 수행한다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 dk 입력 매개변수로 사용하고,
ciphertext를 c 입력 매개변수로 사용한다.
성능상 바람직한 경우 캡슐화 해제 키 형식 검사 및 해시 검사 결과를
CryptoKey
객체에 대해 캐시하거나 미리 계산할 수 있다.
캡슐화 해제 키 검사에 실패한 경우 OperationError를
반환한다.
algorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
7.3절에 설명된 ML-KEM.Decaps 함수를 수행하여 얻은 출력을
sharedKey로 둔다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 dk 입력 매개변수로 사용하고,
ciphertext를 c 입력 매개변수로 사용한다.
sharedKey를 반환한다.
usages에
"encapsulateKey", "encapsulateBits",
"decapsulateKey" 또는 "decapsulateBits" 중
하나가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
7.1절에 설명된 대로 ML-KEM 키 쌍을 생성한다.
시드 (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를
발생시킨다.
keyData에 subjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.
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를
발생시킨다.
keyData에 privateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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를
발생시킨다.
data를 privateKeyInfo의 privateKey 필드로,
structure를 asn1Structure로 설정하고,
exactData를 true로 설정하여
ASN.1
구조 구문 분석
알고리즘을 수행한 결과를 mlKemPrivateKey로 둔다.
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로 둔다.
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-203]의
6.1절에 설명된 ML-KEM.KeyGen_internal 함수를 수행한 결과를
privateKey로 둔다.
이때 data의 처음 256비트를 d로,
마지막 256비트를 z로 사용한다.
key를 privateKey가 식별하는 ML-KEM 비밀 키를 나타내는
새로운 CryptoKey로
둔다.
algorithm을 새로운 KeyAlgorithm로
둔다.
key의
[[algorithm]]
내부 슬롯을 algorithm로 설정한다.
jwk"인 경우:ML-KEM의 JWK 형식은 아직 표준화되지 않았으므로 변경될 수 있다.
JsonWebKey
딕셔너리인 경우:jwk를 keyData와 같게 둔다.
jwk의 priv 필드가 존재하고
usages에 "decapsulateKey" 또는
"decapsulateBits"가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
jwk의 priv 필드가 존재하지 않고
usages에 "encapsulateKey" 또는
"encapsulateBits"가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
jwk의 alg
필드가 [draft-ietf-jose-pqc-kem-05]의
8절(그림 1 또는 2)에 제시된
normalizedAlgorithm의 name
멤버에 대응하는 alg 값 중 하나가 아니면
DataError를
발생시킨다.
예를 들어 ML-KEM-512와 ML-KEM-512+A128KW는
ML-KEM-512에 유효한 "alg" 값이다.
usages가 비어 있지 않고 jwk의
use
필드가 존재하며 "enc"와 같지 않으면
DataError를
발생시킨다.
jwk의 key_ops
필드가 존재하고 JSON Web Key [JWK]의 요구 사항에 따라
유효하지 않거나, 지정된 usages 값을 모두 포함하지 않으면
DataError를
발생시킨다.
jwk의 ext
필드가 존재하고 값이 false이며 extractable이 true이면
DataError를
발생시킨다.
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 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-KEM-512-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
name
멤버가 "ML-KEM-768"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-KEM 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-KEM-768-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
name
멤버가 "ML-KEM-1024"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-KEM 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-KEM-1024-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
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"인 경우:ML-KEM의 JWK 형식은 아직 표준화되지 않았으므로 변경될 수 있다.
jwk를 새로운 JsonWebKey
딕셔너리로 둔다.
keyAlgorithm을 key의
[[algorithm]]
내부 슬롯으로 둔다.
jwk의 kty 속성을
"AKP"로 설정한다.
jwk의 alg 속성을
[draft-ietf-jose-pqc-kem-05]의
8절(그림 1)에 제시된
keyAlgorithm의 name
멤버에 대응하는 alg 값으로 설정한다.
예를 들어 ML-KEM-512는 ML-KEM-512에
사용되는 "alg" 값이다.
jwk의 pub 속성을
key의 [[handle]]
내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정한다.
[[type]]
내부 슬롯이 "private"인
경우:
priv 속성을
key의 [[handle]]
내부 슬롯이 나타내는 base64url 인코딩 시드로 설정한다.
jwk의 key_ops 속성을
key의 usages
속성으로 설정한다.
jwk의 ext 속성을
key의 [[extractable]]
내부 슬롯으로 설정한다.
result를 jwk로 둔다.
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
여기에서는 [FIPS-204]에 명시된 대로 서명 및 검증에 ML-DSA를 사용하는 방법을 설명한다.
이 알고리즘의 인식되는 알고리즘
이름은
"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
딕셔너리와 동일하며, 이 제안을 병합할 때 후자를 전자로 대체할 수 있다.
key의
[[type]]
내부 슬롯이 "private"이
아니면 InvalidAccessError를
발생시킨다.
normalizedAlgorithm의 context
멤버를 context로 두고,
normalizedAlgorithm의 context
멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.
[FIPS-204]의 5.2절에 명시된
ML-DSA.Sign 서명 알고리즘을 수행한 결과를 result로 둔다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key과 연결된 ML-DSA 비밀 키를 sk로,
message를 M으로, context를 ctx로 사용한다.
ML-DSA.Sign 알고리즘이 오류를 반환한 경우 OperationError를
반환한다.
result를 반환한다.
key의
[[type]]
내부 슬롯이 "public"이
아니면 InvalidAccessError를
발생시킨다.
normalizedAlgorithm의 context
멤버를 context로 두고,
normalizedAlgorithm의 context
멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.
[FIPS-204]의 5.3절에 명시된
ML-DSA.Verify 검증 알고리즘을 수행한 결과를 result로 둔다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key과 연결된 ML-DSA 공개 키를 pk로,
message를 M으로, signature를 σ로,
context를 ctx로 사용한다.
ML-DSA.Verify 알고리즘이 오류를 반환한 경우 OperationError를
반환한다.
result를 반환한다.
usages에 "sign" 또는 "verify" 중
하나가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-204]의
5.1절에 설명된 대로 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를
발생시킨다.
keyData에 subjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.
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)로 둔다.
NotSupportedError를
발생시킨다.
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를
발생시킨다.
keyData에 privateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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 구조로 둔다.
NotSupportedError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드에 있는
algorithm 객체 식별자 필드가 expectedOid와
같지 않으면
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에
parameters 필드가 존재하면
DataError를
발생시킨다.
data를 privateKeyInfo의 privateKey 필드로,
structure를 asn1Structure로 설정하고,
exactData를 true로 설정하여
ASN.1
구조 구문 분석
알고리즘을 수행한 결과를 mlDsaPrivateKey로 둔다.
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로 둔다.
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-204]의
6.1절에 설명된 ML-DSA.KeyGen_internal 함수를
data를 ξ로 사용하여 수행한 결과를
privateKey로 둔다.
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로 설정한다.
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-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로 설정한다.
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-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로 설정한다.
NotSupportedError를
발생시킨다.
privateKey 필드를 다음과 같이 설정한다.
name
멤버가 "ML-DSA-44"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-DSA-44-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
name
멤버가 "ML-DSA-65"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-DSA-65-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
name
멤버가 "ML-DSA-87"인 경우:
privateKey 필드를
key의 [[handle]]
내부 슬롯이 나타내는 ML-DSA 비밀 키 시드를
시드 전용 형식으로 나타내는
ML-DSA-87-PrivateKey ASN.1 형식을
DER 인코딩한 결과로 설정한다
(OCTET STRING의 암시적 인코딩과 함께
컨텍스트별 [0] 기본 태그를 사용한다).
NotSupportedError를
발생시킨다.
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로 둔다.
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
여기에서는 [FIPS-205]에 명시된 대로 서명 및 검증에 SLH-DSA를 사용하는 방법을 설명한다.
이 알고리즘의 인식되는 알고리즘
이름은
"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"(Algorithm Key Pair) 키 형식을 사용한다. "alg"(알고리즘) 매개변수는 특정 SLH-DSA 매개변수 집합을 식별한다. 공개 키는 "pub" 매개변수에 담긴다. 비밀 키가 포함된 경우 "priv" 매개변수를 사용하여 나타낸다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩된다.
key의
[[type]]
내부 슬롯이 "private"이
아니면 InvalidAccessError를
발생시킨다.
normalizedAlgorithm의 context
멤버를 context로 두고,
normalizedAlgorithm의 context
멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.
[FIPS-205]의 10.2.1절에 명시된
slh_sign 서명 알고리즘을 수행한 결과를 result로 둔다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key과 연결된 SLH-DSA 비밀 키를 SK로,
message를 M으로, context를 ctx로 사용한다.
slh_sign 알고리즘이 오류를 반환한 경우
OperationError를
반환한다.
result를 반환한다.
key의
[[type]]
내부 슬롯이 "public"이
아니면 InvalidAccessError를
발생시킨다.
normalizedAlgorithm의 context
멤버를 context로 두고,
normalizedAlgorithm의 context
멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.
[FIPS-205]의 10.3절에 명시된
slh_verify 검증 알고리즘을 수행한 결과를 result로 둔다.
이때 normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합을 사용하고,
key과 연결된 SLH-DSA 공개 키를 PK로,
message를 M으로, signature를 SIG로,
context를 ctx로 사용한다.
slh_verify 알고리즘이 오류를 반환한 경우
OperationError를
반환한다.
result를 반환한다.
usages에 "sign" 또는 "verify" 중
하나가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합으로
[FIPS-205]의
10.1절에 설명된 대로 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를
발생시킨다.
keyData에 subjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.
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)로 둔다.
NotSupportedError를
발생시킨다.
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를
발생시킨다.
keyData에 privateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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)로 둔다.
NotSupportedError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithm 필드에 있는
algorithm 객체 식별자 필드가 expectedOid와
같지 않으면
DataError를
발생시킨다.
privateKeyInfo의
privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에
parameters 필드가 존재하면
DataError를
발생시킨다.
data를 privateKeyInfo의 privateKey 필드로,
structure를 OCTET STRING으로 설정하고,
exactData를 true로 설정하여
ASN.1
구조 구문 분석
알고리즘을 수행한 결과를 slhDsaPrivateKey로 둔다.
key를 slhDsaPrivateKey가 식별하는
SLH-DSA 비밀 키를 나타내는 새로운 CryptoKey로
둔다.
algorithm을 새로운 KeyAlgorithm로
둔다.
key의
[[algorithm]]
내부 슬롯을 algorithm로 설정한다.
raw-public"인 경우:
usages에 "verify"가 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
algorithm을 새로운 KeyAlgorithm
객체로 둔다.
keyData의
길이가
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합에 대해
[FIPS-205]의
표 2에 명시된 pk length가 아니면
DataError를
발생시킨다.
key를 keyData에 제공된 키 데이터를 나타내는 새로운
CryptoKey로
둔다.
key의
[[algorithm]]
내부 슬롯을 algorithm로 설정한다.
raw-private"인 경우:
usages에 "sign"이 아닌 항목이 포함되어 있으면
SyntaxError를
발생시킨다.
keyData의
길이가
normalizedAlgorithm의 name
멤버가 나타내는 매개변수 집합에 대해
[FIPS-205]의
표 2에 명시된 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로 설정한다.
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
멤버가
"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로 설정한다.
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
멤버가
"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로 설정한다.
NotSupportedError를
발생시킨다.
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로 둔다.
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
"AES-OCB" 알고리즘 식별자는
[RFC7253]에 설명된 대로 OCB 모드의 AES를 사용하여
인증된 암호화 및 복호화를 수행하는 데 사용된다.
이 알고리즘의 인식되는 알고리즘 이름은
"AES-OCB"이다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AeadParams |
바이트 시퀀스 |
| decrypt | AeadParams |
바이트 시퀀스 |
| generateKey | AesKeyGenParams
|
CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
| get key length | 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를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을
additionalData로 둔다.
[RFC7253]의 4.2절에 설명된
OCB-ENCRYPT 함수를 수행하여 얻은 출력을 C로 둔다.
이때 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를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을
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로 둔다.
NotSupportedError를
발생시킨다.
result를 반환한다.
normalizedDerivedKeyAlgorithm의 length
멤버가 128, 192 또는 256이 아니면
OperationError를
발생시킨다.
normalizedDerivedKeyAlgorithm의 length
멤버를 반환한다.
이 절은 비규범적이다.
"ChaCha20-Poly1305" 알고리즘 식별자는
[RFC8439]에 설명된 대로
AEAD_CHACHA20_POLY1305를 사용하여 인증된 암호화 및 복호화를 수행하는 데 사용된다.
이 알고리즘의 인식되는 알고리즘 이름은
"ChaCha20-Poly1305"이다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| encrypt | AeadParams |
바이트 시퀀스 |
| decrypt | AeadParams |
바이트 시퀀스 |
| generateKey | 없음 | CryptoKey |
| importKey | 없음 | CryptoKey |
| exportKey | 없음 | 객체 |
| get key length | 없음 | 정수 |
normalizedAlgorithm의 iv 멤버의 길이가
12바이트가 아니면
OperationError를
발생시킨다.
normalizedAlgorithm의 tagLength
멤버가
존재하고 128이 아니면
OperationError를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을
additionalData로 둔다.
[RFC8439]의
2.8절에 설명된 AEAD_CHACHA20_POLY1305 암호화 알고리즘을
수행하여 얻은 출력을 ciphertext로 둔다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 키 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
논스 입력 매개변수로,
plaintext를 평문 입력 매개변수로,
additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용한다.
ciphertext를 반환한다.
normalizedAlgorithm의 iv 멤버의 길이가
12바이트가 아니면
OperationError를
발생시킨다.
normalizedAlgorithm의 tagLength
멤버가
존재하고 128이 아니면
OperationError를
발생시킨다.
ciphertext의 길이가 128비트보다 작으면
OperationError를
발생시킨다.
normalizedAlgorithm의 additionalData 멤버가
존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을
additionalData로 둔다.
[RFC8439]의
2.8절에 설명된 AEAD_CHACHA20_POLY1305 복호화 알고리즘을 수행한다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 키를 키 입력 매개변수로,
normalizedAlgorithm의 iv 멤버를
논스 입력 매개변수로,
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로 둔다.
NotSupportedError를
발생시킨다.
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 멤버로 둔다.
normalizedAlgorithm의 functionName 멤버가
존재하면 이를 functionName으로 두고, 그렇지 않으면 빈 옥텟 문자열을
functionName으로 둔다.
normalizedAlgorithm의 customization 멤버가
존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을
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를
발생시킨다.
normalizedAlgorithm의 domainSeparation
멤버가 존재하면 이를 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를
발생시킨다.
normalizedAlgorithm의 customization
멤버가 존재하면 이를 customization으로 두고,
그렇지 않으면 빈 옥텟 문자열을 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 | 없음 | 객체 |
| get key length | 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 unsigned long length;
};
length 멤버는 키의 길이(비트 단위)를
나타낸다.
WebIDLdictionary KmacParams : Algorithm {
required [EnforceRange] unsigned long outputLength;
BufferSource customization;
};
outputLength 멤버는 요청된
비트 단위 출력 길이를 나타낸다.
customization 멤버는
사용자 정의 문자열을 나타낸다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택한다.
normalizedAlgorithm의 customization 멤버가
존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을
customization으로 둔다.
name
멤버가 "KMAC128"과 대소문자를 구분하여 일치하는 문자열인 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로,
customization을 S 입력 매개변수로 사용한다.
name
멤버가 "KMAC256"과 대소문자를 구분하여 일치하는 문자열인 경우:
[[handle]]
내부 슬롯이 나타내는 키를 K 입력 매개변수로,
message를 X 입력 매개변수로,
normalizedAlgorithm의 outputLength 멤버를
L 입력 매개변수로,
customization을 S 입력 매개변수로 사용한다.
mac을 포함하는 바이트 시퀀스를 반환한다.
normalizedAlgorithm의 customization 멤버가
존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을
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로 둔다.
NotSupportedError를
발생시킨다.
result를 반환한다.
이 절은 비규범적이다.
여기에서는 [RFC9106]에 정의된 비밀번호 해싱 및 키 파생용 Argon2 함수를 설명한다.
각 Argon2 형식의 인식되는 알고리즘
이름은
"Argon2d",
"Argon2i" 및
"Argon2id"이다.
| 연산 | 매개변수 | 결과 |
|---|---|---|
| deriveBits | Argon2Params |
바이트 시퀀스 |
| importKey | 없음 | CryptoKey |
| get key length | 없음 | 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 멤버는 논스를 나타내며, 비밀번호 해싱
애플리케이션에서는 솔트이다.
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를
발생시킨다.
normalizedAlgorithm의 secretValue 멤버가
존재하면 이를 secretValue로 둔다.
normalizedAlgorithm의 associatedData 멤버가
존재하면 이를 associatedData로 둔다.
[RFC9106]의
3절에 정의된 Argon2 함수를 수행한 결과를 result로 둔다.
이때 key의 [[handle]]
내부 슬롯이 나타내는 비밀번호를 메시지 P로,
normalizedAlgorithm의 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 Web Key와 함께 사용할 다음 알고리즘 식별자를 IANA JSON Web 서명 및 암호화 알고리즘 레지스트리에 등록한다.
이 절에서는 JSON Web Key와 함께 사용할 다음 키 연산을 IANA JSON Web Key 연산 레지스트리에 등록한다.
이 절은 비규범적이다.
이 명세는 많은 알고리즘과 연산을 정의한다. 구현자에게 지침을 제공하고 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: