OK?

---
 sys/net/pfkeyv2.h         |  6 ++++--
 sys/net/pfkeyv2_convert.c |  8 ++++++++
 sys/netinet/ip_esp.c      | 20 ++++++++++++++++++--
 3 files changed, 30 insertions(+), 4 deletions(-)

diff --git sys/net/pfkeyv2.h sys/net/pfkeyv2.h
index 3d08bd3..97d95e2 100644
--- sys/net/pfkeyv2.h
+++ sys/net/pfkeyv2.h
@@ -291,11 +291,12 @@ struct sadb_x_tap {
 #define SADB_X_AALG_SHA2_512         7
 #define SADB_X_AALG_RIPEMD160HMAC    8
 #define SADB_X_AALG_AES128GMAC       9
 #define SADB_X_AALG_AES192GMAC       10
 #define SADB_X_AALG_AES256GMAC       11
-#define SADB_AALG_MAX                11
+#define SADB_X_AALG_CHACHA20POLY1305 12
+#define SADB_AALG_MAX                12
 
 #define SADB_EALG_NONE        0
 #define SADB_X_EALG_DES_IV64  1
 #define SADB_EALG_DESCBC      2
 #define SADB_EALG_3DESCBC     3
@@ -311,11 +312,12 @@ struct sadb_x_tap {
 #define SADB_X_EALG_AESCTR    13
 #define SADB_X_EALG_AESGCM8   18
 #define SADB_X_EALG_AESGCM12  19
 #define SADB_X_EALG_AESGCM16  20
 #define SADB_X_EALG_AESGMAC   21
-#define SADB_EALG_MAX         21
+#define SADB_X_EALG_CHACHA20POLY1305 22
+#define SADB_EALG_MAX         22
 
 #define SADB_X_CALG_NONE       0
 #define SADB_X_CALG_OUI                1
 #define SADB_X_CALG_DEFLATE    2
 #define SADB_X_CALG_LZS                3
diff --git sys/net/pfkeyv2_convert.c sys/net/pfkeyv2_convert.c
index 3502316..4306189 100644
--- sys/net/pfkeyv2_convert.c
+++ sys/net/pfkeyv2_convert.c
@@ -213,10 +213,14 @@ export_sa(void **p, struct tdb *tdb)
                        break;
 
                case CRYPTO_AES_256_GMAC:
                        sadb_sa->sadb_sa_auth = SADB_X_AALG_AES256GMAC;
                        break;
+
+               case CRYPTO_CHACHA20_POLY1305_MAC:
+                       sadb_sa->sadb_sa_auth = SADB_X_AALG_CHACHA20POLY1305;
+                       break;
                }
        }
 
        if (tdb->tdb_encalgxform) {
                switch (tdb->tdb_encalgxform->type) {
@@ -253,10 +257,14 @@ export_sa(void **p, struct tdb *tdb)
                        break;
 
                case CRYPTO_BLF_CBC:
                        sadb_sa->sadb_sa_encrypt = SADB_X_EALG_BLF;
                        break;
+
+               case CRYPTO_CHACHA20_POLY1305:
+                       sadb_sa->sadb_sa_encrypt = SADB_X_EALG_CHACHA20POLY1305;
+                       break;
                }
        }
 
        if (tdb->tdb_flags & TDBF_PFS)
                sadb_sa->sadb_sa_flags |= SADB_SAFLAGS_PFS;
diff --git sys/netinet/ip_esp.c sys/netinet/ip_esp.c
index 8cc172e..2e57c7c 100644
--- sys/netinet/ip_esp.c
+++ sys/netinet/ip_esp.c
@@ -133,10 +133,14 @@ esp_init(struct tdb *tdbp, struct xformsw *xsp, struct 
ipsecinit *ii)
 
                case SADB_X_EALG_AESGMAC:
                        txform = &enc_xform_aes_gmac;
                        break;
 
+               case SADB_X_EALG_CHACHA20POLY1305:
+                       txform = &enc_xform_chacha20_poly1305;
+                       break;
+
                case SADB_X_EALG_BLF:
                        txform = &enc_xform_blf;
                        break;
 
                case SADB_X_EALG_CAST:
@@ -176,10 +180,14 @@ esp_init(struct tdb *tdbp, struct xformsw *xsp, struct 
ipsecinit *ii)
                                ii->ii_authalg = SADB_X_AALG_AES256GMAC;
                                break;
                        }
                        ii->ii_authkeylen = ii->ii_enckeylen;
                        ii->ii_authkey = ii->ii_enckey;
+               } else if (ii->ii_encalg == SADB_X_EALG_CHACHA20POLY1305) {
+                       ii->ii_authalg = SADB_X_AALG_CHACHA20POLY1305;
+                       ii->ii_authkeylen = ii->ii_enckeylen;
+                       ii->ii_authkey = ii->ii_enckey;
                }
 
                tdbp->tdb_encalgxform = txform;
 
                DPRINTF(("esp_init(): initialized TDB with enc algorithm %s\n",
@@ -224,10 +232,14 @@ esp_init(struct tdb *tdbp, struct xformsw *xsp, struct 
ipsecinit *ii)
 
                case SADB_X_AALG_AES256GMAC:
                        thash = &auth_hash_gmac_aes_256;
                        break;
 
+               case SADB_X_AALG_CHACHA20POLY1305:
+                       thash = &auth_hash_chacha20_poly1305;
+                       break;
+
                default:
                        DPRINTF(("esp_init(): unsupported authentication "
                            "algorithm %d specified\n", ii->ii_authalg));
                        return EINVAL;
                }
@@ -468,11 +480,13 @@ esp_input(struct mbuf *m, struct tdb *tdb, int skip, int 
protoff)
                        esn = htonl(esn);
                        bcopy(&esn, crda->crd_esn, 4);
                        crda->crd_flags |= CRD_F_ESN;
                }
 
-               if (espx && espx->type == CRYPTO_AES_GCM_16)
+               if (espx &&
+                   (espx->type == CRYPTO_AES_GCM_16 ||
+                    espx->type == CRYPTO_CHACHA20_POLY1305))
                        crda->crd_len = hlen - tdb->tdb_ivlen;
                else
                        crda->crd_len = m->m_pkthdr.len - (skip + alen);
 
                /* Copy the authenticator */
@@ -1023,11 +1037,13 @@ esp_output(struct mbuf *m, struct tdb *tdb, struct mbuf 
**mp, int skip,
                        esn = htonl((u_int32_t)(tdb->tdb_rpl >> 32));
                        bcopy(&esn, crda->crd_esn, 4);
                        crda->crd_flags |= CRD_F_ESN;
                }
 
-               if (espx && espx->type == CRYPTO_AES_GCM_16)
+               if (espx &&
+                   (espx->type == CRYPTO_AES_GCM_16 ||
+                    espx->type == CRYPTO_CHACHA20_POLY1305))
                        crda->crd_len = hlen - tdb->tdb_ivlen;
                else
                        crda->crd_len = m->m_pkthdr.len - (skip + alen);
        }
 
-- 
2.6.2

Reply via email to