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.decapsulateKey 및 SubtleCrypto.decapsulateBits입니다.

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

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

2. 명세 규칙

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

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

2.1 Keccak 비트 문자열

비트 문자열의 Keccak 인코딩은 해당 비트 문자열을 연속된 8비트 그룹으로 나누고 각 그룹을 최하위 비트 우선 순서로 해석하여 얻는 바이트 시퀀스이다. 첫 번째 비트의 가중치는 20, 두 번째는 21이며 이후에도 같은 방식이다. 마지막 그룹이 8비트 미만이면 해당 비트들은 마지막 바이트의 하위 비트 위치를 차지하고 나머지 상위 비트 위치는 0으로 설정된다. 빈 비트 문자열을 인코딩하면 빈 바이트 시퀀스가 된다.

바이트 시퀀스의 Keccak 디코딩은 각 바이트를 순서대로 읽되 각 바이트의 최하위 비트부터 최상위 비트까지 읽어서 얻는 비트 문자열이다. 빈 바이트 시퀀스를 디코딩하면 빈 비트 문자열이 된다.

참고

Keccak 함수군(SHA-3, cSHAKE 및 KMAC)의 바이트 단위 구현은 이미 이 인코딩을 구현하고 있을 가능성이 높으며, 이 경우 호출 시 별도의 변환 단계가 필요하지 않다. 이러한 인코딩 및 디코딩 단계는 [FIPS-202] 및 [NIST-SP800-185]의 비트 단위 정의와 연계하기 위해서만 필요하다.

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, extractable 및 usages를 각각 encapsulateKey() 메서드에 전달된 encapsulationAlgorithm, encapsulationKey, sharedKeyAlgorithm, extractable 및 keyUsages 매개변수로 둔다.

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

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

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

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

  6. realm을 this의 관련 영역으로 둔다.

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

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

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

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

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

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

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

  14. usages 가 비어 있으면 다음 예외를 던집니다 : SyntaxError.

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

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

  17. 새로운 EncapsulatedKey 딕셔너리를 encapsulatedKey로 둔다. 이 딕셔너리의 sharedKey는 sharedKey로 설정하고, ciphertext는 encapsulatedBits의 ciphertext 필드로 설정한다.

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

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

  20. promise를 result로 이행한다.

3.2.2 encapsulateBits 메서드

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

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

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

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

  4. realm을 this의 관련 영역으로 둔다.

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

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

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

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

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

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

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

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

  13. promise를 result로 이행한다.

3.2.3 decapsulateKey 메서드

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

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

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

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

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

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

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

  7. realm을 this의 관련 영역으로 둔다.

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

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

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

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

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

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

  14. normalizedSharedKeyAlgorithm에서 지정한 키 가져오기 연산을 수행한 결과를 sharedKey로 둔다. 이때 "raw-secret"을 format으로, decapsulatedBits를 keyData로, sharedKeyAlgorithm을 algorithm으로 사용하고 extractable 및 usages를 사용한다.

  15. usages 가 비어 있으면 다음 예외를 던집니다 : SyntaxError.

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

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

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

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

  20. promise를 result로 이행한다.

3.2.4 decapsulateBits 메서드

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

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

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

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

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

  5. realm을 this의 관련 영역으로 둔다.

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

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

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

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

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

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

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

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

  14. promise를 result로 이행한다.

3.2.5 getPublicKey 메서드

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

  1. key 및 usages를 각각 getPublicKey() 메서드에 전달된 key 및 keyUsages 매개변수로 둔다.

  2. algorithm을 key의 [[algorithm]] 내부 슬롯으로 둔다.

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

  4. realm을 this의 관련 영역으로 둔다.

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

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

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

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

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

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

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

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

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

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

  15. 설정할 대상은 [[usages]] 내부 슬롯이며, 해당 키는 publicKey 입니다. 이 슬롯을 다음 값의 정규화된 값 으로 설정합니다: usages.

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

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

  18. promise를 result로 이행한다.

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. 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 op는 operation으로, alg는 algorithm으로, length는 length로 설정한다.

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"로 설정하고 alg를 additionalAlgorithm으로 설정했을 때 false이면, false를 반환한다.

    operation이 "wrapKey"인 경우:

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

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

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

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

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

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

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

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

  4. length를 null로 설정한다.

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

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

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

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

  6. 알고리즘 지원 여부를 확인한 결과를 반환한다. 이때 op는 operation으로, alg는 algorithm으로, length는 length로 설정한다.

3.3 알고리즘 지원 여부 확인

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

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

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

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

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

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

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

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

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

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

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

  6. 연산 단계에서 지원 여부를 결정한 결과를 반환한다. 이때 op는 op로, normalizedAlgorithm은 normalizedAlgorithm로, length는 length로 설정한다.

연산 단계에서 지원 여부 결정 알고리즘은 정규화된 알고리즘의 연산 단계가 지원을 나타내는지 여부를 결정한다. 입력은 연산 이름 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 딕셔너리는 sharedKey와 ciphertext로 구성된 캡슐화된 키를 나타낸다.

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

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에 설명된 캡슐화 키 검사를 수행합니다. 이때 algorithm의 name 멤버가 나타내는 매개변수 세트를 사용하고, key의 [[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.

    참고

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

  3. 캡슐화 키 검사에 실패하면 다음 예외를 던집니다 : OperationError.

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

  5. ML-KEM.Encaps 함수가 오류를 반환하면 다음 예외를 던집니다 : OperationError.

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

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

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

  9. result를 반환합니다.

6.4.2 캡슐화 해제

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

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

    참고

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

  3. 역캡슐화 입력 검사에 실패하면 다음 예외를 던집니다 : OperationError.

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

  5. sharedKey를 반환합니다.

6.4.3 공유 키 길이 가져오기

  1. 256을 반환합니다.

6.4.4 키 생성

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

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

    참고

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

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

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

  5. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

  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. result의 publicKey 속성을 publicKey로 설정합니다.

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

  19. result를 반환합니다.

6.4.5 키 가져오기

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

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

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

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

    4. normalizedAlgorithm의 name 멤버가 "ML-KEM-512"인 경우:

      expectedOid를 id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1)라고 합니다.

      normalizedAlgorithm의 name 멤버가 "ML-KEM-768"인 경우:

      expectedOid를 id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2)라고 합니다.

      normalizedAlgorithm의 name 멤버가 "ML-KEM-1024"인 경우:

      expectedOid를 id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3)라고 합니다.

      그렇지 않은 경우:

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

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

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

    7. publicKey를 spki의 subjectPublicKey 필드가 식별하는 ML-KEM 공개 키라고 합니다.

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

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

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

    11. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

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

    4. normalizedAlgorithm의 name 멤버가 "ML-KEM-512"인 경우:

      expectedOid를 id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1)라고 합니다.

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

      normalizedAlgorithm의 name 멤버가 "ML-KEM-768"인 경우:

      expectedOid를 id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2)라고 합니다.

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

      normalizedAlgorithm의 name 멤버가 "ML-KEM-1024"인 경우:

      expectedOid를 id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3)라고 합니다.

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

      그렇지 않은 경우:

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

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

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

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

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

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

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

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

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

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

    14. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

    2. data를 keyData라고 합니다.

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

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

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

    6. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

    2. data를 keyData라고 합니다.

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

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

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

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

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

    8. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같다고 합니다.

      그렇지 않은 경우:

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

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

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

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

    5. jwk의 alg 필드가 존재하지 않거나, 그 값이 normalizedAlgorithm의 name 멤버가 나타내는 ML-KEM 매개변수 세트를 식별하지 않는 경우 예외를 발생시켜 DataError로 처리합니다.

      참고

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

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

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

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

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

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

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

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

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

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

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

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

    11. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

    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. keyAlgorithm을 key의 [[algorithm]] 내부 슬롯이라고 합니다.

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

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

        • keyAlgorithm의 name 멤버가 "ML-KEM-512"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-768"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-1024"인 경우:

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

          그렇지 않은 경우:

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

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

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

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

    2. keyAlgorithm을 key의 [[algorithm]] 내부 슬롯이라고 합니다.

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

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

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

        • keyAlgorithm의 name 멤버가 "ML-KEM-512"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-768"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-1024"인 경우:

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

          그렇지 않은 경우:

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

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

        • keyAlgorithm의 name 멤버가 "ML-KEM-512"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-768"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-KEM-1024"인 경우:

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

          그렇지 않은 경우:

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

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

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

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

    3. result를 data라고 합니다.

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

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

      참고

      d 및 z 값은 키를 생성하거나 가져올 때 사용된 시드이며, [FIPS-203]의 섹션 6.1에 있는 ML-KEM.KeyGen_internal에서 사용됩니다.

    3. result를 data라고 합니다.

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

    2. keyAlgorithm을 key의 [[algorithm]] 내부 슬롯이라고 합니다.

    3. jwk의 kty 속성을 "AKP"로 설정합니다.

    4. jwk의 alg 속성을 keyAlgorithm의 name 멤버로 설정합니다.

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

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

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

    9. result를 jwk라고 합니다.

    그렇지 않은 경우:

    예외를 발생시켜 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. sharedKey 및 ciphertext를 [draft-irtf-cfrg-concrete-hybrid-kems-04]의 섹션 4에서 algorithm의 name 멤버가 나타내는 하이브리드 KEM 인스턴스에 대해 Encaps 함수를 수행하여 얻은 출력으로 설정하며, key의 [[handle]] 내부 슬롯이 나타내는 키를 ek 입력 매개변수로 사용합니다.

  3. Encaps 함수가 오류를 반환하면 다음 예외를 던집니다 : OperationError.

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

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

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

  7. result를 반환합니다.

7.4.2 캡슐화 해제

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

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

  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 함수를 normalizedAlgorithm의 name 멤버가 나타내는 하이브리드 KEM 인스턴스로 수행하여 하이브리드 KEM 키 쌍을 생성합니다.

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

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

  5. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

  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. result의 publicKey 속성을 publicKey로 설정합니다.

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

  19. result를 반환합니다.

7.4.5 키 가져오기

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

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

    2. data를 keyData로 설정합니다.

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

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

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

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

    7. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

    2. data를 keyData로 설정합니다.

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

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

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

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

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

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

    9. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

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

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

    4. jwk의 kty 필드가 "AKP"가 아니면, DataError를 던집니다.

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

      참고

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

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

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

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

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

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

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

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

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

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

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

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

    11. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

    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. data를 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하는 바이트 시퀀스로 설정합니다.

    3. result를 data로 설정합니다.

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

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

    3. result를 data로 설정합니다.

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

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

    3. jwk의 kty 속성을 "AKP"로 설정합니다.

    4. jwk의 alg 속성을 keyAlgorithm의 name 멤버로 설정합니다.

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

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

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

    9. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    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. normalizedAlgorithm의 context 멤버가 존재하고 길이가 255 바이트보다 크면, OperationError를 던집니다.

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

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

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

  5. ML-DSA.Sign 알고리즘이 오류를 반환하면 다음 예외를 던집니다 : OperationError.

  6. result를 반환합니다.

8.4.2 검증

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

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

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

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

  5. ML-DSA.Verify 알고리즘이 오류를 반환하면 다음 예외를 던집니다 : OperationError.

  6. result를 반환합니다.

8.4.3 키 생성

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

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

    참고

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

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

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

  5. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

  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. result의 publicKey 속성을 publicKey로 설정합니다.

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

  19. result를 반환합니다.

8.4.4 키 가져오기

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

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

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

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

    4. normalizedAlgorithm의 name 멤버가 "ML-DSA-44"인 경우:

      expectedOid를 id-ml-dsa-44 (2.16.840.1.101.3.4.3.17)로 설정합니다.

      normalizedAlgorithm의 name 멤버가 "ML-DSA-65"인 경우:

      expectedOid를 id-ml-dsa-65 (2.16.840.1.101.3.4.3.18)로 설정합니다.

      normalizedAlgorithm의 name 멤버가 "ML-DSA-87"인 경우:

      expectedOid를 id-ml-dsa-87 (2.16.840.1.101.3.4.3.19)로 설정합니다.

      그렇지 않은 경우:

      NotSupportedError를 던집니다.

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

    6. spki의 algorithm AlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError를 던집니다.

    7. publicKey를 spki의 subjectPublicKey 필드가 식별하는 ML-DSA 공개 키로 설정합니다.

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

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

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

    11. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

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

    4. normalizedAlgorithm의 name 멤버가 "ML-DSA-44"인 경우:

      expectedOid를 id-ml-dsa-44 (2.16.840.1.101.3.4.3.17)로 설정합니다.

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

      normalizedAlgorithm의 name 멤버가 "ML-DSA-65"인 경우:

      expectedOid를 id-ml-dsa-65 (2.16.840.1.101.3.4.3.18)로 설정합니다.

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

      normalizedAlgorithm의 name 멤버가 "ML-DSA-87"인 경우:

      expectedOid를 id-ml-dsa-87 (2.16.840.1.101.3.4.3.19)로 설정합니다.

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

      그렇지 않은 경우:

      NotSupportedError를 던집니다.

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

    6. privateKeyInfo의 privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError를 던집니다.

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

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

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

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

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

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

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

    14. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

    3. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

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

    2. data를 keyData로 설정합니다.

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

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

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

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

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

    8. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

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

    3. jwk의 kty 필드가 "AKP"가 아니면, DataError를 던집니다.

    4. jwk의 alg 필드가 normalizedAlgorithm의 name 멤버와 같지 않으면, DataError를 던집니다.

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

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

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

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

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

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

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

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

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

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

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

    10. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

    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. keyAlgorithm을 key의 [[algorithm]] 내부 슬롯으로 설정합니다.

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

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

        • keyAlgorithm의 name 멤버가 "ML-DSA-44"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-65"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-87"인 경우:

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

          그렇지 않은 경우:

          NotSupportedError를 던집니다.

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

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

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

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

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

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

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

        • keyAlgorithm의 name 멤버가 "ML-DSA-44"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-65"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-87"인 경우:

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

          그렇지 않은 경우:

          NotSupportedError를 던집니다.

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

        • keyAlgorithm의 name 멤버가 "ML-DSA-44"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-65"인 경우:

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

          keyAlgorithm의 name 멤버가 "ML-DSA-87"인 경우:

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

          그렇지 않은 경우:

          NotSupportedError를 던집니다.

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

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

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

    3. result를 data로 설정합니다.

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

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

      참고

      ξ 값은 키를 생성하거나 가져올 때 사용된 시드이며, [FIPS-204]의 섹션 6.1에 있는 ML-DSA.KeyGen_internal에서 사용됩니다.

    3. result를 data로 설정합니다.

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

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

    3. jwk의 kty 속성을 "AKP"로 설정합니다.

    4. jwk의 alg 속성을 keyAlgorithm의 name 멤버로 설정합니다.

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

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

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

    9. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    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. normalizedAlgorithm의 context 멤버가 존재하고 길이가 255 바이트보다 크면, OperationError를 던집니다.

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

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

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

  5. slh_sign 알고리즘이 오류를 반환하면 다음 예외를 던집니다 : OperationError.

  6. result를 반환합니다.

9.4.2 검증

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

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

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

  4. slh_verify 알고리즘이 오류를 반환하면 다음 예외를 던집니다 : OperationError.

  5. result를 반환합니다.

9.4.3 키 생성

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

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

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

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

  5. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

  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. result의 publicKey 속성을 publicKey로 설정합니다.

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

  19. result를 반환합니다.

9.4.4 키 가져오기

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

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

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

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

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

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

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

      그렇지 않은 경우:

      NotSupportedError를 던집니다.

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

    6. spki의 algorithm AlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError를 던집니다.

    7. publicKey를 spki의 subjectPublicKey 필드가 식별하는 SLH-DSA 공개 키로 설정합니다.

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

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

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

    11. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

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

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

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

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

      normalizedAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

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

      그렇지 않은 경우:

      NotSupportedError를 던집니다.

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

    6. privateKeyInfo의 privateKeyAlgorithm PrivateKeyAlgorithmIdentifier 필드에 parameters 필드가 존재하면, DataError를 던집니다.

    7. slhDsaPrivateKey 를 privateKey 필드로 둡니다. 이 필드를 포함하는 구조체는 privateKeyInfo이며, 이 필드는 [RFC9909]의 섹션 7에 명시된 원시 개인 키 바이트를 포함합니다.

    8. 길이 ( slhDsaPrivateKey )가 n 값의 4배가 아니면(이 값은 [FIPS-205]의 표 2에서 name 멤버( normalizedAlgorithm)가 나타내는 매개변수 집합에 대해 정해집니다) 다음 예외를 던집니다 : DataError.

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

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

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

    12. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

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

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

    3. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

    4. 길이 ( keyData )가 공개 키 크기(pk bytes)와 다르면(이 크기는 [FIPS-205]의 표 2에서 name 멤버( normalizedAlgorithm)가 나타내는 매개변수 집합에 대해 정해집니다) 다음 예외를 던집니다 : DataError.

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

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

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

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

    2. 길이 ( keyData )가 n 값의 4배가 아니면(이 값은 [FIPS-205]의 표 2에서 name 멤버( normalizedAlgorithm)가 나타내는 매개변수 집합에 대해 정해집니다) 다음 예외를 던집니다 : DataError.

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

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

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

    6. algorithm의 name 속성을 normalizedAlgorithm의 name 속성으로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

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

    3. jwk의 kty 필드가 "AKP"가 아니면, DataError를 던집니다.

    4. jwk의 alg 필드가 normalizedAlgorithm의 name 멤버와 같지 않으면, DataError를 던집니다.

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

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

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

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

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

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

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

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

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

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

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

    10. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

    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. keyAlgorithm을 key의 [[algorithm]] 내부 슬롯으로 설정합니다.

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

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

        • keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

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

          그렇지 않은 경우:

          NotSupportedError를 던집니다.

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

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

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

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

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

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

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

        • keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-128f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-192f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHA2-256f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-128f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-192f"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256s"인 경우:

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

          keyAlgorithm의 name 멤버가 "SLH-DSA-SHAKE-256f"인 경우:

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

          그렇지 않은 경우:

          NotSupportedError를 던집니다.

      • privateKey 필드를 원시 SLH-DSA 개인 키 바이트로 설정합니다. 이 바이트는 [[handle]] 내부 슬롯이 나타내며, 해당 키는 key입니다. 바이트 형식은 [RFC9909]의 섹션 7에 명시되어 있습니다.

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

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

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

    3. result를 data로 설정합니다.

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

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

    3. result를 data로 설정합니다.

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

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

    3. jwk의 kty 속성을 "AKP"로 설정합니다.

    4. jwk의 alg 속성을 keyAlgorithm의 name 멤버로 설정합니다.

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

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

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

    9. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    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. normalizedAlgorithm의 iv 멤버의 길이가 15 바이트보다 크면, OperationError를 던집니다.

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

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

  5. C를 반환합니다.

10.4.2 복호화

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

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

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

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

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

10.4.3 키 생성

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

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

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

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

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

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

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

  8. algorithm의 name 속성을 "AES-OCB"로 설정합니다.

  9. algorithm의 length 속성을 normalizedAlgorithm의 length 멤버와 같게 설정합니다.

  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. data를 keyData로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

    2. jwk의 kty 필드가 "oct"가 아니면, DataError를 던집니다.

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

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

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

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

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

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

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

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

  7. algorithm의 name 속성을 "AES-OCB"로 설정합니다.

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

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

  10. key를 반환합니다.

10.4.5 키 내보내기

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

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

    2. result를 data로 설정합니다.

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

    2. jwk의 kty 속성을 문자열 "oct"로 설정합니다.

    3. jwk의 k 속성을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고, JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

    4. key의 length 속성이 128인 경우:
      jwk의 alg 속성을 문자열 "A128OCB"로 설정합니다.
      key의 length 속성이 192인 경우:
      jwk의 alg 속성을 문자열 "A192OCB"로 설정합니다.
      key의 length 속성이 256인 경우:
      jwk의 alg 속성을 문자열 "A256OCB"로 설정합니다.
    5. jwk의 key_ops 속성을 key의 usages 속성과 같게 설정합니다.

    6. jwk의 ext 속성을 key의 [[extractable]] 내부 슬롯과 같게 설정합니다.

    7. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError를 던집니다.

  3. result를 반환합니다.

10.4.6 키 길이 가져오기

  1. normalizedDerivedKeyAlgorithm의 length 멤버가 128, 192 또는 256이 아니면, OperationError를 던집니다.

  2. normalizedDerivedKeyAlgorithm의 length 멤버를 반환합니다.

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. normalizedAlgorithm의 iv 멤버의 길이가 12바이트가 아니면, OperationError를 던집니다.

  2. normalizedAlgorithm의 tagLength 멤버가 존재하고 128이 아니면, OperationError를 던집니다.

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

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

  5. ciphertext를 반환합니다.

11.3.2 복호화

  1. normalizedAlgorithm의 iv 멤버의 길이가 12바이트가 아니면, OperationError를 던집니다.

  2. normalizedAlgorithm의 tagLength 멤버가 존재하고 128이 아니면, OperationError를 던집니다.

  3. ciphertext의 길이가 128비트보다 작으면, OperationError를 던집니다.

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

  5. [RFC8439]의 섹션 2.8에 설명된 AEAD_CHACHA20_POLY1305 복호화 알고리즘을 수행합니다. 이때 key의 [[handle]] 내부 슬롯이 나타내는 키를 키 입력 매개변수로, normalizedAlgorithm의 iv 멤버를 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. algorithm의 name 속성을 "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. data를 keyData로 설정합니다.

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

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

    2. jwk의 kty 필드가 "oct"가 아니면, DataError를 던집니다.

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

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

    5. 비트 단위 길이를 검사하여 data 의 길이가 256이 아니면 다음 예외를 던집니다 : DataError.

    6. jwk의 alg 필드가 존재하며 "C20P"가 아니면, DataError를 던집니다.

    7. usages가 비어 있지 않고 jwk의 use 필드가 존재하며 "enc"가 아니면, DataError를 던집니다.

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

    9. jwk의 ext 필드가 존재하고 값이 false이며 extractable이 true이면, DataError를 던집니다.

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

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

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

  7. algorithm의 name 속성을 "ChaCha20-Poly1305"로 설정합니다.

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

  9. key를 반환합니다.

11.3.5 키 내보내기

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

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

    2. result를 data로 설정합니다.

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

    2. jwk의 kty 속성을 문자열 "oct"로 설정합니다.

    3. jwk의 k 속성을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 옥텟을 포함하고, JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

    4. jwk의 alg 속성을 문자열 "C20P"로 설정합니다.

    5. jwk의 key_ops 속성을 key의 usages 속성과 같게 설정합니다.

    6. jwk의 ext 속성을 key의 [[extractable]] 내부 슬롯과 같게 설정합니다.

    7. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    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. normalizedAlgorithm의 name 멤버가 "SHA3-256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 message의 Keccak 디코딩을 입력 메시지 M으로 사용하여 [FIPS-202]의 6.1절에 정의된 SHA3-256 해시 함수를 수행한 결과로 설정한다.
    normalizedAlgorithm의 name 멤버가 "SHA3-384"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 message의 Keccak 디코딩을 입력 메시지 M으로 사용하여 [FIPS-202]의 6.1절에 정의된 SHA3-384 해시 함수를 수행한 결과로 설정한다.
    normalizedAlgorithm의 name 멤버가 "SHA3-512"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 message의 Keccak 디코딩을 입력 메시지 M으로 사용하여 [FIPS-202]의 6.1절에 정의된 SHA3-512 해시 함수를 수행한 결과로 설정한다.
  2. 연산을 수행한 결과 오류가 발생하면, OperationError를 던집니다.

  3. result의 Keccak 인코딩을 반환한다.

13. cSHAKE

13.1 설명

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

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

functionName 및 customization 매개변수가 모두 비어 있거나 제공되지 않은 경우, 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 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

참고

바이트 단위의 cSHAKE 구현은 정수가 아닌 바이트 수를 출력하는 것을 지원하지 않을 수 있다. 이 경우 outputLength가 8의 배수가 아니면 구현은 다이제스트 연산에서 NotSupportedError를 던지고 supports()에서 false를 반환하는 것이 권장된다.

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

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

13.4 연산

13.4.1 다이제스트

  1. outputLength를 normalizedAlgorithm의 outputLength 멤버로 설정합니다.

  2. normalizedAlgorithm의 functionName 멤버가 있으면 functionName을 해당 멤버의 Keccak 디코딩으로 설정하고, 그렇지 않으면 빈 비트 문자열로 설정한다.

  3. normalizedAlgorithm의 customization 멤버가 있으면 customization을 해당 멤버의 Keccak 디코딩으로 설정하고, 그렇지 않으면 빈 비트 문자열로 설정한다.

  4. normalizedAlgorithm의 name 멤버가 "cSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 message의 Keccak 디코딩을 X 입력 매개변수로, outputLength를 L 입력 매개변수로, functionName을 N 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 3절에 정의된 cSHAKE128 함수를 수행한 결과로 설정한다.
    normalizedAlgorithm의 name 멤버가 "cSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 message의 Keccak 디코딩을 X 입력 매개변수로, outputLength를 L 입력 매개변수로, functionName을 N 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 3절에 정의된 cSHAKE256 함수를 수행한 결과로 설정한다.
  5. 연산을 수행한 결과 오류가 발생하면, OperationError를 던집니다.

  6. result의 Keccak 인코딩을 반환한다.

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, 0x07 및 0x0B 값을 사용하지 않아야 합니다. 이러한 값은 KangarooTwelve에서 내부적으로 사용되기 때문입니다.

14.4 연산

14.4.1 다이제스트

  1. outputLength를 normalizedAlgorithm의 outputLength 멤버로 설정합니다.

  2. outputLength가 0이거나 8의 배수가 아니면, OperationError를 던집니다.

  3. domainSeparation을 normalizedAlgorithm의 domainSeparation 멤버가 존재하면 해당 멤버로 설정하고, 그렇지 않으면 0x1F로 설정합니다.

  4. domainSeparation이 0x01보다 작거나 0x7F보다 크면, OperationError를 던집니다.

  5. normalizedAlgorithm의 name 멤버가 "TurboSHAKE128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 2에 정의된 TurboSHAKE128 함수를 수행한 결과로 설정하며, message를 M 입력 매개변수로, domainSeparation을 D 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
    normalizedAlgorithm의 name 멤버가 "TurboSHAKE256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 2에 정의된 TurboSHAKE256 함수를 수행한 결과로 설정하며, message를 M 입력 매개변수로, domainSeparation을 D 입력 매개변수로, 그리고 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. outputLength를 normalizedAlgorithm의 outputLength 멤버로 설정합니다.

  2. outputLength가 0이거나 8의 배수가 아니면, OperationError를 던집니다.

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

  4. normalizedAlgorithm의 name 멤버가 "KT128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 3에 정의된 KT128 함수를 수행한 결과로 설정하며, message를 M 입력 매개변수로, customization을 C 입력 매개변수로, 그리고 outputLength를 8로 나눈 값을 L 입력 매개변수로 사용합니다.
    normalizedAlgorithm의 name 멤버가 "KT256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    result를 [RFC9861]의 섹션 3에 정의된 KT256 함수를 수행한 결과로 설정하며, message를 M 입력 매개변수로, customization을 C 입력 매개변수로, 그리고 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입니다.

참고

바이트 단위의 KMAC 구현은 바이트 수가 정수가 아닌 키를 지원하지 않을 수 있다. 이 경우 length가 8의 배수가 아니면 구현은 키 생성 연산에서 NotSupportedError를 던지고 supports()에서 false를 반환하는 것이 권장된다.

16.4 KmacImportParams 사전

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

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

참고

바이트 단위의 KMAC 구현은 바이트 수가 정수가 아닌 키를 지원하지 않을 수 있다. 이 경우 length가 8의 배수가 아니면 구현은 키 가져오기 연산에서 NotSupportedError를 던지고 supports()에서 false를 반환하는 것이 권장된다.

또한 deriveKey()를 사용하여 파생된 키를 가져올 때는 Keccak 디코딩 단계로 인해 최상위 비트가 아니라 최하위 비트부터 읽는다. 따라서 바이트 수가 정수가 아닌 키를 파생하면 비트가 손실된다.

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 멤버는 요청된 비트 단위 출력 길이를 나타냅니다.

참고

바이트 단위의 KMAC 구현은 정수가 아닌 바이트 수를 출력하는 것을 지원하지 않을 수 있다. 이 경우 outputLength가 8의 배수가 아니면 구현은 서명 및 검증 연산에서 NotSupportedError를 던지고 supports()에서 false를 반환하는 것이 권장된다.

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

16.7 연산

16.7.1 서명

  1. normalizedAlgorithm의 customization 멤버가 있으면 customization을 해당 멤버의 Keccak 디코딩으로 설정하고, 그렇지 않으면 빈 비트 문자열로 설정한다.

  2. normalizedAlgorithm의 name 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 비트를 K 입력 매개변수로, message의 Keccak 디코딩을 X 입력 매개변수로, normalizedAlgorithm의 outputLength 멤버를 L 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 4절에 정의된 KMAC128 함수를 수행한 결과로 설정한다.
    normalizedAlgorithm의 name 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 비트를 K 입력 매개변수로, message의 Keccak 디코딩을 X 입력 매개변수로, normalizedAlgorithm의 outputLength 멤버를 L 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 4절에 정의된 KMAC256 함수를 수행한 결과로 설정한다.
  3. 연산을 수행하는 중 오류가 발생하면 다음 예외를 던집니다 : OperationError.

  4. mac의 Keccak 인코딩을 반환한다.

16.7.2 검증

  1. normalizedAlgorithm의 customization 멤버가 있으면 customization을 해당 멤버의 Keccak 디코딩으로 설정하고, 그렇지 않으면 빈 비트 문자열로 설정한다.

  2. normalizedAlgorithm의 name 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 비트를 K 입력 매개변수로, message의 Keccak 디코딩을 X 입력 매개변수로, normalizedAlgorithm의 outputLength 멤버를 L 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 4절에 정의된 KMAC128 함수를 수행한 결과로 설정한다.
    normalizedAlgorithm의 name 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    mac을 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 비트를 K 입력 매개변수로, message의 Keccak 디코딩을 X 입력 매개변수로, normalizedAlgorithm의 outputLength 멤버를 L 입력 매개변수로, customization을 S 입력 매개변수로 사용하여 [NIST-SP800-185]의 4절에 정의된 KMAC256 함수를 수행한 결과로 설정한다.
  3. 연산을 수행하는 중 오류가 발생하면 다음 예외를 던집니다 : OperationError.

  4. computedMac을 mac의 Keccak 인코딩으로 설정한다.

  5. computedMac이 signature와 같으면 true를 반환하고, 그렇지 않으면 false를 반환합니다. 이 비교는 상수 시간으로 수행해야 합니다.

16.7.3 키 생성

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

  2. normalizedAlgorithm의 length 멤버가 존재하는 경우:
    length를 normalizedAlgorithm의 length 멤버와 같게 설정합니다.
    그렇지 않고, normalizedAlgorithm의 name 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 128로 설정합니다.
    그렇지 않고, normalizedAlgorithm의 name 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 256으로 설정합니다.
  3. 길이가 length비트인 키를 생성합니다.

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

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

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

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

  8. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

  9. algorithm의 length 속성을 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. data를 keyData로 설정합니다.

    format이 "jwk"인 경우:
    1. keyData가 JsonWebKey 사전인 경우:

      jwk를 keyData와 같게 설정합니다.

      그렇지 않은 경우:

      DataError를 던집니다.

    2. jwk의 kty 필드가 "oct"가 아니면, DataError를 던집니다.

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

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

    5. normalizedAlgorithm의 name 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
      jwk의 alg 필드가 존재하고 "K128"이 아니면, DataError를 던집니다.
      normalizedAlgorithm의 name 멤버가 "KMAC256"과 대소문자를 구분하여 문자열이 일치하는 경우:
      jwk의 alg 필드가 존재하고 "K256"이 아니면, DataError를 던집니다.
    6. usages가 비어 있지 않고 jwk의 use 필드가 존재하며 "sig"가 아니면, DataError를 던집니다.

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

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

    그렇지 않은 경우:
    NotSupportedError를 던집니다.
  4. length를 data의 비트 단위 길이로 설정합니다.

  5. normalizedAlgorithm의 length 멤버가 존재하는 경우:
    normalizedAlgorithm의 length 멤버가 length보다 큰 경우:
    DataError를 던집니다.
    normalizedAlgorithm의 length 멤버가 length에서 8을 뺀 값보다 작거나 같은 경우:
    DataError를 던집니다.
    그렇지 않은 경우:
    length를 normalizedAlgorithm의 length 멤버와 같게 설정합니다.
  6. key를 data의 Keccak 디코딩 결과 중 처음 length비트로 이루어진 KMAC 키를 나타내는 새로운 CryptoKey 객체로 설정한다.

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

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

  9. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

  10. algorithm의 length 속성을 length로 설정합니다.

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

  12. key를 반환합니다.

16.7.5 키 내보내기

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

  2. bits를 key의 [[handle]] 내부 슬롯이 나타내는 키의 원시 비트로 설정합니다.

  3. data를 bits의 Keccak 인코딩으로 설정한다.

  4. format이 "raw-secret"인 경우:
    1. result를 data로 설정합니다.

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

    2. jwk의 kty 속성을 문자열 "oct"로 설정합니다.

    3. jwk의 k 속성을 data를 포함하며 JSON Web Algorithms [JWA]의 섹션 6.4에 따라 인코딩된 문자열로 설정합니다.

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

    5. keyAlgorithm의 name 멤버가 "KMAC128"인 경우:
      jwk의 alg 속성을 문자열 "K128"로 설정합니다.
      keyAlgorithm의 name 멤버가 "KMAC256"인 경우:
      jwk의 alg 속성을 문자열 "K256"로 설정합니다.
    6. jwk의 key_ops 속성을 key의 usages 속성과 같게 설정합니다.

    7. jwk의 ext 속성을 key의 [[extractable]] 내부 슬롯과 같게 설정합니다.

    8. result를 jwk로 설정합니다.

    그렇지 않은 경우:

    NotSupportedError를 던집니다.

  5. result를 반환합니다.

16.7.6 키 길이 가져오기

  1. normalizedAlgorithm의 length 멤버가 존재하는 경우:
    length를 normalizedAlgorithm의 length 멤버와 같게 설정합니다.
    그렇지 않고, normalizedAlgorithm의 name 멤버가 "KMAC128"과 대소문자를 구분하여 문자열이 일치하는 경우:
    length를 128로 설정합니다.
    그렇지 않고, normalizedAlgorithm의 name 멤버가 "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. normalizedAlgorithm의 version 멤버가 존재하고 19(0x13)가 아니면, OperationError를 던집니다.

  3. normalizedAlgorithm의 parallelism 멤버가 0이거나, 16777215(2^24-1)보다 크면, OperationError를 던집니다.

  4. normalizedAlgorithm의 memory 멤버가 normalizedAlgorithm의 parallelism 멤버의 8배보다 작으면, OperationError를 던집니다.

  5. normalizedAlgorithm의 passes 멤버가 0이면, OperationError를 던집니다.

  6. normalizedAlgorithm의 name 멤버가 "Argon2d"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 0으로 설정합니다.
    normalizedAlgorithm의 name 멤버가 "Argon2i"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 1로 설정합니다.
    normalizedAlgorithm의 name 멤버가 "Argon2id"와 대소문자를 구분하여 문자열이 일치하는 경우:
    type을 2로 설정합니다.
  7. secretValue를 normalizedAlgorithm의 secretValue 멤버가 존재하는 경우 해당 멤버로 설정합니다.

  8. associatedData를 normalizedAlgorithm의 associatedData 멤버가 존재하는 경우 해당 멤버로 설정합니다.

  9. result를 [RFC9106]의 섹션 3에 정의된 Argon2 함수를 수행한 결과로 설정하며, key의 [[handle]] 내부 슬롯이 나타내는 비밀번호를 메시지 P로, normalizedAlgorithm의 nonce 속성을 nonce S로, normalizedAlgorithm의 parallelism 속성 값을 병렬성 정도 p로, normalizedAlgorithm의 memory 속성 값을 메모리 크기 m으로, normalizedAlgorithm의 passes 속성 값을 패스 횟수 t로, 0x13을 버전 번호 v로, secretValue가 존재하는 경우 이를 비밀 값 K로, associatedData가 존재하는 경우 이를 연관 데이터 X로, type을 유형 y로, 그리고 length를 8로 나눈 값을 태그 길이 T로 사용합니다.

  10. 키 파생 연산이 실패하면, OperationError를 던집니다.

  11. result를 반환합니다.

17.4.2 키 가져오기

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

  2. format이 "raw-secret"이 아니면, NotSupportedError를 던집니다

  3. usages에 "deriveKey" 또는 "deriveBits"가 아닌 값이 포함되어 있으면, SyntaxError를 던집니다.

  4. extractable이 false가 아니면, SyntaxError를 던집니다.

  5. key를 keyData를 나타내는 새로운 CryptoKey로 설정합니다.

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

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

  8. algorithm의 name 속성을 normalizedAlgorithm의 name 멤버로 설정합니다.

  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-3 및 cSHAKE (구체적으로 SHA3-256 및 cSHAKE256)는 ML-KEM 키 파생과 하이브리드 KEM 결합기를 포함한 많은 포스트 양자 구성에서 사용됩니다. 특히 사용자 지정 매개변수 없이 호출한 cSHAKE256은 SHAKE256과 동일한 출력을 생성하므로, 하나의 구현으로 사용자 지정(cSHAKE256) 및 비사용자 지정(SHAKE256) 사용 사례를 모두 지원할 수 있습니다. 그러나 cSHAKE 구현을 사용할 수 없더라도 SHAKE 구현은 여전히 유용할 수 있습니다. 이때 다음 예외를 던지도록 해야 합니다: NotSupportedError (그리고 반환값은 false 로 하며, 이를 반환하는 메서드는 SubtleCrypto.supports입니다). 이 처리는 functionName 또는 customization 매개변수가 존재하고 비어 있지 않은 경우에 적용합니다.
  6. Argon2는 메모리 하드 비밀번호 기반 키 파생 함수이며 [RFC9106], 고도로 병렬화된 환경 (예: GPU 및 FPGA)에서 무차별 대입 공격에 대한 향상된 저항성을 제공합니다.

SLH-DSA는 NIST [FIPS-205]에서 표준화한 상태 비저장 해시 기반 디지털 서명 알고리즘입니다. 지금까지 ML-DSA보다 도입이 적었지만, ML-DSA의 대안이 필요해지는 경우 구현하는 것이 유용할 수 있습니다.

이 밖에도 AES-OCB, TurboSHAKE, KangarooTwelve 및 KMAC은 모두 가치 있는 추가 항목이지만 포스트 양자 전환에 즉각적으로 중요한 정도는 상대적으로 낮습니다.

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(12));
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) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-128s" [CSOR], [RFC9814]
id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-128f" [CSOR], [RFC9814]
id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-192s" [CSOR], [RFC9814]
id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-192f" [CSOR], [RFC9814]
id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-256s" [CSOR], [RFC9814]
id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-256f" [CSOR], [RFC9814]
id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-128s" [CSOR], [RFC9814]
id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-128f" [CSOR], [RFC9814]
id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-192s" [CSOR], [RFC9814]
id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-192f" [CSOR], [RFC9814]
id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) 원시 개인 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-256s" [CSOR], [RFC9814]
id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) 원시 개인 키 바이트(ASN.1 래핑 없음) "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) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-DSA-44" [CSOR], [RFC9881]
id-ml-dsa-65 (2.16.840.1.101.3.4.3.18) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-DSA-65" [CSOR], [RFC9881]
id-ml-dsa-87 (2.16.840.1.101.3.4.3.19) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-DSA-87" [CSOR], [RFC9881]
id-alg-ml-kem-512 (2.16.840.1.101.3.4.4.1) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-KEM-512" [CSOR], [RFC9935]
id-alg-ml-kem-768 (2.16.840.1.101.3.4.4.2) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-KEM-768" [CSOR], [RFC9935]
id-alg-ml-kem-1024 (2.16.840.1.101.3.4.4.3) 원시 공개 키 바이트(ASN.1 래핑 없음) "ML-KEM-1024" [CSOR], [RFC9935]
id-slh-dsa-sha2-128s (2.16.840.1.101.3.4.3.20) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-128s" [CSOR], [RFC9814]
id-slh-dsa-sha2-128f (2.16.840.1.101.3.4.3.21) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-128f" [CSOR], [RFC9814]
id-slh-dsa-sha2-192s (2.16.840.1.101.3.4.3.22) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-192s" [CSOR], [RFC9814]
id-slh-dsa-sha2-192f (2.16.840.1.101.3.4.3.23) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-192f" [CSOR], [RFC9814]
id-slh-dsa-sha2-256s (2.16.840.1.101.3.4.3.24) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-256s" [CSOR], [RFC9814]
id-slh-dsa-sha2-256f (2.16.840.1.101.3.4.3.25) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHA2-256f" [CSOR], [RFC9814]
id-slh-dsa-shake-128s (2.16.840.1.101.3.4.3.26) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-128s" [CSOR], [RFC9814]
id-slh-dsa-shake-128f (2.16.840.1.101.3.4.3.27) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-128f" [CSOR], [RFC9814]
id-slh-dsa-shake-192s (2.16.840.1.101.3.4.3.28) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-192s" [CSOR], [RFC9814]
id-slh-dsa-shake-192f (2.16.840.1.101.3.4.3.29) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-192f" [CSOR], [RFC9814]
id-slh-dsa-shake-256s (2.16.840.1.101.3.4.3.30) 원시 공개 키 바이트(ASN.1 래핑 없음) "SLH-DSA-SHAKE-256s" [CSOR], [RFC9814]
id-slh-dsa-shake-256f (2.16.840.1.101.3.4.3.31) 원시 공개 키 바이트(ASN.1 래핑 없음) "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
[RFC9909]
인터넷 X.509 공개 키 인프라 -- 상태 비저장 해시 기반 디지털 서명 알고리즘(SLH-DSA)의 알고리즘 식별자. K. Bashiri; S. Fluhrer; S. Gazdag; D. Van Geest; S. Kousidis. IETF. 2025년 12월. 제안 표준. URL: https://www.rfc-editor.org/info/rfc9909/
[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/