28#include <glib/gstdio.h>
29#include <gnutls/gnutls.h>
30#include <gnutls/x509.h>
31#include <gvm/base/logging.h>
42#define G_LOG_DOMAIN "lib nasl"
45#define DIM(v) (sizeof (v) / sizeof ((v)[0]))
46#define DIMof(type, member) DIM (((type *) 0)->member)
50#define spacep(p) (*(p) == ' ' || *(p) == '\t')
51#define digitp(p) (*(p) >= '0' && *(p) <= '9')
53 (digitp (a) || (*(a) >= 'A' && *(a) <= 'F') || (*(a) >= 'a' && *(a) <= 'f'))
56#define atoi_1(p) (*(p) - '0')
57#define atoi_2(p) ((atoi_1 (p) * 10) + atoi_1 ((p) + 1))
58#define atoi_4(p) ((atoi_2 (p) * 100) + atoi_2 ((p) + 2))
60 (*(p) <= '9' ? (*(p) - '0') \
61 : *(p) <= 'F' ? (*(p) - 'A' + 10) \
64 ((xtoi_1 ((const unsigned char *) (p)) * 16) \
65 + xtoi_1 ((const unsigned char *) (p) + 1))
68#define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
85typedef struct object_desc_s *object_desc_t;
94static object_desc_t object_list;
123 for (obj = object_list; obj; obj = obj->next)
124 if (obj->object_id == last)
165 ksba_reader_t reader;
172 g_message (
"No certificate passed to cert_open");
176 err = ksba_reader_new (&reader);
179 g_message (
"Opening reader object failed: %s", gpg_strerror (err));
182 err = ksba_reader_set_mem (reader, data, datalen);
185 g_message (
"ksba_reader_set_mem failed: %s", gpg_strerror (err));
186 ksba_reader_release (reader);
190 err = ksba_cert_new (&cert);
193 g_message (
"ksba_cert_new failed: %s", gpg_strerror (err));
194 ksba_reader_release (reader);
198 err = ksba_cert_read_der (cert, reader);
201 g_message (
"Certificate parsing failed: %s", gpg_strerror (err));
203 ksba_reader_release (reader);
204 ksba_cert_release (cert);
207 ksba_reader_release (reader);
209 obj = g_try_malloc (
sizeof *obj);
212 g_message (
"malloc failed in %s", __func__);
213 ksba_cert_release (cert);
216 obj->object_id = next_object_id ();
218 obj->next = object_list;
223 retc->
x.
i_val = obj->object_id;
248 object_desc_t prevobj, obj;
255 g_message (
"Bad object id %d passed to cert_close", object_id);
259 for (prevobj = NULL, obj = object_list; obj; prevobj = obj, obj = obj->next)
260 if (obj->object_id == object_id)
264 g_message (
"Unused object id %d passed to cert_close", object_id);
269 prevobj->next = obj->next;
271 object_list = obj->next;
273 ksba_cert_release (obj->cert);
281parse_dn_part_for_CN (
const char *
string,
char **r_value)
291 for (s =
string + 1; *s && *s !=
'='; s++)
299 found = (n == 2 &&
string[0] ==
'C' &&
string[1] ==
'N');
305 for (s =
string; hexdigitp (s); s++)
312 *r_value = p = g_malloc0 (n + 1);
314 for (s1 =
string; n; s1 += 2, n--, p++)
318 *(
unsigned char *) p = xtoi_2 (s1);
329 for (n = 0, s =
string; *s; s++)
334 if (*s ==
',' || *s ==
'=' || *s ==
'+' || *s ==
'<' || *s ==
'>'
335 || *s ==
'#' || *s ==
';' || *s ==
'\\' || *s ==
'\"'
338 else if (hexdigitp (s) && hexdigitp (s + 1))
348 else if (*s ==
',' || *s ==
'=' || *s ==
'+' || *s ==
'<' || *s ==
'>'
356 *r_value = p = g_malloc0 (n + 1);
358 for (s =
string; n; s++, n--)
367 *(
unsigned char *) p = xtoi_2 (s);
393parse_dn_for_CN (
const char *
string)
397 while (*
string && !value)
399 while (*
string ==
' ')
403 string = parse_dn_part_for_CN (
string, &value);
406 while (*
string ==
' ')
408 if (*
string && *
string !=
',' && *
string !=
';' && *
string !=
'+')
425build_hostname_list (ksba_cert_t cert)
434 name = ksba_cert_get_subject (cert, 0);
439 retc->
x.
ref_val = a = g_malloc0 (
sizeof *a);
442 value = parse_dn_for_CN (
name);
448 memset (&v, 0,
sizeof v);
457 for (idx = 1; (
name = ksba_cert_get_subject (cert, idx)); idx++)
463 && !memcmp (
name + 3,
"dns-name", 8))
466 unsigned long n = strtoul (
name + 11, &endp, 10);
474 memset (&v, 0,
sizeof v);
491make_hexstring (
const void *buffer,
size_t length)
493 const unsigned char *s;
503 *p++ = tohex ((*s >> 4) & 15);
504 *p++ = tohex (*s & 15);
521get_fingerprint (ksba_cert_t cert,
int algo)
524 const unsigned char *der;
526 unsigned char digest[32];
528 dlen = gcry_md_get_algo_dlen (algo);
529 if (dlen != 20 && dlen != 32)
532 der = ksba_cert_get_image (cert, &derlen);
535 gcry_md_hash_buffer (algo, digest, der, derlen);
537 return make_hexstring (digest, dlen);
548get_oid_name (
const char *
oid)
551 if (!strcmp (
"1.2.840.10040.4.1",
oid))
553 else if (!strcmp (
"1.2.840.10046.2.1",
oid))
554 return "dhpublicnumber";
555 else if (!strcmp (
"2.16.840.1.101.2.1.1.22",
oid))
556 return "id-keyExchangeAlgorithm";
557 else if (!strcmp (
"1.2.840.10045.1.1",
oid))
558 return "prime-field";
559 else if (!strcmp (
"1.2.840.10045.2.1",
oid))
560 return "id-ecPublicKey";
561 else if (!strcmp (
"1.2.840.10045.4.1",
oid))
562 return "ecdsa-with-SHA1";
563 else if (!strcmp (
"1.2.840.10045.4.3.1",
oid))
564 return "ecdsa-with-SHA224";
565 else if (!strcmp (
"1.2.840.10045.4.3.2",
oid))
566 return "ecdsa-with-SHA256";
567 else if (!strcmp (
"1.2.840.10045.4.3.3",
oid))
568 return "ecdsa-with-SHA384";
569 else if (!strcmp (
"1.2.840.10045.4.3.4",
oid))
570 return "ecdsa-with-SHA512";
571 else if (!strcmp (
"1.3.132.1.12",
oid))
573 else if (!strcmp (
"1.2.840.10045.2.13",
oid))
575 else if (!strcmp (
"1.2.840.113549.1.1.10",
oid))
576 return "id-RSASSA-PSS";
577 else if (!strcmp (
"1.2.840.113549.1.1.11",
oid))
578 return "sha256WithRSAEncryption";
579 else if (!strcmp (
"1.2.840.113549.1.1.12",
oid))
580 return "sha384WithRSAEncryption";
581 else if (!strcmp (
"1.2.840.113549.1.1.13",
oid))
582 return "sha512WithRSAEncryption";
583 else if (!strcmp (
"1.2.840.113549.1.1.14",
oid))
584 return "sha224WithRSAEncryption";
585 else if (!strcmp (
"1.2.840.113549.1.1.8",
oid))
587 else if (!strcmp (
"1.2.840.113549.2.2",
oid))
589 else if (!strcmp (
"1.2.840.113549.2.4",
oid))
591 else if (!strcmp (
"1.2.840.113549.2.5",
oid))
593 else if (!strcmp (
"1.2.840.113549.1.1.1",
oid))
594 return "rsaEncryption";
595 else if (!strcmp (
"1.2.840.113549.1.1.2",
oid))
596 return "md2WithRSAEncryption";
597 else if (!strcmp (
"1.2.840.113549.1.1.3",
oid))
598 return "md4WithRSAEncryption";
599 else if (!strcmp (
"1.2.840.113549.1.1.4",
oid))
600 return "md5WithRSAEncryption";
601 else if (!strcmp (
"1.2.840.113549.1.1.5",
oid))
602 return "sha1WithRSAEncryption";
603 else if (!strcmp (
"1.2.840.113549.1.1.6",
oid))
604 return "rsaOAEPEncryptionSET";
605 else if (!strcmp (
"1.2.840.10045.3.1.1",
oid))
607 else if (!strcmp (
"1.3.132.0.1",
oid))
609 else if (!strcmp (
"1.3.132.0.15",
oid))
611 else if (!strcmp (
"1.3.132.0.33",
oid))
613 else if (!strcmp (
"1.3.132.0.26",
oid))
615 else if (!strcmp (
"1.3.132.0.27",
oid))
617 else if (!strcmp (
"1.2.840.10045.3.1.7",
oid))
619 else if (!strcmp (
"1.3.132.0.16",
oid))
621 else if (!strcmp (
"1.3.132.0.17",
oid))
623 else if (!strcmp (
"1.3.132.0.34",
oid))
625 else if (!strcmp (
"1.3.132.0.36",
oid))
627 else if (!strcmp (
"1.3.132.0.37",
oid))
629 else if (!strcmp (
"1.3.132.0.35",
oid))
631 else if (!strcmp (
"1.3.132.0.38",
oid))
633 else if (!strcmp (
"1.3.132.0.39",
oid))
635 else if (!strcmp (
"2.16.840.1.101.3.4.3.1",
oid))
636 return "id-dsa-with-sha224";
637 else if (!strcmp (
"2.16.840.1.101.3.4.3.2",
oid))
638 return "id-dsa-with-sha256";
639 else if (!strcmp (
"2.16.840.1.101.3.4.2.1",
oid))
641 else if (!strcmp (
"2.16.840.1.101.3.4.2.2",
oid))
643 else if (!strcmp (
"2.16.840.1.101.3.4.2.3",
oid))
645 else if (!strcmp (
"2.16.840.1.101.3.4.2.4",
oid))
658get_name (
const char *
string)
670 len = gcry_sexp_canon_len ((
const unsigned char *)
string, 0, NULL, NULL);
671 if (gcry_sexp_sscan (&sexp, NULL,
string,
len))
673 len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, NULL, 0);
676 buffer = g_malloc0 (
len);
677 len = gcry_sexp_sprint (sexp, GCRYSEXP_FMT_ADVANCED, buffer,
len);
680 len = strlen (buffer);
682 if (
len && buffer[
len - 1] ==
'\n')
684 gcry_sexp_release (sexp);
694 retc->
x.
str_val = g_strdup (
string);
797 ksba_isotime_t isotime;
804 g_message (
"Bad object id %d passed to cert_query", object_id);
808 for (obj = object_list; obj; obj = obj->next)
809 if (obj->object_id == object_id)
813 g_message (
"Unused object id %d passed to cert_query", object_id);
821 g_message (
"No proper command passed to cert_query");
830 if (!strcmp (command,
"serial"))
832 const unsigned char *s;
836 sexp = ksba_cert_get_serial (obj->cert);
841 n = strtoul ((
const char *) s, &endp, 10);
842 s = (
const unsigned char *) endp;
846 retc = make_hexstring (s, n);
850 else if (!strcmp (command,
"issuer"))
852 result = ksba_cert_get_issuer (obj->cert, cmdidx);
856 retc = get_name (result);
859 else if (!strcmp (command,
"subject"))
861 result = ksba_cert_get_subject (obj->cert, cmdidx);
865 retc = get_name (result);
868 else if (!strcmp (command,
"not-before"))
870 ksba_cert_get_validity (obj->cert, 0, isotime);
872 retc->
x.
str_val = g_strdup (isotime);
873 retc->
size = strlen (isotime);
875 else if (!strcmp (command,
"not-after"))
877 ksba_cert_get_validity (obj->cert, 1, isotime);
879 retc->
x.
str_val = g_strdup (isotime);
880 retc->
size = strlen (isotime);
882 else if (!strcmp (command,
"fpr-sha-256"))
884 retc = get_fingerprint (obj->cert, GCRY_MD_SHA256);
886 else if (!strcmp (command,
"fpr-sha-1"))
888 retc = get_fingerprint (obj->cert, GCRY_MD_SHA1);
890 else if (!strcmp (command,
"all"))
894 else if (!strcmp (command,
"hostnames"))
896 retc = build_hostname_list (obj->cert);
898 else if (!strcmp (command,
"image"))
900 const unsigned char *der;
903 der = ksba_cert_get_image (obj->cert, &derlen);
908 retc->
x.
str_val = g_malloc0 (derlen);
909 memcpy (retc->
x.
str_val, der, derlen);
912 else if (!strcmp (command,
"algorithm-name")
913 || !strcmp (command,
"signature-algorithm-name"))
915 const char *digest = ksba_cert_get_digest_algo (obj->cert);
918 const char *
name = get_oid_name (digest);
926 else if (!strcmp (command,
"public-key-algorithm-name"))
928 gnutls_datum_t datum;
929 gnutls_x509_crt_t cert = NULL;
934 (
void *) ksba_cert_get_image (obj->cert, (
size_t *) &datum.size);
937 if (gnutls_x509_crt_init (&cert) != GNUTLS_E_SUCCESS)
939 if (gnutls_x509_crt_import (cert, &datum, GNUTLS_X509_FMT_DER)
942 if ((algo = gnutls_x509_crt_get_pk_algorithm (cert, NULL)) < 0)
944 g_message (
"%s: Error getting the public key algorithm name.",
948 algo_name = gnutls_pk_algorithm_get_name (algo)
949 ? g_strdup (gnutls_pk_algorithm_get_name (algo))
950 : g_strdup (
"unknown");
952 retc->
size = strlen (algo_name);
955 else if (!strcmp (command,
"modulus"))
957 gnutls_datum_t datum, m, e;
958 gnutls_x509_crt_t cert = NULL;
961 (
void *) ksba_cert_get_image (obj->cert, (
size_t *) &datum.size);
964 if (gnutls_x509_crt_init (&cert) != GNUTLS_E_SUCCESS)
966 if (gnutls_x509_crt_import (cert, &datum, GNUTLS_X509_FMT_DER)
969 if (gnutls_x509_crt_get_pk_rsa_raw (cert, &m, &e) != GNUTLS_E_SUCCESS)
974 retc->
x.
str_val = g_malloc0 (m.size);
975 memcpy (retc->
x.
str_val, m.data, m.size);
977 gnutls_free (m.data);
978 gnutls_free (e.data);
979 gnutls_x509_crt_deinit (cert);
981 else if (!strcmp (command,
"exponent"))
983 gnutls_datum_t datum, m, e;
984 gnutls_x509_crt_t cert = NULL;
987 (
void *) ksba_cert_get_image (obj->cert, (
size_t *) &datum.size);
990 if (gnutls_x509_crt_init (&cert) != GNUTLS_E_SUCCESS)
992 if (gnutls_x509_crt_import (cert, &datum, GNUTLS_X509_FMT_DER)
995 if (gnutls_x509_crt_get_pk_rsa_raw (cert, &m, &e) != GNUTLS_E_SUCCESS)
1000 retc->
x.
str_val = g_malloc0 (e.size);
1001 memcpy (retc->
x.
str_val, e.data, e.size);
1003 gnutls_free (m.data);
1004 gnutls_free (e.data);
1005 gnutls_x509_crt_deinit (cert);
1007 else if (!strcmp (command,
"key-size"))
1009 gnutls_datum_t datum;
1010 gnutls_x509_crt_t cert = NULL;
1011 unsigned int bits = 0;
1014 (
void *) ksba_cert_get_image (obj->cert, (
size_t *) &datum.size);
1017 if (gnutls_x509_crt_init (&cert) != GNUTLS_E_SUCCESS)
1019 if (gnutls_x509_crt_import (cert, &datum, GNUTLS_X509_FMT_DER)
1020 != GNUTLS_E_SUCCESS)
1022 gnutls_x509_crt_get_pk_algorithm (cert, &bits);
1023 gnutls_x509_crt_deinit (cert);
1030 g_message (
"Unknown command '%s' passed to cert_query", command);
Protos and data structures for CERT functions used by NASL scripts.
tree_cell * nasl_cert_open(lex_ctxt *lexic)
tree_cell * nasl_cert_query(lex_ctxt *lexic)
tree_cell * nasl_cert_close(lex_ctxt *lexic)
int get_var_type_by_num(lex_ctxt *, int)
Returns NASL variable/cell type, VAR2_UNDEF if value is NULL.
struct struct_lex_ctxt lex_ctxt
int get_var_size_by_num(lex_ctxt *, int)
char * get_str_var_by_num(lex_ctxt *, int)
long int get_int_var_by_num(lex_ctxt *, int, int)
long int get_int_var_by_name(lex_ctxt *, const char *, int)
tree_cell * alloc_typed_cell(int typ)
int add_var_to_list(nasl_array *a, int i, const anon_nasl_var *v)
struct st_a_nasl_var anon_nasl_var
struct st_nasl_array nasl_array
union TC::@332262321161220155002104006201360276211317150140 x
union st_a_nasl_var::@154137074032032170165360023270032033276061363156 v
Define a string struct for storing the response.