France's ANSSI will stop certifying non-PQC products from 2027. The US Executive Order 14409 mandates PQC for all federal systems, with key establishment by 2030 and digital signatures by 2031. Australia's ASD/ACSC has published post-quantum vendor guidance urging organizations to assess PQC readiness across their supply chain.
Two concrete PQC gaps
1. Token signing locked to RSA
src/pkg/token/options.go in NewOptions() only allows *jwt.SigningMethodRSA and RSAPSS in its switch statement, with the default case returning "only RSA methods are supported". GetKey() type-asserts *rsa.PrivateKey. Every robot account token and registry pull/push token is RS256-only. Not even ECDSA is reachable, let alone ML-DSA (FIPS 204).
2. TLS curves actively strip PQC
src/common/http/tls.go explicitly pins CurvePreferences: {P256, X25519}. Go 1.24+ includes X25519MLKEM768 in its default curve list when CurvePreferences is nil, but this explicit override removes it. Harbor is actively opting out of PQC key exchange that Go provides for free.
Proposal
- TLS fix (quick win): Remove the explicit
CurvePreferences or add tls.X25519MLKEM768 to the list. This restores Go's passive PQC key exchange.
- Token signing (longer term): Extend the signing method switch to support ECDSA and eventually ML-DSA (RFC 9964) once Go 1.27 ships
crypto/mldsa.
- Documentation: Add PQC readiness notes to Harbor's security documentation.
References
France's ANSSI will stop certifying non-PQC products from 2027. The US Executive Order 14409 mandates PQC for all federal systems, with key establishment by 2030 and digital signatures by 2031. Australia's ASD/ACSC has published post-quantum vendor guidance urging organizations to assess PQC readiness across their supply chain.
Two concrete PQC gaps
1. Token signing locked to RSA
src/pkg/token/options.goinNewOptions()only allows*jwt.SigningMethodRSAandRSAPSSin its switch statement, with the default case returning "only RSA methods are supported".GetKey()type-asserts*rsa.PrivateKey. Every robot account token and registry pull/push token is RS256-only. Not even ECDSA is reachable, let alone ML-DSA (FIPS 204).2. TLS curves actively strip PQC
src/common/http/tls.goexplicitly pinsCurvePreferences: {P256, X25519}. Go 1.24+ includes X25519MLKEM768 in its default curve list when CurvePreferences is nil, but this explicit override removes it. Harbor is actively opting out of PQC key exchange that Go provides for free.Proposal
CurvePreferencesor addtls.X25519MLKEM768to the list. This restores Go's passive PQC key exchange.crypto/mldsa.References