diff --git a/legacy/eet/src/lib/Eet.h b/legacy/eet/src/lib/Eet.h index 2ad5aa29ed..c09dcf6722 100644 --- a/legacy/eet/src/lib/Eet.h +++ b/legacy/eet/src/lib/Eet.h @@ -313,6 +313,14 @@ extern "C" { */ EAPI const void *eet_identity_signature(Eet_File *ef, int *signature_length); + /** + * Get the SHA1 associated with a file. Could be the one used to sign the data + * or if the data where not signed, it will be the SHA1 of the file. + * + * @since 2.0.0 + */ + EAPI const void *eet_identity_sha1(Eet_File *ef, int *sha1_length); + /** * Display the x509 der certificate to out. * diff --git a/legacy/eet/src/lib/Eet_private.h b/legacy/eet/src/lib/Eet_private.h index 1701328c76..c05f203928 100644 --- a/legacy/eet/src/lib/Eet_private.h +++ b/legacy/eet/src/lib/Eet_private.h @@ -72,6 +72,8 @@ const void* eet_identity_check(const void *data_base, unsigned int data_length, const void *signature_base, unsigned int signature_length, const void **raw_signature_base, unsigned int *raw_signature_length, int *x509_length); +void *eet_identity_compute_sha1(const void *data_base, unsigned int data_length, + int *sha1_length); Eet_Error eet_cipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length); Eet_Error eet_decipher(const void *data, unsigned int size, const char *key, unsigned int length, void **result, unsigned int *result_length); Eet_Error eet_identity_sign(FILE *fp, Eet_Key *key); diff --git a/legacy/eet/src/lib/eet_cipher.c b/legacy/eet/src/lib/eet_cipher.c index 9e5fe6a126..ea9c2702a4 100644 --- a/legacy/eet/src/lib/eet_cipher.c +++ b/legacy/eet/src/lib/eet_cipher.c @@ -30,6 +30,10 @@ # endif #endif +#ifdef HAVE_OPENSSL +# include +#endif + #ifdef HAVE_CIPHER # ifdef HAVE_GNUTLS # include @@ -337,6 +341,31 @@ eet_identity_unref(Eet_Key *key) eet_identity_close(key); } +void * +eet_identity_compute_sha1(const void *data_base, unsigned int data_length, + int *sha1_length) +{ + void *result; + +#ifdef HAVE_GNUTLS + result = malloc(gcry_md_get_algo_dlen(GCRY_MD_SHA1)); + if (!result) return NULL; + + gcry_md_hash_buffer(GCRY_MD_SHA1, result, data_base, data_length); +#else +# ifdef HAVE_OPENSSL + result = malloc(SHA_DIGEST_LENGTH); + if (!result) return NULL; + + SHA1(data_base, data_length, result); +# else + result = NULL; +# endif +#endif + + return result; +} + Eet_Error eet_identity_sign(FILE *fp, Eet_Key *key) { @@ -513,11 +542,12 @@ eet_identity_check(const void *data_base, unsigned int data_length, gnutls_x509_crt_init(&cert); gnutls_x509_crt_import(cert, &datum, GNUTLS_X509_FMT_DER); + signature.data = (void *)sign; + signature.size = sign_len; + /* Verify the signature */ datum.data = (void *)data_base; datum.size = data_length; - signature.data = (void *)sign; - signature.size = sign_len; if (!gnutls_x509_crt_verify_data(cert, 0, &datum, &signature)) return NULL; # else diff --git a/legacy/eet/src/lib/eet_lib.c b/legacy/eet/src/lib/eet_lib.c index 8b6f50b184..bbcb07d8fa 100644 --- a/legacy/eet/src/lib/eet_lib.c +++ b/legacy/eet/src/lib/eet_lib.c @@ -90,6 +90,7 @@ struct _Eet_File const unsigned char *data; const void *x509_der; const void *signature; + void *sha1; Eet_File_Mode mode; @@ -99,6 +100,7 @@ struct _Eet_File int data_size; int x509_length; unsigned int signature_length; + unsigned int sha1_length; time_t mtime; @@ -1266,6 +1268,8 @@ eet_memopen_read(const void *data, size_t size) ef->readfp = NULL; ef->data = data; ef->data_size = size; + ef->sha1 = NULL; + ef->sha1_length = 0; return eet_internal_read(ef); } @@ -1382,6 +1386,8 @@ eet_open(const char *file, Eet_File_Mode mode) ef->delete_me_now = 0; ef->data = NULL; ef->data_size = 0; + ef->sha1 = NULL; + ef->sha1_length = 0; ef->ed = (mode == EET_FILE_MODE_WRITE) || (ef->fp == NULL && mode == EET_FILE_MODE_READ_WRITE) ? @@ -1456,6 +1462,16 @@ eet_identity_signature(Eet_File *ef, int *signature_length) return ef->signature; } +EAPI const void * +eet_identity_sha1(Eet_File *ef, int *sha1_length) +{ + if (!ef->sha1) + ef->sha1 = eet_identity_compute_sha1(ef->data, ef->data_size, &ef->sha1_length); + + if (sha1_length) *sha1_length = ef->sha1_length; + return ef->sha1; +} + EAPI Eet_Error eet_identity_set(Eet_File *ef, Eet_Key *key) {