Skip to content

Commit 76cb775

Browse files
committed
Merge branch 'add-support-ml-kem'
2 parents b07d76d + 1a555b9 commit 76cb775

24 files changed

Lines changed: 547 additions & 30 deletions

File tree

CHANGELOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,13 @@ Line wrap the file at 100 chars. Th
1919
* **Fixed**: for any bug fixes.
2020
* **Security**: in case of vulnerabilities.
2121

22+
## [Unreleased]
23+
### Added
24+
- Add support for using ML-KEM-1024 in exchange.
25+
### Changed
26+
- Change default value for argument `kem` into `cme-mlkem`.
27+
28+
2229
## [1.0.4] - 2024-10-01
2330
### Changed
2431
- Prevent upgrading an already upgraded tunnel.

README.md

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
# wgephemeralpeer
22

3+
**Note for OpenWrt users: For building directly on the device, do a checkout of the revision tagged with `v1.0.4`.**
4+
35
This repository contains a library that can be used to negotiate ephemeral
46
peers in the realm of Mullvad.
57

@@ -80,9 +82,15 @@ and subsequent attempts to establish a tunnel will fail.
8082

8183
By setting the `-kem <kem>` flag, you can use one of the following key
8284
encapsulation methods when negotiating the preshared key. The default value is
83-
`cme-kyber`.
85+
`cme-mlkem`.
8486

8587
- cme (Classic McEliece 460896 Round3)
88+
- mlkem (ML-KEM-1024)
89+
- cme-mlkem (Classic McEliece 460896 Round3 + ML-KEM-1024)
90+
- mlkem-cme (ML-KEM-1024 + Classic McEliece 460896 Round3)
91+
92+
Obsolete methods that are still supported:
93+
8694
- cme-kyber (Classic McEliece 460896 Round3 + Kyber1024)
8795
- kyber (Kyber1024)
8896
- kyber-cme (Kyber1024 + Classic McEliece 460896 Round3)

cmd/mullvad-upgrade-tunnel/main.go

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ var VERSION string
1414

1515
func main() {
1616
iface := flag.String("wg-interface", "", "wireguard interface")
17-
kem := flag.String("kem", "cme-kyber", "key encapsulation methods to use when negotiating psk")
17+
kem := flag.String("kem", "cme-mlkem", "key encapsulation methods to use when negotiating psk")
1818
version := flag.Bool("version", false, "display version and exit")
1919
flag.Parse()
2020

@@ -64,6 +64,14 @@ func parseKem(kem string) ([]wgephemeralpeer.Option, error) {
6464
case "kyber-cme":
6565
k = append(k, wgephemeralpeer.WithKyber1024())
6666
k = append(k, wgephemeralpeer.WithMcEliece460896Round3())
67+
case "mlkem":
68+
k = append(k, wgephemeralpeer.WithMLKEM1024())
69+
case "cme-mlkem":
70+
k = append(k, wgephemeralpeer.WithMcEliece460896Round3())
71+
k = append(k, wgephemeralpeer.WithMLKEM1024())
72+
case "mlkem-cme":
73+
k = append(k, wgephemeralpeer.WithMLKEM1024())
74+
k = append(k, wgephemeralpeer.WithMcEliece460896Round3())
6775
default:
6876
return nil, fmt.Errorf("unknown kem: %s", kem)
6977
}

go.mod

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
module github.com/mullvad/wgephemeralpeer
22

3-
// Use go 1.19 to ensure the application can be built on an OpenWrt device.
4-
// Bump once a newer package is available at:
5-
// https://openwrt.org/packages/pkgdata/golang
6-
go 1.19
3+
go 1.21
74

8-
replace github.com/cloudflare/circl => github.com/mullvad/circl v0.0.0-20240104174227-83b264e1de1f
5+
replace github.com/cloudflare/circl => github.com/mullvad/circl v0.0.0-20240930082155-0c072461a157
96

107
require (
118
github.com/cloudflare/circl v1.3.7

go.sum

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,9 @@ github.com/mdlayher/netlink v1.7.2/go.mod h1:xraEF7uJbxLhc5fpHL4cPe221LI2bdttWlU
99
github.com/mdlayher/socket v0.5.1 h1:VZaqt6RkGkt2OE9l3GcC6nZkqD3xKeQLyfleW/uBcos=
1010
github.com/mdlayher/socket v0.5.1/go.mod h1:TjPLHI1UgwEv5J1B5q0zTZq12A/6H7nKmtTanQE37IQ=
1111
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721 h1:RlZweED6sbSArvlE924+mUcZuXKLBHA35U7LN621Bws=
12-
github.com/mullvad/circl v0.0.0-20240104174227-83b264e1de1f h1:YogYmnPRrB0tDPuFX8w2NWp10yobLCzsLUEew7Alfds=
13-
github.com/mullvad/circl v0.0.0-20240104174227-83b264e1de1f/go.mod h1:sRTcRWXGLrKw6yIGJ+l7amYJFfAXbZG0kBSc8r4zxgA=
12+
github.com/mikioh/ipaddr v0.0.0-20190404000644-d465c8ab6721/go.mod h1:Ickgr2WtCLZ2MDGd4Gr0geeCH5HybhRJbonOgQpvSxc=
13+
github.com/mullvad/circl v0.0.0-20240930082155-0c072461a157 h1:onkvLt87R9LmLAgvc/u+vf4/f2mTOgMd5UAGN3rxEzc=
14+
github.com/mullvad/circl v0.0.0-20240930082155-0c072461a157/go.mod h1:PDRU+oXvdD7KCtgKxW95M5Z8BpSCJXQORiZFnBQS5QU=
1415
golang.org/x/crypto v0.22.0 h1:g1v0xeRhjcugydODzvb3mEM9SQ0HGp9s/nh3COQ/C30=
1516
golang.org/x/crypto v0.22.0/go.mod h1:vr6Su+7cTlO45qkww3VDJlzDn0ctJvRgYbC2NvXHt+M=
1617
golang.org/x/net v0.24.0 h1:1PcaxkF854Fu3+lvBIx5SYn9wRlBzzcnHZSiaFFAb0w=

grpc_test.go

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package wgephemeralpeer
2+
3+
import (
4+
"testing"
5+
6+
"github.com/cloudflare/circl/kem/kyber/kyber1024"
7+
"github.com/cloudflare/circl/kem/mceliece/mceliece460896"
8+
"github.com/cloudflare/circl/kem/mlkem/mlkem1024"
9+
)
10+
11+
func TestCirclStringIdsAreUnchanged(t *testing.T) {
12+
// This is required because we're embedding KEM string identifiers
13+
// in the request that gets sent to the server.
14+
// If identifiers in CIRCL were to change, requests would start failing
15+
// inexplicably and everyone would be scratching their heads.
16+
if mceliece460896.Scheme().Name() != "mceliece460896" {
17+
t.Fatal("Identifier for CME has changed")
18+
}
19+
if kyber1024.Scheme().Name() != "Kyber1024" {
20+
t.Fatal("Identifier for Kyber has changed")
21+
}
22+
if mlkem1024.Scheme().Name() != "ML-KEM-1024" {
23+
t.Fatal("Identifier for ML-KEM has changed")
24+
}
25+
}

options.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,14 @@ func WithKyber1024() Option {
1818
}
1919
}
2020

21+
// WithMLKEM1024 uses the key encapsulation method ML-KEM-1024 when negotiating a
22+
// PSK for the ephemeral peer
23+
func WithMLKEM1024() Option {
24+
return func(ep *ephemeralPeer) {
25+
ep.kemSchemes = append(ep.kemSchemes, schemeMLKEM1024)
26+
}
27+
}
28+
2129
// WithDAITA enables DAITA on the ephemeral peer. DAITA hides patterns in the
2230
// VPN tunnel by generating dummy traffic and using a fixed packet size.
2331
// However, this is not supported in vanilla WireGuard so enabling this option

pq.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ import (
66
"github.com/cloudflare/circl/kem"
77
"github.com/cloudflare/circl/kem/kyber/kyber1024"
88
"github.com/cloudflare/circl/kem/mceliece/mceliece460896"
9+
"github.com/cloudflare/circl/kem/mlkem/mlkem1024"
910
)
1011

1112
var (
@@ -15,6 +16,7 @@ var (
1516
var (
1617
schemeMcEliece460896Round3 kem.Scheme = mceliece460896.Scheme()
1718
schemeKyber1024 kem.Scheme = kyber1024.Scheme()
19+
schemeMLKEM1024 kem.Scheme = mlkem1024.Scheme()
1820
)
1921

2022
type pqkem struct {

vendor/github.com/cloudflare/circl/kem/kem.go

Lines changed: 3 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

vendor/github.com/cloudflare/circl/kem/kyber/kyber1024/kyber.go

Lines changed: 5 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)