summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCarl Hetherington <cth@carlh.net>2013-01-05 23:14:49 +0000
committerCarl Hetherington <cth@carlh.net>2013-01-05 23:14:49 +0000
commitc1204f68f6ede72bbaefe853e3ebf6e24b3a9f8b (patch)
treea716967da25d3c832954637ddb89742e340301e7 /src
parentfd8a665cbb0a9a44995f88567747e2379a6f4098 (diff)
Add certificate thumbprint method.
Diffstat (limited to 'src')
-rw-r--r--src/certificates.cc42
-rw-r--r--src/certificates.h21
-rw-r--r--src/dcp.cc2
-rw-r--r--src/util.cc1
4 files changed, 64 insertions, 2 deletions
diff --git a/src/certificates.cc b/src/certificates.cc
index ac7e20f7..6ed32dca 100644
--- a/src/certificates.cc
+++ b/src/certificates.cc
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2012 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.
+
+*/
+
#include <sstream>
#include <vector>
#include <boost/algorithm/string.hpp>
@@ -5,6 +24,7 @@
#include <openssl/ssl.h>
#include <openssl/asn1.h>
#include <libxml++/nodes/element.h>
+#include "KM_util.h"
#include "certificates.h"
#include "exceptions.h"
@@ -106,6 +126,27 @@ Certificate::serial () const
return st;
}
+string
+Certificate::thumbprint () const
+{
+ uint8_t buffer[8192];
+ uint8_t* p = buffer;
+ i2d_X509_CINF (_certificate->cert_info, &p);
+ int const length = p - buffer;
+ if (length > 8192) {
+ throw MiscError ("buffer too small to generate thumbprint");
+ }
+
+ SHA_CTX sha;
+ SHA1_Init (&sha);
+ SHA1_Update (&sha, buffer, length);
+ uint8_t digest[20];
+ SHA1_Final (digest, &sha);
+
+ char digest_base64[64];
+ return Kumu::base64encode (digest, 20, digest_base64, 64);
+}
+
/** @param filename Text file of PEM-format certificates,
* in the order:
*
@@ -153,3 +194,4 @@ CertificateChain::leaf_to_root () const
c.reverse ();
return c;
}
+
diff --git a/src/certificates.h b/src/certificates.h
index 1c342acb..0b7127c8 100644
--- a/src/certificates.h
+++ b/src/certificates.h
@@ -1,3 +1,22 @@
+/*
+ Copyright (C) 2012 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.
+
+*/
+
#ifndef LIBDCP_CERTIFICATES_H
#define LIBDCP_CERTIFICATES_H
@@ -26,6 +45,8 @@ public:
std::string serial () const;
std::string subject () const;
+ std::string thumbprint () const;
+
static std::string name_for_xml (std::string const &);
private:
diff --git a/src/dcp.cc b/src/dcp.cc
index a282c33e..efa0e510 100644
--- a/src/dcp.cc
+++ b/src/dcp.cc
@@ -631,7 +631,7 @@ CPL::make_kdm (CertificateChain const & certificates, string const & signer_key,
authorized_device_info->add_child("DeviceListDescription")->add_child_text(recipient_cert->subject());
{
xmlpp::Element* device_list = authorized_device_info->add_child("DeviceList");
- device_list->add_child("CertificateThumbprint")->add_child_text("XXX");
+ device_list->add_child("CertificateThumbprint")->add_child_text(recipient_cert->thumbprint());
}
}
diff --git a/src/util.cc b/src/util.cc
index ea6f6c0d..f2ee35e3 100644
--- a/src/util.cc
+++ b/src/util.cc
@@ -97,7 +97,6 @@ libdcp::make_digest (string filename, boost::signals2::signal<void (float)>* pro
byte_t byte_buffer[20];
SHA1_Final (byte_buffer, &sha);
- stringstream s;
char digest[64];
return Kumu::base64encode (byte_buffer, 20, digest, 64);
}