diff --git a/libr/crypto/hash/sha2.c b/libr/crypto/hash/sha2.c index 7f75e25671ba0..a308fa25c88cc 100644 --- a/libr/crypto/hash/sha2.c +++ b/libr/crypto/hash/sha2.c @@ -268,11 +268,10 @@ static const ut64 sha512_initial_hash_value[8] = { * Constant used by SHA256/384/512_End() functions for converting the * digest to a readable hexadecimal character string: */ -static const char * const sha2_hex_digits = "0123456789abcdef"; +static const char sha2_hex_digits[] = "0123456789abcdef"; -/*** SHA-256: *********************************************************/ -R_IPI void r_sha256_init(RSha256Context *context) { +R_IPI void R_SHA2_API(r_sha256_init)(RSha256Context *context) { if (context == (RSha256Context *) 0) { return; } @@ -465,7 +464,7 @@ static void SHA256_Transform(RSha256Context *context, const ut32 *data) { #endif /* SHA2_UNROLL_TRANSFORM */ -R_IPI void r_sha256_update(RSha256Context *context, const ut8 *data, size_t len) { +R_IPI void R_SHA2_API(r_sha256_update)(RSha256Context *context, const ut8 *data, size_t len) { R_RETURN_IF_FAIL (context); if (!data || len == 0) { return; @@ -503,7 +502,7 @@ R_IPI void r_sha256_update(RSha256Context *context, const ut8 *data, size_t len) } } -R_IPI void r_sha256_final(ut8 digest[R_SHA256_DIGEST_LENGTH], RSha256Context *context) { +R_IPI void R_SHA2_API(r_sha256_final)(ut8 digest[R_SHA256_DIGEST_LENGTH], RSha256Context *context) { R_RETURN_IF_FAIL (context); ut32 *d = (ut32 *) digest; unsigned int usedspace; @@ -570,7 +569,7 @@ R_IPI void r_sha256_final(ut8 digest[R_SHA256_DIGEST_LENGTH], RSha256Context *co usedspace = 0; } -R_IPI char *r_sha256_end(RSha256Context *context, char buffer[R_SHA256_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha256_end)(RSha256Context *context, char buffer[R_SHA256_DIGEST_STRING_LENGTH]) { ut8 digest[R_SHA256_DIGEST_LENGTH], *d = digest; int i; @@ -579,7 +578,7 @@ R_IPI char *r_sha256_end(RSha256Context *context, char buffer[R_SHA256_DIGEST_ST } if (buffer) { - r_sha256_final (digest, context); + R_SHA2_API (r_sha256_final) (digest, context); for (i = 0; i < R_SHA256_DIGEST_LENGTH; i++) { *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; *buffer++ = sha2_hex_digits[*d & 0x0f]; @@ -593,15 +592,15 @@ R_IPI char *r_sha256_end(RSha256Context *context, char buffer[R_SHA256_DIGEST_ST return buffer; } -R_IPI char *r_sha256_data(const ut8 *data, size_t len, char digest[R_SHA256_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha256_data)(const ut8 *data, size_t len, char digest[R_SHA256_DIGEST_STRING_LENGTH]) { RSha256Context context; - r_sha256_init (&context); - r_sha256_update (&context, data, len); - return r_sha256_end (&context, digest); + R_SHA2_API (r_sha256_init) (&context); + R_SHA2_API (r_sha256_update) (&context, data, len); + return R_SHA2_API (r_sha256_end) (&context, digest); } /*** SHA-512: *********************************************************/ -R_IPI void r_sha512_init(RSha512Context *context) { +R_IPI void R_SHA2_API(r_sha512_init)(RSha512Context *context) { if (context == (RSha512Context *) 0) { return; } @@ -778,7 +777,7 @@ static void SHA512_Transform(RSha512Context *context, const ut64 *data) { #endif /* SHA2_UNROLL_TRANSFORM */ -R_IPI void r_sha512_update(RSha512Context *context, const ut8 *data, size_t len) { +R_IPI void R_SHA2_API(r_sha512_update)(RSha512Context *context, const ut8 *data, size_t len) { if (!context || !data || len < 1) { return; } @@ -867,7 +866,7 @@ static void SHA512_Last(RSha512Context *context) { SHA512_Transform (context, (ut64 *) context->buffer); } -R_IPI void r_sha512_final(ut8 digest[R_SHA512_DIGEST_LENGTH], RSha512Context *context) { +R_IPI void R_SHA2_API(r_sha512_final)(ut8 digest[R_SHA512_DIGEST_LENGTH], RSha512Context *context) { ut64 *d = (ut64 *) digest; /* Sanity check: */ @@ -898,7 +897,7 @@ R_IPI void r_sha512_final(ut8 digest[R_SHA512_DIGEST_LENGTH], RSha512Context *co r_mem_zero (context, sizeof (*context)); } -R_IPI char *r_sha512_end(RSha512Context *context, char buffer[R_SHA512_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha512_end)(RSha512Context *context, char buffer[R_SHA512_DIGEST_STRING_LENGTH]) { ut8 digest[R_SHA512_DIGEST_LENGTH]; ut8 *d = digest; int i; @@ -909,7 +908,7 @@ R_IPI char *r_sha512_end(RSha512Context *context, char buffer[R_SHA512_DIGEST_ST } if (buffer) { - r_sha512_final (digest, context); + R_SHA2_API (r_sha512_final) (digest, context); for (i = 0; i < R_SHA512_DIGEST_LENGTH; i++) { *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; *buffer++ = sha2_hex_digits[*d & 0x0f]; @@ -923,27 +922,27 @@ R_IPI char *r_sha512_end(RSha512Context *context, char buffer[R_SHA512_DIGEST_ST return buffer; } -R_IPI char *r_sha512_data(const ut8 *data, size_t len, char digest[R_SHA512_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha512_data)(const ut8 *data, size_t len, char digest[R_SHA512_DIGEST_STRING_LENGTH]) { RSha512Context context; - r_sha512_init (&context); - r_sha512_update (&context, data, len); - return r_sha512_end (&context, digest); + R_SHA2_API (r_sha512_init) (&context); + R_SHA2_API (r_sha512_update) (&context, data, len); + return R_SHA2_API (r_sha512_end) (&context, digest); } /*** SHA-384: *********************************************************/ -R_IPI void r_sha384_init(RSha384Context *context) { +R_IPI void R_SHA2_API(r_sha384_init)(RSha384Context *context) { R_RETURN_IF_FAIL (context); memcpy (context->state, sha384_initial_hash_value, R_SHA512_DIGEST_LENGTH); memset (context->buffer, 0, R_SHA384_BLOCK_LENGTH); context->bitcount[0] = context->bitcount[1] = 0; } -R_IPI void r_sha384_update(RSha384Context *context, const ut8 *data, size_t len) { +R_IPI void R_SHA2_API(r_sha384_update)(RSha384Context *context, const ut8 *data, size_t len) { // wat :D 512 is not 384 looks like a bad function name to me - r_sha512_update ((RSha512Context *) context, data, len); + R_SHA2_API (r_sha512_update) ((RSha512Context *) context, data, len); } -R_IPI void r_sha384_final(ut8 digest[R_SHA384_DIGEST_LENGTH], RSha384Context *context) { +R_IPI void R_SHA2_API(r_sha384_final)(ut8 digest[R_SHA384_DIGEST_LENGTH], RSha384Context *context) { ut64 *d = (ut64 *) digest; /* Sanity check: */ @@ -974,7 +973,7 @@ R_IPI void r_sha384_final(ut8 digest[R_SHA384_DIGEST_LENGTH], RSha384Context *co memset (context, 0, sizeof (*context)); } -R_IPI char *r_sha384_end(RSha384Context *context, char buffer[R_SHA384_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha384_end)(RSha384Context *context, char buffer[R_SHA384_DIGEST_STRING_LENGTH]) { ut8 digest[R_SHA384_DIGEST_LENGTH], *d = digest; int i; @@ -984,7 +983,7 @@ R_IPI char *r_sha384_end(RSha384Context *context, char buffer[R_SHA384_DIGEST_ST } if (buffer) { - r_sha384_final (digest, context); + R_SHA2_API (r_sha384_final) (digest, context); for (i = 0; i < sizeof (digest); i++) { *buffer++ = sha2_hex_digits[(*d & 0xf0) >> 4]; @@ -999,9 +998,9 @@ R_IPI char *r_sha384_end(RSha384Context *context, char buffer[R_SHA384_DIGEST_ST return buffer; } -R_IPI char *r_sha384_data(const ut8 *data, size_t len, char digest[R_SHA384_DIGEST_STRING_LENGTH]) { +R_IPI char *R_SHA2_API(r_sha384_data)(const ut8 *data, size_t len, char digest[R_SHA384_DIGEST_STRING_LENGTH]) { RSha384Context context; - r_sha384_init (&context); - r_sha384_update (&context, data, len); - return r_sha384_end (&context, digest); + R_SHA2_API (r_sha384_init) (&context); + R_SHA2_API (r_sha384_update) (&context, data, len); + return R_SHA2_API (r_sha384_end) (&context, digest); } diff --git a/libr/crypto/hash/sha2.h b/libr/crypto/hash/sha2.h index 7cf642fe5fd51..b84edfd156c03 100644 --- a/libr/crypto/hash/sha2.h +++ b/libr/crypto/hash/sha2.h @@ -45,6 +45,10 @@ extern "C" { #if R_CRYPTO_INTERNAL #undef R_IPI #define R_IPI R_UNUSED static +#define IPI static +#define R_SHA2_API(x) __sha2_##x +#else +#define R_SHA2_API(x) x #endif /*** SHA-256/384/512 Various Length Definitions ***********************/ @@ -60,23 +64,23 @@ extern "C" { /*** SHA-256/384/512 Function Prototypes ******************************/ -R_IPI void r_sha256_init(RSha256Context *); -R_IPI void r_sha256_update(RSha256Context*, const ut8*, size_t); -R_IPI void r_sha256_final(ut8[R_SHA256_DIGEST_LENGTH], RSha256Context*); -R_IPI char* r_sha256_end(RSha256Context*, char[R_SHA256_DIGEST_STRING_LENGTH]); -R_IPI char* r_sha256_data(const ut8*, size_t, char[R_SHA256_DIGEST_STRING_LENGTH]); +R_IPI void R_SHA2_API(r_sha256_init)(RSha256Context *); +R_IPI void R_SHA2_API(r_sha256_update)(RSha256Context*, const ut8*, size_t); +R_IPI void R_SHA2_API(r_sha256_final)(ut8[R_SHA256_DIGEST_LENGTH], RSha256Context*); +R_IPI char* R_SHA2_API(r_sha256_end)(RSha256Context*, char[R_SHA256_DIGEST_STRING_LENGTH]); +R_IPI char* R_SHA2_API(r_sha256_data)(const ut8*, size_t, char[R_SHA256_DIGEST_STRING_LENGTH]); -R_IPI void r_sha384_init(RSha384Context*); -R_IPI void r_sha384_update(RSha384Context*, const ut8*, size_t); -R_IPI void r_sha384_final(ut8[R_SHA384_DIGEST_LENGTH], RSha384Context*); -R_IPI char* r_sha384_end(RSha384Context*, char[R_SHA384_DIGEST_STRING_LENGTH]); -R_IPI char* r_sha384_data(const ut8*, size_t, char[R_SHA384_DIGEST_STRING_LENGTH]); +R_IPI void R_SHA2_API(r_sha384_init)(RSha384Context*); +R_IPI void R_SHA2_API(r_sha384_update)(RSha384Context*, const ut8*, size_t); +R_IPI void R_SHA2_API(r_sha384_final)(ut8[R_SHA384_DIGEST_LENGTH], RSha384Context*); +R_IPI char* R_SHA2_API(r_sha384_end)(RSha384Context*, char[R_SHA384_DIGEST_STRING_LENGTH]); +R_IPI char* R_SHA2_API(r_sha384_data)(const ut8*, size_t, char[R_SHA384_DIGEST_STRING_LENGTH]); -R_IPI void r_sha512_init(RSha512Context*); -R_IPI void r_sha512_update(RSha512Context*, const ut8*, size_t); -R_IPI void r_sha512_final(ut8[R_SHA512_DIGEST_LENGTH], RSha512Context*); -R_IPI char* r_sha512_end(RSha512Context*, char[R_SHA512_DIGEST_STRING_LENGTH]); -R_IPI char* r_sha512_data(const ut8*, size_t, char[R_SHA512_DIGEST_STRING_LENGTH]); +R_IPI void R_SHA2_API(r_sha512_init)(RSha512Context*); +R_IPI void R_SHA2_API(r_sha512_update)(RSha512Context*, const ut8*, size_t); +R_IPI void R_SHA2_API(r_sha512_final)(ut8[R_SHA512_DIGEST_LENGTH], RSha512Context*); +R_IPI char* R_SHA2_API(r_sha512_end)(RSha512Context*, char[R_SHA512_DIGEST_STRING_LENGTH]); +R_IPI char* R_SHA2_API(r_sha512_data)(const ut8*, size_t, char[R_SHA512_DIGEST_STRING_LENGTH]); #ifdef __cplusplus } diff --git a/libr/include/rvc.h b/libr/include/rvc.h index 3357bd34ea044..c8b457810d7f5 100644 --- a/libr/include/rvc.h +++ b/libr/include/rvc.h @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2021-2023 - RHL120, pancake */ +/* radare - LGPL - Copyright 2021-2024 - RHL120, pancake */ #ifndef R_RVC_H #define R_RVC_H 1 @@ -42,7 +42,10 @@ typedef bool (*RvcPluginClone)(const struct r_vc_t *rvc, const char *dst); typedef bool (*RvcPluginSave)(struct r_vc_t *vc); typedef Rvc *(*RvcPluginOpen)(const char *path); +// R2_600 typedef char *(*RvcPluginHash)(const ut8 *data, size_t len); + typedef struct rvc_plugin_t { + // TODO: R2_600 - Use RPluginMeta const char *const name; const char *const author; const char *const desc; @@ -60,6 +63,7 @@ typedef struct rvc_plugin_t { RvcPluginClose close; RvcPluginSave save; RvcPluginOpen open; + // R2_600 RvcPluginHash hash; } RvcPlugin; R_API Rvc *rvc_open(const char *rp, RvcType type); diff --git a/libr/util/rvc.c b/libr/util/rvc.c index a8b7a6af56108..0077577a50d77 100644 --- a/libr/util/rvc.c +++ b/libr/util/rvc.c @@ -18,13 +18,15 @@ R_API void rvc_free(Rvc *vc) { } R_API RvcType rvc_repo_type(const char *path) { + R_RETURN_VAL_IF_FAIL (path, RVC_TYPE_INV); const char *paths[] = {".git", ".rvc"}; - const RvcType types[] = {RVC_TYPE_GIT, RVC_TYPE_RVC}; + const RvcType types[] = { RVC_TYPE_GIT, RVC_TYPE_RVC }; size_t i = 0; for (; i < sizeof (paths) / sizeof (char *) && i < sizeof (types) / sizeof (RvcType); i++) { char *p = r_file_new (path, paths[i], NULL); if (r_file_is_directory (p)) { + free (p); return types[i]; } free (p); diff --git a/libr/util/rvc_rvc.c b/libr/util/rvc_rvc.c index 4222ac93fe7ca..2be2b0f241ab2 100644 --- a/libr/util/rvc_rvc.c +++ b/libr/util/rvc_rvc.c @@ -1,4 +1,4 @@ -/* radare - LGPL - Copyright 2021-2022 - RHL120, pancake */ +/* radare - LGPL - Copyright 2021-2024 - RHL120, pancake */ #define R_LOG_ORIGIN "vc.rvc" @@ -22,6 +22,26 @@ static RList *uncommited_rvc(Rvc *rvc); static bool save_rvc(Rvc *vc); extern const RvcPlugin r_vc_plugin_rvc; +static char *sha256_data(const ut8 *data, size_t len) { + RSha256Context ctx; + R_SHA2_API (r_sha256_init) (&ctx); + R_SHA2_API (r_sha256_update) (&ctx, data, len); + char textdigest[R_SHA256_DIGEST_STRING_LENGTH] = {0}; + R_SHA2_API (r_sha256_end) (&ctx, textdigest); + return strdup (textdigest); +} + +static inline char *sha256_file(const char *fname) { + size_t content_length = 0; + char *content = r_file_slurp (fname, &content_length); + if (content) { + char *res = sha256_data ((const ut8 *)content, content_length); + free (content); + return res; + } + return NULL; +} + static void free_blobs(RList *blobs) { if (blobs) { RListIter *iter; @@ -115,25 +135,22 @@ static Rvc *rvc_rvc_new(const char *path) { return rvc_save (rvc)? rvc : NULL; } - static inline void rvc_warn(void) { R_LOG_WARN ("rvc is still under development and can be unstable, be careful"); } +// removes the double slash static char *strip_sys_dir(const char *path) { char *res = strdup (path); char *ptr = res; + const char *dds = (*R_SYS_DIR == '/')? "//": "\\\\"; while (*ptr) { - if (*ptr == *R_SYS_DIR) { - if (ptr[1] == *R_SYS_DIR) { - char *ptr2 = ptr + 1; - while (*ptr2 == *R_SYS_DIR) { - ptr2++; - } - memmove (ptr + 1, ptr2, strlen (ptr2) + 1); - } + char *ss = strstr (ptr, dds); + if (!ss) { + break; } - ptr++; + memmove (ss, ss + 1, strlen (ss)); + ptr = ss; } return res; } @@ -168,7 +185,6 @@ static bool in_rvc_ignore(const RList *ignore, const char *rpf) { } free (stripped); } - } return ret; } @@ -204,28 +220,8 @@ static bool update_blobs(const RList *ignore, RList *blobs, const RList *nh) { free (blob->fname); free (blob); return false; - } -static char *compute_hash(const ut8 *data, size_t len) { - RSha256Context ctx; - r_sha256_init (&ctx); - r_sha256_update (&ctx, data, len); - char textdigest[R_SHA256_DIGEST_STRING_LENGTH] = {0}; - r_sha256_end (&ctx, textdigest); - return strdup (textdigest); -} - -static inline char *sha256_file(const char *fname) { - size_t content_length = 0; - char *content = r_file_slurp (fname, &content_length); - if (content) { - char *res = compute_hash ((const ut8 *)content, content_length); - free (content); - return res; - } - return NULL; -} static bool traverse_files(RList *dst, const char *dir) { char *name; RListIter *iter; @@ -661,7 +657,7 @@ static char *write_commit(Rvc *rvc, const char *message, const char *author, RLi } size_t len = r_strbuf_length (sb); char *content = r_strbuf_drain (sb); - char *commit_hash = compute_hash ((const ut8*)content, len); + char *commit_hash = sha256_data ((const ut8*)content, len); if (commit_hash) { char *commit_path = r_file_new (rvc->path, ".rvc", "commits", commit_hash, NULL); if (!commit_path || !r_file_dump (commit_path, (const ut8*)content, -1, false)) { @@ -791,7 +787,7 @@ R_API bool r_vc_checkout(Rvc *rvc, const char *bname) { return false; } r_list_free (uncommitted); - //Must set to NULL to avoid double r_list_free on fail_ret + // Must set to NULL to avoid double r_list_free on fail_ret uncommitted = NULL; const char *oldb; { @@ -936,6 +932,8 @@ static bool log_rvc(Rvc *rvc) { r_list_free (commits); return ret; } + +// XXX must be static R_API char *curbranch_rvc(Rvc *rvc) { if (!rvc_repo_exists (rvc->path)) { R_LOG_ERROR ("No valid repo in %s", rvc->path); @@ -1196,4 +1194,3 @@ const RvcPlugin r_vc_plugin_rvc = { .save = save_rvc, .open = open_rvc, }; -