Web Cryptography API의 현대 알고리즘

커뮤니티 그룹 보고서 초안

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

초록

이 명세는 Web Cryptography API를 위한 여러 양자 내성 및 현대 암호 알고리즘, 즉 ML-KEM, ML-DSA, SLH-DSA, AES-OCB, ChaCha20-Poly1305, SHA-3, cSHAKE, TurboSHAKE, KangarooTwelve, KMAC 및 Argon2를 정의한다.

이 문서의 상태

이 명세는 Web Platform Incubator 커뮤니티 그룹에서 게시했다. 이 문서는 W3C 표준이 아니며 W3C 표준화 과정에 포함되지도 않는다. 다음 W3C 커뮤니티 기여자 라이선스 계약 (CLA)에 따라 제한적인 참여 철회가 가능하며 기타 조건이 적용됨에 유의한다. W3C 커뮤니티 및 비즈니스 그룹에 대해 자세히 알아볼 수 있다.

이 문서는 비공식 제안이다.

이 명세에 관한 논의에는 GitHub 이슈를 사용하는 것이 권장된다.

1. 소개

이 절은 비규범적이다.

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

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

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

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

2. 명세 규칙

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

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 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", "encapsulateKey" 또는 "decapsulateKey"인 경우:

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

    operation이 "wrapKey"인 경우:

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

  3. length를 null로 둔다.

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

    2. algadditionalAlgorithm로 설정하고 op를 "get key length"로 설정하여 알고리즘을 정규화한 결과를 normalizedAdditionalAlgorithm로 둔다.

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

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

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

3.3 알고리즘 지원 여부 확인

알고리즘 지원 여부 확인 알고리즘은 지정된 알고리즘이 지정된 연산에서 지원되는지 확인하는 절차를 정의한다. 입력은 연산 이름 op, AlgorithmIdentifier alglength 매개변수이다. 출력은 불리언이다. 다음과 같이 동작한다.

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

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

  3. op가 "getPublicKey"인 경우:
    1. algalg로 설정하고 op를 "exportKey"로 설정하여 알고리즘을 정규화한 결과를 normalizedAlgorithm로 둔다.

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

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

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

  4. algalg로 설정하고 opop로 설정하여 알고리즘을 정규화한 결과를 normalizedAlgorithm로 둔다.

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

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

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

  6. 지정된 연산이나 알고리즘 또는 그 매개변수 값 중 하나가 구현별 이유 (예: 알려진 명세 부적합)로 인해 모든 키 및/또는 데이터에서 실패할 것으로 예상되면 false를 반환한다.

  7. op가 "generateKey" 또는 "importKey"이면 usages를 빈 목록으로 둔다.

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

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

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

  9. 단언: 연산 단계 중 하나가 값을 반환하거나 오류를 발생시키도록 하여 각각 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 연산

6.3.1 캡슐화

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

  2. algorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-203]의 7.2절에 설명된 캡슐화 키 검사를 수행한다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용한다.

    참고

    성능상 바람직한 경우 이 검사 결과를 CryptoKey 객체에 대해 캐시하거나 미리 계산할 수 있다.

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

  4. algorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-203]의 7.2절에 설명된 ML-KEM.Encaps 함수를 수행하여 얻은 출력을 sharedKeyciphertext로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용한다.

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

  6. result를 새로운 EncapsulatedBits 딕셔너리로 둔다.

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

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

  9. result를 반환한다.

6.3.2 캡슐화 해제

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

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

    참고

    성능상 바람직한 경우 캡슐화 해제 키 형식 검사 및 해시 검사 결과를 CryptoKey 객체에 대해 캐시하거나 미리 계산할 수 있다.

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

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

  5. sharedKey를 반환한다.

6.3.3 키 생성

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

  2. normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-203]의 7.1절에 설명된 대로 ML-KEM 키 쌍을 생성한다.

    참고

    시드 (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.3.4 키 가져오기

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

  2. format이 "spki"인 경우:
    1. usages에 "encapsulateKey" 또는 "encapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

    2. keyDatasubjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.

    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. keyDataprivateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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. dataprivateKeyInfoprivateKey 필드로, structureasn1Structure로 설정하고, exactData를 true로 설정하여 ASN.1 구조 구문 분석 알고리즘을 수행한 결과를 mlKemPrivateKey로 둔다.

    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. normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-203]의 6.1절에 설명된 ML-KEM.KeyGen_internal 함수를 수행한 결과를 privateKey로 둔다. 이때 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

    ML-KEM의 JWK 형식은 아직 표준화되지 않았으므로 변경될 수 있다.

    1. keyDataJsonWebKey 딕셔너리인 경우:

      jwkkeyData와 같게 둔다.

      그렇지 않은 경우:

      DataError발생시킨다.

    2. jwkpriv 필드가 존재하고 usages에 "decapsulateKey" 또는 "decapsulateBits"가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

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

    4. jwkkty 필드가 "AKP"가 아니면 DataError발생시킨다.

    5. jwkalg 필드가 [draft-ietf-jose-pqc-kem-05]의 8절(그림 1 또는 2)에 제시된 normalizedAlgorithmname 멤버에 대응하는 alg 값 중 하나가 아니면 DataError발생시킨다.

      예를 들어 ML-KEM-512ML-KEM-512+A128KW는 ML-KEM-512에 유효한 "alg" 값이다.

    6. usages가 비어 있지 않고 jwkuse 필드가 존재하며 "enc"와 같지 않으면 DataError발생시킨다.

    7. jwkkey_ops 필드가 존재하고 JSON Web Key [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.3.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-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 비밀 키 시드를 시드 전용 형식으로 나타내는 ML-KEM-512-PrivateKey ASN.1 형식을 DER 인코딩한 결과로 설정한다 (OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그를 사용한다).

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

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

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

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

          그렇지 않은 경우:

          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"인 경우:
    이슈 2

    ML-KEM의 JWK 형식은 아직 표준화되지 않았으므로 변경될 수 있다.

    1. jwk를 새로운 JsonWebKey 딕셔너리로 둔다.

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

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

    4. jwkalg 속성을 [draft-ietf-jose-pqc-kem-05]의 8절(그림 1)에 제시된 keyAlgorithmname 멤버에 대응하는 alg 값으로 설정한다.

      예를 들어 ML-KEM-512는 ML-KEM-512에 사용되는 "alg" 값이다.

    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. ML-DSA

7.1 설명

이 절은 비규범적이다.

여기에서는 [FIPS-204]에 명시된 대로 서명 및 검증에 ML-DSA를 사용하는 방법을 설명한다.

7.2 등록

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

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

7.3 ContextParams 딕셔너리

WebIDLdictionary ContextParams : Algorithm {
  BufferSource context;
};

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

참고

ContextParams 딕셔너리는 [webcrypto-secure-curves]의 Ed448Params 딕셔너리와 동일하며, 이 제안을 병합할 때 후자를 전자로 대체할 수 있다.

7.4 연산

7.4.1 서명

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

  2. normalizedAlgorithmcontext 멤버를 context로 두고, normalizedAlgorithmcontext 멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.

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

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

  5. result를 반환한다.

7.4.2 검증

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

  2. normalizedAlgorithmcontext 멤버를 context로 두고, normalizedAlgorithmcontext 멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.

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

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

  5. result를 반환한다.

7.4.3 키 생성

  1. usages에 "sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

  2. normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-204]의 5.1절에 설명된 대로 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를 반환한다.

7.4.4 키 가져오기

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

  2. format이 "spki"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

    2. keyDatasubjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.

    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. keyDataprivateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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. dataprivateKeyInfoprivateKey 필드로, structureasn1Structure로 설정하고, exactData를 true로 설정하여 ASN.1 구조 구문 분석 알고리즘을 수행한 결과를 mlDsaPrivateKey로 둔다.

    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. normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-204]의 6.1절에 설명된 ML-DSA.KeyGen_internal 함수를 dataξ로 사용하여 수행한 결과를 privateKey로 둔다.

    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를 반환한다.

7.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 비밀 키 시드를 시드 전용 형식으로 나타내는 ML-DSA-44-PrivateKey ASN.1 형식을 DER 인코딩한 결과로 설정한다 (OCTET STRING의 암시적 인코딩과 함께 컨텍스트별 [0] 기본 태그를 사용한다).

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

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

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

          privateKey 필드를 key[[handle]] 내부 슬롯이 나타내는 ML-DSA 비밀 키 시드를 시드 전용 형식으로 나타내는 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를 반환한다.

8. SLH-DSA

8.1 설명

이 절은 비규범적이다.

여기에서는 [FIPS-205]에 명시된 대로 서명 및 검증에 SLH-DSA를 사용하는 방법을 설명한다.

8.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 없음 객체

8.3 JSON Web Key 표현

SLH-DSA 키는 JWK 표현에 [RFC9964]에 정의된 "AKP"(Algorithm Key Pair) 키 형식을 사용한다. "alg"(알고리즘) 매개변수는 특정 SLH-DSA 매개변수 집합을 식별한다. 공개 키는 "pub" 매개변수에 담긴다. 비밀 키가 포함된 경우 "priv" 매개변수를 사용하여 나타낸다. JWK로 표현할 때 모든 키 매개변수는 base64url로 인코딩된다.

8.4 연산

8.4.1 서명

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

  2. normalizedAlgorithmcontext 멤버를 context로 두고, normalizedAlgorithmcontext 멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.

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

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

  5. result를 반환한다.

8.4.2 검증

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

  2. normalizedAlgorithmcontext 멤버를 context로 두고, normalizedAlgorithmcontext 멤버가 존재하지 않으면 빈 옥텟 문자열을 context로 둔다.

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

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

  5. result를 반환한다.

8.4.3 키 생성

  1. usages에 "sign" 또는 "verify" 중 하나가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

  2. normalizedAlgorithmname 멤버가 나타내는 매개변수 집합으로 [FIPS-205]의 10.1절에 설명된 대로 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를 반환한다.

8.4.4 키 가져오기

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

  2. format이 "spki"인 경우:
    1. usages에 "verify"가 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

    2. keyDatasubjectPublicKeyInfo 구문 분석 알고리즘을 실행한 결과를 spki로 둔다.

    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. keyDataprivateKeyInfo 구문 분석 알고리즘을 실행한 결과를 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. dataprivateKeyInfoprivateKey 필드로, structure를 OCTET STRING으로 설정하고, exactData를 true로 설정하여 ASN.1 구조 구문 분석 알고리즘을 수행한 결과를 slhDsaPrivateKey로 둔다.

    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길이normalizedAlgorithmname 멤버가 나타내는 매개변수 집합에 대해 [FIPS-205]의 표 2에 명시된 pk length가 아니면 DataError발생시킨다.

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

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

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

    format이 "raw-private"인 경우:
    1. usages에 "sign"이 아닌 항목이 포함되어 있으면 SyntaxError발생시킨다.

    2. keyData길이normalizedAlgorithmname 멤버가 나타내는 매개변수 집합에 대해 [FIPS-205]의 표 2에 명시된 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를 반환한다.

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 멤버가 "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를 반환한다.

9. AES-OCB

9.1 설명

이 절은 비규범적이다.

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

9.2 등록

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

연산 매개변수 결과
encrypt AeadParams 바이트 시퀀스
decrypt AeadParams 바이트 시퀀스
generateKey AesKeyGenParams CryptoKey
importKey 없음 CryptoKey
exportKey 없음 객체
get key length AesDerivedKeyParams 정수

9.3 AeadParams 딕셔너리

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

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

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

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

참고

AeadParams 딕셔너리는 [webcrypto]의 AesGcmParams 딕셔너리와 동일하며, 이 제안을 병합할 때 후자를 전자로 대체할 수 있다.

9.4 연산

9.4.1 암호화

  1. normalizedAlgorithmiv 멤버의 길이가 15바이트보다 크면 OperationError발생시킨다.

  2. normalizedAlgorithmtagLength 멤버가 존재하지 않는 경우:
    tagLength를 128로 둔다.
    normalizedAlgorithmtagLength 멤버가 64, 96 또는 128 중 하나인 경우:
    tagLengthnormalizedAlgorithmtagLength 멤버와 같게 둔다.
    그렇지 않은 경우:
    OperationError발생시킨다.
  3. normalizedAlgorithmadditionalData 멤버가 존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을 additionalData로 둔다.

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

  5. C를 반환한다.

9.4.2 복호화

  1. normalizedAlgorithmiv 멤버의 길이가 15바이트보다 크면 OperationError발생시킨다.

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

  4. normalizedAlgorithmadditionalData 멤버가 존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을 additionalData로 둔다.

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

    알고리즘의 결과가 인증 실패를 나타내는 "INVALID"인 경우:
    OperationError발생시킨다.
    그렇지 않은 경우:
    plaintext를 OCB-DECRYPT의 출력 P로 둔다.
  6. plaintext를 반환한다.

9.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를 반환한다.

9.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. jwkk 필드를 디코딩하여 얻은 바이트 시퀀스data로 둔다.

    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를 반환한다.

9.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를 반환한다.

9.4.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithmlength 멤버가 128, 192 또는 256이 아니면 OperationError발생시킨다.

  2. normalizedDerivedKeyAlgorithmlength 멤버를 반환한다.

10. ChaCha20-Poly1305

10.1 설명

이 절은 비규범적이다.

"ChaCha20-Poly1305" 알고리즘 식별자는 [RFC8439]에 설명된 대로 AEAD_CHACHA20_POLY1305를 사용하여 인증된 암호화 및 복호화를 수행하는 데 사용된다.

10.2 등록

이 알고리즘의 인식되는 알고리즘 이름은 "ChaCha20-Poly1305"이다.

연산 매개변수 결과
encrypt AeadParams 바이트 시퀀스
decrypt AeadParams 바이트 시퀀스
generateKey 없음 CryptoKey
importKey 없음 CryptoKey
exportKey 없음 객체
get key length 없음 정수

10.3 연산

10.3.1 암호화

  1. normalizedAlgorithmiv 멤버의 길이가 12바이트가 아니면 OperationError발생시킨다.

  2. normalizedAlgorithmtagLength 멤버가 존재하고 128이 아니면 OperationError발생시킨다.

  3. normalizedAlgorithmadditionalData 멤버가 존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을 additionalData로 둔다.

  4. [RFC8439]의 2.8절에 설명된 AEAD_CHACHA20_POLY1305 암호화 알고리즘을 수행하여 얻은 출력을 ciphertext로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 키 입력 매개변수로, normalizedAlgorithmiv 멤버를 논스 입력 매개변수로, plaintext를 평문 입력 매개변수로, additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용한다.

  5. ciphertext를 반환한다.

10.3.2 복호화

  1. normalizedAlgorithmiv 멤버의 길이가 12바이트가 아니면 OperationError발생시킨다.

  2. normalizedAlgorithmtagLength 멤버가 존재하고 128이 아니면 OperationError발생시킨다.

  3. ciphertext의 길이가 128비트보다 작으면 OperationError발생시킨다.

  4. normalizedAlgorithmadditionalData 멤버가 존재하면 이를 additionalData로 두고, 그렇지 않으면 빈 옥텟 문자열을 additionalData로 둔다.

  5. [RFC8439]의 2.8절에 설명된 AEAD_CHACHA20_POLY1305 복호화 알고리즘을 수행한다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 키 입력 매개변수로, normalizedAlgorithmiv 멤버를 논스 입력 매개변수로, ciphertext를 암호문 입력 매개변수로, additionalData를 추가 인증 데이터(AAD) 입력 매개변수로 사용한다.

    알고리즘의 결과가 인증 실패를 나타내는 경우:
    OperationError발생시킨다.
    그렇지 않은 경우:
    plaintext를 결과 평문으로 둔다.
  6. plaintext를 반환한다.

10.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를 반환한다.

10.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. jwkk 필드를 디코딩하여 얻은 바이트 시퀀스data로 둔다.

    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를 반환한다.

10.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를 반환한다.

10.3.6 키 길이 가져오기

  1. 256을 반환한다.

11. SHA-3

11.1 설명

이 절은 비규범적이다.

여기에서는 [FIPS-202]에 명시된 SHA-3 해시 함수 계열을 설명한다.

11.2 등록

각 SHA-3 알고리즘의 인식되는 알고리즘 이름은 "SHA3-256", "SHA3-384" 및 "SHA3-512"이다.

연산 매개변수 결과
digest 없음 바이트 시퀀스

11.3 연산

11.3.1 다이제스트

  1. normalizedAlgorithmname 멤버가 "SHA3-256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [FIPS-202]의 6.1절에 정의된 SHA3-256 해시 함수를 message를 입력 메시지 M으로 사용하여 수행한 결과를 result로 둔다.
    normalizedAlgorithmname 멤버가 "SHA3-384"와 대소문자를 구분하여 일치하는 문자열인 경우:
    [FIPS-202]의 6.1절에 정의된 SHA3-384 해시 함수를 message를 입력 메시지 M으로 사용하여 수행한 결과를 result로 둔다.
    normalizedAlgorithmname 멤버가 "SHA3-512"와 대소문자를 구분하여 일치하는 문자열인 경우:
    [FIPS-202]의 6.1절에 정의된 SHA3-512 해시 함수를 message를 입력 메시지 M으로 사용하여 수행한 결과를 result로 둔다.
  2. 연산을 수행한 결과 오류가 발생하면 OperationError발생시킨다.

  3. result를 반환한다.

12. cSHAKE

12.1 설명

이 절은 비규범적이다.

여기에서는 [NIST-SP800-185]에 명시된 cSHAKE128 및 cSHAKE256을 설명한다.

functionNamecustomization 매개변수가 모두 비어 있거나 제공되지 않으면, cSHAKE는 [FIPS-202]의 6.2절에 정의된 SHAKE와 기능적으로 동일하다.

12.2 등록

인식되는 알고리즘 이름은 "cSHAKE128" 및 "cSHAKE256"이다.

연산 매개변수 결과
digest CShakeParams 바이트 시퀀스

12.3 CShakeParams 딕셔너리

WebIDLdictionary CShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource functionName;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타낸다.

functionName 멤버는 NIST가 cSHAKE를 기반으로 함수를 정의하는 데 사용하는 함수 이름을 나타낸다. 사용할 경우 NIST가 정의한 값으로만 설정해야 한다.

customization 멤버는 사용자 정의 문자열을 나타낸다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택한다.

12.4 연산

12.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 둔다.

  2. normalizedAlgorithmfunctionName 멤버가 존재하면 이를 functionName으로 두고, 그렇지 않으면 빈 옥텟 문자열을 functionName으로 둔다.

  3. normalizedAlgorithmcustomization 멤버가 존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을 customization으로 둔다.

  4. normalizedAlgorithmname 멤버가 "cSHAKE128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 3절에 정의된 cSHAKE128 함수를 수행한 결과를 result로 둔다. 이때 messageX 입력 매개변수로, outputLengthL 입력 매개변수로, functionNameN 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
    normalizedAlgorithmname 멤버가 "cSHAKE256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 3절에 정의된 cSHAKE256 함수를 수행한 결과를 result로 둔다. 이때 messageX 입력 매개변수로, outputLengthL 입력 매개변수로, functionNameN 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
  5. 연산을 수행한 결과 오류가 발생하면 OperationError발생시킨다.

  6. result포함하는 바이트 시퀀스를 반환한다.

13. TurboSHAKE

13.1 설명

이 절은 비규범적이다.

여기에서는 [RFC9861]에 명시된 TurboSHAKE128 및 TurboSHAKE256을 설명한다.

TurboSHAKE는 SHA-3에서 사용되는 Keccak 순열의 라운드 수를 줄인 버전을 기반으로 하는 확장 가능 출력 함수(XOF) 계열로, 동일한 보안 강도를 유지하면서 SHAKE 함수보다 약 두 배 빠르다.

참고

128비트 충돌 보안을 위해 TurboSHAKE128 출력은 최소 256비트여야 한다. 256비트 충돌 보안을 위해 TurboSHAKE256 출력은 최소 512비트여야 한다. 이러한 출력 길이는 대응하는 원상 및 제2원상 보안 요구 사항 (목표 보안 수준과 같은 출력 길이만 필요함)도 초과한다. 출력 길이가 이 임곗값을 충족하면 TurboSHAKE128은 NIST 양자 내성 보안 수준 2를 달성하고, TurboSHAKE256은 수준 5를 달성한다. [RFC9861]의 7절을 참조한다.

13.2 등록

인식되는 알고리즘 이름은 "TurboSHAKE128" 및 "TurboSHAKE256"이다.

연산 매개변수 결과
digest TurboShakeParams 바이트 시퀀스

13.3 TurboShakeParams 딕셔너리

WebIDLdictionary TurboShakeParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  [EnforceRange] octet domainSeparation;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타낸다.

domainSeparation 멤버는 도메인 분리 바이트를 나타낸다. 지정하지 않으면 기본값은 0x1F이다. 유효한 값의 범위는 0x01부터 0x7F까지이다.

참고

KangarooTwelve와 TurboSHAKE를 모두 사용하는 프로토콜은 도메인 분리에 0x06, 0x070x0B 값을 사용하지 않아야 한다. 이러한 값은 KangarooTwelve가 내부적으로 사용하기 때문이다.

13.4 연산

13.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 둔다.

  2. outputLength가 0이거나 8의 배수가 아니면 OperationError발생시킨다.

  3. normalizedAlgorithmdomainSeparation 멤버가 존재하면 이를 domainSeparation으로 두고, 그렇지 않으면 0x1F로 둔다.

  4. domainSeparation0x01보다 작거나 0x7F보다 크면 OperationError발생시킨다.

  5. normalizedAlgorithmname 멤버가 "TurboSHAKE128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [RFC9861]의 2절에 정의된 TurboSHAKE128 함수를 수행한 결과를 result로 둔다. 이때 messageM 입력 매개변수로, domainSeparationD 입력 매개변수로, outputLength을 8로 나눈 값을 L 입력 매개변수로 사용한다.
    normalizedAlgorithmname 멤버가 "TurboSHAKE256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [RFC9861]의 2절에 정의된 TurboSHAKE256 함수를 수행한 결과를 result로 둔다. 이때 messageM 입력 매개변수로, domainSeparationD 입력 매개변수로, outputLength을 8로 나눈 값을 L 입력 매개변수로 사용한다.
  6. 연산을 수행한 결과 오류가 발생하면 OperationError발생시킨다.

  7. result를 반환한다.

14. KangarooTwelve

14.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절을 참조한다.

14.2 등록

인식되는 알고리즘 이름은 "KT128" 및 "KT256"이다.

연산 매개변수 결과
digest KangarooTwelveParams 바이트 시퀀스

14.3 KangarooTwelveParams 딕셔너리

WebIDLdictionary KangarooTwelveParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타낸다.

customization 멤버는 사용자 정의 문자열을 나타낸다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택한다. 지정하지 않으면 기본값은 빈 문자열이다.

14.4 연산

14.4.1 다이제스트

  1. outputLengthnormalizedAlgorithmoutputLength 멤버로 둔다.

  2. outputLength가 0이거나 8의 배수가 아니면 OperationError발생시킨다.

  3. normalizedAlgorithmcustomization 멤버가 존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을 customization으로 둔다.

  4. normalizedAlgorithmname 멤버가 "KT128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [RFC9861]의 3절에 정의된 KT128 함수를 수행한 결과를 result로 둔다. 이때 messageM 입력 매개변수로, customizationC 입력 매개변수로, outputLength을 8로 나눈 값을 L 입력 매개변수로 사용한다.
    normalizedAlgorithmname 멤버가 "KT256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [RFC9861]의 3절에 정의된 KT256 함수를 수행한 결과를 result로 둔다. 이때 messageM 입력 매개변수로, customizationC 입력 매개변수로, outputLength을 8로 나눈 값을 L 입력 매개변수로 사용한다.
  5. 연산을 수행한 결과 오류가 발생하면 OperationError발생시킨다.

  6. result를 반환한다.

15. KMAC

15.1 설명

이 절은 비규범적이다.

여기에서는 [NIST-SP800-185]에 명시된 KMAC128 및 KMAC256을 설명한다.

15.2 등록

인식되는 알고리즘 이름은 "KMAC128" 및 "KMAC256"이다.

연산 매개변수 결과
sign KmacParams 바이트 시퀀스
verify KmacParams 불리언
generateKey KmacKeyGenParams CryptoKey
importKey KmacImportParams CryptoKey
exportKey 없음 객체
get key length KmacImportParams 정수

15.3 KmacKeyGenParams 딕셔너리

WebIDLdictionary KmacKeyGenParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length 멤버는 생성할 키의 길이(비트 단위)를 나타낸다. 지정하지 않으면 권장 길이를 사용하며, KMAC128은 128이고 KMAC256은 256이다.

15.4 KmacImportParams 딕셔너리

WebIDLdictionary KmacImportParams : Algorithm {
  [EnforceRange] unsigned long length;
};

length 멤버는 키의 길이(비트 단위)를 나타낸다.

15.5 KmacKeyAlgorithm 딕셔너리

WebIDLdictionary KmacKeyAlgorithm : KeyAlgorithm {
  required unsigned long length;
};

length 멤버는 키의 길이(비트 단위)를 나타낸다.

15.6 KmacParams 딕셔너리

WebIDLdictionary KmacParams : Algorithm {
  required [EnforceRange] unsigned long outputLength;
  BufferSource customization;
};

outputLength 멤버는 요청된 비트 단위 출력 길이를 나타낸다.

customization 멤버는 사용자 정의 문자열을 나타낸다. 애플리케이션은 함수의 변형을 정의하기 위해 이 문자열을 선택한다.

15.7 연산

15.7.1 서명

  1. normalizedAlgorithmcustomization 멤버가 존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을 customization으로 둔다.

  2. normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 4절에 정의된 KMAC128 함수를 수행한 결과를 mac으로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
    normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 4절에 정의된 KMAC256 함수를 수행한 결과를 mac으로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
  3. mac포함하는 바이트 시퀀스를 반환한다.

15.7.2 검증

  1. normalizedAlgorithmcustomization 멤버가 존재하면 이를 customization으로 두고, 그렇지 않으면 빈 옥텟 문자열을 customization으로 둔다.

  2. normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 4절에 정의된 KMAC128 함수를 수행한 결과를 mac으로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
    normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    [NIST-SP800-185]의 4절에 정의된 KMAC256 함수를 수행한 결과를 mac으로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 키를 K 입력 매개변수로, messageX 입력 매개변수로, normalizedAlgorithmoutputLength 멤버를 L 입력 매개변수로, customizationS 입력 매개변수로 사용한다.
  3. computedMacmac포함하는 바이트 시퀀스로 둔다.

  4. computedMacsignature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환한다. 이 비교는 상수 시간에 수행해야 한다.

15.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를 반환한다.

15.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. jwkk 필드를 디코딩하여 얻은 바이트 시퀀스data로 둔다.

    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를 반환한다.

15.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를 반환한다.

15.7.6 키 길이 가져오기

  1. normalizedAlgorithmlength 멤버가 존재하는 경우:
    lengthnormalizedAlgorithmlength 멤버와 같게 둔다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC128"과 대소문자를 구분하여 일치하는 문자열인 경우:
    length를 128로 둔다.
    그렇지 않고, normalizedAlgorithmname 멤버가 "KMAC256"과 대소문자를 구분하여 일치하는 문자열인 경우:
    length를 256으로 둔다.
  2. length를 반환한다.

16. Argon2

16.1 설명

이 절은 비규범적이다.

여기에서는 [RFC9106]에 정의된 비밀번호 해싱 및 키 파생용 Argon2 함수를 설명한다.

16.2 등록

각 Argon2 형식의 인식되는 알고리즘 이름은 "Argon2d", "Argon2i" 및 "Argon2id"이다.

연산 매개변수 결과
deriveBits Argon2Params 바이트 시퀀스
importKey 없음 CryptoKey
get key length 없음 null

16.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 멤버는 논스를 나타내며, 비밀번호 해싱 애플리케이션에서는 솔트이다.

parallelism 멤버는 병렬화 수준을 나타낸다.

memory 멤버는 키비바이트 단위의 메모리 크기를 나타낸다. 병렬화 수준의 최소 8배여야 한다.

passes 멤버는 패스 횟수를 나타낸다.

version 멤버는 버전 번호를 나타낸다. 기본값이자 현재 정의된 유일한 버전은 19(0x13)이다.

secretValue 멤버는 선택적 비밀 값을 나타낸다.

associatedData 멤버는 선택적 연관 데이터를 나타낸다.

참고

권장 매개변수 값은 [RFC9106]의 4절을 참조한다.

16.4 연산

16.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. normalizedAlgorithmsecretValue 멤버가 존재하면 이를 secretValue로 둔다.

  8. normalizedAlgorithmassociatedData 멤버가 존재하면 이를 associatedData로 둔다.

  9. [RFC9106]의 3절에 정의된 Argon2 함수를 수행한 결과를 result로 둔다. 이때 key[[handle]] 내부 슬롯이 나타내는 비밀번호를 메시지 P로, normalizedAlgorithmnonce 속성을 논스 S로, normalizedAlgorithmparallelism 속성 값을 병렬화 수준 p로, normalizedAlgorithmmemory 속성 값을 메모리 크기 m으로, normalizedAlgorithmpasses 속성 값을 패스 횟수 t로, 0x13을 버전 번호 v로, secretValue가 존재하면 이를 비밀 값 K로, associatedData가 존재하면 이를 연관 데이터 X로, type을 형식 y로, length를 8로 나눈 값을 태그 길이 T로 사용한다.

  10. 키 파생 연산에 실패하면 OperationError발생시킨다.

  11. result를 반환한다.

16.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를 반환한다.

16.4.3 키 길이 가져오기

  1. null을 반환한다.

17. IANA 고려 사항

17.1 JSON Web 서명 및 암호화 알고리즘 등록

이 절에서는 JSON Web Key와 함께 사용할 다음 알고리즘 식별자를 IANA JSON Web 서명 및 암호화 알고리즘 레지스트리에 등록한다.

17.2 JSON Web Key 연산

이 절에서는 JSON Web Key와 함께 사용할 다음 키 연산을 IANA JSON Web Key 연산 레지스트리에 등록한다.

18. 도입 지침

이 절은 비규범적이다.

이 명세는 많은 알고리즘과 연산을 정의한다. 구현자에게 지침을 제공하고 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. ML-DSA는 NIST가 표준화한 주요 양자 내성 디지털 서명 알고리즘이다 [FIPS-204].
  3. ChaCha20-Poly1305는 널리 배포된 AEAD 암호이다 [RFC8439]. 많은 프로토콜 (TLS, SSH, WireGuard, HPKE)에서 사용된다.
  4. SHA-3cSHAKE (특히 SHA3-256 및 cSHAKE256)는 ML-KEM 키 파생 및 하이브리드 KEM 결합기를 비롯한 많은 양자 내성 구성에서 사용된다. 특히 사용자 정의 매개변수 없이 호출한 cSHAKE256은 SHAKE256과 동일한 출력을 생성하므로, 하나의 구현만으로 사용자 정의(cSHAKE256) 및 비사용자 정의(SHAKE256) 사용 사례를 모두 지원할 수 있다. 그러나 cSHAKE 구현을 사용할 수 없는 경우에도 SHAKE 구현은 유용할 수 있다. 이때 customization 매개변수가 존재하고 비어 있지 않으면 반드시 NotSupportedError를 발생시키고 SubtleCrypto.supports에서 false를 반환하도록 해야 한다.
  5. Argon2는 메모리 집약적인 비밀번호 기반 키 파생 함수이다 [RFC9106]. GPU 및 FPGA와 같이 고도로 병렬화된 환경에서 무차별 대입 공격에 대한 향상된 저항성을 제공한다.

SLH-DSA는 NIST가 표준화한 무상태 해시 기반 디지털 서명 알고리즘이다 [FIPS-204]. 지금까지 ML-DSA보다 도입 사례가 적지만, ML-DSA의 대안이 필요해지는 경우 구현할 가치가 있을 수 있다.

그 밖에도 AES-OCB, TurboSHAKE, KangarooTwelveKMAC은 모두 가치 있는 추가 기능이지만 양자 내성 전환에 즉시 필수적인 수준은 아니다.

19. 사용 예

이 예에서는 사용할 수 있는 경우 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: "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-ietf-jose-pqc-kem-05]
JOSE 및 COSE를 위한 양자 내성 키 캡슐화 메커니즘(PQ KEM). IETF. 2025년 12월. URL: https://www.ietf.org/archive/id/draft-ietf-jose-pqc-kem-05.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/
[infra]
Infra 표준. Anne van Kesteren; Domenic Denicola. WHATWG. 현행 표준. URL: https://infra.spec.whatwg.org/
[JWA]
JSON Web 알고리즘(JWA). M. Jones. IETF. 2015년 5월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc7518/
[JWK]
JSON Web Key(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일. 최초 공개 작업 초안. 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/
[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/