| // Copyright 2026 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| // Package mldsa implements the post-quantum ML-DSA signature scheme specified |
| // in [FIPS 204]. |
| // |
| // This package is unavailable if using the [FIPS 140-3 Go Cryptographic Module] |
| // v1.0.0, in which case [GenerateKey], [NewPrivateKey], [NewPublicKey], and |
| // [Verify] will return an error. It is available if using v1.26.0 or later. |
| // |
| // [FIPS 204]: https://nvlpubs.nist.gov/nistpubs/FIPS/NIST.FIPS.204.pdf |
| // [FIPS 140-3 Go Cryptographic Module]: https://go.dev/doc/security/fips140 |
| package mldsa |
| |
| import "crypto" |
| |
| const ( |
| PrivateKeySize = 32 |
| |
| MLDSA44PublicKeySize = 1312 |
| MLDSA65PublicKeySize = 1952 |
| MLDSA87PublicKeySize = 2592 |
| |
| MLDSA44SignatureSize = 2420 |
| MLDSA65SignatureSize = 3309 |
| MLDSA87SignatureSize = 4627 |
| ) |
| |
| // Parameters represents one of the fixed parameter sets defined in FIPS 204. |
| // |
| // Most applications should use [MLDSA44]. |
| // |
| // Multiple invocations of [MLDSA44], [MLDSA65], or [MLDSA87] will return the |
| // same respective value, which can be used for equality checks and switch |
| // statements. The returned value is safe for concurrent use. |
| type Parameters struct { |
| name string |
| publicKeySize int |
| signatureSize int |
| } |
| |
| // MLDSA44 returns the ML-DSA-44 parameter set defined in FIPS 204. |
| func MLDSA44() Parameters { |
| return Parameters{ |
| name: "ML-DSA-44", |
| publicKeySize: MLDSA44PublicKeySize, |
| signatureSize: MLDSA44SignatureSize, |
| } |
| } |
| |
| // MLDSA65 returns the ML-DSA-65 parameter set defined in FIPS 204. |
| func MLDSA65() Parameters { |
| return Parameters{ |
| name: "ML-DSA-65", |
| publicKeySize: MLDSA65PublicKeySize, |
| signatureSize: MLDSA65SignatureSize, |
| } |
| } |
| |
| // MLDSA87 returns the ML-DSA-87 parameter set defined in FIPS 204. |
| func MLDSA87() Parameters { |
| return Parameters{ |
| name: "ML-DSA-87", |
| publicKeySize: MLDSA87PublicKeySize, |
| signatureSize: MLDSA87SignatureSize, |
| } |
| } |
| |
| // PublicKeySize returns the size of public keys for this parameter set, in bytes. |
| func (params Parameters) PublicKeySize() int { |
| return params.publicKeySize |
| } |
| |
| // SignatureSize returns the size of signatures for this parameter set, in bytes. |
| func (params Parameters) SignatureSize() int { |
| return params.signatureSize |
| } |
| |
| // String returns the name of the parameter set, e.g. "ML-DSA-44". |
| func (params Parameters) String() string { |
| return params.name |
| } |
| |
| // Options contains additional options for signing and verifying ML-DSA signatures. |
| type Options struct { |
| // Context can be used to distinguish signatures created for different |
| // purposes. It must be at most 255 bytes long, and it is empty by default. |
| // |
| // The same context must be used when signing and verifying a signature. |
| Context string |
| } |
| |
| // HashFunc returns zero, to implement the [crypto.SignerOpts] interface. |
| func (opts *Options) HashFunc() crypto.Hash { |
| return 0 |
| } |