X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Futil.cc;h=ac067a7670233f32581c178d6cf896b553a58dc7;hb=1dc082f3295f64a9fd4a103078a1dbb5121a865d;hp=9758db9cf030fae331ffbb4d1b9072cb6131774f;hpb=9026320cc48e9c200d33aae9e8f601f29542e186;p=libdcp.git diff --git a/src/util.cc b/src/util.cc index 9758db9c..ac067a76 100644 --- a/src/util.cc +++ b/src/util.cc @@ -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); +}