Web Cryptography API의 현대 알고리즘

커뮤니티 그룹 보고서 초안

최신 게시 버전:
없음
최신 편집자 초안:
https://wicg.github.io/webcrypto-modern-algos/
편집자:
(Proton AG)
(Okta)
피드백:
GitHub WICG/webcrypto-modern-algos (풀 리퀘스트, 새 이슈, 열린 이슈)

초록

이 명세는 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 이슈를 사용하는 것이 권장된다.

1. 소개

이 절은 비규범적이다.

이 제안은 Web 암호화 API에서 사용할 수 있는 암호화 알고리즘 집합을 현대화하여, 웹 애플리케이션이 포스트 양자 보안 및 고성능 암호화 알고리즘을 사용할 수 있도록 하는 것을 목표로 합니다. 이를 위해 다음 암호화 알고리즘이 추가됩니다:

ML-KEM, 하이브리드 KEM 및 향후 추가될 수 있는 다른 KEM의 사용을 지원하기 위해, 이 제안은 키 캡슐화 및 캡슐화 해제를 위한 함수를 도입합니다; SubtleCrypto.encapsulateKey, SubtleCrypto.encapsulateBits, SubtleCrypto.decapsulateKeySubtleCrypto.decapsulateBits입니다.

또한 이 제안은 SubtleCrypto.getPublicKey 함수를 도입하며, 이 함수는 비대칭 개인 키에서 공개 키를 파생하는 편리한 방법을 제공하여, 개인 키만 필요한 경우 공개 키와 개인 키를 모두 별도로 저장할 필요를 없애 줍니다.

마지막으로 이 제안은 기능 감지를 더 쉽게 하는 것을 목표로 하며, SubtleCrypto.supports 함수를 추가합니다. 이 함수는 주어진 알고리즘 식별자 (모든 매개변수 포함)가 주어진 연산에서 지원되는지 감지하는 데 사용할 수 있습니다.

2. 명세 규칙

이 명세는 [webcrypto]의 18.3절에 규정된 규칙을 따른다. 여기에서 정의하는 알고리즘은 어떠한 것도 반드시 구현해야 하는 것은 아니지만, 적합한 사용자 에이전트가 알고리즘을 구현하는 경우 이 문서에 명시된 지원되는 모든 연산을 반드시 구현해야 하며, 지원되는 각 연산에 대해 [webcrypto]의 18.4.3절에 명시된 알고리즘 정의 단계를 수행해야 한다.

[webcrypto]에 정의된 지원되는 연산에 더해, 이 명세에서는 다음 연산을 사용한다:

3. 부분 SubtleCrypto 인터페이스

이 절은 [webcrypto]의 SubtleCrypto 인터페이스를 확장한다.

WebIDL[SecureContext,Exposed=(Window,Worker)]
partial interface SubtleCrypto {
  Promise<EncapsulatedKey> encapsulateKey(
    AlgorithmIdentifier encapsulationAlgorithm,
    CryptoKey encapsulationKey,
    AlgorithmIdentifier sharedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  Promise<EncapsulatedBits> encapsulateBits(
    AlgorithmIdentifier encapsulationAlgorithm,
    CryptoKey encapsulationKey
  );

  Promise<CryptoKey> decapsulateKey(
    AlgorithmIdentifier decapsulationAlgorithm,
    CryptoKey decapsulationKey,
    BufferSource ciphertext,
    AlgorithmIdentifier sharedKeyAlgorithm,
    boolean extractable,
    sequence<KeyUsage> keyUsages
  );
  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);
};

3.1 데이터 형식

3.1.1 키 형식

이 명세는 [webcrypto]의 KeyFormat 정의를 다음으로 대체한다.

WebIDLenum KeyFormat { "raw-public", "raw-private", "raw-seed", "raw-secret", "raw", "spki", "pkcs8", "jwk" };

이 명세는 여러 새로운 인식되는 키 형식 값을 명시한다.

raw-public
형식이 지정되지 않은 공개 키 바이트 시퀀스.
raw-private
형식이 지정되지 않은 비밀 키 바이트 시퀀스.
raw-seed
형식이 지정되지 않은 비밀 키 시드 바이트 시퀀스.
raw-secret
형식이 지정되지 않은 비밀 키 바이트 시퀀스.

[webcrypto]의 기존 모든 대칭 알고리즘에서 "raw-secret"은 "raw"의 별칭으로 동작한다.

[webcrypto]의 기존 모든 비대칭 알고리즘에서 "raw-public"은 "raw"의 별칭으로 동작한다.

deriveKey() 메서드의 키 가져오기 단계에서는 "raw" 대신 "raw-secret"을 형식으로 사용해야 한다.

3.1.2 키 용도

이 명세는 [webcrypto]의 KeyUsage 정의를 다음으로 대체한다.

WebIDLenum KeyUsage { "encrypt", "decrypt", "sign", "verify", "deriveKey", "deriveBits", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" };

이 명세는 여러 새로운 인식되는 키 용도 값을 명시한다.

encapsulateKey
SubtleCrypto.encapsulateKey에서 키를 사용할 수 있도록 한다.
encapsulateBits
SubtleCrypto.encapsulateBits에서 키를 사용할 수 있도록 한다.
decapsulateKey
SubtleCrypto.decapsulateKey에서 키를 사용할 수 있도록 한다.
decapsulateBits
SubtleCrypto.decapsulateBits에서 키를 사용할 수 있도록 한다.

3.2 메서드 및 매개변수

3.2.1 encapsulateKey 메서드

encapsulateKey(encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable, usages) 메서드는 키를 캡슐화하고 EncapsulatedKey 객체를 반환한다. 다음과 같이 동작한다.

  1. encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractableusages를 각각 encapsulateKey() 메서드에 전달된 encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractablekeyUsages 매개변수로 둔다.

  2. algencapsulationAlgorithm로 설정하고 op를 "encapsulate"로 설정하여 알고리즘을 정규화한 결과를 normalizedEncapsulationAlgorithm로 둔다.

  3. 오류가 발생한 경우 normalizedEncapsulationAlgorithm로 거부된 Promise를 반환한다.

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

  5. 오류가 발생한 경우 normalizedSharedKeyAlgorithm로 거부된 Promise를 반환한다.

  6. realmthis관련 영역으로 둔다.

  7. promise를 새로운 Promise로 둔다.

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

  9. 다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.

  10. normalizedEncapsulationAlgorithmname 멤버가 encapsulationKey[[algorithm]] 내부 슬롯에 있는 name 속성과 같지 않으면 InvalidAccessError발생시킨다.

  11. encapsulationKey[[usages]] 내부 슬롯에 "encapsulateKey"인 항목이 포함되어 있지 않으면 InvalidAccessError발생시킨다.

  12. encapsulationKey을 사용하여 encapsulationKey[[algorithm]] 내부 슬롯에서 지정한 캡슐화 연산을 수행한 결과를 encapsulatedBits로 둔다.

  13. normalizedSharedKeyAlgorithm에서 지정한 키 가져오기 연산을 수행한 결과를 sharedKey로 둔다. 이때 "raw-secret"을 format으로, encapsulatedBitssharedKey 필드를 keyData로, sharedKeyAlgorithmalgorithm으로 사용하고 extractableusages를 사용한다.

  14. sharedKey[[extractable]] 내부 슬롯을 extractable로 설정한다.

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

  16. 새로운 EncapsulatedKey 딕셔너리를 encapsulatedKey로 둔다. 이 딕셔너리의 sharedKeysharedKey로 설정하고, ciphertextencapsulatedBitsciphertext 필드로 설정한다.

  17. realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.

  18. [WebIDL]에 정의된 대로 encapsulatedKeyrealm의 ECMAScript 객체로 변환한 결과를 result로 둔다.

  19. promiseresult로 이행한다.

3.2.2 encapsulateBits 메서드

encapsulateBits(encapsulationAlgorithm, encapsulationKey) 메서드는 키를 캡슐화하고 EncapsulatedBits 객체를 반환한다. 다음과 같이 동작한다.

  1. encapsulationAlgorithmencapsulationKey을 각각 encapsulateBits() 메서드에 전달된 encapsulationAlgorithmencapsulationKey 매개변수로 둔다.

  2. algencapsulationAlgorithm로 설정하고 op를 "encapsulate"로 설정하여 알고리즘을 정규화한 결과를 normalizedEncapsulationAlgorithm로 둔다.

  3. 오류가 발생한 경우 normalizedEncapsulationAlgorithm로 거부된 Promise를 반환한다.

  4. realmthis관련 영역으로 둔다.

  5. promise를 새로운 Promise로 둔다.

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

  7. 다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.

  8. normalizedEncapsulationAlgorithmname 멤버가 encapsulationKey[[algorithm]] 내부 슬롯에 있는 name 속성과 같지 않으면 InvalidAccessError발생시킨다.

  9. encapsulationKey[[usages]] 내부 슬롯에 "encapsulateBits"인 항목이 포함되어 있지 않으면 InvalidAccessError발생시킨다.

  10. encapsulationKey을 사용하여 encapsulationKey[[algorithm]] 내부 슬롯에서 지정한 캡슐화 연산을 수행한 결과를 encapsulatedBits로 둔다.

  11. realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.

  12. [WebIDL]에 정의된 대로 encapsulatedBitsrealm의 ECMAScript 객체로 변환한 결과를 result로 둔다.

  13. promiseresult로 이행한다.

3.2.3 decapsulateKey 메서드

decapsulateKey(decapsulationAlgorithm, decapsulationKey, ciphertext, sharedKeyAlgorithm, extractable, usages) 메서드는 키의 캡슐화를 해제하고 CryptoKey 객체를 반환한다. 다음과 같이 동작한다.

  1. decapsulationAlgorithm, decapsulationKey, sharedKeyAlgorithm, extractableusages를 각각 decapsulateKey() 메서드에 전달된 decapsulationAlgorithm, decapsulationKey, sharedKeyAlgorithm, extractablekeyUsages 매개변수로 둔다.

  2. algdecapsulationAlgorithm로 설정하고 op를 "decapsulate"로 설정하여 알고리즘을 정규화한 결과를 normalizedDecapsulationAlgorithm로 둔다.

  3. 오류가 발생한 경우 normalizedDecapsulationAlgorithm로 거부된 Promise를 반환한다.

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

  5. 오류가 발생한 경우 normalizedSharedKeyAlgorithm로 거부된 Promise를 반환한다.

  6. ciphertextdecapsulateKey() 메서드에 전달된 ciphertext 매개변수가 보유한 바이트의 복사본을 가져온 결과로 둔다.

  7. realmthis관련 영역으로 둔다.

  8. promise를 새로운 Promise로 둔다.

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

  10. 다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.

  11. normalizedDecapsulationAlgorithmname 멤버가 decapsulationKey[[algorithm]] 내부 슬롯에 있는 name 속성과 같지 않으면 InvalidAccessError발생시킨다.

  12. decapsulationKey[[usages]] 내부 슬롯에 "decapsulateKey"인 항목이 포함되어 있지 않으면 InvalidAccessError발생시킨다.

  13. decapsulationKeyciphertext를 사용하여 decapsulationKey[[algorithm]] 내부 슬롯에서 지정한 캡슐화 해제 연산을 수행한 결과를 decapsulatedBits로 둔다.

  14. normalizedSharedKeyAlgorithm에서 지정한 키 가져오기 연산을 수행한 결과를 sharedKey로 둔다. 이때 "raw-secret"을 format으로, decapsulatedBitskeyData로, sharedKeyAlgorithmalgorithm으로 사용하고 extractableusages를 사용한다.

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

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

  17. realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.

  18. [WebIDL]에 정의된 대로 sharedKeyrealm의 ECMAScript 객체로 변환한 결과를 result로 둔다.

  19. promiseresult로 이행한다.

3.2.4 decapsulateBits 메서드

decapsulateBits(decapsulationAlgorithm, decapsulationKey, ciphertext) 메서드는 키의 캡슐화를 해제하고 ArrayBuffer 객체를 반환한다. 다음과 같이 동작한다.

  1. decapsulationAlgorithmdecapsulationKey을 각각 decapsulateBits() 메서드에 전달된 decapsulationAlgorithmdecapsulationKey 매개변수로 둔다.

  2. algdecapsulationAlgorithm로 설정하고 op를 "decapsulate"로 설정하여 알고리즘을 정규화한 결과를 normalizedDecapsulationAlgorithm로 둔다.

  3. 오류가 발생한 경우 normalizedDecapsulationAlgorithm로 거부된 Promise를 반환한다.

  4. ciphertextdecapsulateBits() 메서드에 전달된 ciphertext 매개변수가 보유한 바이트의 복사본을 가져온 결과로 둔다.

  5. realmthis관련 영역으로 둔다.

  6. promise를 새로운 Promise로 둔다.

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

  8. 다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.

  9. normalizedDecapsulationAlgorithmname 멤버가 decapsulationKey[[algorithm]] 내부 슬롯에 있는 name 속성과 같지 않으면 InvalidAccessError발생시킨다.

  10. decapsulationKey[[usages]] 내부 슬롯에 "decapsulateBits"인 항목이 포함되어 있지 않으면 InvalidAccessError발생시킨다.

  11. decapsulationKeyciphertext를 사용하여 decapsulationKey[[algorithm]] 내부 슬롯에서 지정한 캡슐화 해제 연산을 수행한 결과를 decapsulatedBits로 둔다.

  12. realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.

  13. realm에서 decapsulatedBits를 포함하는 ArrayBuffer생성한 결과를 result로 둔다.

  14. promiseresult로 이행한다.

3.2.5 getPublicKey 메서드

getPublicKey(key, usages) 메서드는 지정된 비밀 키에 대응하는 공개 키를 반환한다. 다음과 같이 동작한다.

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

  2. algorithmkey[[algorithm]] 내부 슬롯으로 둔다.

  3. algorithm이 식별하는 암호 알고리즘이 비밀 키에서 공개 키를 파생하는 기능을 지원하지 않으면 NotSupportedError로 거부된 Promise를 반환한다.

  4. realmthis관련 영역으로 둔다.

  5. promise를 새로운 Promise로 둔다.

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

  7. 다음 단계 또는 참조된 절차에서 오류를 발생시키라고 하는 경우, realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 반환된 오류로 promise를 거부한 다음, 알고리즘을 종료한다.

  8. key[[type]] 내부 슬롯이 "private"이 아니면 InvalidAccessError발생시킨다.

  9. usagesalgorithm이 식별하는 알고리즘이 공개 키에 대해 지원하지 않는 항목이 포함되어 있으면 SyntaxError발생시킨다.

  10. key[[handle]] 내부 슬롯이 나타내는 비밀 키에 대응하는 공개 키를 나타내는 새로운 CryptoKeypublicKey로 둔다.

  11. 오류가 발생한 경우 OperationError발생시킨다.

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

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

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

  15. publicKey[[usages]] 내부 슬롯을 usages로 설정한다.

  16. realm의 전역 객체를 지정하여 암호화 작업 소스전역 작업을 대기열에 추가하여 나머지 단계를 수행한다.

  17. [WebIDL]에 정의된 대로 publicKeyrealm의 ECMAScript 객체로 변환한 결과를 result로 둔다.

  18. promiseresult로 이행한다.

3.2.6 supports 메서드

supports(operation, algorithm, length) 메서드는 지정된 AlgorithmIdentifier를 사용하여 주어진 연산을 구현이 지원하는지 여부를 나타내는 불리언 값을 반환하며, operation이 "deriveBits"일 때 파생할 비트 수를 나타내는 선택적 length 매개변수를 사용한다. 다음과 같이 동작한다:

  1. operation이 다음 중 하나가 아니면 "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" 또는 "getPublicKey", false를 반환한다.

  2. 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 opoperation으로, algalgorithm으로, lengthlength로 설정한다.

supports(operation, algorithm, additionalAlgorithm) 메서드는 지정된 AlgorithmIdentifier를 사용하여 주어진 연산을 구현이 지원하는지 여부를 나타내는 불리언 값을 반환한다. 추가 알고리즘은 operation이 "deriveKey"일 때 파생할 키의 유형, operation이 "wrapKey"일 때 래핑하기 전에 내보낼 키의 유형, 그리고 operation이 "unwrapKey"일 때 언래핑한 후 가져올 키의 유형을 나타낸다. 다음과 같이 동작한다:

  1. operation이 다음 중 하나가 아니면 "encrypt", "decrypt", "sign", "verify", "digest", "generateKey", "deriveKey", "deriveBits", "importKey", "exportKey", "wrapKey", "unwrapKey", "encapsulateKey", "encapsulateBits", "decapsulateKey", "decapsulateBits" 또는 "getPublicKey", false를 반환한다.

  2. operation이 "deriveKey" 또는 "unwrapKey"인 경우:

    알고리즘 지원 여부를 확인한 결과가 op를 "importKey"로 설정하고 algadditionalAlgorithm으로 설정했을 때 false이면, false를 반환한다.

    operation이 "wrapKey"인 경우:

    알고리즘 지원 여부를 확인한 결과가 op를 "exportKey"로 설정하고 algadditionalAlgorithm으로 설정했을 때 false이면, false를 반환한다.

  3. operation이 "encapsulateKey" 또는 "decapsulateKey"인 경우:
    1. normalizedAlgorithm알고리즘을 정규화한 결과로 설정한다. 이때 algalgorithm으로, op는 "get shared key length"로 설정한다.

    2. 오류가 발생한 경우 false를 반환한다.

    3. sharedKeyLengthnormalizedAlgorithm이 지정한 공유 키 길이 가져오기 알고리즘을 algorithm을 사용하여 수행한 결과로 설정한다.

    4. normalizedAdditionalAlgorithm알고리즘을 정규화한 결과로 설정한다. 이때 algadditionalAlgorithm으로, op는 "importKey"로 설정한다.

    5. 오류가 발생한 경우 false를 반환한다.

    6. 연산 단계에서 지원 여부를 결정한 결과가 op를 "importKey"로 설정하고 normalizedAlgorithmnormalizedAdditionalAlgorithm으로 설정하며, length를 null로 설정했을 때 false이면, false를 반환한다.

    7. normalizedAdditionalAlgorithm이 지정한 키 가져오기 연산이 format이 "raw-secret"일 때 비트 단위 길이가 sharedKeyLength바이트 시퀀스인 모든 keyData 값에 대해 오류를 발생시키는 경우, false를 반환한다.

  4. length를 null로 설정한다.

  5. operation이 "deriveKey"인 경우:
    1. 알고리즘 지원 여부를 확인한 결과가 op를 "get key length"로 설정하고 algadditionalAlgorithm으로 설정했을 때 false이면, false를 반환한다.

    2. normalizedAdditionalAlgorithm알고리즘을 정규화한 결과로 설정한다. 이때 algadditionalAlgorithm으로, op는 "get key length"로 설정한다.

    3. lengthadditionalAlgorithm이 지정한 키 길이 가져오기 알고리즘을 normalizedAdditionalAlgorithm을 사용하여 수행한 결과로 설정한다.

    4. operation을 "deriveBits"로 설정한다.

  6. 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 opoperation으로, algalgorithm으로, lengthlength로 설정한다.

3.3 알고리즘 지원 여부 확인

알고리즘 지원 여부 확인 알고리즘은 주어진 연산에 대해 주어진 알고리즘이 지원되는지 확인하는 프로세스를 정의한다. 입력은 연산 이름 op, AlgorithmIdentifier alg, 그리고 length 매개변수이다. 출력은 불리언이다. 다음과 같이 동작한다:

  1. op가 "encapsulateKey" 또는 "encapsulateBits"이면, op를 "encapsulate"로 설정한다.

  2. op가 "decapsulateKey" 또는 "decapsulateBits"이면, op를 "decapsulate"로 설정한다.

  3. op가 "getPublicKey"인 경우:
    1. normalizedAlgorithm알고리즘을 정규화한 결과로 설정한다. 이때 algalg로, op는 "exportKey"로 설정한다.

    2. 오류가 발생한 경우 false를 반환한다.

    3. normalizedAlgorithm이 식별하는 암호화 알고리즘이 개인 키에서 공개 키를 파생하는 것을 지원하지 않으면, false를 반환한다.

    4. 그렇지 않으면 true를 반환한다.

  4. normalizedAlgorithm알고리즘을 정규화한 결과로 설정한다. 이때 algalg로, opop로 설정한다.

  5. 오류가 발생한 경우:
    1. op가 "wrapKey"이면, 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 op는 "encrypt"로, algalg로 설정한다.

    2. op가 "unwrapKey"이면, 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 op는 "decrypt"로, algalg로 설정한다.

    3. 그렇지 않으면 false를 반환한다.

  6. 연산 단계에서 지원 여부를 결정한 결과를 반환한다. 이때 opop로, normalizedAlgorithmnormalizedAlgorithm로, lengthlength로 설정한다.

연산 단계에서 지원 여부 결정 알고리즘은 정규화된 알고리즘의 연산 단계가 지원을 나타내는지 여부를 결정한다. 입력은 연산 이름 op, Algorithm normalizedAlgorithm, 그리고 length 매개변수이다. 출력은 불리언이다. 다음과 같이 동작한다:

  1. 지정된 연산 또는 정규화된 알고리즘(또는 그 매개변수 값 중 하나)이 구현별 이유로 (어떤 키 및/또는 데이터에 대해서도) 실패할 것으로 예상되는 경우 (예: 명세를 준수하지 않는 것으로 알려진 경우), false를 반환한다.

  2. op가 "generateKey" 또는 "importKey"이면, usages를 빈 목록으로 설정한다.

  3. normalizedAlgorithm이 지정한 알고리즘에서 op가 지정한 연산의 각 단계에 대해:

    단계에서 오류를 발생시키라고 하는 경우:
    false를 반환한다.
    단계에서 키를 생성하라고 하는 경우:
    true를 반환한다.
    단계가 key, plaintext 또는 ciphertext와 같이 사용할 수 없는 매개변수에 의존하는 경우:
    true를 반환한다.
    단계에서 값을 반환하라고 하는 경우:
    true를 반환한다.
    그렇지 않은 경우:
    해당 단계를 실행한다.
    참고

    참조된 알고리즘의 단계는 이 컨텍스트의 normalizedAlgorithm, length, 그리고 usages 변수에 접근할 수 있다.

  4. 단언: 이 단계에는 절대로 도달하지 않는다. 연산의 단계 중 하나가 값을 반환하거나 오류를 발생시키라고 했을 것이므로, 각각 true 또는 false를 반환하게 되기 때문이다.

4. 캡슐화 딕셔너리

WebIDLdictionary EncapsulatedKey {
  CryptoKey sharedKey;
  ArrayBuffer ciphertext;
};

dictionary EncapsulatedBits {
  ArrayBuffer sharedKey;
  ArrayBuffer ciphertext;
};

EncapsulatedKey 딕셔너리는 sharedKeyciphertext로 구성된 캡슐화된 키를 나타낸다.

EncapsulatedBits 딕셔너리는 sharedKeyciphertext로 구성된 캡슐화된 키 비트를 나타낸다.

5. 부분 JsonWebKey 딕셔너리

WebIDLpartial dictionary JsonWebKey {
  // 다음 필드는 RFC 9964에 정의되어 있다
  DOMString pub;
  DOMString priv;
};

[webcrypto]에 정의된 JsonWebKey 딕셔너리의 이 확장은 [RFC9964]에 정의된 "AKP" 키 형식으로 키를 나타내는 방법을 제공한다.

6. ML-KEM

6.1 설명

이 섹션은 비규범적입니다.

여기에서는 [FIPS-203]에 명시된 대로, 키 캡슐화 및 캡슐화 해제에 ML-KEM을 사용하는 방법을 설명합니다.

6.2 등록

이 알고리즘에 대해 인식되는 알고리즘 이름은 "ML-KEM-512", "ML-KEM-768" 및 "ML-KEM-1024"입니다.

연산 매개변수 결과
encapsulate 없음 EncapsulatedBits
decapsulate 없음 바이트 시퀀스
공유 키 길이 가져오기 없음 정수
generateKey 없음 CryptoKeyPair
importKey 없음 CryptoKey
exportKey 없음 객체

6.3 JSON 웹 키 표현

ML-KEM 키는 JWK 표현에 [RFC9964]에 정의된 "AKP"(Algorithm Key Pair) 키 유형을 사용합니다. "alg"(algorithm) 매개변수는 특정 ML-KEM 매개변수 세트를 식별합니다. 공개 키는 "pub" 매개변수에 담깁니다. 비공개 키가 포함된 경우에는 "priv" 매개변수를 사용하여 표현합니다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩됩니다.

6.4 연산

6.4.1 캡슐화

  1. key[[type]] 내부 슬롯이 "public"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

  2. [FIPS-203]의 섹션 7.2에 설명된 캡슐화 키 검사를 수행합니다. 이때 algorithmname 멤버가 나타내는 매개변수 세트를 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.

    참고

    성능을 위해 필요하다면 이 검사의 결과를 CryptoKey 객체에 대해 캐시하거나 미리 계산할 수 있습니다.

  3. 캡슐화 키 검사가 실패한 경우 OperationError를 반환합니다.

  4. sharedKeyciphertext를 [FIPS-203]의 섹션 7.2에 설명된 ML-KEM.Encaps 함수를 수행하여 얻은 출력이라고 합니다. 이때 algorithmname 멤버가 나타내는 매개변수 세트를 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.

  5. ML-KEM.Encaps 함수가 오류를 반환한 경우 OperationError를 반환합니다.

  6. result를 새 EncapsulatedBits 사전이라고 합니다.

  7. resultsharedKey 속성을 sharedKey를 포함하는 ArrayBuffer생성한 결과로 설정합니다.

  8. resultciphertext 속성을 ciphertext를 포함하는 ArrayBuffer생성한 결과로 설정합니다.

  9. result를 반환합니다.

6.4.2 캡슐화 해제

  1. key[[type]] 내부 슬롯이 "private"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

  2. [FIPS-203]의 섹션 7.3에 설명된 캡슐화 해제 입력 검사를 수행합니다. 이때 algorithmname 멤버가 나타내는 매개변수 세트를 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 dk 입력 매개변수로, ciphertextc 입력 매개변수로 사용합니다.

    참고

    성능을 위해 필요하다면 캡슐화 해제 키 유형 검사와 해시 검사의 결과를 CryptoKey 객체에 대해 캐시하거나 미리 계산할 수 있습니다.

  3. 캡슐화 해제 키 검사가 실패한 경우 OperationError를 반환합니다.

  4. sharedKey를 [FIPS-203]의 섹션 7.3에 설명된 ML-KEM.Decaps 함수를 수행하여 얻은 출력이라고 합니다. 이때 algorithmname 멤버가 나타내는 매개변수 세트를 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 dk 입력 매개변수로, ciphertextc 입력 매개변수로 사용합니다.

  5. sharedKey를 반환합니다.

6.4.3 공유 키 길이 가져오기

  1. 256을 반환합니다.

6.4.4 키 생성

  1. usages에 "encapsulateKey", "encapsulateBits", "decapsulateKey" 또는 "decapsulateBits" 중 하나가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

  2. [FIPS-203]의 섹션 7.1에 설명된 대로 ML-KEM 키 쌍을 생성하며, normalizedAlgorithmname 멤버가 나타내는 매개변수 세트를 사용합니다.

    참고

    시드 (d, z)를 내보낼 수 있도록 하려면, dz를 생성된 키 자료의 일부로 저장해야 합니다.

  3. 키 생성 단계가 실패한 경우 예외를 발생시켜 OperationError로 처리합니다.

  4. algorithm을 새 KeyAlgorithm 객체라고 합니다.

  5. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

  6. publicKey를 생성된 키 쌍의 캡슐화 키를 나타내는 새 CryptoKey라고 합니다.

  7. publicKey[[type]] 내부 슬롯을 "public"으로 설정합니다.

  8. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  9. publicKey[[extractable]] 내부 슬롯을 true로 설정합니다.

  10. publicKey[[usages]] 내부 슬롯을 usages[ "encapsulateKey", "encapsulateBits" ]용도 교집합으로 설정합니다.

  11. privateKey를 생성된 키 쌍의 캡슐화 해제 키를 나타내는 새 CryptoKey라고 합니다.

  12. privateKey[[type]] 내부 슬롯을 "private"으로 설정합니다.

  13. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  14. privateKey[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  15. privateKey[[usages]] 내부 슬롯을 usages[ "decapsulateKey", "decapsulateBits" ]용도 교집합으로 설정합니다.

  16. result를 새 CryptoKeyPair 사전이라고 합니다.

  17. resultpublicKey 속성을 publicKey로 설정합니다.

  18. resultprivateKey 속성을 privateKey로 설정합니다.

  19. result를 반환합니다.

6.4.5 키 가져오기

  1. keyData를 가져올 키 데이터라고 합니다.

  2. format이 "spki"인 경우:
    1. usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    2. spkikeyData에 대해 subjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과라고 합니다.

    3. 구문 분석 중 오류가 발생한 경우 예외를 발생시켜 DataError로 처리합니다.

    4. normalizedAlgorithmname 멤버가 "ML-KEM-512"인 경우:

      expectedOidid-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1)라고 합니다.

      normalizedAlgorithmname 멤버가 "ML-KEM-768"인 경우:

      expectedOidid-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2)라고 합니다.

      normalizedAlgorithmname 멤버가 "ML-KEM-1024"인 경우:

      expectedOidid-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3)라고 합니다.

      그렇지 않은 경우:

      예외를 발생시켜 NotSupportedError로 처리합니다.

    5. spkialgorithm AlgorithmIdentifier 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

    6. spkialgorithm AlgorithmIdentifier 필드에 parameters 필드가 존재하는 경우 예외를 발생시켜 DataError로 처리합니다.

    7. publicKeyspkisubjectPublicKey 필드가 식별하는 ML-KEM 공개 키라고 합니다.

    8. keypublicKey를 나타내는 새 CryptoKey라고 합니다.

    9. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    10. algorithm을 새 KeyAlgorithm이라고 합니다.

    11. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "pkcs8"인 경우:
    1. usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    2. privateKeyInfokeyData에 대해 privateKeyInfo 구문 분석 알고리즘을 실행한 결과라고 합니다.

    3. 구문 분석 중 오류가 발생하는 경우 예외를 발생시켜 DataError로 처리합니다.

    4. normalizedAlgorithmname 멤버가 "ML-KEM-512"인 경우:

      expectedOidid-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1)라고 합니다.

      asn1Structure를 ASN.1 ML-KEM-512-PrivateKey 구조라고 합니다.

      normalizedAlgorithmname 멤버가 "ML-KEM-768"인 경우:

      expectedOidid-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2)라고 합니다.

      asn1Structure를 ASN.1 ML-KEM-768-PrivateKey 구조라고 합니다.

      normalizedAlgorithmname 멤버가 "ML-KEM-1024"인 경우:

      expectedOidid-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3)라고 합니다.

      asn1Structure를 ASN.1 ML-KEM-1024-PrivateKey 구조라고 합니다.

      그렇지 않은 경우:

      예외를 발생시켜 NotSupportedError로 처리합니다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에 parameters 필드가 존재하는 경우 예외를 발생시켜 DataError로 처리합니다.

    7. mlKemPrivateKeydata에는 privateKeyInfoprivateKey 필드를, structure에는 asn1Structure를 지정하고 exactData를 true로 설정하여 ASN.1 구조 구문 분석 알고리즘을 수행한 결과라고 합니다.

    8. 구문 분석 중 오류가 발생한 경우 예외를 발생시켜 DataError로 처리합니다.

    9. mlKemPrivateKeyexpandedKey 형식의 ML-KEM 키를 나타내거나, mlKemPrivateKeyboth 형식의 ML-KEM 키를 나타내고 both 형식이 지원되지 않는 경우 NotSupportedError 예외를 발생시킵니다.

    10. mlKemPrivateKeyboth 형식의 ML-KEM 키를 나타내고, seed 필드가 expandedKey 필드와 일치하지 않는 경우 DataError 예외를 발생시킵니다.

    11. keymlKemPrivateKey가 식별하는 ML-KEM 비공개 키를 나타내는 새 CryptoKey라고 합니다.

    12. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    13. algorithm을 새 KeyAlgorithm이라고 합니다.

    14. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    15. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-public"인 경우:
    1. usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    2. datakeyData라고 합니다.

    3. keydata의 ML-KEM 공개 키 데이터를 나타내는 새 CryptoKey라고 합니다.

    4. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    5. algorithm을 새 KeyAlgorithm이라고 합니다.

    6. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    7. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-seed"인 경우:
    1. usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    2. datakeyData라고 합니다.

    3. data의 비트 단위 길이가 512가 아닌 경우 예외를 발생시켜 DataError로 처리합니다.

    4. privateKey를 [FIPS-203]의 섹션 6.1에 설명된 ML-KEM.KeyGen_internal 함수를 수행한 결과라고 합니다. 이때 normalizedAlgorithmname 멤버가 나타내는 매개변수 세트를 사용하고, data의 처음 256비트를 d로, 마지막 256비트를 z로 사용합니다.

    5. keyprivateKey가 식별하는 ML-KEM 비공개 키를 나타내는 새 CryptoKey라고 합니다.

    6. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    7. algorithm을 새 KeyAlgorithm이라고 합니다.

    8. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    9. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같다고 합니다.

      그렇지 않은 경우:

      예외를 발생시켜 DataError로 처리합니다.

    2. jwkpriv 필드가 존재하고 usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    3. jwkpriv 필드가 존재하지 않고 usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있는 경우 예외를 발생시켜 SyntaxError로 처리합니다.

    4. jwkkty 필드가 "AKP"가 아닌 경우 예외를 발생시켜 DataError로 처리합니다.

    5. jwkalg 필드가 존재하지 않거나, 그 값이 normalizedAlgorithmname 멤버가 나타내는 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]에서 제안한 값이 있습니다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"와 같지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

    7. jwkkey_ops 필드가 존재하면서 JSON 웹 키 [JWK]의 요구사항에 따라 유효하지 않거나, 지정된 usages 값을 모두 포함하지 않는 경우 예외를 발생시켜 DataError로 처리합니다.

    8. jwkext 필드가 존재하고 그 값이 false이며 extractable이 true인 경우 예외를 발생시켜 DataError로 처리합니다.

    9. jwkpriv 필드가 존재하는 경우:
      1. jwkpriv 속성에 ML-KEM 비공개 키를 나타내는 유효한 base64url 인코딩 시드가 포함되어 있지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

      2. keyjwkpriv 속성을 base64url 인코딩 시드로 해석하여 식별한 ML-KEM 비공개 키를 나타내는 새 CryptoKey 객체라고 합니다.

      3. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

      4. jwkpub 속성에 key에 대응하는 ML-KEM 공개 키를 나타내는 base64url 인코딩 공개 키가 포함되어 있지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

      그렇지 않은 경우:
      1. jwkpub 속성에 ML-KEM 공개 키를 나타내는 유효한 base64url 인코딩 공개 키가 포함되어 있지 않은 경우 예외를 발생시켜 DataError로 처리합니다.

      2. keyjwkpub 속성을 base64url 인코딩 공개 키로 해석하여 식별한 ML-KEM 공개 키를 나타내는 새 CryptoKey 객체라고 합니다.

      3. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    10. algorithm을 새 KeyAlgorithm 객체의 인스턴스라고 합니다.

    11. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    그렇지 않은 경우:
    예외를 발생시켜 NotSupportedError로 처리합니다.
  3. key를 반환합니다.

6.4.6 키 내보내기

  1. key를 내보낼 CryptoKey라고 합니다.

  2. key[[handle]] 내부 슬롯이 나타내는 기반 암호화 키 자료에 접근할 수 없는 경우 예외를 발생시켜 OperationError로 처리합니다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯이라고 합니다.

    3. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 하며 다음 속성을 갖도록 합니다.

      • algorithm 필드를 다음 속성을 갖는 AlgorithmIdentifier ASN.1 유형으로 설정합니다.

        • keyAlgorithmname 멤버가 "ML-KEM-512"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-768"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-1024"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) OID로 설정합니다.

          그렇지 않은 경우:

          예외를 발생시켜 NotSupportedError로 처리합니다.

      • subjectPublicKey 필드를 keyData로 설정합니다.

    4. resultdata를 DER 인코딩한 결과라고 합니다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯이라고 합니다.

    3. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 하며 다음 속성을 갖도록 합니다.

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

      • privateKeyAlgorithm 필드를 다음 속성을 갖는 PrivateKeyAlgorithmIdentifier ASN.1 유형으로 설정합니다.

        • keyAlgorithmname 멤버가 "ML-KEM-512"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-768"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-1024"인 경우:

          algorithm 객체 식별자를 id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) OID로 설정합니다.

          그렇지 않은 경우:

          예외를 발생시켜 NotSupportedError로 처리합니다.

      • privateKey 필드를 다음과 같이 설정합니다.

        • keyAlgorithmname 멤버가 "ML-KEM-512"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를 시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는 컨텍스트별 [0] 기본 태그 사용)으로 나타내는 ML-KEM-512-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-768"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를 시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는 컨텍스트별 [0] 기본 태그 사용)으로 나타내는 ML-KEM-768-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다.

          keyAlgorithmname 멤버가 "ML-KEM-1024"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-KEM 비공개 키 시드를 시드 전용 형식(암시적 OCTET STRING 인코딩을 사용하는 컨텍스트별 [0] 기본 태그 사용)으로 나타내는 ML-KEM-1024-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다.

          그렇지 않은 경우:

          예외를 발생시켜 NotSupportedError로 처리합니다.

    4. resultdata를 DER 인코딩한 결과라고 합니다.

    format이 "raw-public"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는 바이트 시퀀스라고 합니다.

    3. resultdata라고 합니다.

    format이 "raw-seed"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아닌 경우 예외를 발생시켜 InvalidAccessError로 처리합니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 키의 dz 시드 변수를 연결한 값을 포함하는 바이트 시퀀스라고 합니다.

      참고

      dz 시드 변수는 [FIPS-203]의 섹션 7.1에 설명된 대로 ML-KEM.KeyGen 함수에서 샘플링되었습니다.

    3. resultdata라고 합니다.

    format이 "jwk"인 경우:
    1. jwk를 새 JsonWebKey 사전이라고 합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯이라고 합니다.

    3. jwkkty 속성을 "AKP"로 설정합니다.

    4. jwkalg 속성을 keyAlgorithmname 멤버로 설정합니다.

    5. jwkpub 속성을 key[[handle]] 내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      jwkpriv 속성을 key[[handle]] 내부 슬롯이 나타내는 base64url 인코딩 시드로 설정합니다.
    7. jwkkey_ops 속성을 keyusages 속성으로 설정합니다.

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

    9. resultjwk라고 합니다.

    그렇지 않은 경우:

    예외를 발생시켜 NotSupportedError로 처리합니다.

  4. result를 반환합니다.

7. 하이브리드 KEM

7.1 설명

이 섹션은 비규범적입니다.

여기에서는 키 캡슐화 및 캡슐화 해제를 위해 하이브리드 포스트 양자/전통적 키 캡슐화 메커니즘을 사용하는 방법을 설명하며, [draft-irtf-cfrg-concrete-hybrid-kems-04]에 명시되어 있습니다.

7.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "MLKEM768-P256", "MLKEM768-X25519" 및 "MLKEM1024-P384"입니다.

연산 매개변수 결과
encapsulate 없음 EncapsulatedBits
decapsulate 없음 바이트 시퀀스
공유 키 길이 가져오기 없음 정수
generateKey 없음 CryptoKeyPair
importKey 없음 CryptoKey
exportKey 없음 객체

7.3 JSON Web Key 표현

하이브리드 KEM 키는 JWK 표현에 [RFC9964]에서 정의된 "AKP"(Algorithm Key Pair) 키 유형을 사용합니다. "alg"(algorithm) 매개변수는 특정 하이브리드 KEM 인스턴스를 식별합니다. 공개 키는 "pub" 매개변수에 저장됩니다. 개인 키가 포함되는 경우에는 "priv" 매개변수를 사용하여 표현됩니다. JWK로 표현될 때 모든 키 매개변수는 base64url로 인코딩됩니다.

7.4 연산

7.4.1 캡슐화

  1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

  2. sharedKeyciphertext를 [draft-irtf-cfrg-concrete-hybrid-kems-04]의 섹션 4에서 algorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스에 대해 Encaps 함수를 수행하여 얻은 출력으로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.

  3. Encaps 함수가 오류를 반환한 경우 OperationError를 반환합니다.

  4. result를 새로운 EncapsulatedBits 사전으로 설정합니다.

  5. resultsharedKey 속성을 sharedKey를 포함하는 ArrayBuffer생성한 결과로 설정합니다.

  6. resultciphertext 속성을 ciphertext를 포함하는 ArrayBuffer생성한 결과로 설정합니다.

  7. result를 반환합니다.

7.4.2 캡슐화 해제

  1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

  2. sharedKey를 [draft-irtf-cfrg-concrete-hybrid-kems-04]의 섹션 4에서 algorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스에 대해 Decaps 함수를 수행하여 얻은 출력으로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 dk 입력 매개변수로 사용하고, ciphertextct 입력 매개변수로 사용합니다.

  3. Decaps 함수가 오류를 반환한 경우 OperationError를 반환합니다.

  4. sharedKey를 반환합니다.

7.4.3 공유 키 길이 가져오기

  1. 256을 반환합니다.

7.4.4 키 생성

  1. usages에 "encapsulateKey", "encapsulateBits", "decapsulateKey" 또는 "decapsulateBits" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. [draft-irtf-cfrg-hybrid-kems-12]의 섹션 5.2에 설명된 GenerateKeyPair 함수를 normalizedAlgorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스로 수행하여 하이브리드 KEM 키 쌍을 생성합니다.

  3. 키 생성 단계가 실패하면, OperationError던집니다.

  4. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

  5. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

  6. publicKey를 생성된 키 쌍의 캡슐화 키를 나타내는 새로운 CryptoKey로 설정합니다.

  7. publicKey[[type]] 내부 슬롯을 "public"으로 설정합니다.

  8. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  9. publicKey[[extractable]] 내부 슬롯을 true로 설정합니다.

  10. publicKey[[usages]] 내부 슬롯을 usages[ "encapsulateKey", "encapsulateBits" ]용도 교집합으로 설정합니다.

  11. privateKey를 생성된 키 쌍의 캡슐화 해제 키를 나타내는 새로운 CryptoKey로 설정합니다.

  12. privateKey[[type]] 내부 슬롯을 "private"으로 설정합니다.

  13. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  14. privateKey[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  15. privateKey[[usages]] 내부 슬롯을 usages[ "decapsulateKey", "decapsulateBits" ]용도 교집합으로 설정합니다.

  16. result를 새로운 CryptoKeyPair 사전으로 설정합니다.

  17. resultpublicKey 속성을 publicKey로 설정합니다.

  18. resultprivateKey 속성을 privateKey로 설정합니다.

  19. result를 반환합니다.

7.4.5 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. format이 "raw-public"인 경우:
    1. usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError던집니다.

    2. datakeyData로 설정합니다.

    3. data의 바이트 단위 길이가 [draft-irtf-cfrg-concrete-hybrid-kems-04]의 섹션 4에서 normalizedAlgorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스의 원시 공개 키 길이 Nek와 같지 않으면, DataError던집니다.

    4. keydata의 하이브리드 KEM 공개 키 데이터를 나타내는 새로운 CryptoKey로 설정합니다.

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

    6. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    7. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

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

    format이 "raw-seed"인 경우:
    1. usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError던집니다.

    2. datakeyData로 설정합니다.

    3. data의 비트 단위 길이가 256이 아니면 DataError던집니다.

    4. keyPair를 [draft-irtf-cfrg-hybrid-kems-12]의 섹션 5.5에 설명된 DeriveKeyPair 함수를 normalizedAlgorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스로 수행한 결과로 설정하며, dataseed 입력 매개변수로 사용합니다.

    5. DeriveKeyPair 함수가 오류를 반환한 경우, OperationError던집니다.

    6. keykeyPair의 캡슐화 해제 키로 식별되는 하이브리드 KEM 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

    7. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    8. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    9. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. jwkpriv 필드가 존재하고, usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError던집니다.

    3. jwkpriv 필드가 존재하지 않고, usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError던집니다.

    4. jwkkty 필드가 "AKP"가 아니면, DataError던집니다.

    5. jwkalg 필드가 존재하지 않거나, 그 값이 normalizedAlgorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스를 식별하지 않으면, DataError던집니다.

      참고

      이 명세에서 정의한 하이브리드 KEM 인스턴스에 대해 IANA JSON 웹 서명 및 암호화 알고리즘 레지스트리에 등록된 "alg" 값은 MLKEM768-P256, MLKEM768-X25519MLKEM1024-P384입니다. 구현은 동일한 하이브리드 KEM 인스턴스를 사용하는 JWE 알고리즘을 식별하는 이 레지스트리의 다른 값도 허용해야 합니다. 단, 해당 JWE 알고리즘의 JWK 표현은 "alg" 값을 제외하고 여기에서 정의한 표현과 호환되어야 합니다. 예로는 등록된 이후의 [draft-ietf-jose-hpke-pq-pqt]에서 제안한 값이 있습니다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"와 같지 않으면, DataError던집니다.

    7. jwkkey_ops 필드가 존재하며, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나, 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    8. jwkext 필드가 존재하며 값이 false이고 extractable이 true이면, DataError던집니다.

    9. jwkpriv 필드가 존재하는 경우:
      1. jwkpriv 속성이 하이브리드 KEM 개인 키를 나타내는 유효한 base64url 인코딩 32바이트 시드를 포함하지 않으면, DataError던집니다.

      2. keyjwkpriv 속성을 base64url로 인코딩된 시드로 해석하여 식별되는 하이브리드 KEM 개인 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

      4. jwkpub 속성이 key에 대응하는 하이브리드 KEM 공개 키를 나타내는 base64url 인코딩 공개 키를 포함하지 않으면, DataError던집니다.

      그렇지 않은 경우:
      1. jwkpub 속성이 [draft-irtf-cfrg-concrete-hybrid-kems-04]의 섹션 4에서 normalizedAlgorithmname 멤버가 나타내는 하이브리드 KEM 인스턴스에 대해 길이가 Nek인 유효한 base64url 인코딩 원시 공개 키를 포함하지 않으면, DataError던집니다.

      2. keyjwkpub 속성을 base64url로 인코딩된 공개 키로 해석하여 식별되는 하이브리드 KEM 공개 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    10. algorithm을 새로운 KeyAlgorithm 객체의 인스턴스로 설정합니다.

    11. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    그렇지 않은 경우:
    NotSupportedError던집니다.
  3. key를 반환합니다.

7.4.6 키 내보내기

  1. key를 내보낼 CryptoKey로 설정합니다.

  2. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  3. format이 "raw-public"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는 바이트 시퀀스로 설정합니다.

    3. resultdata로 설정합니다.

    format이 "raw-seed"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 32바이트 시드를 포함하는 바이트 시퀀스로 설정합니다.

    3. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. jwkkty 속성을 "AKP"로 설정합니다.

    4. jwkalg 속성을 keyAlgorithmname 멤버로 설정합니다.

    5. jwkpub 속성을 key[[handle]] 내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      jwkpriv 속성을 key[[handle]] 내부 슬롯이 나타내는 base64url 인코딩 32바이트 시드로 설정합니다.
    7. jwkkey_ops 속성을 keyusages 속성으로 설정합니다.

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

    9. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  4. result를 반환합니다.

8. ML-DSA

8.1 설명

이 섹션은 비규범적입니다.

여기에서는 서명 및 검증에 ML-DSA를 사용하는 방법을 설명하며, [FIPS-204]에 명시되어 있습니다.

8.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "ML-DSA-44", "ML-DSA-65" 및 "ML-DSA-87"입니다.

연산 매개변수 결과
sign ContextParams 바이트 시퀀스
verify ContextParams 불리언
generateKey 없음 CryptoKeyPair
importKey 없음 CryptoKey
exportKey 없음 객체

8.3 ContextParams 사전

WebIDLdictionary ContextParams : Algorithm {
  BufferSource context;
};

context 멤버는 메시지와 연결할 선택적 컨텍스트 데이터를 나타냅니다.

참고

ContextParams 사전은 [webcrypto-secure-curves]의 Ed448Params 사전과 동일하며, 이 제안을 병합할 때 후자를 전자로 대체할 수 있습니다.

8.4 연산

8.4.1 서명

  1. normalizedAlgorithmcontext 멤버가 존재하고 길이가 255 바이트보다 크면, OperationError던집니다.

  2. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

  3. contextnormalizedAlgorithmcontext 멤버로 설정하거나, normalizedAlgorithmcontext 멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.

  4. result를 [FIPS-204]의 섹션 5.2에 명시된 ML-DSA.Sign 서명 알고리즘을 수행한 결과로 설정합니다. 이때 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하고, key와 연결된 ML-DSA 개인 키를 sk로, messageM으로, contextctx로 사용합니다.

  5. ML-DSA.Sign 알고리즘이 오류를 반환한 경우 OperationError를 반환합니다.

  6. result를 반환합니다.

8.4.2 검증

  1. normalizedAlgorithmcontext 멤버가 존재하고 길이가 255 바이트보다 크면, OperationError던집니다.

  2. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

  3. contextnormalizedAlgorithmcontext 멤버로 설정하거나, normalizedAlgorithmcontext 멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.

  4. result를 [FIPS-204]의 섹션 5.3에 명시된 ML-DSA.Verify 검증 알고리즘을 수행한 결과로 설정합니다. 이때 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하고, key와 연결된 ML-DSA 공개 키를 pk로, messageM으로, signatureσ로, contextctx로 사용합니다.

  5. ML-DSA.Verify 알고리즘이 오류를 반환한 경우 OperationError를 반환합니다.

  6. result를 반환합니다.

8.4.3 키 생성

  1. usages에 "sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. [FIPS-204]의 섹션 5.1에 설명된 대로, normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하여 ML-DSA 키 쌍을 생성합니다.

    참고

    시드 ξ를 내보낼 수 있도록 하려면, 생성된 키 재료의 일부로 저장해야 합니다.

  3. 키 생성 단계가 실패하면, OperationError던집니다.

  4. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

  5. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

  6. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새로운 CryptoKey로 설정합니다.

  7. publicKey[[type]] 내부 슬롯을 "public"으로 설정합니다.

  8. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  9. publicKey[[extractable]] 내부 슬롯을 true로 설정합니다.

  10. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]용도 교집합으로 설정합니다.

  11. privateKey를 생성된 키 쌍의 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

  12. privateKey[[type]] 내부 슬롯을 "private"으로 설정합니다.

  13. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  14. privateKey[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  15. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]용도 교집합으로 설정합니다.

  16. result를 새로운 CryptoKeyPair 사전으로 설정합니다.

  17. resultpublicKey 속성을 publicKey로 설정합니다.

  18. resultprivateKey 속성을 privateKey로 설정합니다.

  19. result를 반환합니다.

8.4.4 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. format이 "spki"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

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

    3. 파싱 중 오류가 발생하면, DataError던집니다.

    4. normalizedAlgorithmname 멤버가 "ML-DSA-44"인 경우:

      expectedOidid-ml-dsa-44 (2.16.840.1.101.3.4.3.17)로 설정합니다.

      normalizedAlgorithmname 멤버가 "ML-DSA-65"인 경우:

      expectedOidid-ml-dsa-65 (2.16.840.1.101.3.4.3.18)로 설정합니다.

      normalizedAlgorithmname 멤버가 "ML-DSA-87"인 경우:

      expectedOidid-ml-dsa-87 (2.16.840.1.101.3.4.3.19)로 설정합니다.

      그렇지 않은 경우:

      NotSupportedError던집니다.

    5. spkialgorithm AlgorithmIdentifier 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않으면, DataError던집니다.

    6. spkialgorithm AlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError던집니다.

    7. publicKeyspkisubjectPublicKey 필드가 식별하는 ML-DSA 공개 키로 설정합니다.

    8. keypublicKey를 나타내는 새로운 CryptoKey로 설정합니다.

    9. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    10. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    11. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "pkcs8"인 경우:
    1. usages에 "sign"이 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

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

    3. 파싱 중 오류가 발생하면, DataError던집니다.

    4. normalizedAlgorithmname 멤버가 "ML-DSA-44"인 경우:

      expectedOidid-ml-dsa-44 (2.16.840.1.101.3.4.3.17)로 설정합니다.

      asn1Structure를 ASN.1 ML-DSA-44-PrivateKey 구조로 설정합니다.

      normalizedAlgorithmname 멤버가 "ML-DSA-65"인 경우:

      expectedOidid-ml-dsa-65 (2.16.840.1.101.3.4.3.18)로 설정합니다.

      asn1Structure를 ASN.1 ML-DSA-65-PrivateKey 구조로 설정합니다.

      normalizedAlgorithmname 멤버가 "ML-DSA-87"인 경우:

      expectedOidid-ml-dsa-87 (2.16.840.1.101.3.4.3.19)로 설정합니다.

      asn1Structure를 ASN.1 ML-DSA-87-PrivateKey 구조로 설정합니다.

      그렇지 않은 경우:

      NotSupportedError던집니다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않으면, DataError던집니다.

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError던집니다.

    7. mlDsaPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 설정합니다. 이때 data에는 privateKeyInfoprivateKey 필드를, structure에는 asn1Structure를 사용하고, exactData는 true로 설정합니다.

    8. 파싱 중 오류가 발생하면, DataError던집니다.

    9. mlDsaPrivateKeyexpandedKey 형식의 ML-DSA 키를 나타내거나, mlDsaPrivateKeyboth 형식의 ML-DSA 키를 나타내며 both 형식이 지원되지 않는 경우, NotSupportedError를 던집니다.

    10. mlDsaPrivateKeyboth 형식의 ML-DSA 키를 나타내고, seed 필드가 expandedKey 필드에 대응하지 않으면, DataError를 던집니다.

    11. keymlDsaPrivateKey가 식별하는 ML-DSA 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

    12. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    13. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    14. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    15. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-public"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    2. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

    3. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    4. keykeyData에 제공된 키 데이터를 나타내는 새로운 CryptoKey로 설정합니다.

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

    6. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-seed"인 경우:
    1. usages에 "sign"이 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    2. datakeyData로 설정합니다.

    3. data의 비트 단위 길이가 256이 아니면, DataError던집니다.

    4. privateKey를 [FIPS-204]의 섹션 6.1에 설명된 ML-DSA.KeyGen_internal 함수를 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 수행한 결과로 설정하며, dataξ로 사용합니다.

    5. keyprivateKey가 식별하는 ML-DSA 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

    6. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    7. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    8. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    9. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. priv 필드가 존재하고 usages에 "sign"이 아닌 항목이 포함되어 있거나, priv 필드가 존재하지 않고 usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    3. jwkkty 필드가 "AKP"가 아니면, DataError던집니다.

    4. jwkalg 필드가 normalizedAlgorithmname 멤버와 같지 않으면, DataError던집니다.

    5. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sig"와 같지 않으면, DataError던집니다.

    6. jwkkey_ops 필드가 존재하며 JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나, 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    7. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError던집니다.

    8. jwkpriv 필드가 존재하는 경우:
      1. jwkpriv 속성이 ML-DSA 개인 키를 나타내는 유효한 base64url 인코딩 시드를 포함하지 않으면, DataError던집니다.

      2. keyjwkpriv 속성을 base64url로 인코딩된 시드로 해석하여 식별되는 ML-DSA 개인 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

      4. jwkpub 속성이 key에 대응하는 ML-DSA 공개 키를 나타내는 base64url 인코딩 공개 키를 포함하지 않으면, DataError던집니다.

      그렇지 않은 경우:
      1. jwkpub 속성이 ML-DSA 공개 키를 나타내는 유효한 base64url 인코딩 공개 키를 포함하지 않으면, DataError던집니다.

      2. keyjwkpub 속성을 base64url로 인코딩된 공개 키로 해석하여 식별되는 ML-DSA 공개 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    9. algorithm을 새로운 KeyAlgorithm 객체의 인스턴스로 설정합니다.

    10. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

    11. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  3. key를 반환합니다.

8.4.5 키 내보내기

  1. key를 내보낼 CryptoKey로 설정합니다.

  2. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 유형으로 설정합니다:

        • keyAlgorithmname 멤버가 "ML-DSA-44"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-DSA-65"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-DSA-87"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) OID로 설정합니다.

          그렇지 않은 경우:

          NotSupportedError던집니다.

      • subjectPublicKey 필드를 keyData로 설정합니다.

    4. resultdata를 DER 인코딩한 결과로 설정합니다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:

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

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 유형으로 설정합니다:

        • keyAlgorithmname 멤버가 "ML-DSA-44"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-44 (2.16.840.1.101.3.4.3.17) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-DSA-65"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) OID로 설정합니다.

          keyAlgorithmname 멤버가 "ML-DSA-87"인 경우:

          algorithm 객체 식별자를 id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) OID로 설정합니다.

          그렇지 않은 경우:

          NotSupportedError던집니다.

      • privateKey 필드를 다음과 같이 설정합니다:

        • keyAlgorithmname 멤버가 "ML-DSA-44"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-DSA 개인 키 시드를 seed-only 형식으로 나타내는 ML-DSA-44-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다 (OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).

          keyAlgorithmname 멤버가 "ML-DSA-65"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-DSA 개인 키 시드를 seed-only 형식으로 나타내는 ML-DSA-65-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다 (OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).

          keyAlgorithmname 멤버가 "ML-DSA-87"인 경우:

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-DSA 개인 키 시드를 seed-only 형식으로 나타내는 ML-DSA-87-PrivateKey ASN.1 유형을 DER 인코딩한 결과로 설정합니다 (OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그 사용).

          그렇지 않은 경우:

          NotSupportedError던집니다.

    4. resultdata를 DER 인코딩한 결과로 설정합니다.

    format이 "raw-public"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 ML-DSA 공개 키를 포함하는 바이트 시퀀스로 설정합니다.

    3. resultdata로 설정합니다.

    format이 "raw-seed"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 키의 ξ 시드 변수를 포함하는 바이트 시퀀스로 설정합니다.

      참고

      ξ 시드 변수는 [FIPS-204]의 섹션 5.1에 설명된 대로 ML-DSA.KeyGen 함수에서 샘플링되었습니다.

    3. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. jwkkty 속성을 "AKP"로 설정합니다.

    4. jwkalg 속성을 keyAlgorithmname 멤버로 설정합니다.

    5. jwkpub 속성을 key[[handle]] 내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      jwkpriv 속성을 key[[handle]] 내부 슬롯이 나타내는 base64url 인코딩 시드로 설정합니다.
    7. jwkkey_ops 속성을 keyusages 속성으로 설정합니다.

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

    9. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  4. result를 반환합니다.

9. SLH-DSA

9.1 설명

이 섹션은 비규범적입니다.

여기에서는 서명 및 검증에 SLH-DSA를 사용하는 방법을 설명하며, [FIPS-205]에 명시되어 있습니다.

9.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "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 없음 객체

9.3 JSON Web Key 표현

SLH-DSA 키는 JWK 표현에 [RFC9964]에서 정의된 "AKP"(알고리즘 키 쌍) 키 유형을 사용합니다. "alg"(알고리즘) 매개변수는 특정 SLH-DSA 매개변수 집합을 식별합니다. 공개 키는 "pub" 매개변수에 저장됩니다. 개인 키가 포함된 경우에는 "priv" 매개변수를 사용하여 표현됩니다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩됩니다.

9.4 연산

9.4.1 서명

  1. normalizedAlgorithmcontext 멤버가 존재하고 길이가 255 바이트보다 크면, OperationError던집니다.

  2. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

  3. contextnormalizedAlgorithmcontext 멤버로 설정하거나, normalizedAlgorithmcontext 멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.

  4. result를 [FIPS-205]의 섹션 10.2.1에 명시된 slh_sign 서명 알고리즘을 수행한 결과로 설정합니다. 이때 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하고, key와 연결된 SLH-DSA 개인 키를 SK로, messageM으로, contextctx로 사용합니다.

  5. slh_sign 알고리즘이 오류를 반환한 경우 OperationError를 반환합니다.

  6. result를 반환합니다.

9.4.2 검증

  1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

  2. contextnormalizedAlgorithmcontext 멤버로 설정하거나, normalizedAlgorithmcontext 멤버가 존재하지 않는 경우 빈 옥텟 문자열로 설정합니다.

  3. result를 [FIPS-205]의 섹션 10.3에 명시된 slh_verify 검증 알고리즘을 수행한 결과로 설정합니다. 이때 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하고, key와 연결된 SLH-DSA 공개 키를 PK로, messageM으로, signatureSIG로, contextctx로 사용합니다.

  4. slh_verify 알고리즘이 오류를 반환한 경우 OperationError를 반환합니다.

  5. result를 반환합니다.

9.4.3 키 생성

  1. usages에 "sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. [FIPS-205]의 섹션 10.1에 설명된 대로, normalizedAlgorithmname 멤버가 나타내는 매개변수 집합을 사용하여 SLH-DSA 키 쌍을 생성합니다.

  3. 키 생성 단계가 실패하면, OperationError던집니다.

  4. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

  5. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

  6. publicKey를 생성된 키 쌍의 공개 키를 나타내는 새로운 CryptoKey로 설정합니다.

  7. publicKey[[type]] 내부 슬롯을 "public"으로 설정합니다.

  8. publicKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  9. publicKey[[extractable]] 내부 슬롯을 true로 설정합니다.

  10. publicKey[[usages]] 내부 슬롯을 usages[ "verify" ]용도 교집합으로 설정합니다.

  11. privateKey를 생성된 키 쌍의 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

  12. privateKey[[type]] 내부 슬롯을 "private"으로 설정합니다.

  13. privateKey[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  14. privateKey[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  15. privateKey[[usages]] 내부 슬롯을 usages[ "sign" ]용도 교집합으로 설정합니다.

  16. result를 새로운 CryptoKeyPair 사전으로 설정합니다.

  17. resultpublicKey 속성을 publicKey로 설정합니다.

  18. resultprivateKey 속성을 privateKey로 설정합니다.

  19. result를 반환합니다.

9.4.4 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. format이 "spki"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

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

    3. 파싱 중 오류가 발생하면, DataError던집니다.

    4. normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-128s"인 경우:

      expectedOidid-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-128f"인 경우:

      expectedOidid-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-192s"인 경우:

      expectedOidid-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-192f"인 경우:

      expectedOidid-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-256s"인 경우:

      expectedOidid-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-256f"인 경우:

      expectedOidid-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

      expectedOidid-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

      expectedOidid-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

      expectedOidid-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

      expectedOidid-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

      expectedOidid-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

      expectedOidid-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31)로 설정합니다.

      그렇지 않은 경우:

      NotSupportedError던집니다.

    5. spkialgorithm AlgorithmIdentifier 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않으면, DataError던집니다.

    6. spkialgorithm AlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError던집니다.

    7. publicKeyspkisubjectPublicKey 필드가 식별하는 SLH-DSA 공개 키로 설정합니다.

    8. keypublicKey를 나타내는 새로운 CryptoKey로 설정합니다.

    9. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    10. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    11. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    12. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "pkcs8"인 경우:
    1. usages에 "sign"이 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

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

    3. 파싱 중 오류가 발생하면, DataError던집니다.

    4. normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-128s"인 경우:

      expectedOidid-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-128f"인 경우:

      expectedOidid-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-192s"인 경우:

      expectedOidid-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-192f"인 경우:

      expectedOidid-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-256s"인 경우:

      expectedOidid-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHA2-256f"인 경우:

      expectedOidid-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

      expectedOidid-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

      expectedOidid-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

      expectedOidid-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

      expectedOidid-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

      expectedOidid-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30)로 설정합니다.

      normalizedAlgorithmname 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

      expectedOidid-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31)로 설정합니다.

      그렇지 않은 경우:

      NotSupportedError던집니다.

    5. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithm 필드의 algorithm 객체 식별자 필드가 expectedOid와 같지 않으면, DataError던집니다.

    6. privateKeyInfoprivateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError던집니다.

    7. slhDsaPrivateKeyASN.1 구조 파싱 알고리즘을 수행한 결과로 설정합니다. 이때 data에는 privateKeyInfoprivateKey 필드를, structure에는 OCTET STRING을 사용하고, exactData는 true로 설정합니다.

    8. 파싱 중 오류가 발생하면, DataError던집니다.

    9. keyslhDsaPrivateKey가 식별하는 SLH-DSA 개인 키를 나타내는 새로운 CryptoKey로 설정합니다.

    10. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    11. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    12. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    13. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-public"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    2. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

    3. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    4. keyData길이가 [FIPS-205]의 표 2에서 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합에 대해 명시한 pk length와 같지 않으면, DataError던집니다.

    5. keykeyData에 제공된 키 데이터를 나타내는 새로운 CryptoKey로 설정합니다.

    6. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    7. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "raw-private"인 경우:
    1. usages에 "sign"이 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    2. keyData길이가 [FIPS-205]의 표 2에서 normalizedAlgorithmname 멤버가 나타내는 매개변수 집합에 대해 명시한 pk length의 2배와 같지 않으면, DataError던집니다.

    3. keykeyData에 제공된 키 데이터를 나타내는 새로운 CryptoKey로 설정합니다.

    4. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

    5. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

    6. algorithmname 속성을 normalizedAlgorithmname 속성으로 설정합니다.

    7. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. priv 필드가 존재하고 usages에 "sign"이 아닌 항목이 포함되어 있거나, priv 필드가 존재하지 않고 usages에 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

    3. jwkkty 필드가 "AKP"가 아니면, DataError던집니다.

    4. jwkalg 필드가 normalizedAlgorithmname 멤버와 같지 않으면, DataError던집니다.

    5. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sig"와 같지 않으면, DataError던집니다.

    6. jwkkey_ops 필드가 존재하며 JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나, 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    7. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError던집니다.

    8. jwkpriv 필드가 존재하는 경우:
      1. jwkpriv 속성이 SLH-DSA 개인 키를 나타내는 유효한 base64url 인코딩 값을 포함하지 않으면, DataError던집니다.

      2. keyjwkpriv 속성을 base64url로 인코딩된 개인 키로 해석하여 식별되는 SLH-DSA 개인 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "private"으로 설정합니다.

      4. jwkpub 속성이 key에 대응하는 SLH-DSA 공개 키를 나타내는 base64url 인코딩 공개 키를 포함하지 않으면, DataError던집니다.

      그렇지 않은 경우:
      1. jwkpub 속성이 SLH-DSA 공개 키를 나타내는 유효한 base64url 인코딩 공개 키를 포함하지 않으면, DataError던집니다.

      2. keyjwkpub 속성을 base64url로 인코딩된 공개 키로 해석하여 식별되는 SLH-DSA 공개 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

      3. key[[type]] 내부 슬롯을 "public"으로 설정합니다.

    9. algorithm을 새로운 KeyAlgorithm 객체의 인스턴스로 설정합니다.

    10. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

    11. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  3. key를 반환합니다.

9.4.5 키 내보내기

  1. key를 내보낼 CryptoKey로 설정합니다.

  2. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  3. format이 "spki"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. data를 [RFC5280]에 정의된 SubjectPublicKeyInfo ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:

      • algorithm 필드를 다음 속성을 가진 AlgorithmIdentifier ASN.1 유형으로 설정합니다:

        • keyAlgorithmname 멤버가 "SLH-DSA-SHA2-128s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-128f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-192s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-192f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-256s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-256f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) OID로 설정합니다.

          그렇지 않은 경우:

          NotSupportedError던집니다.

      • subjectPublicKey 필드를 keyData로 설정합니다.

    4. resultdata를 DER 인코딩한 결과로 설정합니다.

    format이 "pkcs8"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. data를 [RFC5208]에 정의된 PrivateKeyInfo ASN.1 구조의 인스턴스로 설정하며 다음 속성을 갖도록 합니다:

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

      • privateKeyAlgorithm 필드를 다음 속성을 가진 PrivateKeyAlgorithmIdentifier ASN.1 유형으로 설정합니다:

        • keyAlgorithmname 멤버가 "SLH-DSA-SHA2-128s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-128f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-192s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-192f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-256s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHA2-256f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) OID로 설정합니다.

          keyAlgorithmname 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

          algorithm 객체 식별자를 id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) OID로 설정합니다.

          keyAlgorithmname 멤버가 "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 인코딩한 결과로 설정합니다.

    4. resultdata를 DER 인코딩한 결과로 설정합니다.

    format이 "raw-public"인 경우:
    1. key[[type]] 내부 슬롯이 "public"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 SLH-DSA 공개 키를 포함하는 바이트 시퀀스로 설정합니다.

    3. resultdata로 설정합니다.

    format이 "raw-private"인 경우:
    1. key[[type]] 내부 슬롯이 "private"이 아니면, InvalidAccessError던집니다.

    2. datakey[[handle]] 내부 슬롯이 나타내는 SLH-DSA 개인 키를 포함하는 바이트 시퀀스로 설정합니다.

    3. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    3. jwkkty 속성을 "AKP"로 설정합니다.

    4. jwkalg 속성을 keyAlgorithmname 멤버로 설정합니다.

    5. jwkpub 속성을 key[[handle]] 내부 슬롯에 대응하는 base64url 인코딩 공개 키로 설정합니다.

    6. key[[type]] 내부 슬롯이 "private"인 경우:
      jwkpriv 속성을 key[[handle]] 내부 슬롯이 나타내는 base64url 인코딩 개인 키로 설정합니다.
    7. jwkkey_ops 속성을 keyusages 속성으로 설정합니다.

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

    9. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  4. result를 반환합니다.

10. AES-OCB

10.1 설명

이 섹션은 비규범적입니다.

"AES-OCB" 알고리즘 식별자는 OCB 모드의 AES를 사용하여 인증된 암호화 및 복호화를 수행하는 데 사용되며, [RFC7253]에 설명되어 있습니다.

10.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "AES-OCB"입니다.

연산 매개변수 결과
encrypt AeadParams 바이트 시퀀스
decrypt AeadParams 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 객체
키 길이 가져오기 AesDerivedKeyParams 정수

10.3 AeadParams 사전

WebIDLdictionary AeadParams : Algorithm {
  required BufferSource iv;
  BufferSource additionalData;
  [EnforceRange] octet tagLength;
};

iv 멤버는 사용할 초기화 벡터를 나타냅니다.

additionalData 멤버는 포함할 추가 인증 데이터를 나타냅니다.

tagLength 멤버는 원하는 인증 태그 길이를 나타냅니다.

참고

AeadParams 사전은 [webcrypto]의 AesGcmParams 사전과 동일하며, 이 제안을 병합할 때 후자를 전자로 대체할 수 있습니다.

10.4 연산

10.4.1 암호화

  1. normalizedAlgorithmiv 멤버의 길이가 15 바이트보다 크면, OperationError던집니다.

  2. normalizedAlgorithmtagLength 멤버가 존재하지 않는 경우:
    tagLength를 128로 설정합니다.
    normalizedAlgorithmtagLength 멤버가 64, 96 또는 128 중 하나인 경우:
    tagLengthnormalizedAlgorithmtagLength 멤버와 같게 설정합니다.
    그렇지 않은 경우:
    OperationError던집니다.
  3. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  4. C를 [RFC7253]의 섹션 4.2에 설명된 OCB-ENCRYPT 함수를 수행하여 얻은 출력으로 설정합니다. 이때 AES를 블록 암호로 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, normalizedAlgorithmiv 멤버를 N 입력 매개변수로, additionalDataA 입력 매개변수로, plaintextP 입력 매개변수로, 그리고 tagLengthTAGLEN 전역 매개변수로 사용합니다.

  5. C를 반환합니다.

10.4.2 복호화

  1. normalizedAlgorithmiv 멤버의 길이가 15 바이트보다 크면, OperationError던집니다.

  2. normalizedAlgorithmtagLength 멤버가 존재하지 않는 경우:
    tagLength를 128로 설정합니다.
    normalizedAlgorithmtagLength 멤버가 64, 96 또는 128 중 하나인 경우:
    tagLengthnormalizedAlgorithmtagLength 멤버와 같게 설정합니다.
    그렇지 않은 경우:
    OperationError던집니다.
  3. ciphertext의 길이가 tagLength 비트보다 작으면, OperationError던집니다.

  4. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  5. [RFC7253]의 섹션 4.3에 설명된 OCB-DECRYPT 함수를 수행합니다. 이때 AES를 블록 암호로 사용하고, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, normalizedAlgorithmiv 멤버를 N 입력 매개변수로, additionalDataA 입력 매개변수로, ciphertextC 입력 매개변수로, 그리고 tagLengthTAGLEN 전역 매개변수로 사용합니다.

    알고리즘의 결과가 인증 실패를 나타내는 "INVALID"인 경우:
    OperationError던집니다.
    그렇지 않은 경우:
    plaintext를 OCB-DECRYPT의 출력 P로 설정합니다.
  6. plaintext를 반환합니다.

10.4.3 키 생성

  1. usages에 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. normalizedAlgorithmlength 멤버가 128, 192 또는 256 중 하나와 같지 않으면, OperationError던집니다.

  3. normalizedAlgorithmlength 멤버와 동일한 길이의 AES 키를 생성합니다.

  4. 키 생성 단계가 실패하면, OperationError던집니다.

  5. key를 생성된 AES 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  6. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  7. algorithm을 새로운 AesKeyAlgorithm으로 설정합니다.

  8. algorithmname 속성을 "AES-OCB"로 설정합니다.

  9. algorithmlength 속성을 normalizedAlgorithmlength 멤버와 같게 설정합니다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  12. key[[usages]] 내부 슬롯을 usages정규화된 값으로 설정합니다.

  13. key를 반환합니다.

10.4.4 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. usages에 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  3. format이 "raw-secret"인 경우:
    1. datakeyData로 설정합니다.

    2. data의 비트 단위 길이가 128, 192 또는 256이 아니면 DataError던집니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. jwkkty 필드가 "oct"가 아니면, DataError던집니다.

    3. jwk가 JSON Web Algorithms [JWA]의 섹션 6.4 요구사항을 충족하지 않으면, DataError던집니다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 설정합니다.

    5. data의 길이가 128비트인 경우:
      jwkalg 필드가 존재하며 "A128OCB"가 아니면, DataError던집니다.
      data의 길이가 192비트인 경우:
      jwkalg 필드가 존재하며 "A192OCB"가 아니면, DataError던집니다.
      data의 길이가 256비트인 경우:
      jwkalg 필드가 존재하며 "A256OCB"가 아니면, DataError던집니다.
      그렇지 않은 경우:
      DataError던집니다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, DataError던집니다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError던집니다.

    그렇지 않은 경우:
    NotSupportedError던집니다.
  4. key를 값이 data인 AES 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  5. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  6. algorithm을 새로운 AesKeyAlgorithm으로 설정합니다.

  7. algorithmname 속성을 "AES-OCB"로 설정합니다.

  8. algorithmlength 속성을 data의 비트 단위 길이로 설정합니다.

  9. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  10. key를 반환합니다.

10.4.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  2. format이 "raw-secret"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는 바이트 시퀀스로 설정합니다.

    2. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. jwkkty 속성을 문자열 "oct"로 설정합니다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고, JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

    4. keylength 속성이 128인 경우:
      jwkalg 속성을 문자열 "A128OCB"로 설정합니다.
      keylength 속성이 192인 경우:
      jwkalg 속성을 문자열 "A192OCB"로 설정합니다.
      keylength 속성이 256인 경우:
      jwkalg 속성을 문자열 "A256OCB"로 설정합니다.
    5. jwkkey_ops 속성을 keyusages 속성과 같게 설정합니다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정합니다.

    7. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  3. result를 반환합니다.

10.4.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면, OperationError던집니다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환합니다.

11. ChaCha20-Poly1305

11.1 설명

이 섹션은 비규범적입니다.

"ChaCha20-Poly1305" 알고리즘 식별자는 AEAD_CHACHA20_POLY1305를 사용하여 인증된 암호화 및 복호화를 수행하는 데 사용되며, [RFC8439]에 설명되어 있습니다.

11.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "ChaCha20-Poly1305"입니다.

연산 매개변수 결과
encrypt AeadParams 바이트 시퀀스
decrypt AeadParams 바이트 시퀀스
generateKey 없음 CryptoKey
importKey 없음 CryptoKey
exportKey 없음 객체
키 길이 가져오기 없음 정수

11.3 연산

11.3.1 암호화

  1. normalizedAlgorithmiv 멤버의 길이가 12바이트가 아니면, OperationError던집니다.

  2. normalizedAlgorithmtagLength 멤버가 존재하고 128이 아니면, OperationError던집니다.

  3. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  4. ciphertext를 [RFC8439]의 섹션 2.8에 설명된 AEAD_CHACHA20_POLY1305 암호화 알고리즘을 수행하여 얻은 출력으로 설정합니다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 키 입력 매개변수로, normalizedAlgorithmiv 멤버를 nonce 입력 매개변수로, plaintext를 평문 입력 매개변수로, 그리고 additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용합니다.

  5. ciphertext를 반환합니다.

11.3.2 복호화

  1. normalizedAlgorithmiv 멤버의 길이가 12바이트가 아니면, OperationError던집니다.

  2. normalizedAlgorithmtagLength 멤버가 존재하고 128이 아니면, OperationError던집니다.

  3. ciphertext의 길이가 128비트보다 작으면, OperationError던집니다.

  4. additionalDatanormalizedAlgorithmadditionalData 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  5. [RFC8439]의 섹션 2.8에 설명된 AEAD_CHACHA20_POLY1305 복호화 알고리즘을 수행합니다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 키 입력 매개변수로, normalizedAlgorithmiv 멤버를 nonce 입력 매개변수로, ciphertext를 암호문 입력 매개변수로, 그리고 additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용합니다.

    알고리즘의 결과가 인증 실패를 나타내는 경우:
    OperationError던집니다
    그렇지 않은 경우:
    plaintext를 결과 평문으로 설정합니다.
  6. plaintext를 반환합니다.

11.3.3 키 생성

  1. usages에 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. 256비트 키를 생성합니다.

  3. 키 생성 단계가 실패하면, OperationError던집니다.

  4. key를 생성된 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  5. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  6. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

  7. algorithmname 속성을 "ChaCha20-Poly1305"로 설정합니다.

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

  9. key[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  10. key[[usages]] 내부 슬롯을 usages정규화된 값으로 설정합니다.

  11. key를 반환합니다.

11.3.4 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. usages에 "encrypt", "decrypt", "wrapKey" 또는 "unwrapKey" 중 하나가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  3. format이 "raw-secret"인 경우:
    1. datakeyData로 설정합니다.

    2. data의 비트 단위 길이가 256이 아니면 DataError던집니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. jwkkty 필드가 "oct"가 아니면, DataError던집니다.

    3. jwk가 JSON Web Algorithms [JWA]의 섹션 6.4 요구사항을 충족하지 않으면, DataError던집니다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 설정합니다.

    5. jwkalg 필드가 존재하며 "C20P"가 아니면, DataError던집니다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"가 아니면, DataError던집니다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError던집니다.

    그렇지 않은 경우:
    NotSupportedError던집니다.
  4. key를 값이 data인 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  5. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  6. algorithm을 새로운 KeyAlgorithm으로 설정합니다.

  7. algorithmname 속성을 "ChaCha20-Poly1305"로 설정합니다.

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

  9. key를 반환합니다.

11.3.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  2. format이 "raw-secret"인 경우:
    1. datakey[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는 바이트 시퀀스로 설정합니다.

    2. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. jwkkty 속성을 문자열 "oct"로 설정합니다.

    3. jwkk 속성을 key[[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고, JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

    4. jwkalg 속성을 문자열 "C20P"로 설정합니다.

    5. jwkkey_ops 속성을 keyusages 속성과 같게 설정합니다.

    6. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정합니다.

    7. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  3. result를 반환합니다.

11.3.6 키 길이 가져오기

  1. 256을 반환합니다.

12. SHA-3

12.1 설명

이 섹션은 비규범적입니다.

여기에서는 [FIPS-202]에 명시된 SHA-3 해시 함수 계열을 설명합니다.

12.2 등록

각 SHA-3 알고리즘의 인식되는 알고리즘 이름은 "SHA3-256", "SHA3-384" 및 "SHA3-512"입니다.

연산 매개변수 결과
digest 없음 바이트 시퀀스

12.3 연산

12.3.1 다이제스트

  1. normalizedAlgorithmname 멤버가 "SHA3-256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [FIPS-202]의 섹션 6.1에 정의된 SHA3-256 해시 함수를 수행한 결과로 설정하며, message를 입력 메시지 M으로 사용합니다.
    normalizedAlgorithmname 멤버가 "SHA3-384"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [FIPS-202]의 섹션 6.1에 정의된 SHA3-384 해시 함수를 수행한 결과로 설정하며, message를 입력 메시지 M으로 사용합니다.
    normalizedAlgorithmname 멤버가 "SHA3-512"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [FIPS-202]의 섹션 6.1에 정의된 SHA3-512 해시 함수를 수행한 결과로 설정하며, message를 입력 메시지 M으로 사용합니다.
  2. 연산을 수행한 결과 오류가 발생하면, OperationError던집니다.

  3. result를 반환합니다.

13. cSHAKE

13.1 설명

이 섹션은 비규범적입니다.

여기에서는 [NIST-SP800-185]에 명시된 cSHAKE128 및 cSHAKE256을 설명합니다.

functionNamecustomization 매개변수가 모두 비어 있거나 제공되지 않은 경우, cSHAKE는 [FIPS-202]의 섹션 6.2에 정의된 SHAKE와 기능적으로 동일합니다.

참고

기술적으로 구현할 수는 있지만, digest() 외부의 다른 알고리즘 일부로 cSHAKE를 사용하는 것은 (예를 들어 HMAC의 hash 매개변수에서 사용하는 경우) 유용할 가능성이 낮으며 지원될 것으로 예상되지 않습니다. supports()의 결과는 이러한 사용이 지원되는지를 반영해야 합니다.

13.2 등록

인식되는 알고리즘 이름은 "cSHAKE128" 및 "cSHAKE256"입니다.

연산 매개변수 결과
digest CShakeParams 바이트 시퀀스

13.3 CShakeParams 사전

WebIDLdictionary CShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource functionName;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

functionName 멤버는 NIST가 cSHAKE를 기반으로 함수를 정의할 때 사용하는 함수 이름을 나타냅니다. 사용하는 경우 NIST가 정의한 값으로만 설정해야 합니다.

customization 멤버는 사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다.

13.4 연산

13.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 설정합니다.

  2. functionNamenormalizedAlgorithmfunctionName 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  3. customizationnormalizedAlgorithmcustomization 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  4. normalizedAlgorithmname 멤버가 "cSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [NIST-SP800-185]의 섹션 3에 정의된 cSHAKE128 함수를 수행한 결과로 설정하며, messageX 입력 매개변수로, outputLengthL 입력 매개변수로, functionNameN 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
    normalizedAlgorithmname 멤버가 "cSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [NIST-SP800-185]의 섹션 3에 정의된 cSHAKE256 함수를 수행한 결과로 설정하며, messageX 입력 매개변수로, outputLengthL 입력 매개변수로, functionNameN 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
  5. 연산을 수행한 결과 오류가 발생하면, OperationError던집니다.

  6. result포함하는 바이트 시퀀스를 반환합니다.

14. TurboSHAKE

14.1 설명

이 섹션은 비규범적입니다.

여기에서는 [RFC9861]에 명시된 TurboSHAKE128 및 TurboSHAKE256을 설명합니다.

TurboSHAKE는 SHA-3에서 사용되는 Keccak 순열의 라운드 수를 줄인 버전에 기반한 확장 가능 출력 함수(XOF) 계열로, 동일한 보안 강도를 유지하면서 SHAKE 함수보다 약 두 배 빠릅니다.

참고

128비트 충돌 보안을 위해 TurboSHAKE128 출력은 최소 256비트여야 합니다. 256비트 충돌 보안을 위해 TurboSHAKE256 출력은 최소 512비트여야 합니다. 이러한 출력 길이는 대응하는 원상 및 제2 원상 보안 요구사항도 초과합니다 (이러한 요구사항에는 목표 보안 수준과 동일한 출력 길이만 필요합니다). 출력 길이가 이러한 임계값을 충족하면 TurboSHAKE128은 NIST 포스트 양자 보안 수준 2를 달성하고, TurboSHAKE256은 수준 5를 달성합니다. [RFC9861]의 섹션 7을 참조하십시오.

참고

기술적으로 구현할 수는 있지만, digest() 외부의 다른 알고리즘 일부로 TurboSHAKE를 사용하는 것은 (예를 들어 HMAC의 hash 매개변수에서 사용하는 경우) 유용할 가능성이 낮으며 지원될 것으로 예상되지 않습니다. supports()의 결과는 이러한 사용이 지원되는지를 반영해야 합니다.

14.2 등록

인식되는 알고리즘 이름은 "TurboSHAKE128" 및 "TurboSHAKE256"입니다.

연산 매개변수 결과
digest TurboShakeParams 바이트 시퀀스

14.3 TurboShakeParams 사전

WebIDLdictionary TurboShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  [EnforceRange] octet domainSeparation;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

domainSeparation 멤버는 도메인 분리 바이트를 나타냅니다. 지정하지 않으면 기본값은 0x1F입니다. 유효한 값은 0x01부터 0x7F까지의 범위입니다.

참고

KangarooTwelve와 TurboSHAKE를 모두 사용하는 프로토콜은 도메인 분리에 0x06, 0x070x0B 값을 사용하지 않아야 합니다. 이러한 값은 KangarooTwelve에서 내부적으로 사용되기 때문입니다.

14.4 연산

14.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 설정합니다.

  2. outputLength가 0이거나 8의 배수가 아니면, OperationError던집니다.

  3. domainSeparationnormalizedAlgorithmdomainSeparation 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 0x1F로 설정합니다.

  4. domainSeparation0x01보다 작거나 0x7F보다 크면, OperationError던집니다.

  5. normalizedAlgorithmname 멤버가 "TurboSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 2에 정의된 TurboSHAKE128 함수를 수행한 결과로 설정하며, messageM 입력 매개변수로, domainSeparationD 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
    normalizedAlgorithmname 멤버가 "TurboSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 2에 정의된 TurboSHAKE256 함수를 수행한 결과로 설정하며, messageM 입력 매개변수로, domainSeparationD 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
  6. 연산을 수행한 결과 오류가 발생하면, OperationError던집니다.

  7. result를 반환합니다.

15. KangarooTwelve

15.1 설명

이 섹션은 비규범적입니다.

여기에서는 [RFC9861]에 명시된 KT128 및 KT256을 설명합니다.

KangarooTwelve는 TurboSHAKE 위에 트리 해싱을 적용하여 입력 데이터를 병렬로 처리할 수 있도록 하는 확장 가능 출력 함수(XOF) 계열입니다. KT128은 내부적으로 TurboSHAKE128을 사용하고, KT256은 TurboSHAKE256을 사용합니다.

참고

128비트 충돌 보안을 위해 KT128 출력은 최소 256비트여야 합니다. 256비트 충돌 보안을 위해 KT256 출력은 최소 512비트여야 합니다. 이러한 출력 길이는 대응하는 원상 및 제2 원상 보안 요구사항도 초과합니다 (이러한 요구사항에는 목표 보안 수준과 동일한 출력 길이만 필요합니다). 출력 길이가 이러한 임계값을 충족하면 KT128은 NIST 포스트 양자 보안 수준 2를 달성하고, KT256은 수준 5를 달성합니다. [RFC9861]의 섹션 7을 참조하십시오.

참고

기술적으로 구현할 수는 있지만, digest() 외부의 다른 알고리즘 일부로 KangarooTwelve를 사용하는 것은 (예를 들어 HMAC의 hash 매개변수에서 사용하는 경우) 유용할 가능성이 낮으며 지원될 것으로 예상되지 않습니다. supports()의 결과는 이러한 사용이 지원되는지를 반영해야 합니다.

15.2 등록

인식되는 알고리즘 이름은 "KT128" 및 "KT256"입니다.

연산 매개변수 결과
digest KangarooTwelveParams 바이트 시퀀스

15.3 KangarooTwelveParams 사전

WebIDLdictionary KangarooTwelveParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

customization 멤버는 사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다. 지정하지 않으면 기본값은 빈 문자열입니다.

15.4 연산

15.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 설정합니다.

  2. outputLength가 0이거나 8의 배수가 아니면, OperationError던집니다.

  3. customizationnormalizedAlgorithmcustomization 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  4. normalizedAlgorithmname 멤버가 "KT128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 3에 정의된 KT128 함수를 수행한 결과로 설정하며, messageM 입력 매개변수로, customizationC 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
    normalizedAlgorithmname 멤버가 "KT256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 3에 정의된 KT256 함수를 수행한 결과로 설정하며, messageM 입력 매개변수로, customizationC 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
  5. 연산을 수행한 결과 오류가 발생하면, OperationError던집니다.

  6. result를 반환합니다.

16. KMAC

16.1 설명

이 섹션은 비규범적입니다.

여기에서는 [NIST-SP800-185]에 명시된 KMAC128 및 KMAC256을 설명합니다.

16.2 등록

인식되는 알고리즘 이름은 "KMAC128" 및 "KMAC256"입니다.

연산 매개변수 결과
sign KmacParams 바이트 시퀀스
verify KmacParams 불리언
generateKey KmacKeyGenParams CryptoKey
importKey KmacImportParams CryptoKey
exportKey 없음 객체
키 길이 가져오기 KmacImportParams 정수

16.3 KmacKeyGenParams 사전

WebIDLdictionary KmacKeyGenParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length 멤버는 생성할 키의 길이(비트 단위)를 나타냅니다. 지정하지 않으면 권장 길이가 사용되며, KMAC128의 경우 128, KMAC256의 경우 256입니다.

16.4 KmacImportParams 사전

WebIDLdictionary KmacImportParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length 멤버는 키의 길이(비트 단위)를 나타냅니다.

16.5 KmacKeyAlgorithm 사전

WebIDLdictionary KmacKeyAlgorithm : KeyAlgorithm {
  required [EnforceRange] unsigned long length;
};

length 멤버는 키의 길이(비트 단위)를 나타냅니다.

16.6 KmacParams 사전

WebIDLdictionary KmacParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

customization 멤버는 사용자 지정 문자열을 나타냅니다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택합니다.

16.7 연산

16.7.1 서명

  1. customizationnormalizedAlgorithmcustomization 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  2. normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 [NIST-SP800-185]의 섹션 4에 정의된 KMAC128 함수를 수행한 결과로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
    normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 [NIST-SP800-185]의 섹션 4에 정의된 KMAC256 함수를 수행한 결과로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
  3. mac포함하는 바이트 시퀀스를 반환합니다.

16.7.2 검증

  1. customizationnormalizedAlgorithmcustomization 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 빈 옥텟 문자열로 설정합니다.

  2. normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 [NIST-SP800-185]의 섹션 4에 정의된 KMAC128 함수를 수행한 결과로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
    normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 [NIST-SP800-185]의 섹션 4에 정의된 KMAC256 함수를 수행한 결과로 설정하며, key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, 그리고 customizationS 입력 매개변수로 사용합니다.
  3. computedMacmac포함하는 바이트 시퀀스로 설정합니다.

  4. computedMacsignature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 이 비교는 상수 시간으로 수행해야 합니다.

16.7.3 키 생성

  1. usages에 "sign" 또는 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  2. normalizedAlgorithmlength 멤버가 존재하는 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 설정합니다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 128로 설정합니다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 256으로 설정합니다.
  3. 길이가 length비트인 키를 생성합니다.

  4. 키 생성 단계가 실패하면, OperationError던집니다.

  5. key를 생성된 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  6. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  7. algorithm을 새로운 KmacKeyAlgorithm으로 설정합니다.

  8. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

  9. algorithmlength 속성을 length로 설정합니다.

  10. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  11. key[[extractable]] 내부 슬롯을 extractable로 설정합니다.

  12. key[[usages]] 내부 슬롯을 usages정규화된 값으로 설정합니다.

  13. key를 반환합니다.

16.7.4 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. usages에 "sign" 또는 "verify"가 아닌 항목이 포함되어 있으면, SyntaxError던집니다.

  3. format이 "raw-secret"인 경우:
    1. datakeyData로 설정합니다.

    format이 "jwk"인 경우:
    1. keyDataJsonWebKey 사전인 경우:

      jwkkeyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError던집니다.

    2. jwkkty 필드가 "oct"가 아니면, DataError던집니다.

    3. jwk가 JSON Web Algorithms [JWA]의 섹션 6.4 요구사항을 충족하지 않으면, DataError던집니다.

    4. datajwkk 필드를 디코딩하여 얻은 바이트 시퀀스로 설정합니다.

    5. normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
      jwkalg 필드가 존재하고 "K128"이 아니면, DataError던집니다.
      normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
      jwkalg 필드가 존재하고 "K256"이 아니면, DataError던집니다.
    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "sig"가 아니면, DataError던집니다.

    7. jwkkey_ops 필드가 존재하고, JSON Web Key [JWK]의 요구사항에 따라 유효하지 않거나 지정된 모든 usages 값을 포함하지 않으면, DataError던집니다.

    8. jwkext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError던집니다.

    그렇지 않은 경우:
    NotSupportedError던집니다.
  4. lengthdata의 비트 단위 길이로 설정합니다.

  5. normalizedAlgorithmlength 멤버가 존재하는 경우:
    normalizedAlgorithmlength 멤버가 length보다 큰 경우:
    DataError던집니다.
    normalizedAlgorithmlength 멤버가 length에서 8을 뺀 값보다 작거나 같은 경우:
    DataError던집니다.
    그렇지 않은 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 설정합니다.
  6. keydata의 처음 length 비트를 사용하는 KMAC 키를 나타내는 새로운 CryptoKey 객체로 설정합니다.

  7. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  8. algorithm을 새로운 KmacKeyAlgorithm으로 설정합니다.

  9. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

  10. algorithmlength 속성을 length로 설정합니다.

  11. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  12. key를 반환합니다.

16.7.5 키 내보내기

  1. key[[handle]] 내부 슬롯이 나타내는 기본 암호화 키 재료에 접근할 수 없으면, OperationError던집니다.

  2. bitskey[[handle]] 내부 슬롯이 나타내는 키의 원시 비트로 설정합니다.

  3. databits포함하는 바이트 시퀀스로 설정합니다.

  4. format이 "raw-secret"인 경우:
    1. resultdata로 설정합니다.

    format이 "jwk"인 경우:
    1. jwk를 새로운 JsonWebKey 사전으로 설정합니다.

    2. jwkkty 속성을 문자열 "oct"로 설정합니다.

    3. jwkk 속성을 data를 포함하며 JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

    4. keyAlgorithmkey[[algorithm]] 내부 슬롯으로 설정합니다.

    5. keyAlgorithmname 멤버가 "KMAC128"인 경우:
      jwkalg 속성을 문자열 "K128"로 설정합니다.
      keyAlgorithmname 멤버가 "KMAC256"인 경우:
      jwkalg 속성을 문자열 "K256"로 설정합니다.
    6. jwkkey_ops 속성을 keyusages 속성과 같게 설정합니다.

    7. jwkext 속성을 key[[extractable]] 내부 슬롯과 같게 설정합니다.

    8. resultjwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError던집니다.

  5. result를 반환합니다.

16.7.6 키 길이 가져오기

  1. normalizedAlgorithmlength 멤버가 존재하는 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 설정합니다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 128로 설정합니다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 256으로 설정합니다.
  2. length를 반환합니다.

17. Argon2

17.1 설명

이 섹션은 비규범적입니다.

여기에서는 비밀번호 해싱 및 키 파생을 위한 Argon2 함수를 설명하며, [RFC9106]에 정의되어 있습니다.

17.2 등록

각 Argon2 유형의 인식되는 알고리즘 이름은 "Argon2d", "Argon2i" 및 "Argon2id"입니다.

연산 매개변수 결과
deriveBits Argon2Params 바이트 시퀀스
importKey 없음 CryptoKey
키 길이 가져오기 없음 null

17.3 Argon2Params 사전

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를 참조하십시오.

17.4 연산

17.4.1 비트 파생

  1. length가 null이거나, 32(4*8)보다 작거나, 8의 배수가 아니면, OperationError던집니다.

  2. normalizedAlgorithmversion 멤버가 존재하고 19(0x13)가 아니면, OperationError던집니다.

  3. normalizedAlgorithmparallelism 멤버가 0이거나, 16777215(2^24-1)보다 크면, OperationError던집니다.

  4. normalizedAlgorithmmemory 멤버가 normalizedAlgorithmparallelism 멤버의 8배보다 작으면, OperationError던집니다.

  5. normalizedAlgorithmpasses 멤버가 0이면, OperationError던집니다.

  6. normalizedAlgorithmname 멤버가 "Argon2d"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 0으로 설정합니다.
    normalizedAlgorithmname 멤버가 "Argon2i"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 1로 설정합니다.
    normalizedAlgorithmname 멤버가 "Argon2id"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 2로 설정합니다.
  7. secretValuenormalizedAlgorithmsecretValue 멤버가 존재하는 경우 해당 멤버로 설정합니다.

  8. associatedDatanormalizedAlgorithmassociatedData 멤버가 존재하는 경우 해당 멤버로 설정합니다.

  9. result를 [RFC9106]의 섹션 3에 정의된 Argon2 함수를 수행한 결과로 설정하며, key[[handle]] 내부 슬롯이 나타내는 비밀번호를 메시지 P로, normalizedAlgorithmnonce 속성을 nonce S로, normalizedAlgorithmparallelism 속성 값을 병렬성 정도 p로, normalizedAlgorithmmemory 속성 값을 메모리 크기 m으로, normalizedAlgorithmpasses 속성 값을 패스 횟수 t로, 0x13을 버전 번호 v로, secretValue가 존재하는 경우 이를 비밀 값 K로, associatedData가 존재하는 경우 이를 연관 데이터 X로, type을 유형 y로, 그리고 length를 8로 나눈 값을 태그 길이 T로 사용합니다.

  10. 키 파생 연산이 실패하면, OperationError던집니다.

  11. result를 반환합니다.

17.4.2 키 가져오기

  1. keyData를 가져올 키 데이터로 설정합니다.

  2. format이 "raw-secret"이 아니면, NotSupportedError던집니다

  3. usages에 "deriveKey" 또는 "deriveBits"가 아닌 값이 포함되어 있으면, SyntaxError던집니다.

  4. extractablefalse가 아니면, SyntaxError던집니다.

  5. keykeyData를 나타내는 새로운 CryptoKey로 설정합니다.

  6. key[[type]] 내부 슬롯을 "secret"으로 설정합니다.

  7. algorithm을 새로운 KeyAlgorithm 객체로 설정합니다.

  8. algorithmname 속성을 normalizedAlgorithmname 멤버로 설정합니다.

  9. key[[algorithm]] 내부 슬롯을 algorithm으로 설정합니다.

  10. key를 반환합니다.

17.4.3 키 길이 가져오기

  1. null을 반환합니다.

18. IANA 고려 사항

18.1 JSON Web 서명 및 암호화 알고리즘 등록

이 섹션에서는 JSON 웹 키와 함께 사용하기 위해 IANA JSON 웹 서명 및 암호화 알고리즘 레지스트리에 다음 알고리즘 식별자를 등록합니다.

이러한 등록에서는 "JWK"를 유일한 알고리즘 사용 위치로 사용합니다. 이 명세에서 정의한 JSON 웹 키 표현에 안정적인 alg 값을 제공하므로, Web Cryptography API 구현은 exportKey()importKey()를 "jwk"와 함께 사용하여 이러한 키를 직렬화하고 구문 분석할 수 있습니다. 이 명세에서는 이러한 식별자를 JSON 웹 서명 또는 JSON 웹 암호화 알고리즘으로 사용하는 방법을 정의하지 않습니다.

18.2 JSON Web Key 연산

이 섹션에서는 JSON Web Key와 함께 사용하기 위해 다음 키 연산을 IANA JSON Web Key Operations 레지스트리에 등록합니다.

19. 도입 지침

이 섹션은 비규범적입니다.

이 명세는 많은 알고리즘과 연산을 정의합니다. 구현자에게 지침을 제공하고 Web 플랫폼의 포스트 양자 전환을 가속하기 위해, 이 섹션에서는 구현 시 우선시할 알고리즘과 연산을 권장합니다.

SubtleCrypto.supports 메서드는 기능 감지, 우아한 폴백 및 점진적 향상을 가능하게 하여 이 명세의 다른 모든 알고리즘과 연산을 신속하게 도입하는 과정을 단순화합니다.

SubtleCrypto.getPublicKey 메서드는 이 명세와 [webcrypto]에 정의된 비대칭 알고리즘을 실용적으로 사용하는 데 중요합니다. 애플리케이션이 해당 공개 키 없이 개인 키만 저장할 수 있게 하고, 개인 키와 공개 키가 실제로 서로 대응하는지 확인할 필요도 없게 하여 키 관리를 단순화합니다. 또한 라이브러리 작성자가 공개 키 값을 출력에 커밋하는 프로토콜의 입력으로 추출할 수 없는 개인 키를 허용할 수 있게 합니다.

알고리즘 측면에서는 다음 항목이 포스트 양자 전환과 Web에서 최신 암호화 프로토콜을 사용할 수 있게 하는 데 가장 높은 우선순위를 갖는 것으로 간주되며, 우선순위 순서는 다음과 같습니다:

  1. ML-KEM은 NIST [FIPS-203]에서 표준화한 주요 포스트 양자 키 캡슐화 메커니즘입니다. 전통적인 키 합의와 결합하면 [draft-ietf-hpke-hpke] 및 그 PQ와 PQ/T 알고리즘 [draft-ietf-hpke-pq]과 같은 프로토콜에서 사용되는 하이브리드 포스트 양자/전통적(PQ/T) 키 설정을 가능하게 합니다.
  2. 하이브리드 KEM은 ML-KEM을 P-256, X25519 또는 P-384와 결합한 포스트 양자/전통적 KEM 인스턴스를 제공합니다 [draft-irtf-cfrg-concrete-hybrid-kems-04].
  3. ML-DSA는 NIST [FIPS-204]에서 표준화한 주요 포스트 양자 디지털 서명 알고리즘입니다.
  4. ChaCha20-Poly1305는 여러 프로토콜 (TLS, SSH, WireGuard, HPKE)에서 사용되는 널리 배포된 AEAD 암호입니다 [RFC8439].
  5. SHA-3cSHAKE (특히 SHA3-256 및 cSHAKE256)는 ML-KEM 키 파생과 하이브리드 KEM 결합기를 포함한 많은 포스트 양자 구성에서 사용됩니다. 특히 사용자 지정 매개변수 없이 호출된 cSHAKE256은 SHAKE256과 동일한 출력을 생성하므로, 하나의 구현만으로 사용자 지정(cSHAKE256) 및 비사용자 지정(SHAKE256) 사용 사례를 모두 처리할 수 있습니다. 그러나 cSHAKE 구현을 사용할 수 없는 경우에도 SHAKE 구현은 유용할 수 있으며, 이때 customization 매개변수가 존재하고 비어 있지 않은 경우 NotSupportedError를 던지고 SubtleCrypto.supports에서 false를 반환해야 합니다.
  6. Argon2는 메모리 하드 비밀번호 기반 키 파생 함수이며 [RFC9106], 고도로 병렬화된 환경 (예: GPU 및 FPGA)에서 무차별 대입 공격에 대한 향상된 저항성을 제공합니다.

SLH-DSA는 NIST [FIPS-204]에서 표준화한 상태 비저장 해시 기반 디지털 서명 알고리즘입니다. 지금까지 ML-DSA보다 도입이 적었지만, ML-DSA의 대안이 필요해지는 경우 구현하는 것이 유용할 수 있습니다.

이 밖에도 AES-OCB, TurboSHAKE, KangarooTwelveKMAC은 모두 가치 있는 추가 항목이지만 포스트 양자 전환에 즉각적으로 중요한 정도는 상대적으로 낮습니다.

20. 사용 예시

이 예시는 사용할 수 있는 경우 Argon2를, 그렇지 않으면 PBKDF2를 사용하여 비밀번호에서 키를 파생하고, 사용할 수 있는 경우 AES-OCB를, 그렇지 않으면 AES-GCM을 사용하여 일부 텍스트를 암호화하고 복호화합니다.

예시 1: 비밀번호에서 파생한 키를 사용하여 일부 데이터를 암호화합니다
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
));

A. JSON Web Key와 JSON Web Algorithm 간 매핑

이 절은 비규범적이다.

JWK 가져오기 및 내보내기의 규범적 요구 사항은 알고리즘별 절을 참조한다.

A.1 알고리즘 매핑

JSON Web Key AlgorithmIdentifier
{ kty: "AKP",
alg: "MLKEM768-P256" }
{ name: "MLKEM768-P256" }
{ kty: "AKP",
alg: "MLKEM768-X25519" }
{ name: "MLKEM768-X25519" }
{ kty: "AKP",
alg: "MLKEM1024-P384" }
{ name: "MLKEM1024-P384" }
{ kty: "oct",
alg: "A128OCB" }
{ name: "AES-OCB",
length: 128 }
{ kty: "oct",
alg: "A192OCB" }
{ name: "AES-OCB",
length: 192 }
{ kty: "oct",
alg: "A256OCB" }
{ name: "AES-OCB",
length: 256 }
{ kty: "oct",
alg: "C20P" }
{ name: "ChaCha20-Poly1305" }
{ kty: "oct",
alg: "K128" }
{ name: "KMAC128" }
{ kty: "oct",
alg: "K256" }
{ name: "KMAC256" }

B. 알고리즘과 PKCS#8 PrivateKeyInfo 간 매핑

이 절은 비규범적이다.

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]

C. 알고리즘과 SubjectPublicKeyInfo 간 매핑

이 절은 비규범적이다.

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]

D. 적합성

비규범적으로 표시된 절과 마찬가지로 이 명세의 모든 작성 지침, 다이어그램, 예 및 참고 사항은 비규범적이다. 이 명세의 그 밖의 모든 내용은 규범적이다.

이 문서의 핵심어 MUST는 여기에서와 같이 모두 대문자로 표시된 경우에만 BCP 14 [RFC2119] [RFC8174]에 설명된 대로 해석해야 한다.

E. 참고 문헌

E.1 규범적 참고 문헌

[draft-irtf-cfrg-concrete-hybrid-kems-04]
구체적인 하이브리드 PQ/T 키 캡슐화 메커니즘. IETF. 2026년 7월. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-concrete-hybrid-kems-04.html
[draft-irtf-cfrg-hybrid-kems-12]
하이브리드 PQ/T 키 캡슐화 메커니즘. IETF. 2026년 7월. URL: https://www.ietf.org/archive/id/draft-irtf-cfrg-hybrid-kems-12.html
[FIPS-202]
SHA-3 표준: 순열 기반 해시 및 확장 가능 출력 함수. NIST. 2015년 8월. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.202.pdf
[FIPS-203]
모듈 격자 기반 키 캡슐화 메커니즘 표준. NIST. 2024년 8월. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.203.pdf
[FIPS-204]
모듈 격자 기반 디지털 서명 표준. NIST. 2024년 8월. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf
[FIPS-205]
상태 비저장 해시 기반 디지털 서명 표준. NIST. 2024년 8월. URL: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.205.pdf
[html]
HTML 표준. Anne van Kesteren; Domenic Denicola; Dominic Farolino; Ian Hickson; Philip Jägenstedt; Simon Pieters. WHATWG. 현행 표준. URL: https://html.spec.whatwg.org/multipage/
[IANA-JOSE-Algorithms]
IANA JSON 웹 서명 및 암호화 알고리즘. IANA. URL: https://www.iana.org/assignments/jose/jose.xhtml#web-signature-encryption-algorithms
[infra]
Infra 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[JWA]
JSON 웹 알고리즘(JWA). M. Jones. IETF. 2015년 5월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc7518/
[JWK]
JSON 웹 키(JWK). M. Jones. IETF. 2015년 5월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc7517/
[NIST-SP800-185]
NIST 특별 간행물 800-185: SHA-3 파생 함수: cSHAKE, KMAC, TupleHash 및 ParallelHash. NIST. 2016년 12월. URL: https://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-185.pdf
[RFC2119]
요구 수준을 나타내기 위해 RFC에서 사용하는 핵심 단어. S. Bradner. IETF. 1997년 3월. 현행 최선 관행. URL: https://www.rfc-editor.org/info/rfc2119/
[RFC5208]
공개 키 암호화 표준(PKCS) #8: 비공개 키 정보 구문 명세 버전 1.2. B. Kaliski. IETF. 2008년 5월. 정보 제공. URL: https://www.rfc-editor.org/info/rfc5208/
[RFC5280]
인터넷 X.509 공개 키 인프라 인증서 및 인증서 해지 목록(CRL) 프로파일. D. Cooper; S. Santesson; S. Farrell; S. Boeyen; R. Housley; W. Polk. IETF. 2008년 5월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc5280/
[RFC7253]
OCB 인증 암호화 알고리즘. T. Krovetz; P. Rogaway. IETF. 2014년 5월. 정보 제공. URL: https://www.rfc-editor.org/info/rfc7253/
[RFC8174]
RFC 2119 핵심 단어에서 대문자와 소문자의 모호성. B. Leiba. IETF. 2017년 5월. 현행 최선 관행. URL: https://www.rfc-editor.org/info/rfc8174/
[RFC8439]
IETF 프로토콜을 위한 ChaCha20 및 Poly1305. Y. Nir; A. Langley. IETF. 2018년 6월. 정보 제공. URL: https://www.rfc-editor.org/info/rfc8439/
[RFC9106]
비밀번호 해싱 및 작업 증명 애플리케이션을 위한 Argon2 메모리 하드 함수. A. Biryukov; D. Dinu; D. Khovratovich; S. Josefsson. IETF. 2021년 9월. 정보 제공. URL: https://www.rfc-editor.org/info/rfc9106/
[RFC9861]
KangarooTwelve 및 TurboSHAKE. IETF. 2025년 10월. URL: https://www.rfc-editor.org/rfc/rfc9861.html
[RFC9964]
JSON 객체 서명 및 암호화(JOSE)와 CBOR 객체 서명 및 암호화(COSE)를 위한 ML-DSA. M. Prorock; O. Steele. IETF. 2026년 5월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc9964/
[webcrypto]
Web Cryptography 레벨 2. Daniel Huigens. W3C. 2025년 4월 22일. FPWD. URL: https://www.w3.org/TR/webcrypto-2/
[WebIDL]
Web IDL 표준. Edgar Chen; Timothy Gu. WHATWG. 현행 표준. URL: https://webidl.spec.whatwg.org/

E.2 비규범적 참고 문헌

[CSOR]
컴퓨터 보안 객체 레지스터. NIST. URL: https://csrc.nist.gov/projects/computer-security-objects-register/algorithm-registration
[draft-ietf-hpke-hpke]
하이브리드 공개 키 암호화. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-hpke-hpke/
[draft-ietf-hpke-pq]
HPKE를 위한 포스트 양자 하이브리드 키 캡슐화 메커니즘. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-hpke-pq/
[draft-ietf-jose-hpke-pq-pqt]
JOSE HPKE PQ 및 PQ/T 알고리즘 등록. IETF. URL: https://datatracker.ietf.org/doc/draft-ietf-jose-hpke-pq-pqt/
[RFC9814]
암호화 메시지 구문(CMS)에서 SLH-DSA 서명 알고리즘 사용. R. Housley; S. Fluhrer; P. Kampanakis; B. Westerbaan. IETF. 2025년 7월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc9814/
[RFC9881]
인터넷 X.509 공개 키 인프라 -- 모듈 격자 기반 디지털 서명 알고리즘 (ML-DSA)을 위한 알고리즘 식별자. J. Massimo; P. Kampanakis; S. Turner; B. E. Westerbaan. IETF. 2025년 10월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc9881/
[RFC9935]
인터넷 X.509 공개 키 인프라 - 모듈 격자 기반 키 캡슐화 메커니즘 (ML-KEM)을 위한 알고리즘 식별자. S. Turner; P. Kampanakis; J. Massimo; B. E. Westerbaan. IETF. 2026년 3월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc9935/
[webcrypto-secure-curves]
Web Cryptography API의 안전한 곡선. W3C. 커뮤니티 그룹 보고서 초안. URL: https://wicg.github.io/webcrypto-secure-curves/