+
+ _assert(PKCS7_set_type(value_, NID_pkcs7_signed));
+ _assert(PKCS7_content_new(value_, NID_pkcs7_data));
+
+ STACK_OF(X509) *certs(stuff);
+ for (unsigned i(0), e(sk_X509_num(certs)); i != e; i++)
+ _assert(PKCS7_add_certificate(value_, sk_X509_value(certs, e - i - 1)));
+
+ auto info(PKCS7_sign_add_signer(value_, stuff, stuff, NULL, PKCS7_NOSMIMECAP));
+ _assert(info != NULL);
+
+ PKCS7_set_detached(value_, 1);
+
+ ASN1_OCTET_STRING *string(ASN1_OCTET_STRING_new());
+ _assert(string != NULL);
+ try {
+ _assert(ASN1_STRING_set(string, xml.data(), xml.size()));
+
+ static auto nid(OBJ_create("1.2.840.113635.100.9.1", "", ""));
+ _assert(PKCS7_add_signed_attribute(info, nid, V_ASN1_OCTET_STRING, string));
+ } catch (...) {
+ ASN1_OCTET_STRING_free(string);
+ throw;
+ }
+
+ _assert(PKCS7_final(value_, data, PKCS7_BINARY));