diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/misc.c | 26 | ||||
-rw-r--r-- | lib/misc.h | 1 | ||||
-rw-r--r-- | lib/sha1.c | 50 |
3 files changed, 62 insertions, 15 deletions
@@ -786,3 +786,29 @@ char *str_reject_chars(char *string, const char *reject, char replacement) return string; } + +/* Returns a string that is exactly 'char_len' utf8 characters long (not bytes), + * padded to the right with spaces or truncated with the 'ellipsis' parameter + * if specified (can be NULL). + * Returns a newly allocated string, or NULL on invalid parameters. */ +char *str_pad_and_truncate(const char *string, long char_len, const char *ellipsis) +{ + size_t string_len = strlen(string); + size_t ellipsis_len = (ellipsis) ? strlen(ellipsis) : 0; + long orig_len = g_utf8_strlen(string, -1); + + g_return_val_if_fail(char_len > ellipsis_len, NULL); + + if (orig_len > char_len) { + char *ret = g_malloc(string_len + 1); + g_utf8_strncpy(ret, string, char_len - ellipsis_len); + if (ellipsis) { + g_strlcat(ret, ellipsis, string_len); + } + return ret; + } else if (orig_len < char_len) { + return g_strdup_printf("%s%*s", string, (int) (char_len - orig_len), ""); + } else { + return g_strdup(string); + } +} @@ -150,5 +150,6 @@ G_MODULE_EXPORT char *get_rfc822_header(const char *text, const char *header, in G_MODULE_EXPORT int truncate_utf8(char *string, int maxlen); G_MODULE_EXPORT gboolean parse_int64(char *string, int base, guint64 *number); G_MODULE_EXPORT char *str_reject_chars(char *string, const char *reject, char replacement); +G_MODULE_EXPORT char *str_pad_and_truncate(const char *string, long char_len, const char *ellipsis); #endif @@ -23,14 +23,23 @@ void sha1_finish(sha1_state_t *ctx, guint8 digest[SHA1_HASH_SIZE]) #define HMAC_BLOCK_SIZE 64 -/* BitlBee addition: */ -void sha1_hmac(const char *key_, size_t key_len, const char *payload, size_t payload_len, guint8 digest[SHA1_HASH_SIZE]) +void b_hmac(GChecksumType checksum_type, const char *key_, size_t key_len, + const char *payload, size_t payload_len, guint8 **digest) { - sha1_state_t sha1; - guint8 hash[SHA1_HASH_SIZE]; + GChecksum *checksum; + size_t hash_len; + guint8 *hash; guint8 key[HMAC_BLOCK_SIZE + 1]; int i; + hash_len = g_checksum_type_get_length(checksum_type); + + if (hash_len == (size_t) -1) { + return; + } + + hash = g_malloc(hash_len); + if (key_len == 0) { key_len = strlen(key_); } @@ -42,32 +51,43 @@ void sha1_hmac(const char *key_, size_t key_len, const char *payload, size_t pay otherwise just pad. */ memset(key, 0, HMAC_BLOCK_SIZE + 1); if (key_len > HMAC_BLOCK_SIZE) { - sha1_init(&sha1); - sha1_append(&sha1, (guint8 *) key_, key_len); - sha1_finish(&sha1, key); + checksum = g_checksum_new(checksum_type); + g_checksum_update(checksum, (guint8 *) key_, key_len); + g_checksum_get_digest(checksum, key, &hash_len); + g_checksum_free(checksum); } else { memcpy(key, key_, key_len); } /* Inner part: H(K XOR 0x36, text) */ - sha1_init(&sha1); + checksum = g_checksum_new(checksum_type); for (i = 0; i < HMAC_BLOCK_SIZE; i++) { key[i] ^= 0x36; } - sha1_append(&sha1, key, HMAC_BLOCK_SIZE); - sha1_append(&sha1, (const guint8 *) payload, payload_len); - sha1_finish(&sha1, hash); + g_checksum_update(checksum, key, HMAC_BLOCK_SIZE); + g_checksum_update(checksum, (const guint8 *) payload, payload_len); + g_checksum_get_digest(checksum, hash, &hash_len); + g_checksum_free(checksum); /* Final result: H(K XOR 0x5C, inner stuff) */ - sha1_init(&sha1); + checksum = g_checksum_new(checksum_type); for (i = 0; i < HMAC_BLOCK_SIZE; i++) { key[i] ^= 0x36 ^ 0x5c; } - sha1_append(&sha1, key, HMAC_BLOCK_SIZE); - sha1_append(&sha1, hash, SHA1_HASH_SIZE); - sha1_finish(&sha1, digest); + g_checksum_update(checksum, key, HMAC_BLOCK_SIZE); + g_checksum_update(checksum, hash, hash_len); + g_checksum_get_digest(checksum, *digest, &hash_len); + g_checksum_free(checksum); + + g_free(hash); } +void sha1_hmac(const char *key_, size_t key_len, const char *payload, size_t payload_len, guint8 digest[SHA1_HASH_SIZE]) +{ + b_hmac(G_CHECKSUM_SHA1, key_, key_len, payload, payload_len, &digest); +} + + /* I think this follows the scheme described on: http://en.wikipedia.org/wiki/Universally_unique_identifier#Version_4_.28random.29 My random data comes from a SHA1 generator but hey, it's random enough for |