27 #include "../misc/strutils.h" 38 #include <gnutls/gnutls.h> 39 #include <gnutls/x509.h> 40 #include <gvm/base/logging.h> 42 #define INTBLOB_LEN 20 43 #define SIGBLOB_LEN (2 * INTBLOB_LEN) 44 #define MAX_CIPHER_ID 32 50 #define G_LOG_DOMAIN "lib nasl" 77 nasl_perror (lexic,
"%s: %s (%d)\n", txt, gnutls_strerror (err), err);
88 nasl_perror (lexic,
"%s failed: %s/%s\n",
function, gcry_strsource (err),
100 if (cipher_elem->
id == *
id)
133 static gcry_cipher_hd_t
143 nasl_perror (lexic,
"Cipher handle %d not found.\n", cipher_id);
177 gcry_cipher_close ((gcry_cipher_hd_t)
hd->hd);
178 g_free (hd_item->data);
196 const char *parameter,
const char *
function)
199 unsigned char *buffer = data;
201 err = gcry_mpi_scan (dest, GCRYMPI_FMT_USG, buffer, len, NULL);
204 nasl_perror (lexic,
"%s(): gcry_mpi_scan failed for %s: %s/%s\n",
205 function, parameter, gcry_strsource (err),
206 gcry_strerror (err));
225 const char *parameter,
const char *
function)
260 unsigned char *buffer = NULL;
263 gcry_mpi_aprint (GCRYMPI_FMT_USG, &buffer, &size, mpi);
268 memcpy (retc->
x.
str_val, buffer, size);
288 gcry_mpi_t key1 = NULL, key2 = NULL;
300 retc->
x.
i_val = gcry_mpi_cmp (key1, key2);
309 gcry_mpi_release (key1);
310 gcry_mpi_release (key2);
325 gcry_mpi_t key = NULL;
333 key = gcry_mpi_new (0);
337 gcry_mpi_randomize (key, need, GCRY_STRONG_RANDOM);
346 gcry_mpi_release (key);
360 static gnutls_x509_privkey_t
362 const char *passphrase_name)
364 char *priv = NULL, *passphrase = NULL;
366 gnutls_x509_privkey_t privkey = NULL;
376 pem.data = (
unsigned char *) priv;
379 err = gnutls_x509_privkey_init (&privkey);
386 if (passphrase && !*passphrase)
389 gnutls_x509_privkey_import2 (privkey, &pem, GNUTLS_X509_FMT_PEM, passphrase,
390 passphrase ? 0 : GNUTLS_PKCS_PLAIN);
399 gnutls_x509_privkey_deinit (privkey);
410 gnutls_x509_privkey_t privkey = NULL;
411 gcry_mpi_t key = NULL;
422 gnutls_datum_t m, e, d, p, q, u;
424 gnutls_x509_privkey_export_rsa_raw (privkey, &m, &e, &d, &p, &q, &u);
433 gnutls_free (m.data);
434 gnutls_free (e.data);
435 gnutls_free (d.data);
436 gnutls_free (p.data);
437 gnutls_free (q.data);
438 gnutls_free (u.data);
445 gnutls_datum_t p, q, g, y, x;
446 err = gnutls_x509_privkey_export_dsa_raw (privkey, &p, &q, &g, &y, &x);
456 gnutls_free (p.data);
457 gnutls_free (q.data);
458 gnutls_free (g.data);
459 gnutls_free (y.data);
460 gnutls_free (x.data);
473 gcry_mpi_release (key);
474 gnutls_x509_privkey_deinit (privkey);
526 e = gcry_mpi_new (gcry_mpi_get_nbits (prime));
532 gcry_mpi_powm (e, g, priv, prime);
553 e = gcry_mpi_new (gcry_mpi_get_nbits (prime));
559 gcry_mpi_powm (e, pub, priv, prime);
577 gcry_mpi_t p = NULL, g = NULL, priv = NULL, pub_mpi = NULL;
600 gcry_mpi_release (p);
601 gcry_mpi_release (g);
602 gcry_mpi_release (priv);
603 gcry_mpi_release (pub_mpi);
622 gcry_mpi_t p = NULL, g = NULL, dh_server_pub = NULL;
623 gcry_mpi_t pub_key = NULL, priv_key = NULL;
624 gcry_mpi_t shared = NULL;
633 "nasl_dh_compute_key")
637 "nasl_dh_compute_key")
641 "nasl_dh_compute_key")
654 gcry_mpi_release (p);
655 gcry_mpi_release (g);
656 gcry_mpi_release (dh_server_pub);
657 gcry_mpi_release (priv_key);
658 gcry_mpi_release (pub_key);
659 gcry_mpi_release (shared);
674 gcry_sexp_t child = NULL;
675 gcry_mpi_t mpi = NULL;
677 child = gcry_sexp_find_token (sexp, token, strlen (token));
680 g_message (
"set_retc_from_sexp: no subexpression with token <%s>", token);
684 mpi = gcry_sexp_nth_mpi (child, 1, GCRYMPI_FMT_USG);
687 gcry_sexp_release (child);
710 gcry_mpi_release (mpi);
735 if (p[0] == 1 || p[0] == 2)
741 while (i < retc->size && p[i])
747 int rest = retc->
size - i;
748 temp = g_malloc0 (rest);
749 memcpy (temp, p + i, rest);
773 gcry_mpi_t e = NULL, n = NULL, dt = NULL;
774 gcry_sexp_t key = NULL, data = NULL, encrypted = NULL;
789 nasl_perror (lexic,
"Syntax : rsa_public_encrypt(data:<d>," 790 "n:<n>, e:<e>, pad:<TRUE:FALSE>)");
804 err = gcry_sexp_build (&key, NULL,
"(public-key (rsa (n %m) (e %m)))", n, e);
812 err = gcry_sexp_build (&data, NULL,
"(data (flags pkcs1) (value %m))", dt);
814 err = gcry_sexp_build (&data, NULL,
"(data (flags raw) (value %m))", dt);
821 err = gcry_pk_encrypt (&encrypted, data, key);
844 gcry_sexp_release (encrypted);
845 gcry_sexp_release (key);
846 gcry_sexp_release (data);
847 gcry_mpi_release (dt);
848 gcry_mpi_release (e);
849 gcry_mpi_release (n);
865 gcry_mpi_t e = NULL, n = NULL, d = NULL, dt = NULL;
866 gcry_sexp_t key = NULL, data = NULL, decrypted = NULL;
881 nasl_perror (lexic,
"Syntax : rsa_public_encrypt(data:<d>," 882 "n:<n>, e:<e>, pad:<TRUE:FALSE>)");
898 err = gcry_sexp_build (&key, NULL,
"(private-key (rsa (n %m) (e %m) (d %m)))",
908 gcry_sexp_build (&data, NULL,
"(enc-val (flags pkcs1) (rsa (a %m)))", dt);
911 gcry_sexp_build (&data, NULL,
"(enc-val (flags raw) (rsa (a %m)))", dt);
918 err = gcry_pk_decrypt (&decrypted, data, key);
941 gcry_sexp_release (decrypted);
942 gcry_sexp_release (key);
943 gcry_sexp_release (data);
944 gcry_mpi_release (dt);
945 gcry_mpi_release (e);
946 gcry_mpi_release (n);
947 gcry_mpi_release (d);
964 gcry_mpi_t e = NULL, n = NULL, s = NULL;
965 gcry_sexp_t key = NULL, sig = NULL, decrypted = NULL;
978 err = gcry_sexp_build (&key, NULL,
"(public-key (rsa (n %m) (e %m)))", n, e);
984 err = gcry_sexp_build (&sig, NULL,
"(data (flags raw) (value %m))", s);
993 err = gcry_pk_encrypt (&decrypted, sig, key);
1008 gcry_sexp_release (decrypted);
1009 gcry_sexp_release (key);
1010 gcry_sexp_release (sig);
1011 gcry_mpi_release (s);
1012 gcry_mpi_release (e);
1013 gcry_mpi_release (n);
1020 #define NUM_RSA_PARAMS 6 1026 gcry_sexp_t key = NULL;
1033 datums[i].data = NULL;
1037 err = gnutls_x509_privkey_export_rsa_raw (privkey, datums + 0, datums + 1,
1038 datums + 2, datums + 3, datums + 4,
1048 err =
mpi_from_string (lexic, mpis + i, datums[i].data, datums[i].size,
1049 "rsa parameter",
"nasl_sexp_from_privkey");
1055 if (gcry_mpi_cmp (mpis[3], mpis[4]) > 0)
1057 gcry_mpi_swap (mpis[3], mpis[4]);
1058 gcry_mpi_invm (mpis[5], mpis[3], mpis[4]);
1061 gerr = gcry_sexp_build (&key, NULL,
1062 "(private-key (rsa (n %m) (e %m) (d %m)" 1063 " (p %m) (q %m) (u %m)))",
1064 mpis[0], mpis[1], mpis[2], mpis[3], mpis[4], mpis[5]);
1074 gnutls_free (datums[i].data);
1075 gcry_mpi_release (mpis[i]);
1103 gcry_sexp_t ssig = NULL, sdata = NULL, skey = NULL;
1104 gnutls_x509_privkey_t priv_key = NULL;
1118 err = gcry_sexp_build (&sdata, NULL,
"(data (flags pkcs1) (hash sha1 %b))",
1130 err = gcry_pk_sign (&ssig, sdata, skey);
1144 gcry_sexp_release (ssig);
1145 gcry_sexp_release (sdata);
1146 gcry_sexp_release (skey);
1147 gnutls_x509_privkey_deinit (priv_key);
1165 gcry_mpi_t p = NULL, g = NULL, q = NULL, pub = NULL, data = NULL;
1166 gcry_mpi_t r = NULL, s = NULL;
1167 gcry_sexp_t ssig = NULL, skey = NULL, sdata = NULL;
1190 err = gcry_sexp_build (&sdata, NULL,
"(data (flags raw) (value %m))", data);
1197 err = gcry_sexp_build (&skey, NULL,
1198 "(public-key (dsa (p %m) (q %m) (g %m) (y %m)))", p, q,
1206 err = gcry_sexp_build (&ssig, NULL,
"(sig-val (dsa (r %m) (s %m)))", r, s);
1213 err = gcry_pk_verify (ssig, sdata, skey);
1216 else if (gcry_err_code (err) == GPG_ERR_BAD_SIGNATURE)
1225 gcry_mpi_release (p);
1226 gcry_mpi_release (g);
1227 gcry_mpi_release (q);
1228 gcry_mpi_release (pub);
1229 gcry_mpi_release (r);
1230 gcry_mpi_release (s);
1231 gcry_mpi_release (data);
1232 gcry_sexp_release (ssig);
1233 gcry_sexp_release (skey);
1234 gcry_sexp_release (sdata);
1254 gcry_mpi_t p = NULL, g = NULL, q = NULL, pub = NULL, priv = NULL, data = NULL;
1255 gcry_mpi_t r = NULL, s = NULL;
1256 gcry_sexp_t ssig = NULL, skey = NULL, sdata = NULL;
1258 unsigned char *sigblob = NULL;
1279 err = gcry_sexp_build (&sdata, NULL,
"(data (flags raw) (value %m))", data);
1286 err = gcry_sexp_build (
1287 &skey, NULL,
"(private-key (dsa (p %m) (q %m) (g %m) (y %m) (x %m)))", p, q,
1295 err = gcry_pk_sign (&ssig, sdata, skey);
1307 rlen = (gcry_mpi_get_nbits (r) + 7) / 8;
1308 slen = (gcry_mpi_get_nbits (s) + 7) / 8;
1311 nasl_perror (lexic,
"rlen (%d) or slen (%d) > INTBLOB_LEN (%d)\n", rlen,
1319 err = gcry_mpi_print (
1328 err = gcry_mpi_print (GCRYMPI_FMT_USG,
1329 (
unsigned char *) (sigblob +
SIGBLOB_LEN - slen), rlen,
1337 retc->
x.
str_val = (
char *) sigblob;
1342 gcry_mpi_release (p);
1343 gcry_mpi_release (g);
1344 gcry_mpi_release (q);
1345 gcry_mpi_release (pub);
1346 gcry_mpi_release (priv);
1347 gcry_mpi_release (data);
1348 gcry_mpi_release (r);
1349 gcry_mpi_release (s);
1350 gcry_sexp_release (ssig);
1351 gcry_sexp_release (skey);
1352 gcry_sexp_release (sdata);
1365 char *enckey = NULL, *iv = NULL, *data = NULL, *out = NULL;
1366 long enckeylen, ivlen, datalen;
1367 gcry_cipher_hd_t
hd = NULL;
1386 if (enckey == NULL || data == NULL || iv == NULL)
1393 "nasl_bf_cbc: unexpected enckeylen = %d; must be >= 16\n",
1399 nasl_perror (lexic,
"nasl_bf_cbc: unexpected ivlen = %d; must >= 8\n",
1405 nasl_perror (lexic,
"nasl_bf_cbc: unexpected datalen = %d; must >= 8\n",
1410 err = gcry_cipher_open (&
hd, GCRY_CIPHER_BLOWFISH, GCRY_CIPHER_MODE_CBC, 0);
1420 err = gcry_cipher_setkey (
hd, enckey, 16);
1429 err = gcry_cipher_setiv (
hd, iv, 8);
1436 out = g_malloc0 (datalen);
1441 err = gcry_cipher_encrypt (
hd, out, datalen, data, datalen);
1443 err = gcry_cipher_decrypt (
hd, out, datalen, data, datalen);
1466 v.
v.
v_str.
s_val = (
unsigned char *) ((enc ? out : data) + datalen - 8);
1478 gcry_cipher_close (
hd);
1535 gcry_cipher_hd_t
hd;
1538 size_t keylen, ivlen;
1548 if (!key || keylen <= 0)
1550 nasl_perror (lexic,
"Syntax: encrypt_data: Missing data or key argument");
1554 if ((error = gcry_cipher_open (&
hd, cipher, mode, 0)))
1556 nasl_perror (lexic,
"gcry_cipher_open: %s", gcry_strerror (error));
1557 gcry_cipher_close (
hd);
1560 if ((error = gcry_cipher_setkey (
hd, key, keylen)))
1562 nasl_perror (lexic,
"gcry_cipher_setkey: %s", gcry_strerror (error));
1563 gcry_cipher_close (
hd);
1569 if ((error = gcry_cipher_setiv (
hd, iv, ivlen)))
1571 nasl_perror (lexic,
"gcry_cipher_setiv: %s", gcry_strerror (error));
1572 gcry_cipher_close (
hd);
1578 if (cipher_id == -1)
1580 nasl_perror (lexic,
"%s: No available slot for a new cipher.", __func__);
1581 gcry_cipher_close (
hd);
1587 hd_item->
id = cipher_id;
1607 gcry_cipher_hd_t
hd;
1609 void *result, *data, *tmp;
1610 size_t resultlen, datalen, tmplen;
1618 if (!data || datalen <= 0)
1620 nasl_perror (lexic,
"Syntax: encrypt_data: Missing data or key argument");
1628 if (cipher == GCRY_CIPHER_ARCFOUR)
1630 resultlen = datalen;
1631 tmp = g_memdup (data, datalen);
1635 result = g_malloc0 (resultlen);
1636 if ((error = gcry_cipher_encrypt (
hd, result, resultlen, tmp, tmplen)))
1638 g_message (
"gcry_cipher_encrypt: %s", gcry_strerror (error));
1648 retc->
size = resultlen;
1665 gcry_cipher_hd_t
hd;
1682 gcry_cipher_hd_t
hd;
1684 void *result, *data, *key, *tmp, *iv;
1685 size_t resultlen, datalen, keylen, tmplen, ivlen;
1695 if (!data || datalen <= 0 || !key || keylen <= 0)
1697 nasl_perror (lexic,
"Syntax: encrypt_data: Missing data or key argument");
1701 if ((error = gcry_cipher_open (&
hd, cipher, mode, 0)))
1703 nasl_perror (lexic,
"gcry_cipher_open: %s", gcry_strerror (error));
1704 gcry_cipher_close (
hd);
1707 if ((error = gcry_cipher_setkey (
hd, key, keylen)))
1709 nasl_perror (lexic,
"gcry_cipher_setkey: %s", gcry_strerror (error));
1710 gcry_cipher_close (
hd);
1714 if (cipher == GCRY_CIPHER_ARCFOUR)
1716 resultlen = datalen;
1717 tmp = g_memdup (data, datalen);
1720 else if (cipher == GCRY_CIPHER_3DES)
1722 if (datalen % 8 == 0)
1723 resultlen = datalen;
1725 resultlen = ((datalen / 8) + 1) * 8;
1726 tmp = g_malloc0 (resultlen);
1728 memcpy (tmp, data, datalen);
1730 else if (cipher == GCRY_CIPHER_AES128)
1732 if (datalen % 16 == 0)
1733 resultlen = datalen;
1735 resultlen = ((datalen / 16) + 1) * 16;
1736 tmp = g_malloc0 (resultlen);
1738 memcpy (tmp, data, datalen);
1740 else if (cipher == GCRY_CIPHER_AES256)
1742 if (datalen % 32 == 0)
1743 resultlen = datalen;
1745 resultlen = ((datalen / 32) + 1) * 32;
1746 tmp = g_malloc0 (resultlen);
1748 memcpy (tmp, data, datalen);
1752 nasl_perror (lexic,
"encrypt_data: Unknown cipher %d", cipher);
1753 gcry_cipher_close (
hd);
1759 if ((error = gcry_cipher_setiv (
hd, iv, ivlen)))
1761 nasl_perror (lexic,
"gcry_cipher_setiv: %s", gcry_strerror (error));
1766 result = g_malloc0 (resultlen);
1767 if ((error = gcry_cipher_encrypt (
hd, result, resultlen, tmp, tmplen)))
1769 g_message (
"gcry_cipher_encrypt: %s", gcry_strerror (error));
1770 gcry_cipher_close (
hd);
1777 gcry_cipher_close (
hd);
1780 retc->
size = resultlen;
1799 gcry_cipher_hd_t
hd;
1810 return encrypt_data (lexic, GCRY_CIPHER_ARCFOUR, GCRY_CIPHER_MODE_STREAM);
1825 GCRY_CIPHER_MODE_STREAM);
1831 return encrypt_data (lexic, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CBC);
1837 return encrypt_data (lexic, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CBC);
1843 return encrypt_data (lexic, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_CTR);
1849 return encrypt_data (lexic, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_CTR);
1855 return encrypt_data (lexic, GCRY_CIPHER_3DES, GCRY_CIPHER_MODE_CBC);
1861 return encrypt_data (lexic, GCRY_CIPHER_AES128, GCRY_CIPHER_MODE_GCM);
1867 return encrypt_data (lexic, GCRY_CIPHER_AES256, GCRY_CIPHER_MODE_GCM);
int get_var_type_by_name(lex_ctxt *, const char *)
tree_cell * nasl_rsa_public_decrypt(lex_ctxt *lexic)
tree_cell * nasl_bn_random(lex_ctxt *lexic)
static tree_cell * encrypt_stream_data(lex_ctxt *lexic, int cipher)
Encrypt data using an existent cipher handle. As the handler is not close, the key is updated to encr...
static gcry_mpi_t calc_dh_key(gcry_mpi_t pub, gcry_mpi_t prime, gcry_mpi_t priv)
Compute the diffie hellman shared secret key.
tree_cell * nasl_bf_cbc_encrypt(lex_ctxt *lexic)
static int mpi_from_string(lex_ctxt *lexic, gcry_mpi_t *dest, void *data, size_t len, const char *parameter, const char *function)
Converts a string to a gcry_mpi_t.
static int strip_pkcs1_padding(tree_cell *retc)
Strips PKCS#1 padding from the string in retc.
tree_cell * nasl_aes128_cbc_encrypt(lex_ctxt *lexic)
#define NUM_RSA_PARAMS
Creates a libgcryt s-expression from a GnuTLS private RSA key.
static gcry_sexp_t nasl_sexp_from_privkey(lex_ctxt *lexic, gnutls_x509_privkey_t privkey)
static tree_cell * nasl_open_stream_cipher(lex_ctxt *lexic, int cipher, int mode)
Open a stream cipher. This function creates a context handle and stores it in a cipher table...
static int get_new_cipher_id(void)
Helper function to get a free id for a new cipher.
static gcry_mpi_t extract_mpi_from_sexp(gcry_sexp_t sexp, const char *token)
Extracts an MPI value from a libgcryt s-expression.
static tree_cell * encrypt_data(lex_ctxt *lexic, int cipher, int mode)
static int find_cipher_hd(cipher_table_item_t *cipher_elem, int *id)
Helper function to find cipher id in the table.
tree_cell * nasl_aes128_ctr_encrypt(lex_ctxt *lexic)
tree_cell * nasl_dsa_do_verify(lex_ctxt *lexic)
tree_cell * nasl_aes128_gcm_encrypt(lex_ctxt *lexic)
char * get_str_var_by_name(lex_ctxt *, const char *)
static gcry_cipher_hd_t verify_cipher_id(lex_ctxt *lexic, int cipher_id)
Helper function to validate the cipher id.
void print_tls_error(lex_ctxt *lexic, char *txt, int err)
Prints a GnuTLS error.
tree_cell * nasl_rsa_sign(lex_ctxt *lexic)
int add_var_to_list(nasl_array *a, int i, const anon_nasl_var *v)
static cipher_table_item_t * cipher_table_item_new(void)
Create a new cipher handler item parameter.
tree_cell * alloc_typed_cell(int typ)
tree_cell * nasl_dh_compute_key(lex_ctxt *lexic)
static GList * cipher_table
List of open cipher handler.
tree_cell * nasl_bn_cmp(lex_ctxt *lexic)
void print_gcrypt_error(lex_ctxt *lexic, char *function, int err)
Prints a libgcrypt error.
tree_cell * nasl_bf_cbc_decrypt(lex_ctxt *lexic)
tree_cell * nasl_rc4_encrypt(lex_ctxt *lexic)
Nasl function to encrypt data with a RC4 cipher. If an hd param exist in the lexix context...
static void delete_cipher_item(int cipher_id)
Free and remove a cipher handler from the cipher table.
tree_cell * nasl_aes256_gcm_encrypt(lex_ctxt *lexic)
tree_cell * nasl_dsa_do_sign(lex_ctxt *lexic)
tree_cell * nasl_open_rc4_cipher(lex_ctxt *lexic)
Nasl function to open RC4 cipher to encrypt a stream of data. The handler can be used to encrypt stre...
tree_cell * nasl_rsa_private_decrypt(lex_ctxt *lexic)
Struct holding a cipher handler.
static int mpi_from_named_parameter(lex_ctxt *lexic, gcry_mpi_t *dest, const char *parameter, const char *function)
Converts a named nasl parameter to a gcry_mpi_t.
tree_cell * nasl_aes256_cbc_encrypt(lex_ctxt *lexic)
void nasl_perror(lex_ctxt *lexic, char *msg,...)
long int get_int_var_by_name(lex_ctxt *, const char *, int)
tree_cell * nasl_rsa_public_encrypt(lex_ctxt *lexic)
static int set_mpi_retc(tree_cell *retc, gcry_mpi_t mpi)
Sets the return value in retc from the MPI mpi.
tree_cell * nasl_dh_generate_key(lex_ctxt *lexic)
union st_a_nasl_var::@4 v
tree_cell * nasl_pem_to_dsa(lex_ctxt *lexic)
tree_cell * nasl_pem_to_rsa(lex_ctxt *lexic)
tree_cell * nasl_des_ede_cbc_encrypt(lex_ctxt *lexic)
static gcry_mpi_t calc_dh_public(gcry_mpi_t g, gcry_mpi_t prime, gcry_mpi_t priv)
compute the diffie hellman public key.
static int set_retc_from_sexp(tree_cell *retc, gcry_sexp_t sexp, const char *token)
Sets the return value in retc from an sexpression.
tree_cell * nasl_close_stream_cipher(lex_ctxt *lexic)
Nasl function to delete a cipher item from the cipher table.
tree_cell * nasl_aes256_ctr_encrypt(lex_ctxt *lexic)
int get_var_size_by_name(lex_ctxt *, const char *)
tree_cell * nasl_pem_to(lex_ctxt *lexic, int type)
Implements the nasl functions pem_to_rsa and pem_to_dsa.
static gnutls_x509_privkey_t nasl_load_privkey_param(lex_ctxt *lexic, const char *priv_name, const char *passphrase_name)
Loads a private key from a string.
tree_cell * nasl_bf_cbc(lex_ctxt *lexic, int enc)
Implements the nasl functions bf_cbc_encrypt and bf_cbc_decrypt.