Add FFDH definitions and translation functions

Signed-off-by: Przemek Stekiel <przemyslaw.stekiel@mobica.com>

Signed-off-by: Przemek Stekiel <przemyslaw.stekiel@mobica.com>
diff --git a/include/mbedtls/dhm.h b/include/mbedtls/dhm.h
index 6ffe681..b7c3256 100644
--- a/include/mbedtls/dhm.h
+++ b/include/mbedtls/dhm.h
@@ -66,6 +66,7 @@
 
 #include "mbedtls/build_info.h"
 #include "mbedtls/bignum.h"
+#include <string.h>
 
 /*
  * DHM Error codes
@@ -91,6 +92,20 @@
 /** Setting the modulus and generator failed. */
 #define MBEDTLS_ERR_DHM_SET_GROUP_FAILED                  -0x3580
 
+/* Finite Field Groups (DHE) */
+#define MBEDTLS_DHM_GROUP_FFDHE2048     0x0100
+#define MBEDTLS_DHM_GROUP_FFDHE3072     0x0101
+#define MBEDTLS_DHM_GROUP_FFDHE4096     0x0102
+#define MBEDTLS_DHM_GROUP_FFDHE6144     0x0103
+#define MBEDTLS_DHM_GROUP_FFDHE8192     0x0104
+
+/* Finite Field Group Names (DHE) */
+#define MBEDTLS_DHM_GROUP_NAME_FFDHE2048     "ffdhe2048"
+#define MBEDTLS_DHM_GROUP_NAME_FFDHE3072     "ffdhe3072"
+#define MBEDTLS_DHM_GROUP_NAME_FFDHE4096     "ffdhe4096"
+#define MBEDTLS_DHM_GROUP_NAME_FFDHE6144     "ffdhe6144"
+#define MBEDTLS_DHM_GROUP_NAME_FFDHE8192     "ffdhe8192"
+
 /** Which parameter to access in mbedtls_dhm_get_value(). */
 typedef enum {
     MBEDTLS_DHM_PARAM_P,  /*!<  The prime modulus. */
@@ -377,6 +392,55 @@
 #endif /* MBEDTLS_FS_IO */
 #endif /* MBEDTLS_ASN1_PARSE_C */
 
+static inline uint16_t mbedtls_ssl_ffdh_group_from_name(const char *name)
+{
+    if (strcmp(name, MBEDTLS_DHM_GROUP_NAME_FFDHE2048) == 0) {
+        return MBEDTLS_DHM_GROUP_FFDHE2048;
+    } else if (strcmp(name, MBEDTLS_DHM_GROUP_NAME_FFDHE3072) == 0) {
+        return MBEDTLS_DHM_GROUP_FFDHE3072;
+    } else if (strcmp(name, MBEDTLS_DHM_GROUP_NAME_FFDHE4096) == 0) {
+        return MBEDTLS_DHM_GROUP_FFDHE4096;
+    } else if (strcmp(name, MBEDTLS_DHM_GROUP_NAME_FFDHE6144) == 0) {
+        return MBEDTLS_DHM_GROUP_FFDHE6144;
+    } else if (strcmp(name, MBEDTLS_DHM_GROUP_NAME_FFDHE8192) == 0) {
+        return MBEDTLS_DHM_GROUP_FFDHE8192;
+    }
+    return 0;
+}
+
+static inline const char *mbedtls_ssl_ffdh_name_from_group(uint16_t group)
+{
+    switch (group) {
+        case MBEDTLS_DHM_GROUP_FFDHE2048:
+            return MBEDTLS_DHM_GROUP_NAME_FFDHE2048;
+        case MBEDTLS_DHM_GROUP_FFDHE3072:
+            return MBEDTLS_DHM_GROUP_NAME_FFDHE3072;
+        case MBEDTLS_DHM_GROUP_FFDHE4096:
+            return MBEDTLS_DHM_GROUP_NAME_FFDHE4096;
+        case MBEDTLS_DHM_GROUP_FFDHE6144:
+            return MBEDTLS_DHM_GROUP_NAME_FFDHE6144;
+        case MBEDTLS_DHM_GROUP_FFDHE8192:
+            return MBEDTLS_DHM_GROUP_NAME_FFDHE8192;
+        default:
+            return NULL;
+    }
+    return NULL;
+}
+
+static inline uint16_t *mbedtls_ssl_ffdh_supported_groups(void)
+{
+    static uint16_t ffdh_groups[] = {
+        MBEDTLS_DHM_GROUP_FFDHE2048,
+        MBEDTLS_DHM_GROUP_FFDHE3072,
+        MBEDTLS_DHM_GROUP_FFDHE4096,
+        MBEDTLS_DHM_GROUP_FFDHE6144,
+        MBEDTLS_DHM_GROUP_FFDHE8192,
+        0
+    };
+
+    return ffdh_groups;
+}
+
 #if defined(MBEDTLS_SELF_TEST)
 
 /**