/* Copyright (c) 2014, Google Inc.
 *
 * Permission to use, copy, modify, and/or distribute this software for any
 * purpose with or without fee is hereby granted, provided that the above
 * copyright notice and this permission notice appear in all copies.
 *
 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY
 * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
 * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
 * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */

#ifndef OPENSSL_HEADER_PKCS7_H
#define OPENSSL_HEADER_PKCS7_H

#include <openssl/base.h>

//==============================================================================
// Samsung patch. Add CMS, OCSP and PKCS7 support for Email application.
#ifdef SAMSUNG_VNDK_EXT
#include <openssl/asn1.h>
#include <openssl/bio.h>
#include <openssl/x509.h>
#include <openssl/asn1t.h>
#include <openssl/ossl_typ.h>
#endif
//==============================================================================
#include <openssl/stack.h>

#if defined(__cplusplus)
extern "C" {
#endif


// PKCS#7.
//
// This library contains functions for extracting information from PKCS#7
// structures (RFC 2315).

DECLARE_STACK_OF(CRYPTO_BUFFER)
DECLARE_STACK_OF(X509)
DECLARE_STACK_OF(X509_CRL)

// PKCS7_get_raw_certificates parses a PKCS#7, SignedData structure from |cbs|
// and appends the included certificates to |out_certs|. It returns one on
// success and zero on error.
OPENSSL_EXPORT int PKCS7_get_raw_certificates(
    STACK_OF(CRYPTO_BUFFER) *out_certs, CBS *cbs, CRYPTO_BUFFER_POOL *pool);

// PKCS7_get_certificates behaves like |PKCS7_get_raw_certificates| but parses
// them into |X509| objects.
OPENSSL_EXPORT int PKCS7_get_certificates(STACK_OF(X509) *out_certs, CBS *cbs);

// PKCS7_bundle_certificates appends a PKCS#7, SignedData structure containing
// |certs| to |out|. It returns one on success and zero on error.
OPENSSL_EXPORT int PKCS7_bundle_certificates(
    CBB *out, const STACK_OF(X509) *certs);

// PKCS7_get_CRLs parses a PKCS#7, SignedData structure from |cbs| and appends
// the included CRLs to |out_crls|. It returns one on success and zero on
// error.
OPENSSL_EXPORT int PKCS7_get_CRLs(STACK_OF(X509_CRL) *out_crls, CBS *cbs);

// PKCS7_bundle_CRLs appends a PKCS#7, SignedData structure containing
// |crls| to |out|. It returns one on success and zero on error.
OPENSSL_EXPORT int PKCS7_bundle_CRLs(CBB *out, const STACK_OF(X509_CRL) *crls);

// PKCS7_get_PEM_certificates reads a PEM-encoded, PKCS#7, SignedData structure
// from |pem_bio| and appends the included certificates to |out_certs|. It
// returns one on success and zero on error.
OPENSSL_EXPORT int PKCS7_get_PEM_certificates(STACK_OF(X509) *out_certs,
                                              BIO *pem_bio);

// PKCS7_get_PEM_CRLs reads a PEM-encoded, PKCS#7, SignedData structure from
// |pem_bio| and appends the included CRLs to |out_crls|. It returns one on
// success and zero on error.
OPENSSL_EXPORT int PKCS7_get_PEM_CRLs(STACK_OF(X509_CRL) *out_crls,
                                      BIO *pem_bio);


//==============================================================================
// Samsung patch. Add CMS, OCSP and PKCS7 support for Email application.
#ifdef SAMSUNG_VNDK_EXT

#ifdef OPENSSL_SYS_WIN32
// Under Win32 these are defined in wincrypt.h
#undef PKCS7_ISSUER_AND_SERIAL
#undef PKCS7_SIGNER_INFO
#endif

// Encryption_ID           DES-CBC
// Digest_ID               MD5
// Digest_Encryption_ID    rsaEncryption
// Key_Encryption_ID       rsaEncryption

typedef struct pkcs7_issuer_and_serial_st {
  X509_NAME *issuer;
  ASN1_INTEGER *serial;
} PKCS7_ISSUER_AND_SERIAL;

typedef struct pkcs7_signer_info_st {
  ASN1_INTEGER *version; // version 1
  PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
  X509_ALGOR *digest_alg;
  STACK_OF(X509_ATTRIBUTE) *auth_attr; // [ 0 ]
  X509_ALGOR *digest_enc_alg;
  ASN1_OCTET_STRING *enc_digest;
  STACK_OF(X509_ATTRIBUTE) *unauth_attr; // [ 1 ]

  // The private key to sign with
  EVP_PKEY *pkey;
} PKCS7_SIGNER_INFO;

DEFINE_STACK_OF(PKCS7_SIGNER_INFO)

DECLARE_STACK_OF(PKCS7_SIGNER_INFO)
DECLARE_ASN1_SET_OF(PKCS7_SIGNER_INFO)

typedef struct pkcs7_recip_info_st {
  ASN1_INTEGER *version; // version 0
  PKCS7_ISSUER_AND_SERIAL *issuer_and_serial;
  X509_ALGOR *key_enc_algor;
  ASN1_OCTET_STRING *enc_key;
  X509 *cert; // get the pub-key from this
} PKCS7_RECIP_INFO;

DEFINE_STACK_OF(PKCS7_RECIP_INFO)

DECLARE_STACK_OF(PKCS7_RECIP_INFO)
DECLARE_ASN1_SET_OF(PKCS7_RECIP_INFO)

typedef struct pkcs7_signed_st {
  ASN1_INTEGER *version; // version 1
  STACK_OF(X509_ALGOR) *md_algs; // md used
  STACK_OF(X509) *cert; // [ 0 ]
  STACK_OF(X509_CRL) *crl; // [ 1 ]
  STACK_OF(PKCS7_SIGNER_INFO) *signer_info;

  struct pkcs7_st *contents;
} PKCS7_SIGNED;
// The above structure is very very similar to PKCS7_SIGN_ENVELOPE.
// How about merging the two?

typedef struct pkcs7_enc_content_st {
  ASN1_OBJECT *content_type;
  X509_ALGOR *algorithm;
  ASN1_OCTET_STRING *enc_data; // [ 0 ]
  const EVP_CIPHER *cipher;
} PKCS7_ENC_CONTENT;

typedef struct pkcs7_enveloped_st {
  ASN1_INTEGER *version; // version 0
  STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;
  PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENVELOPE;

typedef struct pkcs7_signedandenveloped_st {
  ASN1_INTEGER *version; // version 1
  STACK_OF(X509_ALGOR) *md_algs; // md used
  STACK_OF(X509) *cert; // [ 0 ]
  STACK_OF(X509_CRL) *crl; // [ 1 ]
  STACK_OF(PKCS7_SIGNER_INFO) *signer_info;

  PKCS7_ENC_CONTENT *enc_data;
  STACK_OF(PKCS7_RECIP_INFO) *recipientinfo;
} PKCS7_SIGN_ENVELOPE;

typedef struct pkcs7_digest_st {
  ASN1_INTEGER *version; // version 0
  X509_ALGOR *md; // md used
  struct pkcs7_st *contents;
  ASN1_OCTET_STRING *digest;
} PKCS7_DIGEST;

typedef struct pkcs7_encrypted_st {
  ASN1_INTEGER *version; // version 0
  PKCS7_ENC_CONTENT *enc_data;
} PKCS7_ENCRYPT;

typedef struct pkcs7_st {
  // The following is non NULL if it contains ASN1 encoding of this structure
  unsigned char *asn1;
  long length;

#define PKCS7_S_HEADER  0
#define PKCS7_S_BODY    1
#define PKCS7_S_TAIL    2
  int state; // used during processing

  int detached;

  ASN1_OBJECT *type;
  // content as defined by the type
  // all encryption/message digests are applied to the 'contents',
  // leaving out the 'type' field.
  union {
    char *ptr;

    // NID_pkcs7_data
    ASN1_OCTET_STRING *data;

    // NID_pkcs7_signed
    PKCS7_SIGNED *sign;

    // NID_pkcs7_enveloped
    PKCS7_ENVELOPE *enveloped;

    // NID_pkcs7_signedAndEnveloped
    PKCS7_SIGN_ENVELOPE *signed_and_enveloped;

    // NID_pkcs7_digest
    PKCS7_DIGEST *digest;

    // NID_pkcs7_encrypted
    PKCS7_ENCRYPT *encrypted;

    // Anything else
    ASN1_TYPE *other;
  } d;
} PKCS7;

DECLARE_STACK_OF(PKCS7)
DECLARE_ASN1_SET_OF(PKCS7)

#define PKCS7_OP_SET_DETACHED_SIGNATURE 1
#define PKCS7_OP_GET_DETACHED_SIGNATURE 2

#define PKCS7_get_signed_attributes(si) ((si)->auth_attr)
#define PKCS7_get_attributes(si) ((si)->unauth_attr)

#define PKCS7_type_is_signed(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_signed)
#define PKCS7_type_is_encrypted(a) \
    (OBJ_obj2nid((a)->type) == NID_pkcs7_encrypted)
#define PKCS7_type_is_enveloped(a) \
    (OBJ_obj2nid((a)->type) == NID_pkcs7_enveloped)
#define PKCS7_type_is_signedAndEnveloped(a) \
    (OBJ_obj2nid((a)->type) == NID_pkcs7_signedAndEnveloped)
#define PKCS7_type_is_data(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_data)
#define PKCS7_type_is_digest(a) (OBJ_obj2nid((a)->type) == NID_pkcs7_digest)

#define PKCS7_set_detached(p,v) \
    PKCS7_ctrl(p,PKCS7_OP_SET_DETACHED_SIGNATURE,v,NULL)
#define PKCS7_get_detached(p) \
    PKCS7_ctrl(p,PKCS7_OP_GET_DETACHED_SIGNATURE,0,NULL)

#define PKCS7_is_detached(p7) \
    (PKCS7_type_is_signed(p7) && PKCS7_get_detached(p7))

// S/MIME related flags
#define PKCS7_TEXT          0x1
#define PKCS7_NOCERTS       0x2
#define PKCS7_NOSIGS        0x4
#define PKCS7_NOCHAIN       0x8
#define PKCS7_NOINTERN      0x10
#define PKCS7_NOVERIFY      0x20
#define PKCS7_DETACHED      0x40
#define PKCS7_BINARY        0x80
#define PKCS7_NOATTR        0x100
#define PKCS7_NOSMIMECAP    0x200
#define PKCS7_NOOLDMIMETYPE 0x400
#define PKCS7_CRLFEOL       0x800
#define PKCS7_STREAM        0x1000
#define PKCS7_NOCRL         0x2000
#define PKCS7_PARTIAL       0x4000
#define PKCS7_REUSE_DIGEST  0x8000

// Flags: for compatibility with older code
#define SMIME_TEXT      PKCS7_TEXT
#define SMIME_NOCERTS   PKCS7_NOCERTS
#define SMIME_NOSIGS    PKCS7_NOSIGS
#define SMIME_NOCHAIN   PKCS7_NOCHAIN
#define SMIME_NOINTERN  PKCS7_NOINTERN
#define SMIME_NOVERIFY  PKCS7_NOVERIFY
#define SMIME_DETACHED  PKCS7_DETACHED
#define SMIME_BINARY    PKCS7_BINARY
#define SMIME_NOATTR    PKCS7_NOATTR

DECLARE_ASN1_FUNCTIONS(PKCS7_ISSUER_AND_SERIAL)

OPENSSL_EXPORT int PKCS7_ISSUER_AND_SERIAL_digest(PKCS7_ISSUER_AND_SERIAL *data,
    const EVP_MD *type, unsigned char *md, unsigned int *len);
#ifndef OPENSSL_NO_FP_API
OPENSSL_EXPORT PKCS7 *d2i_PKCS7_fp(FILE *fp,PKCS7 **p7);
OPENSSL_EXPORT int i2d_PKCS7_fp(FILE *fp,PKCS7 *p7);
#endif
OPENSSL_EXPORT PKCS7 *PKCS7_dup(PKCS7 *p7);
OPENSSL_EXPORT PKCS7 *d2i_PKCS7_bio(BIO *bp,PKCS7 **p7);
OPENSSL_EXPORT int i2d_PKCS7_bio(BIO *bp,PKCS7 *p7);
OPENSSL_EXPORT int i2d_PKCS7_bio_stream(BIO *out, PKCS7 *p7, BIO *in,
    int flags);
OPENSSL_EXPORT int PEM_write_bio_PKCS7_stream(BIO *out, PKCS7 *p7, BIO *in,
    int flags);

DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNER_INFO)
DECLARE_ASN1_FUNCTIONS(PKCS7_RECIP_INFO)
DECLARE_ASN1_FUNCTIONS(PKCS7_SIGNED)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENC_CONTENT)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENVELOPE)
DECLARE_ASN1_FUNCTIONS(PKCS7_SIGN_ENVELOPE)
DECLARE_ASN1_FUNCTIONS(PKCS7_DIGEST)
DECLARE_ASN1_FUNCTIONS(PKCS7_ENCRYPT)
DECLARE_ASN1_FUNCTIONS(PKCS7)

DECLARE_ASN1_ITEM(PKCS7_ATTR_SIGN)
DECLARE_ASN1_ITEM(PKCS7_ATTR_VERIFY)

DECLARE_ASN1_NDEF_FUNCTION(PKCS7)
DECLARE_ASN1_PRINT_FUNCTION(PKCS7)

OPENSSL_EXPORT long PKCS7_ctrl(PKCS7 *p7, int cmd, long larg, char *parg);

OPENSSL_EXPORT int PKCS7_set_type(PKCS7 *p7, int type);
OPENSSL_EXPORT int PKCS7_set0_type_other(PKCS7 *p7, int type, ASN1_TYPE *other);
OPENSSL_EXPORT int PKCS7_set_content(PKCS7 *p7, PKCS7 *p7_data);
OPENSSL_EXPORT int PKCS7_SIGNER_INFO_set(PKCS7_SIGNER_INFO *p7i, X509 *x509,
    EVP_PKEY *pkey, const EVP_MD *dgst);
OPENSSL_EXPORT int PKCS7_SIGNER_INFO_sign(PKCS7_SIGNER_INFO *si);
OPENSSL_EXPORT int PKCS7_add_signer(PKCS7 *p7, PKCS7_SIGNER_INFO *p7i);
OPENSSL_EXPORT int PKCS7_add_certificate(PKCS7 *p7, X509 *x509);
OPENSSL_EXPORT int PKCS7_add_crl(PKCS7 *p7, X509_CRL *x509);
OPENSSL_EXPORT int PKCS7_content_new(PKCS7 *p7, int nid);
OPENSSL_EXPORT int PKCS7_dataVerify(X509_STORE *cert_store, X509_STORE_CTX *ctx,
    BIO *bio, PKCS7 *p7, PKCS7_SIGNER_INFO *si);
OPENSSL_EXPORT int PKCS7_signatureVerify(BIO *bio, PKCS7 *p7,
    PKCS7_SIGNER_INFO *si, X509 *x509);

OPENSSL_EXPORT BIO *PKCS7_dataInit(PKCS7 *p7, BIO *bio);
OPENSSL_EXPORT int PKCS7_dataFinal(PKCS7 *p7, BIO *bio);
OPENSSL_EXPORT BIO *PKCS7_dataDecode(PKCS7 *p7, EVP_PKEY *pkey, BIO *in_bio,
    X509 *pcert);

OPENSSL_EXPORT PKCS7_SIGNER_INFO *PKCS7_add_signature(PKCS7 *p7, X509 *x509,
    EVP_PKEY *pkey, const EVP_MD *dgst);
OPENSSL_EXPORT X509 *PKCS7_cert_from_signer_info(PKCS7 *p7,
    PKCS7_SIGNER_INFO *si);
OPENSSL_EXPORT int PKCS7_set_digest(PKCS7 *p7, const EVP_MD *md);
OPENSSL_EXPORT STACK_OF(PKCS7_SIGNER_INFO) *PKCS7_get_signer_info(PKCS7 *p7);

OPENSSL_EXPORT PKCS7_RECIP_INFO *PKCS7_add_recipient(PKCS7 *p7, X509 *x509);
OPENSSL_EXPORT void PKCS7_SIGNER_INFO_get0_algs(PKCS7_SIGNER_INFO *si,
    EVP_PKEY **pk, X509_ALGOR **pdig, X509_ALGOR **psig);
OPENSSL_EXPORT void PKCS7_RECIP_INFO_get0_alg(PKCS7_RECIP_INFO *ri,
    X509_ALGOR **penc);
OPENSSL_EXPORT int PKCS7_add_recipient_info(PKCS7 *p7, PKCS7_RECIP_INFO *ri);
OPENSSL_EXPORT int PKCS7_RECIP_INFO_set(PKCS7_RECIP_INFO *p7i, X509 *x509);
OPENSSL_EXPORT int PKCS7_set_cipher(PKCS7 *p7, const EVP_CIPHER *cipher);
OPENSSL_EXPORT int PKCS7_stream(unsigned char ***boundary, PKCS7 *p7);

OPENSSL_EXPORT PKCS7_ISSUER_AND_SERIAL *PKCS7_get_issuer_and_serial(PKCS7 *p7,
    int idx);
OPENSSL_EXPORT ASN1_OCTET_STRING *PKCS7_digest_from_attributes(
    STACK_OF(X509_ATTRIBUTE) *sk);
OPENSSL_EXPORT int PKCS7_add_signed_attribute(PKCS7_SIGNER_INFO *p7si,  int nid,
    int type, void *data);
OPENSSL_EXPORT int PKCS7_add_attribute (PKCS7_SIGNER_INFO *p7si, int nid,
    int atrtype, void *value);
OPENSSL_EXPORT ASN1_TYPE *PKCS7_get_attribute(PKCS7_SIGNER_INFO *si, int nid);
OPENSSL_EXPORT ASN1_TYPE *PKCS7_get_signed_attribute(PKCS7_SIGNER_INFO *si,
    int nid);
OPENSSL_EXPORT int PKCS7_set_signed_attributes(PKCS7_SIGNER_INFO *p7si,
    STACK_OF(X509_ATTRIBUTE) *sk);
OPENSSL_EXPORT int PKCS7_set_attributes(PKCS7_SIGNER_INFO *p7si,
    STACK_OF(X509_ATTRIBUTE) *sk);


OPENSSL_EXPORT PKCS7 *PKCS7_sign(X509 *signcert, EVP_PKEY *pkey,
    STACK_OF(X509) *certs, BIO *data, int flags);

OPENSSL_EXPORT PKCS7_SIGNER_INFO *PKCS7_sign_add_signer(PKCS7 *p7, X509 *signcert,
    EVP_PKEY *pkey, const EVP_MD *md, int flags);

OPENSSL_EXPORT int PKCS7_final(PKCS7 *p7, BIO *data, int flags);
OPENSSL_EXPORT int PKCS7_verify(PKCS7 *p7, STACK_OF(X509) *certs,
    X509_STORE *store, BIO *indata, BIO *out, int flags);
OPENSSL_EXPORT STACK_OF(X509) *PKCS7_get0_signers(PKCS7 *p7,
    STACK_OF(X509) *certs, int flags);
OPENSSL_EXPORT PKCS7 *PKCS7_encrypt(STACK_OF(X509) *certs, BIO *in,
    const EVP_CIPHER *cipher, int flags);
OPENSSL_EXPORT int PKCS7_decrypt(PKCS7 *p7, EVP_PKEY *pkey, X509 *cert,
    BIO *data, int flags);

OPENSSL_EXPORT int PKCS7_add_attrib_smimecap(PKCS7_SIGNER_INFO *si,
    STACK_OF(X509_ALGOR) *cap);
OPENSSL_EXPORT STACK_OF(X509_ALGOR) *PKCS7_get_smimecap(PKCS7_SIGNER_INFO *si);
OPENSSL_EXPORT int PKCS7_simple_smimecap(STACK_OF(X509_ALGOR) *sk, int nid,
    int arg);

OPENSSL_EXPORT int PKCS7_add_attrib_content_type(PKCS7_SIGNER_INFO *si,
    ASN1_OBJECT *coid);
OPENSSL_EXPORT int PKCS7_add0_attrib_signing_time(PKCS7_SIGNER_INFO *si,
    ASN1_TIME *t);
OPENSSL_EXPORT int PKCS7_add1_attrib_digest(PKCS7_SIGNER_INFO *si,
    const unsigned char *md, int mdlen);

OPENSSL_EXPORT int SMIME_write_PKCS7(BIO *bio, PKCS7 *p7, BIO *data, int flags);
OPENSSL_EXPORT PKCS7 *SMIME_read_PKCS7(BIO *bio, BIO **bcont);

OPENSSL_EXPORT BIO *BIO_new_PKCS7(BIO *out, PKCS7 *p7);

OPENSSL_EXPORT void ERR_load_PKCS7_strings(void);
#endif
//==============================================================================

#if defined(__cplusplus)
}  // extern C
#endif

#define PKCS7_R_BAD_PKCS7_VERSION 100
#define PKCS7_R_NOT_PKCS7_SIGNED_DATA 101
#define PKCS7_R_NO_CERTIFICATES_INCLUDED 102
#define PKCS7_R_NO_CRLS_INCLUDED 103

//==============================================================================
// Samsung patch. Add CMS, OCSP and PKCS7 support for Email application.
#ifdef SAMSUNG_VNDK_EXT

// Error codes for the PKCS7 functions.
// Reason codes.
#define PKCS7_R_CERTIFICATE_VERIFY_ERROR                   104
#define PKCS7_R_CIPHER_HAS_NO_OBJECT_IDENTIFIER            105
#define PKCS7_R_CIPHER_NOT_INITIALIZED                     106
#define PKCS7_R_CONTENT_AND_DATA_PRESENT                   107
#define PKCS7_R_CTRL_ERROR                                 108
#define PKCS7_R_DECODE_ERROR                               109
#define PKCS7_R_DECRYPTED_KEY_IS_WRONG_LENGTH              110
#define PKCS7_R_DECRYPT_ERROR                              111
#define PKCS7_R_DIGEST_FAILURE                             112
#define PKCS7_R_ENCRYPTION_CTRL_FAILURE                    113
#define PKCS7_R_ENCRYPTION_NOT_SUPPORTED_FOR_THIS_KEY_TYPE 114
#define PKCS7_R_ERROR_ADDING_RECIPIENT                     115
#define PKCS7_R_ERROR_SETTING_CIPHER                       116
#define PKCS7_R_INVALID_MIME_TYPE                          117
#define PKCS7_R_INVALID_NULL_POINTER                       118
#define PKCS7_R_INVALID_SIGNED_DATA_TYPE                   119
#define PKCS7_R_MIME_NO_CONTENT_TYPE                       120
#define PKCS7_R_MIME_PARSE_ERROR                           121
#define PKCS7_R_MIME_SIG_PARSE_ERROR                       122
#define PKCS7_R_MISSING_CERIPEND_INFO                      123
#define PKCS7_R_NO_CONTENT                                 124
#define PKCS7_R_NO_CONTENT_TYPE                            125
#define PKCS7_R_NO_DEFAULT_DIGEST                          126
#define PKCS7_R_NO_MATCHING_DIGEST_TYPE_FOUND              127
#define PKCS7_R_NO_MULTIPART_BODY_FAILURE                  128
#define PKCS7_R_NO_MULTIPART_BOUNDARY                      129
#define PKCS7_R_NO_RECIPIENT_MATCHES_CERTIFICATE           130
#define PKCS7_R_NO_RECIPIENT_MATCHES_KEY                   131
#define PKCS7_R_NO_SIGNATURES_ON_DATA                      132
#define PKCS7_R_NO_SIGNERS                                 133
#define PKCS7_R_NO_SIG_CONTENT_TYPE                        134
#define PKCS7_R_OPERATION_NOT_SUPPORTED_ON_THIS_TYPE       135
#define PKCS7_R_PKCS7_ADD_SIGNATURE_ERROR                  136
#define PKCS7_R_PKCS7_ADD_SIGNER_ERROR                     137
#define PKCS7_R_PKCS7_DATAFINAL                            138
#define PKCS7_R_PKCS7_DATAFINAL_ERROR                      139
#define PKCS7_R_PKCS7_DATASIGN                             140
#define PKCS7_R_PKCS7_PARSE_ERROR                          141
#define PKCS7_R_PKCS7_SIG_PARSE_ERROR                      142
#define PKCS7_R_PRIVATE_KEY_DOES_NOT_MATCH_CERTIFICATE     143
#define PKCS7_R_SIGNATURE_FAILURE                          144
#define PKCS7_R_SIGNER_CERTIFICATE_NOT_FOUND               145
#define PKCS7_R_SIGNING_CTRL_FAILURE                       146
#define PKCS7_R_SIGNING_NOT_SUPPORTED_FOR_THIS_KEY_TYPE    147
#define PKCS7_R_SIG_INVALID_MIME_TYPE                      148
#define PKCS7_R_SMIME_TEXT_ERROR                           149
#define PKCS7_R_UNABLE_TO_FIND_CERTIFICATE                 150
#define PKCS7_R_UNABLE_TO_FIND_MEM_BIO                     151
#define PKCS7_R_UNABLE_TO_FIND_MESSAGE_DIGEST              152
#define PKCS7_R_UNKNOWN_DIGEST_TYPE                        153
#define PKCS7_R_UNKNOWN_OPERATION                          154
#define PKCS7_R_UNSUPPORTED_CIPHER_TYPE                    155
#define PKCS7_R_UNSUPPORTED_CONTENT_TYPE                   156
#define PKCS7_R_WRONG_CONTENT_TYPE                         157
#define PKCS7_R_WRONG_PKCS7_TYPE                           158

#endif
//==============================================================================

#endif  // OPENSSL_HEADER_PKCS7_H
