Make ::swap virtual.
[libdcp.git] / src / util.cc
index 9758db9cf030fae331ffbb4d1b9072cb6131774f..ac067a7670233f32581c178d6cf896b553a58dc7 100644 (file)
@@ -26,8 +26,8 @@
 #include "types.h"
 #include "argb_frame.h"
 #include "certificates.h"
-#include "gamma_lut.h"
 #include "xyz_frame.h"
+#include "dcp_assert.h"
 #include "compose.hpp"
 #include "KM_util.h"
 #include "KM_fileio.h"
@@ -155,7 +155,7 @@ dcp::content_kind_to_string (ContentKind kind)
                return "advertisement";
        }
 
-       assert (false);
+       DCP_ASSERT (false);
 }
 
 /** Convert a string from a <ContentKind> node to a libdcp ContentKind.
@@ -190,7 +190,7 @@ dcp::content_kind_from_string (string kind)
                return ADVERTISEMENT;
        }
 
-       assert (false);
+       DCP_ASSERT (false);
 }
 
 /** Decompress a JPEG2000 image to a bitmap.
@@ -370,10 +370,14 @@ dcp::ids_equal (string a, string b)
 }
 
 string
-dcp::file_to_string (boost::filesystem::path p)
+dcp::file_to_string (boost::filesystem::path p, uintmax_t max_length)
 {
        uintmax_t len = boost::filesystem::file_size (p);
-       char* c = new char[len];
+       if (len > max_length) {
+               throw MiscError ("Unexpectedly long file");
+       }
+       
+       char* c = new char[len + 1];
                           
        FILE* f = fopen_boost (p, "r");
        if (!f) {
@@ -382,9 +386,32 @@ dcp::file_to_string (boost::filesystem::path p)
 
        fread (c, 1, len, f);
        fclose (f);
+       c[len] = '\0';
 
        string s (c);
        delete[] c;
 
        return s;
 }
+
+/** @param key RSA private key in PEM format (optionally with -----BEGIN... / -----END...)
+ *  @return SHA1 fingerprint of key
+ */
+string
+dcp::private_key_fingerprint (string key)
+{
+       boost::replace_all (key, "-----BEGIN RSA PRIVATE KEY-----\n", "");
+       boost::replace_all (key, "\n-----END RSA PRIVATE KEY-----\n", "");
+
+       unsigned char buffer[4096];
+       int const N = base64_decode (key, buffer, sizeof (buffer));
+
+       SHA_CTX sha;
+       SHA1_Init (&sha);
+       SHA1_Update (&sha, buffer, N);
+       uint8_t digest[20];
+       SHA1_Final (digest, &sha);
+
+       char digest_base64[64];
+       return Kumu::base64encode (digest, 20, digest_base64, 64);
+}