summaryrefslogtreecommitdiff
path: root/src/certificate.h
blob: 6225cf31012c424b02990ae1cfb5669e6478b694 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
/*
    Copyright (C) 2012-2015 Carl Hetherington <cth@carlh.net>

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

*/

/** @file  src/certificate.h
 *  @brief Certificate class.
 */

#ifndef LIBDCP_CERTIFICATE_H
#define LIBDCP_CERTIFICATE_H

#undef X509_NAME
#include <openssl/x509.h>
#include <boost/filesystem.hpp>
#include <string>
#include <list>

class certificates;

namespace xmlpp {
	class Element;
}

namespace dcp {

/** @class Certificate
 *  @brief A wrapper for an X509 certificate.
 *
 *  This class can take a Certificate from a string or an OpenSSL X509 object.
 */
class Certificate
{
public:
	Certificate ()
		: _certificate (0)
		, _public_key (0)
	{}

	Certificate (std::string);
	Certificate (X509 *);
	Certificate (Certificate const &);
	~Certificate ();

	Certificate& operator= (Certificate const &);

	std::string certificate (bool with_begin_end = false) const;
	std::string serial () const;

	std::string issuer () const;

	std::string subject () const;
	std::string subject_common_name () const;
	std::string subject_organization_name () const;
	std::string subject_organizational_unit_name () const;

	X509* x509 () const {
		return _certificate;
	}

	RSA* public_key () const;

	std::string thumbprint () const;

private:
	void read_string (std::string);

	static std::string name_for_xml (X509_NAME *);
	static std::string asn_to_utf8 (ASN1_STRING *);
	static std::string get_name_part (X509_NAME *, int);

	X509* _certificate;
	mutable RSA* _public_key;
};

bool operator== (Certificate const & a, Certificate const & b);
bool operator< (Certificate const & a, Certificate const & b);
std::ostream& operator<< (std::ostream&s, Certificate const & c);

}

#endif