Skip to content

Commit 2445a0c

Browse files
committed
refactor(tls): use IANA cipher suite names instead of OpenSSL names
Switch cipherMap keys and cipherIDToName output from OpenSSL-style (e.g. ECDHE-RSA-AES128-GCM-SHA256) to IANA format (e.g. TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256), which matches what Go's crypto/tls package uses. cipherIDToName now looks up the name from tls.CipherSuites() and tls.InsecureCipherSuites() by ID instead of reverse-iterating cipherMap, so the returned name is always the authoritative Go/IANA name. Update tests and README accordingly. Signed-off-by: zhujian <jiazhu@redhat.com>
1 parent 9cbb733 commit 2445a0c

4 files changed

Lines changed: 54 additions & 52 deletions

File tree

pkg/tls/README.md

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,15 +14,16 @@ metadata:
1414
namespace: <component-namespace>
1515
data:
1616
minTLSVersion: VersionTLS13 # tls.ConfigMapKeyMinVersion
17-
cipherSuites: ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256
17+
cipherSuites: TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256
1818
# ^ tls.ConfigMapKeyCipherSuites
1919
```
2020

2121
Supported `minTLSVersion` values: `VersionTLS10`, `VersionTLS11`, `VersionTLS12` (default),
2222
`VersionTLS13`.
2323

24-
Supported cipher suite names follow the OpenSSL naming convention. TLS 1.3 cipher suites
25-
are fixed by the Go runtime and cannot be configured via `cipherSuites`.
24+
Cipher suite names use the IANA format (e.g. `TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256`),
25+
which matches what Go's `crypto/tls` package uses. TLS 1.3 cipher suites are fixed by
26+
the Go runtime and cannot be configured via `cipherSuites`.
2627

2728
## Use cases
2829

@@ -108,6 +109,6 @@ args := []string{
108109
| `ConfigFromFlags(minVersion, cipherSuites)` | Parse TLS config from flag strings. Returns `nil` if both are empty. |
109110
| `ConfigToFunc(tlsCfg)` | Returns a `func(*tls.Config)` for use with controller-runtime `TLSOpts`. |
110111
| `VersionToString(version)` | Convert a `crypto/tls` version constant to its string name. |
111-
| `CipherSuitesToString(suites)` | Convert cipher suite IDs back to a comma-separated OpenSSL-style string. |
112+
| `CipherSuitesToString(suites)` | Convert cipher suite IDs back to a comma-separated IANA-format string. |
112113

113114
Constants: `ConfigMapName`, `ConfigMapKeyMinVersion`, `ConfigMapKeyCipherSuites`.

pkg/tls/cipher.go

Lines changed: 27 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -2,35 +2,36 @@ package tls
22

33
import "crypto/tls"
44

5-
// cipherMap maps OpenSSL-style cipher names to Go's crypto/tls package constants.
5+
// cipherMap maps IANA cipher suite names to Go's crypto/tls package constants.
6+
// IANA names match those returned by tls.CipherSuites() and tls.InsecureCipherSuites().
67
var cipherMap = map[string]uint16{
7-
// TLS 1.3 cipher suites (standardized names)
8+
// TLS 1.3 cipher suites
89
"TLS_AES_128_GCM_SHA256": tls.TLS_AES_128_GCM_SHA256,
910
"TLS_AES_256_GCM_SHA384": tls.TLS_AES_256_GCM_SHA384,
1011
"TLS_CHACHA20_POLY1305_SHA256": tls.TLS_CHACHA20_POLY1305_SHA256,
1112

12-
// TLS 1.2 and earlier cipher suites (OpenSSL-style names)
13-
"ECDHE-RSA-AES128-GCM-SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
14-
"ECDHE-ECDSA-AES128-GCM-SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
15-
"ECDHE-RSA-AES256-GCM-SHA384": tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
16-
"ECDHE-ECDSA-AES256-GCM-SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
17-
"ECDHE-RSA-CHACHA20-POLY1305": tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
18-
"ECDHE-ECDSA-CHACHA20-POLY1305": tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
19-
// "DHE-RSA-AES128-GCM-SHA256": tls.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
20-
// "DHE-RSA-AES256-GCM-SHA384": tls.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
21-
"ECDHE-RSA-AES128-SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
22-
"ECDHE-ECDSA-AES128-SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
23-
"ECDHE-RSA-AES128-SHA": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
24-
"ECDHE-ECDSA-AES128-SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
25-
// "ECDHE-RSA-AES256-SHA384": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
26-
// "ECDHE-ECDSA-AES256-SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
27-
"ECDHE-RSA-AES256-SHA": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
28-
"ECDHE-ECDSA-AES256-SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
29-
"AES128-GCM-SHA256": tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
30-
"AES256-GCM-SHA384": tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
31-
"AES128-SHA256": tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
32-
// "AES256-SHA256": tls.TLS_RSA_WITH_AES_256_CBC_SHA256,
33-
"AES128-SHA": tls.TLS_RSA_WITH_AES_128_CBC_SHA,
34-
"AES256-SHA": tls.TLS_RSA_WITH_AES_256_CBC_SHA,
35-
"DES-CBC3-SHA": tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
13+
// TLS 1.2 and earlier cipher suites (IANA names)
14+
"TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
15+
"TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
16+
"TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384,
17+
"TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384,
18+
"TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256": tls.TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305,
19+
"TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256": tls.TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305,
20+
// "TLS_DHE_RSA_WITH_AES_128_GCM_SHA256": tls.TLS_DHE_RSA_WITH_AES_128_GCM_SHA256,
21+
// "TLS_DHE_RSA_WITH_AES_256_GCM_SHA384": tls.TLS_DHE_RSA_WITH_AES_256_GCM_SHA384,
22+
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,
23+
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA256,
24+
"TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA": tls.TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,
25+
"TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA,
26+
// "TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA384,
27+
// "TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA384,
28+
"TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA": tls.TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA,
29+
"TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA": tls.TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA,
30+
"TLS_RSA_WITH_AES_128_GCM_SHA256": tls.TLS_RSA_WITH_AES_128_GCM_SHA256,
31+
"TLS_RSA_WITH_AES_256_GCM_SHA384": tls.TLS_RSA_WITH_AES_256_GCM_SHA384,
32+
"TLS_RSA_WITH_AES_128_CBC_SHA256": tls.TLS_RSA_WITH_AES_128_CBC_SHA256,
33+
// "TLS_RSA_WITH_AES_256_CBC_SHA256": tls.TLS_RSA_WITH_AES_256_CBC_SHA256,
34+
"TLS_RSA_WITH_AES_128_CBC_SHA": tls.TLS_RSA_WITH_AES_128_CBC_SHA,
35+
"TLS_RSA_WITH_AES_256_CBC_SHA": tls.TLS_RSA_WITH_AES_256_CBC_SHA,
36+
"TLS_RSA_WITH_3DES_EDE_CBC_SHA": tls.TLS_RSA_WITH_3DES_EDE_CBC_SHA,
3637
}

pkg/tls/config.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ func parseTLSVersion(version string) (uint16, error) {
4444
}
4545
}
4646

47-
// parseCipherSuites converts OpenSSL-style cipher names to Go crypto/tls constants.
47+
// parseCipherSuites converts IANA cipher suite names to Go crypto/tls constants.
4848
// Returns a list of cipher suite IDs and a list of unsupported cipher names.
4949
func parseCipherSuites(cipherString string) ([]uint16, []string) {
5050
if strings.TrimSpace(cipherString) == "" {
@@ -126,7 +126,7 @@ func VersionToString(version uint16) string {
126126
}
127127
}
128128

129-
// CipherSuitesToString converts cipher suite IDs back to OpenSSL-style names
129+
// CipherSuitesToString converts cipher suite IDs back to IANA names
130130
func CipherSuitesToString(suites []uint16) string {
131131
if len(suites) == 0 {
132132
return ""
@@ -160,11 +160,11 @@ func ConfigToFunc(tlsCfg *TLSConfig) func(*tls.Config) {
160160
}
161161
}
162162

163-
// cipherIDToName converts a cipher suite ID to its OpenSSL-style name
163+
// cipherIDToName converts a cipher suite ID to its IANA name.
164164
func cipherIDToName(id uint16) string {
165-
for name, suiteID := range cipherMap {
166-
if suiteID == id {
167-
return name
165+
for _, s := range append(tls.CipherSuites(), tls.InsecureCipherSuites()...) {
166+
if s.ID == id {
167+
return s.Name
168168
}
169169
}
170170
return ""

pkg/tls/tls_test.go

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -69,15 +69,15 @@ func TestConfigFromFlags(t *testing.T) {
6969
{
7070
name: "valid single cipher",
7171
minVersion: "VersionTLS12",
72-
cipherSuites: "ECDHE-RSA-AES128-GCM-SHA256",
72+
cipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
7373
expectError: false,
7474
expectedMin: tls.VersionTLS12,
7575
expectedLen: 1,
7676
},
7777
{
7878
name: "valid multiple ciphers",
7979
minVersion: "VersionTLS12",
80-
cipherSuites: "ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256",
80+
cipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
8181
expectError: false,
8282
expectedMin: tls.VersionTLS12,
8383
expectedLen: 2,
@@ -91,21 +91,21 @@ func TestConfigFromFlags(t *testing.T) {
9191
{
9292
name: "mixed valid and invalid ciphers",
9393
minVersion: "VersionTLS12",
94-
cipherSuites: "ECDHE-RSA-AES128-GCM-SHA256,INVALID-CIPHER",
94+
cipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,INVALID-CIPHER",
9595
expectError: true,
9696
},
9797
{
9898
name: "only cipher suites without version defaults to TLS 1.2",
9999
minVersion: "",
100-
cipherSuites: "ECDHE-RSA-AES128-GCM-SHA256",
100+
cipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
101101
expectError: false,
102102
expectedMin: tls.VersionTLS12,
103103
expectedLen: 1,
104104
},
105105
{
106106
name: "cipher suites with whitespace",
107107
minVersion: "VersionTLS12",
108-
cipherSuites: " ECDHE-RSA-AES128-GCM-SHA256 , ECDHE-ECDSA-AES128-GCM-SHA256 ",
108+
cipherSuites: " TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 , TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ",
109109
expectError: false,
110110
expectedMin: tls.VersionTLS12,
111111
expectedLen: 2,
@@ -212,15 +212,15 @@ func TestCipherSuitesToString(t *testing.T) {
212212
{
213213
name: "single cipher",
214214
suites: []uint16{tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256},
215-
expected: "ECDHE-RSA-AES128-GCM-SHA256",
215+
expected: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
216216
},
217217
{
218218
name: "multiple ciphers",
219219
suites: []uint16{
220220
tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
221221
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
222222
},
223-
expected: "ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256",
223+
expected: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
224224
},
225225
{
226226
name: "unknown cipher ID skipped",
@@ -229,7 +229,7 @@ func TestCipherSuitesToString(t *testing.T) {
229229
0x9999, // unknown cipher
230230
tls.TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256,
231231
},
232-
expected: "ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256",
232+
expected: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
233233
},
234234
}
235235

@@ -387,7 +387,7 @@ func TestLoadTLSConfigFromConfigMap(t *testing.T) {
387387
},
388388
Data: map[string]string{
389389
ConfigMapKeyMinVersion: "VersionTLS12",
390-
ConfigMapKeyCipherSuites: "ECDHE-RSA-AES128-GCM-SHA256",
390+
ConfigMapKeyCipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
391391
},
392392
}
393393
return fake.NewClientset(cm)
@@ -441,7 +441,7 @@ func TestLoadTLSConfigFromConfigMap(t *testing.T) {
441441
},
442442
Data: map[string]string{
443443
ConfigMapKeyMinVersion: "VersionTLS12",
444-
ConfigMapKeyCipherSuites: "ECDHE-RSA-AES128-GCM-SHA256,UNKNOWN-CIPHER",
444+
ConfigMapKeyCipherSuites: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,UNKNOWN-CIPHER",
445445
},
446446
}
447447
return fake.NewClientset(cm)
@@ -888,12 +888,12 @@ func TestParseCipherSuites(t *testing.T) {
888888
},
889889
{
890890
name: "single valid cipher",
891-
cipherString: "ECDHE-RSA-AES128-GCM-SHA256",
891+
cipherString: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
892892
expectedCount: 1,
893893
},
894894
{
895895
name: "multiple valid ciphers",
896-
cipherString: "ECDHE-RSA-AES128-GCM-SHA256,ECDHE-ECDSA-AES128-GCM-SHA256",
896+
cipherString: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
897897
expectedCount: 2,
898898
},
899899
{
@@ -904,18 +904,18 @@ func TestParseCipherSuites(t *testing.T) {
904904
},
905905
{
906906
name: "mixed valid and unsupported",
907-
cipherString: "ECDHE-RSA-AES128-GCM-SHA256,UNKNOWN-CIPHER",
907+
cipherString: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,UNKNOWN-CIPHER",
908908
expectedCount: 1,
909909
expectedUnsupported: 1,
910910
},
911911
{
912912
name: "ciphers with whitespace",
913-
cipherString: " ECDHE-RSA-AES128-GCM-SHA256 , ECDHE-ECDSA-AES128-GCM-SHA256 ",
913+
cipherString: " TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 , TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256 ",
914914
expectedCount: 2,
915915
},
916916
{
917917
name: "empty entries in list",
918-
cipherString: "ECDHE-RSA-AES128-GCM-SHA256,,ECDHE-ECDSA-AES128-GCM-SHA256",
918+
cipherString: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,,TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256",
919919
expectedCount: 2,
920920
},
921921
}
@@ -944,7 +944,7 @@ func TestCipherIDToName(t *testing.T) {
944944
{
945945
name: "known cipher",
946946
id: tls.TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256,
947-
expected: "ECDHE-RSA-AES128-GCM-SHA256",
947+
expected: "TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256",
948948
},
949949
{
950950
name: "unknown cipher",

0 commit comments

Comments
 (0)