diff options
author | Marius Halden <marius.h@lden.org> | 2017-10-24 21:10:02 +0200 |
---|---|---|
committer | Marius Halden <marius.h@lden.org> | 2017-10-24 21:10:02 +0200 |
commit | 7d3a199e5084831fe08aae7e67f562d9fb3fa07b (patch) | |
tree | c2d1eb73ef18d89c0207b4c3629ac859cf39e191 /facebook/facebook-util.c | |
parent | f5a6c8e103d06d949c6ef292cbfc0af2a6fe42e0 (diff) | |
parent | 553593d07170d6d1563d0079dbedd481dcec5b00 (diff) | |
download | bitlbee-facebook-track-messages.tar.gz bitlbee-facebook-track-messages.tar.bz2 bitlbee-facebook-track-messages.tar.xz |
Merge branch 'master' into track-messagestrack-messages
Diffstat (limited to 'facebook/facebook-util.c')
-rw-r--r-- | facebook/facebook-util.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/facebook/facebook-util.c b/facebook/facebook-util.c index 15c4d4a..e101abe 100644 --- a/facebook/facebook-util.c +++ b/facebook/facebook-util.c @@ -376,3 +376,46 @@ fb_util_zlib_inflate(const GByteArray *bytes, GError **error) g_object_unref(conv); return ret; } + +gchar * +fb_util_urlsafe_base64_encode(const guchar *data, gsize len) +{ + gchar *out = g_base64_encode(data, len); + gchar *c; + + for (c = out; *c; c++) { + if (*c == '+') { + *c = '-'; + } else if (*c == '/') { + *c = '_'; + } else if (*c == '=') { + *c = '\0'; + break; + } + } + + return out; +} + +void +fb_util_gen_sso_verifier(gchar **challenge, gchar **verifier, gchar **req_id) +{ + guint8 buf[32]; + GChecksum *gc; + gsize digest_len = sizeof buf; + + random_bytes(buf, sizeof buf); + + *verifier = fb_util_urlsafe_base64_encode(buf, sizeof buf); + + gc = g_checksum_new(G_CHECKSUM_SHA256); + g_checksum_update(gc, (guchar *) *verifier, -1); + g_checksum_get_digest(gc, buf, &digest_len); + g_checksum_free(gc); + + *challenge = fb_util_urlsafe_base64_encode(buf, sizeof buf); + + random_bytes(buf, 3); + + *req_id = fb_util_urlsafe_base64_encode(buf, 3); +} |