|
@@ -2,6 +2,7 @@ package overlay
|
|
|
|
|
|
import (
|
|
import (
|
|
"bytes"
|
|
"bytes"
|
|
|
|
+ "encoding/binary"
|
|
"encoding/hex"
|
|
"encoding/hex"
|
|
"fmt"
|
|
"fmt"
|
|
"net"
|
|
"net"
|
|
@@ -216,7 +217,6 @@ func programMangle(vni uint32, add bool) (err error) {
|
|
|
|
|
|
func programSA(localIP, remoteIP net.IP, spi *spi, k *key, dir int, add bool) (fSA *netlink.XfrmState, rSA *netlink.XfrmState, err error) {
|
|
func programSA(localIP, remoteIP net.IP, spi *spi, k *key, dir int, add bool) (fSA *netlink.XfrmState, rSA *netlink.XfrmState, err error) {
|
|
var (
|
|
var (
|
|
- crypt *netlink.XfrmStateAlgo
|
|
|
|
action = "Removing"
|
|
action = "Removing"
|
|
xfrmProgram = ns.NlHandle().XfrmStateDel
|
|
xfrmProgram = ns.NlHandle().XfrmStateDel
|
|
)
|
|
)
|
|
@@ -224,7 +224,6 @@ func programSA(localIP, remoteIP net.IP, spi *spi, k *key, dir int, add bool) (f
|
|
if add {
|
|
if add {
|
|
action = "Adding"
|
|
action = "Adding"
|
|
xfrmProgram = ns.NlHandle().XfrmStateAdd
|
|
xfrmProgram = ns.NlHandle().XfrmStateAdd
|
|
- crypt = &netlink.XfrmStateAlgo{Name: "cbc(aes)", Key: k.value}
|
|
|
|
}
|
|
}
|
|
|
|
|
|
if dir&reverse > 0 {
|
|
if dir&reverse > 0 {
|
|
@@ -236,7 +235,7 @@ func programSA(localIP, remoteIP net.IP, spi *spi, k *key, dir int, add bool) (f
|
|
Mode: netlink.XFRM_MODE_TRANSPORT,
|
|
Mode: netlink.XFRM_MODE_TRANSPORT,
|
|
}
|
|
}
|
|
if add {
|
|
if add {
|
|
- rSA.Crypt = crypt
|
|
|
|
|
|
+ rSA.Aead = buildAeadAlgo(k, spi.reverse)
|
|
}
|
|
}
|
|
|
|
|
|
exists, err := saExists(rSA)
|
|
exists, err := saExists(rSA)
|
|
@@ -261,7 +260,7 @@ func programSA(localIP, remoteIP net.IP, spi *spi, k *key, dir int, add bool) (f
|
|
Mode: netlink.XFRM_MODE_TRANSPORT,
|
|
Mode: netlink.XFRM_MODE_TRANSPORT,
|
|
}
|
|
}
|
|
if add {
|
|
if add {
|
|
- fSA.Crypt = crypt
|
|
|
|
|
|
+ fSA.Aead = buildAeadAlgo(k, spi.forward)
|
|
}
|
|
}
|
|
|
|
|
|
exists, err := saExists(fSA)
|
|
exists, err := saExists(fSA)
|
|
@@ -363,6 +362,16 @@ func buildSPI(src, dst net.IP, st uint32) int {
|
|
return spi
|
|
return spi
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+func buildAeadAlgo(k *key, s int) *netlink.XfrmStateAlgo {
|
|
|
|
+ salt := make([]byte, 4)
|
|
|
|
+ binary.BigEndian.PutUint32(salt, uint32(s))
|
|
|
|
+ return &netlink.XfrmStateAlgo{
|
|
|
|
+ Name: "rfc4106(gcm(aes))",
|
|
|
|
+ Key: append(k.value, salt...),
|
|
|
|
+ ICVLen: 64,
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
func (d *driver) secMapWalk(f func(string, []*spi) ([]*spi, bool)) error {
|
|
func (d *driver) secMapWalk(f func(string, []*spi) ([]*spi, bool)) error {
|
|
d.secMap.Lock()
|
|
d.secMap.Lock()
|
|
for node, indices := range d.secMap.nodes {
|
|
for node, indices := range d.secMap.nodes {
|