1#if !defined(RESIP_SECURITY_HXX)
2#define RESIP_SECURITY_HXX
8#if defined(HAVE_CONFIG_H)
32#include <openssl/ssl.h>
40class MultipartSignedContents;
52 const char*
name() const noexcept
override {
return "SecurityException"; }
187 static void getCertNames(
X509 *cert, std::list<PeerName> &peerNames,
bool useEmailAsSIP =
false);
286 const Data& privateKeyFilename,
const Data& privateKeyPassPhrase);
299 std::list<Data> mCADirectories;
300 std::list<Data> mCAFiles;
struct ssl_ctx_st SSL_CTX
struct evp_pkey_st EVP_PKEY
Handles cross-platform sockets compatibility.
The abstract base-class for all exceptions thrown by resip code.
CipherList(const Data &cipherList)
Exception(const Data &msg, const Data &file, int line)
const char * name() const noexcept override
Data mDefaultPrivateKeyPassPhrase
void addCertDER(PEMType type, const Data &name, const Data &certDER, bool write)
EVP_PKEY * getUserPrivateKey(const Data &aor)
static int getResipConnectionExDataIdx()
virtual void onReadPEM(const Data &name, PEMType type, Data &buffer) const =0
Data getUserPassPhrase(const Data &aor) const
static SecurityTypes::SSLType parseSSLType(const Data &typeName)
Converts a string containing an SSL type name to the corresponding enum value.
Data getUserPrivateKeyDER(const Data &aor) const
static void dumpAsn(const char *, Data)
void generateUserCert(const Data &aor, int expireDays=365, int keyLen=2048)
void addUserCertPEM(const Data &aor, const Data &certPEM)
static bool allowWildcardCertificates()
static long OpenSSLCTXClearOptions
MultipartSignedContents * signAndEncrypt(const Data &senderAor, Contents *, const Data &recipCertName)
bool hasUserCert(const Data &aor) const
void addPrivateKeyPEM(PEMType type, const Data &name, const Data &privateKeyPEM, bool write, const Data &privateKeyPassPhrase=Data::Empty)
void addCertPEM(PEMType type, const Data &name, const Data &certPEM, bool write)
void removeUserPrivateKey(const Data &aor)
PrivateKeyMap mUserPrivateKeys
Data computeIdentity(const Data &signerDomain, const Data &in) const
virtual void onWritePEM(const Data &name, PEMType type, const Data &buffer) const =0
void addRootCertPEM(const Data &x509PEMEncodedRootCerts)
void addUserCertDER(const Data &aor, const Data &certDER)
X509 * getUserCert(const Data &aor)
static Data getCertName(X509 *cert)
virtual void onRemovePEM(const Data &name, PEMType type) const =0
void addUserPrivateKeyDER(const Data &aor, const Data &certDER, const Data &privateKeyPassPhrase=Data::Empty)
static void setAllowWildcardCertificates(bool bEnable)
Contents * checkSignature(MultipartSignedContents *, Data *signedBy, SignatureStatus *sigStat)
void setDHParams(SSL_CTX *ctx)
void addPrivateKeyDER(PEMType type, const Data &name, const Data &privateKeyDER, bool write, const Data &privateKeyPassPhrase=Data::Empty)
Data getPrivateKeyPEM(PEMType type, const Data &name) const
void setUserPassPhrase(const Data &aor, const Data &passPhrase)
void addCertX509(PEMType type, const Data &name, X509 *cert, bool write)
Data getDomainCertDER(const Data &domainName) const
EVP_PKEY * getDomainKey(const Data &domain)
static int matchHostNameWithWildcards(const Data &certificateName, const Data &domainName)
Matches a certificate name, which may hold a wildcard, against the domain name we connected to,...
static CipherList StrongestSuite
void removeDomainPrivateKey(const Data &domainName)
static void getCertNames(X509 *cert, std::list< PeerName > &peerNames, bool useEmailAsSIP=false)
static int matchHostName(const Data &certificateName, const Data &domainName)
Applies the certificate and domain name matching rules.
std::map< Data, EVP_PKEY * > PrivateKeyMap
Contents * decrypt(const Data &decryptorAor, const Pkcs7Contents *)
void removeDomainCert(const Data &domainName)
bool checkIdentity(const Data &signerDomain, const Data &in, const Data &sig, X509 *cert=NULL) const
void removeCert(PEMType type, const Data &name)
void checkAndSetIdentity(SipMessage &msg, const Data &derCert=Data::Empty) const
std::list< X509 * > X509List
static bool mAllowWildcardCertificates
void addPrivateKeyPKEY(PEMType type, const Data &name, EVP_PKEY *pKey, bool write)
bool hasUserPassPhrase(const Data &aor) const
static CipherList ExportableSuite
Data getDomainPrivateKeyPEM(const Data &domainName) const
void addDomainPrivateKeyPEM(const Data &domainName, const Data &privateKeyPEM, const Data &privateKeyPassPhrase=Data::Empty)
std::map< Data, Data > PassPhraseMap
static bool isSelfSigned(const X509 *cert)
bool hasCert(PEMType type, const Data &name, bool logErrors=true) const
void addUserPrivateKeyPEM(const Data &aor, const Data &certPEM, const Data &privateKeyPassPhrase=Data::Empty)
std::map< Data, X509 * > X509Map
Data getUserCertDER(const Data &aor) const
X509_STORE * mRootTlsCerts
PrivateKeyMap mDomainPrivateKeys
void removeUserCert(const Data &aor)
void addDomainCertDER(const Data &domainName, const Data &certDER)
Data getPrivateKeyDER(PEMType type, const Data &name) const
static long parseOpenSSLCTXOption(const Data &optionName)
Converts a string containing an OpenSSL option name (for SSL_CTX_set_options) to the numeric value fr...
X509_STORE * mRootSslCerts
bool hasUserPrivateKey(const Data &aor) const
void removePrivateKey(PEMType type, const Data &name)
void removeUserPassPhrase(const Data &aor)
static long OpenSSLCTXSetOptions
Note:
bool hasPrivateKey(PEMType type, const Data &name) const
PassPhraseMap mUserPassPhrases
X509 * getDomainCert(const Data &domain)
bool hasDomainPrivateKey(const Data &domainName) const
std::vector< CertificateInfo > CertificateInfoContainer
Data getCertDER(PEMType type, const Data &name) const
CertificateInfoContainer getRootCertDescriptions() const
void addDomainCertPEM(const Data &domainName, const Data &certPEM)
MultipartSignedContents * sign(const Data &senderAor, Contents *)
Data getUserPrivateKeyPEM(const Data &aor) const
Pkcs7Contents * encrypt(Contents *, const Data &recipCertName)
bool hasDomainCert(const Data &domainName, bool logErrors=true) const
Base class for all SIP body types.
An alternative to std::string, encapsulates an arbitrary buffer of bytes.
static const Data Empty
Constant that represents a zero-length data.
SIP body type for holding Multipart-Signed body contents (MIME content-type multipart/signed).
SIP body type for holding PKCS7 contents (MIME content-type application/pkcs7-mime).
void addCADirectory(const Data &caDirectory)
virtual SSL_CTX * createDomainCtx(const SSL_METHOD *method, const Data &domain, const Data &certificateFilename, const Data &privateKeyFilename, const Data &privateKeyPassPhrase)
Throws BaseSecurity::Exception if the certificate or private key can't be loaded; nothing is left all...
virtual void onWritePEM(const Data &name, PEMType type, const Data &buffer) const
virtual void onReadPEM(const Data &name, PEMType type, Data &buffer) const
virtual void updateDomainCtx(SSL_CTX *ctx, const Data &domain, const Data &certificateFilename, const Data &privateKeyFilename, const Data &privateKeyPassPhrase)
Loads the domain's certificate chain and private key into ctx.
virtual void onRemovePEM(const Data &name, PEMType type) const
void loadCAFile(const Data &fileName)
void addCAFile(const Data &caFile)
void loadCADirectory(const Data &directoryName)
Represents a SIP message.
SSLType
Note: Before adding to the SSLType enum, please see the comments about mTlsCtx in resip/stack/ssl/Sec...
dcm! – add UnusedChecking(_enum) below;
PeerName(NameType type, Data name)