mirror of
https://boringssl.googlesource.com/boringssl
synced 2026-07-21 14:43:51 +00:00
945f4a5d8f
Change-Id: If581dcdf063c3b45237a424f0dade7a033151893 Reviewed-on: https://boringssl-review.googlesource.com/c/boringssl/+/83267 Commit-Queue: Adam Langley <agl@google.com> Auto-Submit: David Benjamin <davidben@google.com> Reviewed-by: Adam Langley <agl@google.com>
147 lines
5.8 KiB
C
147 lines
5.8 KiB
C
// Copyright 2025 The BoringSSL Authors
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// https://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
|
|
#ifndef OPENSSL_HEADER_CMS_H
|
|
#define OPENSSL_HEADER_CMS_H
|
|
|
|
#include <openssl/base.h> // IWYU pragma: export
|
|
|
|
#include <openssl/stack.h>
|
|
|
|
#if defined(__cplusplus)
|
|
extern "C" {
|
|
#endif
|
|
|
|
|
|
// CMS.
|
|
//
|
|
// This library contains functions for implementing a small subset of OpenSSL's
|
|
// API for CMS (RFC 5652). A general CMS implementation, notably one suitable
|
|
// for S/MIME, is out of scope for BoringSSL.
|
|
//
|
|
// As this library is intentionally not a general CMS implementation, BoringSSL
|
|
// continues to define |OPENSSL_NO_CMS|, so that most callers turn off their
|
|
// general-purpose CMS code. In callers that are compatible with this subset,
|
|
// the |BORINGSSL_NO_NO_CMS| build option can be used to suppress
|
|
// |OPENSSL_NO_CMS|.
|
|
|
|
DECLARE_STACK_OF(X509)
|
|
|
|
// CMS_* are flags that can be passed to functions in this library. Their
|
|
// interpretation is specified in the corresponding functions.
|
|
#define CMS_NOCERTS 0x2
|
|
#define CMS_DETACHED 0x40
|
|
#define CMS_BINARY 0x80
|
|
#define CMS_NOATTR 0x100
|
|
#define CMS_NOSMIMECAP 0x200
|
|
#define CMS_STREAM 0x1000
|
|
#define CMS_PARTIAL 0x4000
|
|
#define CMS_USE_KEYID 0x10000
|
|
#define CMS_NO_SIGNING_TIME 0x400000
|
|
|
|
// CMS_sign returns a newly-allocated |CMS_ContentInfo| structure for building a
|
|
// SignedData (RFC 5652), or NULL on error.
|
|
//
|
|
// |certs| must be NULL or zero length. BoringSSL does not support embedding
|
|
// certificates in SignedData.
|
|
//
|
|
// |flags| must contain |CMS_DETACHED|, which indicates an external signature.
|
|
// BoringSSL only supports generating external signatures and does not support
|
|
// embedding encapsulated content directly in a SignedData.
|
|
//
|
|
// If |pkey| is non-NULL, |CMS_add1_signer| is automatically called with
|
|
// |signcert|, |pkey|, a default hash of SHA-256, and |flags|. |flags| will then
|
|
// additionally be interpreted as in |CMS_add1_signer|.
|
|
//
|
|
// If |CMS_PARTIAL| or |CMS_STREAM| is set in |flags|, the object will be left
|
|
// incomplete. |data| will then be ignored and should be NULL. The caller can
|
|
// then continue configuring it and finalizing it with |CMS_final|. Otherwise,
|
|
// the object will be finalized with |data| and |flags| passed to |CMS_final|.
|
|
OPENSSL_EXPORT CMS_ContentInfo *CMS_sign(X509 *signcert, EVP_PKEY *pkey,
|
|
STACK_OF(X509) *certs, BIO *data,
|
|
uint32_t flags);
|
|
|
|
// CMS_ContentInfo_free releases memory associated with |cms|.
|
|
OPENSSL_EXPORT void CMS_ContentInfo_free(CMS_ContentInfo *cms);
|
|
|
|
// CMS_add1_signer adds a signer to |cms|, which must be a SignedData created by
|
|
// |CMS_sign|, with the |CMS_PARTIAL| flag set. The signer will use |signcert|,
|
|
// |pkey|, and |md| for the signing certificate, private key, and digest
|
|
// algorithm, respectively. It returns a non-NULL pointer to the signer on
|
|
// success, and NULL on error. The signer is owned by |cms| and should not be
|
|
// released by the caller.
|
|
//
|
|
// |flags| is interpreted as follows:
|
|
//
|
|
// - |CMS_PARTIAL| must not be set. BoringSSL does not support configuring a
|
|
// signer in multiple steps.
|
|
//
|
|
// - |CMS_NOCERTS| must be set. BoringSSL does not support embedding
|
|
// certificates in SignedData.
|
|
//
|
|
// - |CMS_NOATTR| must be set. BoringSSL does not support attributes in
|
|
// SignedData.
|
|
//
|
|
// - If |CMS_USE_KEYID| is set, SignerInfos will be identified by subject key
|
|
// identifier instead of issuer and serial number. |signcert| must then have
|
|
// the subject key identifier extension.
|
|
//
|
|
// BoringSSL currently only supports one signer per |CMS_ContentInfo|.
|
|
// Subsequent calls will fail. Additionally, only RSA keys are currently
|
|
// supported for |pkey|.
|
|
OPENSSL_EXPORT CMS_SignerInfo *CMS_add1_signer(CMS_ContentInfo *cms,
|
|
X509 *signcert, EVP_PKEY *pkey,
|
|
const EVP_MD *md,
|
|
uint32_t flags);
|
|
|
|
// CMS_final finalizes constructing |cms|, which must have been initialized with
|
|
// the |CMS_PARTIAL| flag. |data| is read, until EOF, as the data to be
|
|
// processed by CMS. It returns one on success and zero on error.
|
|
//
|
|
// |CMS_BINARY| must be set in |flags|. BoringSSL does not support translating
|
|
// inputs according to S/MIME.
|
|
//
|
|
// |dcont| must be NULL. What a non-NULL |dcont| does is not clearly documented
|
|
// by OpenSSL, and there are no tests to demonstrate its behavior.
|
|
OPENSSL_EXPORT int CMS_final(CMS_ContentInfo *cms, BIO *data, BIO *dcont,
|
|
uint32_t flags);
|
|
|
|
// i2d_CMS_bio encodes |cms| as a DER-encoded ContentInfo structure (RFC 5652).
|
|
// It returns one on success and zero on failure.
|
|
OPENSSL_EXPORT int i2d_CMS_bio(BIO *out, CMS_ContentInfo *cms);
|
|
|
|
// i2d_CMS_bio_stream calls |i2d_CMS_bio|. |in| must be NULL and |flags| must
|
|
// not contain |CMS_STREAM|. BoringSSL does not support any streaming modes for
|
|
// CMS.
|
|
OPENSSL_EXPORT int i2d_CMS_bio_stream(BIO *out, CMS_ContentInfo *cms, BIO *in,
|
|
int flags);
|
|
|
|
|
|
#if defined(__cplusplus)
|
|
} // extern C
|
|
|
|
extern "C++" {
|
|
BSSL_NAMESPACE_BEGIN
|
|
|
|
BORINGSSL_MAKE_DELETER(CMS_ContentInfo, CMS_ContentInfo_free)
|
|
|
|
BSSL_NAMESPACE_END
|
|
} // extern C++
|
|
#endif
|
|
|
|
#define CMS_R_CERTIFICATE_HAS_NO_KEYID 100
|
|
#define CMS_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE 101
|
|
|
|
#endif // OPENSSL_HEADER_CMS_H
|