aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/misc.c26
-rw-r--r--lib/misc.h1
-rw-r--r--lib/sha1.c50
3 files changed, 62 insertions, 15 deletions
diff --git a/lib/misc.c b/lib/misc.c
index 1c93f65a..b4c02ed1 100644
--- a/lib/misc.c
+++ b/lib/misc.c
@@ -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);
+ }
+}
diff --git a/lib/misc.h b/lib/misc.h
index 73f71e85..581e7a76 100644
--- a/lib/misc.h
+++ b/lib/misc.h
@@ -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
diff --git a/lib/sha1.c b/lib/sha1.c
index 7f442205..bd6a8592 100644
--- a/lib/sha1.c
+++ b/lib/sha1.c
@@ -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