]> git.ipfire.org Git - thirdparty/gnutls.git/commitdiff
pkcs7: move writing attributes to pkcs7-attrs.c
authorDmitry Baryshkov <dbaryshkov@gmail.com>
Sun, 24 May 2020 23:02:12 +0000 (02:02 +0300)
committerDmitry Baryshkov <dmitry.baryshkov@linaro.org>
Sun, 11 Sep 2022 14:54:58 +0000 (17:54 +0300)
Move functions that write PKCS7 attributes to pkcs7-attrs.c, they will
be reused by encrypted/enveloped files support.

Signed-off-by: Dmitry Baryshkov <dbaryshkov@gmail.com>
lib/x509/common.h
lib/x509/pkcs7-attrs.c
lib/x509/pkcs7-sign.c
lib/x509/pkcs7_int.h
lib/x509/time.c

index 457d4c4efb917a0348d8386704a9af333bdfcc19..e6e5cdd91e73fdc11367b9401ad4fcd42da5ee69 100644 (file)
@@ -135,7 +135,7 @@ const char *_gnutls_oid_get_asn_desc(const char *oid);
 int _gnutls_x509_set_time(asn1_node c2, const char *where, time_t tim,
                          int force_general);
 int
-_gnutls_x509_set_raw_time(asn1_node c2, const char *where, time_t tim);
+_gnutls_x509_get_raw_time(time_t tim, gnutls_datum_t *out);
 
 int _gnutls_x509_decode_string(unsigned int etype,
                               const uint8_t * der, size_t der_size,
index 25f947276f830bc65b29060d39c4caf4ce17ca52..2ce2cbd4e74b29c9250c8c564d8e575913eb8335 100644 (file)
@@ -32,6 +32,7 @@
 #include <x509_b64.h>
 #include <gnutls/abstract.h>
 #include <gnutls/pkcs7.h>
+#include <pkcs7_int.h>
 
 /**
  * gnutls_pkcs7_add_attr:
@@ -160,3 +161,63 @@ void gnutls_pkcs7_attrs_deinit(gnutls_pkcs7_attrs_t list)
                r = next;
        }
 }
+
+int _gnutls_pkcs7_write_attr(asn1_node c2, const char *root, const char *oid, gnutls_datum_t *data)
+{
+       char name[256];
+       int result;
+
+       result = asn1_write_value(c2, root, "NEW", 1);
+       if (result != ASN1_SUCCESS) {
+               gnutls_assert();
+               return _gnutls_asn2err(result);
+       }
+
+       snprintf(name, sizeof(name), "%s.?LAST.type", root);
+       result = asn1_write_value(c2, name, oid, 1);
+       if (result != ASN1_SUCCESS) {
+               gnutls_assert();
+               return _gnutls_asn2err(result);
+       }
+
+       snprintf(name, sizeof(name), "%s.?LAST.values", root);
+       result = asn1_write_value(c2, name, "NEW", 1);
+       if (result != ASN1_SUCCESS) {
+               gnutls_assert();
+               return _gnutls_asn2err(result);
+       }
+
+       snprintf(name, sizeof(name), "%s.?LAST.values.?1",
+                       root);
+       result = asn1_write_value(c2, name, data->data,
+                       data->size);
+       if (result != ASN1_SUCCESS) {
+               gnutls_assert();
+               return _gnutls_asn2err(result);
+       }
+
+       return 0;
+}
+
+int _gnutls_pkcs7_write_attrs(asn1_node c2, const char *root, gnutls_pkcs7_attrs_t attrs)
+{
+       gnutls_pkcs7_attrs_st *p = attrs;
+       int result;
+
+       if (attrs == NULL) {
+               /* if there are no other attributes delete that field */
+               (void)asn1_write_value(c2, root, NULL, 0);
+       } else {
+               while (p != NULL) {
+                       result = _gnutls_pkcs7_write_attr(c2, root, p->oid, &p->data);
+                       if (result < 0) {
+                               gnutls_assert();
+                               return result;
+                       }
+
+                       p = p->next;
+               }
+       }
+
+       return 0;
+}
index d121c56c8a1c9924a90532e47929ffb42c3e4b61..1bd079263ad710cd00ee544db50e71c93acae478 100644 (file)
@@ -1794,57 +1794,7 @@ static int write_signer_id(asn1_node c2, const char *root,
        return 0;
 }
 
-static int add_attrs(asn1_node c2, const char *root, gnutls_pkcs7_attrs_t attrs,
-                    unsigned already_set)
-{
-       char name[256];
-       gnutls_pkcs7_attrs_st *p = attrs;
-       int result;
-
-       if (attrs == NULL) {
-               /* if there are no other attributes delete that field */
-               if (already_set == 0)
-                       (void)asn1_write_value(c2, root, NULL, 0);
-       } else {
-               while (p != NULL) {
-                       result = asn1_write_value(c2, root, "NEW", 1);
-                       if (result != ASN1_SUCCESS) {
-                               gnutls_assert();
-                               return _gnutls_asn2err(result);
-                       }
-
-                       snprintf(name, sizeof(name), "%s.?LAST.type", root);
-                       result = asn1_write_value(c2, name, p->oid, 1);
-                       if (result != ASN1_SUCCESS) {
-                               gnutls_assert();
-                               return _gnutls_asn2err(result);
-                       }
-
-                       snprintf(name, sizeof(name), "%s.?LAST.values", root);
-                       result = asn1_write_value(c2, name, "NEW", 1);
-                       if (result != ASN1_SUCCESS) {
-                               gnutls_assert();
-                               return _gnutls_asn2err(result);
-                       }
-
-                       snprintf(name, sizeof(name), "%s.?LAST.values.?1",
-                                root);
-                       result =
-                           asn1_write_value(c2, name, p->data.data,
-                                            p->data.size);
-                       if (result != ASN1_SUCCESS) {
-                               gnutls_assert();
-                               return _gnutls_asn2err(result);
-                       }
-
-                       p = p->next;
-               }
-       }
-
-       return 0;
-}
-
-static int write_attributes(asn1_node c2, const char *root,
+static int write_signed_attributes(asn1_node c2, const char *root,
                            const gnutls_datum_t * data,
                            const mac_entry_st * me,
                            gnutls_pkcs7_attrs_t other_attrs, unsigned flags)
@@ -1863,70 +1813,29 @@ static int write_attributes(asn1_node c2, const char *root,
                }
 
                /* Add time */
-               result = asn1_write_value(c2, root, "NEW", 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
+               ret = _gnutls_x509_get_raw_time(gnutls_time(0), &tmp);
+               if (ret < 0)
+                       return gnutls_assert_val(ret);
 
-               snprintf(name, sizeof(name), "%s.?LAST.type", root);
-               result = asn1_write_value(c2, name, ATTR_SIGNING_TIME, 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
+               ret = _gnutls_pkcs7_write_attr(c2, root, ATTR_SIGNING_TIME, &tmp);
+               _gnutls_free_datum(&tmp);
 
-               snprintf(name, sizeof(name), "%s.?LAST.values", root);
-               result = asn1_write_value(c2, name, "NEW", 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
+               if (ret < 0)
+                       return gnutls_assert_val(ret);
+
+               already_set = 1;
+       }
 
-               snprintf(name, sizeof(name), "%s.?LAST.values.?1", root);
-               ret = _gnutls_x509_set_raw_time(c2, name, gnutls_time(0));
+       if (other_attrs || !already_set) {
+               ret = _gnutls_pkcs7_write_attrs(c2, root, other_attrs);
                if (ret < 0) {
                        gnutls_assert();
                        return ret;
                }
-
-               already_set = 1;
-       }
-
-       ret = add_attrs(c2, root, other_attrs, already_set);
-       if (ret < 0) {
-               gnutls_assert();
-               return ret;
        }
 
        if (already_set != 0 || other_attrs != NULL) {
                /* Add content type */
-               result = asn1_write_value(c2, root, "NEW", 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
-
-               snprintf(name, sizeof(name), "%s.?LAST.type", root);
-               result = asn1_write_value(c2, name, ATTR_CONTENT_TYPE, 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
-
-               snprintf(name, sizeof(name), "%s.?LAST.values", root);
-               result = asn1_write_value(c2, name, "NEW", 1);
-               if (result != ASN1_SUCCESS) {
-                       gnutls_assert();
-                       ret = _gnutls_asn2err(result);
-                       return ret;
-               }
-
                ret =
                    _gnutls_x509_get_raw_field(c2,
                                               "encapContentInfo.eContentType",
@@ -1936,13 +1845,10 @@ static int write_attributes(asn1_node c2, const char *root,
                        return ret;
                }
 
-               snprintf(name, sizeof(name), "%s.?LAST.values.?1", root);
-               result = asn1_write_value(c2, name, tmp.data, tmp.size);
+               ret = _gnutls_pkcs7_write_attr(c2, root, ATTR_CONTENT_TYPE, &tmp);
                gnutls_free(tmp.data);
-
-               if (result != ASN1_SUCCESS) {
+               if (ret < 0) {
                        gnutls_assert();
-                       ret = _gnutls_asn2err(result);
                        return ret;
                }
 
@@ -2136,15 +2042,15 @@ int gnutls_pkcs7_sign(gnutls_pkcs7_t pkcs7,
        }
 
        ret =
-           add_attrs(pkcs7->content_data, "signerInfos.?LAST.unsignedAttrs",
-                     unsigned_attrs, 0);
+           _gnutls_pkcs7_write_attrs(pkcs7->content_data, "signerInfos.?LAST.unsignedAttrs",
+                     unsigned_attrs);
        if (ret < 0) {
                gnutls_assert();
                goto cleanup;
        }
 
        ret =
-           write_attributes(pkcs7->content_data,
+           write_signed_attributes(pkcs7->content_data,
                             "signerInfos.?LAST.signedAttrs", data, me,
                             signed_attrs, flags);
        if (ret < 0) {
index 77d02c149b54abb3cdbf6e9c13b040e75f53a9b5..785a8962ce68458c46b3bf48eddde5422daead24 100644 (file)
@@ -134,4 +134,7 @@ _gnutls_pkcs7_data_enc_info(const gnutls_datum_t * data, const struct pkcs_ciphe
 int _gnutls_pkcs7_decode_signed_data(gnutls_pkcs7_t pkcs7);
 int _gnutls_pkcs7_decode_digested_data(gnutls_pkcs7_t pkcs7);
 
+int _gnutls_pkcs7_write_attr(asn1_node c2, const char *root, const char *oid, gnutls_datum_t *data);
+int _gnutls_pkcs7_write_attrs(asn1_node c2, const char *root, gnutls_pkcs7_attrs_t attrs);
+
 #endif /* GNUTLS_LIB_X509_PKCS7_INT_H */
index 272660069bdb75b6e13143c5c7a624d8f6fc96da..d55d10d349ff6dcd266120b93403fa95d04d8911 100644 (file)
@@ -438,10 +438,10 @@ _gnutls_x509_set_time(asn1_node c2, const char *where, time_t tim,
  * which are of the ANY.
  */
 int
-_gnutls_x509_set_raw_time(asn1_node c2, const char *where, time_t tim)
+_gnutls_x509_get_raw_time(time_t tim, gnutls_datum_t *out)
 {
        char str_time[MAX_TIME];
-       uint8_t buf[128];
+       uint8_t *buf;
        int result, len, der_len;
        unsigned tag;
 
@@ -451,18 +451,22 @@ _gnutls_x509_set_raw_time(asn1_node c2, const char *where, time_t tim)
                return gnutls_assert_val(result);
        len = strlen(str_time);
 
+       buf = gnutls_malloc(1 + ASN1_MAX_LENGTH_SIZE + len);
+       if (buf == NULL)
+               return gnutls_assert_val(GNUTLS_E_MEMORY_ERROR);
+
        buf[0] = tag;
        asn1_length_der(len, buf+1, &der_len);
 
-       if ((unsigned)len > sizeof(buf)-der_len-1) {
+       if (der_len > ASN1_MAX_LENGTH_SIZE) {
                return gnutls_assert_val(GNUTLS_E_INTERNAL_ERROR);
        }
 
        memcpy(buf+1+der_len, str_time, len);
 
-       result = asn1_write_value(c2, where, buf, len+1+der_len);
-       if (result != ASN1_SUCCESS)
-               return gnutls_assert_val(_gnutls_asn2err(result));
+       out->size = 1 + der_len + len;
+       out->data = buf;
+
        return 0;
 }