Mercurial > pidgin
comparison src/cipher.c @ 11183:8dca96cbcd64
[gaim-migrate @ 13295]
I changed the cipher API to use guchar instead of guint8
This seems to be what gtk/glib uses for random bits of data
I don't know what got into me
committer: Tailor Script <tailor@pidgin.im>
author | Mark Doliner <mark@kingant.net> |
---|---|
date | Wed, 03 Aug 2005 02:57:00 +0000 |
parents | 5c56223fa24f |
children | f93d434ee222 |
comparison
equal
deleted
inserted
replaced
11182:5389d7d497ce | 11183:8dca96cbcd64 |
---|---|
36 * MD5 | 36 * MD5 |
37 ******************************************************************************/ | 37 ******************************************************************************/ |
38 struct MD5Context { | 38 struct MD5Context { |
39 guint32 total[2]; | 39 guint32 total[2]; |
40 guint32 state[4]; | 40 guint32 state[4]; |
41 guint8 buffer[64]; | 41 guchar buffer[64]; |
42 }; | 42 }; |
43 | 43 |
44 #define MD5_GET_GUINT32(n,b,i) { \ | 44 #define MD5_GET_GUINT32(n,b,i) { \ |
45 (n) = ((guint32)(b) [(i) ] ) \ | 45 (n) = ((guint32)(b) [(i) ] ) \ |
46 | ((guint32)(b) [(i) + 1] << 8) \ | 46 | ((guint32)(b) [(i) + 1] << 8) \ |
47 | ((guint32)(b) [(i) + 2] << 16) \ | 47 | ((guint32)(b) [(i) + 2] << 16) \ |
48 | ((guint32)(b) [(i) + 3] << 24); \ | 48 | ((guint32)(b) [(i) + 3] << 24); \ |
49 } | 49 } |
50 #define MD5_PUT_GUINT32(n,b,i) { \ | 50 #define MD5_PUT_GUINT32(n,b,i) { \ |
51 (b)[(i) ] = (guint8)((n) ); \ | 51 (b)[(i) ] = (guchar)((n) ); \ |
52 (b)[(i) + 1] = (guint8)((n) >> 8); \ | 52 (b)[(i) + 1] = (guchar)((n) >> 8); \ |
53 (b)[(i) + 2] = (guint8)((n) >> 16); \ | 53 (b)[(i) + 2] = (guchar)((n) >> 16); \ |
54 (b)[(i) + 3] = (guint8)((n) >> 24); \ | 54 (b)[(i) + 3] = (guchar)((n) >> 24); \ |
55 } | 55 } |
56 | 56 |
57 static void | 57 static void |
58 md5_init(GaimCipherContext *context, gpointer extra) { | 58 md5_init(GaimCipherContext *context, gpointer extra) { |
59 struct MD5Context *md5_context; | 59 struct MD5Context *md5_context; |
94 g_free(md5_context); | 94 g_free(md5_context); |
95 md5_context = NULL; | 95 md5_context = NULL; |
96 } | 96 } |
97 | 97 |
98 static void | 98 static void |
99 md5_process(struct MD5Context *md5_context, const guint8 data[64]) { | 99 md5_process(struct MD5Context *md5_context, const guchar data[64]) { |
100 guint32 X[16], A, B, C, D; | 100 guint32 X[16], A, B, C, D; |
101 | 101 |
102 A = md5_context->state[0]; | 102 A = md5_context->state[0]; |
103 B = md5_context->state[1]; | 103 B = md5_context->state[1]; |
104 C = md5_context->state[2]; | 104 C = md5_context->state[2]; |
164 P(A, B, C, D, 13, 5, 0xA9E3E905); | 164 P(A, B, C, D, 13, 5, 0xA9E3E905); |
165 P(D, A, B, C, 2, 9, 0xFCEFA3F8); | 165 P(D, A, B, C, 2, 9, 0xFCEFA3F8); |
166 P(C, D, A, B, 7, 14, 0x676F02D9); | 166 P(C, D, A, B, 7, 14, 0x676F02D9); |
167 P(B, C, D, A, 12, 20, 0x8D2A4C8A); | 167 P(B, C, D, A, 12, 20, 0x8D2A4C8A); |
168 #undef F | 168 #undef F |
169 | 169 |
170 /* third pass */ | 170 /* third pass */ |
171 #define F(x,y,z) (x ^ y ^ z) | 171 #define F(x,y,z) (x ^ y ^ z) |
172 P(A, B, C, D, 5, 4, 0xFFFA3942); | 172 P(A, B, C, D, 5, 4, 0xFFFA3942); |
173 P(D, A, B, C, 8, 11, 0x8771F681); | 173 P(D, A, B, C, 8, 11, 0x8771F681); |
174 P(C, D, A, B, 11, 16, 0x6D9D6122); | 174 P(C, D, A, B, 11, 16, 0x6D9D6122); |
214 md5_context->state[2] += C; | 214 md5_context->state[2] += C; |
215 md5_context->state[3] += D; | 215 md5_context->state[3] += D; |
216 } | 216 } |
217 | 217 |
218 static void | 218 static void |
219 md5_append(GaimCipherContext *context, const guint8 *data, size_t len) { | 219 md5_append(GaimCipherContext *context, const guchar *data, size_t len) { |
220 struct MD5Context *md5_context = NULL; | 220 struct MD5Context *md5_context = NULL; |
221 guint32 left = 0, fill = 0; | 221 guint32 left = 0, fill = 0; |
222 | 222 |
223 g_return_if_fail(context != NULL); | 223 g_return_if_fail(context != NULL); |
224 | 224 |
252 memcpy((md5_context->buffer + left), data, len); | 252 memcpy((md5_context->buffer + left), data, len); |
253 } | 253 } |
254 } | 254 } |
255 | 255 |
256 static gboolean | 256 static gboolean |
257 md5_digest(GaimCipherContext *context, size_t in_len, guint8 digest[16], | 257 md5_digest(GaimCipherContext *context, size_t in_len, guchar digest[16], |
258 size_t *out_len) | 258 size_t *out_len) |
259 { | 259 { |
260 struct MD5Context *md5_context = NULL; | 260 struct MD5Context *md5_context = NULL; |
261 guint32 last, pad; | 261 guint32 last, pad; |
262 guint32 high, low; | 262 guint32 high, low; |
263 guint8 message[8]; | 263 guchar message[8]; |
264 guint8 padding[64] = { | 264 guchar padding[64] = { |
265 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 265 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 266 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | 267 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, |
268 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | 268 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 |
269 }; | 269 }; |
384 | 384 |
385 sha1_ctx->H[0] += A; | 385 sha1_ctx->H[0] += A; |
386 sha1_ctx->H[1] += B; | 386 sha1_ctx->H[1] += B; |
387 sha1_ctx->H[2] += C; | 387 sha1_ctx->H[2] += C; |
388 sha1_ctx->H[3] += D; | 388 sha1_ctx->H[3] += D; |
389 sha1_ctx->H[4] += E; | 389 sha1_ctx->H[4] += E; |
390 } | 390 } |
391 | 391 |
392 static void | 392 static void |
393 sha1_set_opt(GaimCipherContext *context, const gchar *name, void *value) { | 393 sha1_set_opt(GaimCipherContext *context, const gchar *name, void *value) { |
394 struct SHA1Context *ctx; | 394 struct SHA1Context *ctx; |
469 sha1_ctx = NULL; | 469 sha1_ctx = NULL; |
470 } | 470 } |
471 | 471 |
472 | 472 |
473 static void | 473 static void |
474 sha1_append(GaimCipherContext *context, const guint8 *data, size_t len) { | 474 sha1_append(GaimCipherContext *context, const guchar *data, size_t len) { |
475 struct SHA1Context *sha1_ctx; | 475 struct SHA1Context *sha1_ctx; |
476 gint i; | 476 gint i; |
477 | 477 |
478 sha1_ctx = gaim_cipher_context_get_data(context); | 478 sha1_ctx = gaim_cipher_context_get_data(context); |
479 | 479 |
492 sha1_ctx->sizeHi += (sha1_ctx->sizeLo < 8); | 492 sha1_ctx->sizeHi += (sha1_ctx->sizeLo < 8); |
493 } | 493 } |
494 } | 494 } |
495 | 495 |
496 static gboolean | 496 static gboolean |
497 sha1_digest(GaimCipherContext *context, size_t in_len, guint8 digest[20], | 497 sha1_digest(GaimCipherContext *context, size_t in_len, guchar digest[20], |
498 size_t *out_len) | 498 size_t *out_len) |
499 { | 499 { |
500 struct SHA1Context *sha1_ctx; | 500 struct SHA1Context *sha1_ctx; |
501 guint8 pad0x80 = 0x80, pad0x00 = 0x00; | 501 guchar pad0x80 = 0x80, pad0x00 = 0x00; |
502 guint8 padlen[8]; | 502 guchar padlen[8]; |
503 gint i; | 503 gint i; |
504 | 504 |
505 g_return_val_if_fail(in_len >= 20, FALSE); | 505 g_return_val_if_fail(in_len >= 20, FALSE); |
506 | 506 |
507 sha1_ctx = gaim_cipher_context_get_data(context); | 507 sha1_ctx = gaim_cipher_context_get_data(context); |
508 | 508 |
509 g_return_val_if_fail(sha1_ctx, FALSE); | 509 g_return_val_if_fail(sha1_ctx, FALSE); |
510 | 510 |
511 padlen[0] = (guint8)((sha1_ctx->sizeHi >> 24) & 255); | 511 padlen[0] = (guchar)((sha1_ctx->sizeHi >> 24) & 255); |
512 padlen[1] = (guint8)((sha1_ctx->sizeHi >> 16) & 255); | 512 padlen[1] = (guchar)((sha1_ctx->sizeHi >> 16) & 255); |
513 padlen[2] = (guint8)((sha1_ctx->sizeHi >> 8) & 255); | 513 padlen[2] = (guchar)((sha1_ctx->sizeHi >> 8) & 255); |
514 padlen[3] = (guint8)((sha1_ctx->sizeHi >> 0) & 255); | 514 padlen[3] = (guchar)((sha1_ctx->sizeHi >> 0) & 255); |
515 padlen[4] = (guint8)((sha1_ctx->sizeLo >> 24) & 255); | 515 padlen[4] = (guchar)((sha1_ctx->sizeLo >> 24) & 255); |
516 padlen[5] = (guint8)((sha1_ctx->sizeLo >> 16) & 255); | 516 padlen[5] = (guchar)((sha1_ctx->sizeLo >> 16) & 255); |
517 padlen[6] = (guint8)((sha1_ctx->sizeLo >> 8) & 255); | 517 padlen[6] = (guchar)((sha1_ctx->sizeLo >> 8) & 255); |
518 padlen[7] = (guint8)((sha1_ctx->sizeLo >> 0) & 255); | 518 padlen[7] = (guchar)((sha1_ctx->sizeLo >> 0) & 255); |
519 | 519 |
520 /* pad with a 1, then zeroes, then length */ | 520 /* pad with a 1, then zeroes, then length */ |
521 gaim_cipher_context_append(context, &pad0x80, 1); | 521 gaim_cipher_context_append(context, &pad0x80, 1); |
522 while(sha1_ctx->lenW != 56) | 522 while(sha1_ctx->lenW != 56) |
523 gaim_cipher_context_append(context, &pad0x00, 1); | 523 gaim_cipher_context_append(context, &pad0x00, 1); |
524 gaim_cipher_context_append(context, padlen, 8); | 524 gaim_cipher_context_append(context, padlen, 8); |
525 | 525 |
526 for(i = 0; i < 20; i++) { | 526 for(i = 0; i < 20; i++) { |
527 digest[i] = (guint8)(sha1_ctx->H[i / 4] >> 24); | 527 digest[i] = (guchar)(sha1_ctx->H[i / 4] >> 24); |
528 sha1_ctx->H[i / 4] <<= 8; | 528 sha1_ctx->H[i / 4] <<= 8; |
529 } | 529 } |
530 | 530 |
531 gaim_cipher_context_reset(context, NULL); | 531 gaim_cipher_context_reset(context, NULL); |
532 | 532 |
623 | 623 |
624 return caps; | 624 return caps; |
625 } | 625 } |
626 | 626 |
627 gboolean | 627 gboolean |
628 gaim_cipher_digest_region(const gchar *name, const guint8 *data, | 628 gaim_cipher_digest_region(const gchar *name, const guchar *data, |
629 size_t data_len, size_t in_len, | 629 size_t data_len, size_t in_len, |
630 guint8 digest[], size_t *out_len) | 630 guchar digest[], size_t *out_len) |
631 { | 631 { |
632 GaimCipher *cipher; | 632 GaimCipher *cipher; |
633 GaimCipherContext *context; | 633 GaimCipherContext *context; |
634 gboolean ret = FALSE; | 634 gboolean ret = FALSE; |
635 | 635 |
865 g_free(context); | 865 g_free(context); |
866 context = NULL; | 866 context = NULL; |
867 } | 867 } |
868 | 868 |
869 void | 869 void |
870 gaim_cipher_context_set_iv(GaimCipherContext *context, guint8 *iv, size_t len) | 870 gaim_cipher_context_set_iv(GaimCipherContext *context, guchar *iv, size_t len) |
871 { | 871 { |
872 GaimCipher *cipher = NULL; | 872 GaimCipher *cipher = NULL; |
873 | 873 |
874 g_return_if_fail(context); | 874 g_return_if_fail(context); |
875 g_return_if_fail(iv); | 875 g_return_if_fail(iv); |
883 gaim_debug_info("cipher", "the %s cipher does not support the set" | 883 gaim_debug_info("cipher", "the %s cipher does not support the set" |
884 "initialization vector operation\n", cipher->name); | 884 "initialization vector operation\n", cipher->name); |
885 } | 885 } |
886 | 886 |
887 void | 887 void |
888 gaim_cipher_context_append(GaimCipherContext *context, const guint8 *data, | 888 gaim_cipher_context_append(GaimCipherContext *context, const guchar *data, |
889 size_t len) | 889 size_t len) |
890 { | 890 { |
891 GaimCipher *cipher = NULL; | 891 GaimCipher *cipher = NULL; |
892 | 892 |
893 g_return_if_fail(context); | 893 g_return_if_fail(context); |
902 "operation\n", cipher->name); | 902 "operation\n", cipher->name); |
903 } | 903 } |
904 | 904 |
905 gboolean | 905 gboolean |
906 gaim_cipher_context_digest(GaimCipherContext *context, size_t in_len, | 906 gaim_cipher_context_digest(GaimCipherContext *context, size_t in_len, |
907 guint8 digest[], size_t *out_len) | 907 guchar digest[], size_t *out_len) |
908 { | 908 { |
909 GaimCipher *cipher = NULL; | 909 GaimCipher *cipher = NULL; |
910 | 910 |
911 g_return_val_if_fail(context, FALSE); | 911 g_return_val_if_fail(context, FALSE); |
912 | 912 |
925 gboolean | 925 gboolean |
926 gaim_cipher_context_digest_to_str(GaimCipherContext *context, size_t in_len, | 926 gaim_cipher_context_digest_to_str(GaimCipherContext *context, size_t in_len, |
927 gchar digest_s[], size_t *out_len) | 927 gchar digest_s[], size_t *out_len) |
928 { | 928 { |
929 /* 8k is a bit excessive, will tweak later. */ | 929 /* 8k is a bit excessive, will tweak later. */ |
930 guint8 digest[BUF_LEN * 4]; | 930 guchar digest[BUF_LEN * 4]; |
931 gint n = 0; | 931 gint n = 0; |
932 size_t dlen = 0; | 932 size_t dlen = 0; |
933 | 933 |
934 g_return_val_if_fail(context, FALSE); | 934 g_return_val_if_fail(context, FALSE); |
935 g_return_val_if_fail(digest_s, FALSE); | 935 g_return_val_if_fail(digest_s, FALSE); |
950 | 950 |
951 return TRUE; | 951 return TRUE; |
952 } | 952 } |
953 | 953 |
954 gint | 954 gint |
955 gaim_cipher_context_encrypt(GaimCipherContext *context, const guint8 data[], | 955 gaim_cipher_context_encrypt(GaimCipherContext *context, const guchar data[], |
956 size_t len, guint8 output[], size_t *outlen) | 956 size_t len, guchar output[], size_t *outlen) |
957 { | 957 { |
958 GaimCipher *cipher = NULL; | 958 GaimCipher *cipher = NULL; |
959 | 959 |
960 g_return_val_if_fail(context, -1); | 960 g_return_val_if_fail(context, -1); |
961 | 961 |
974 return -1; | 974 return -1; |
975 } | 975 } |
976 } | 976 } |
977 | 977 |
978 gint | 978 gint |
979 gaim_cipher_context_decrypt(GaimCipherContext *context, const guint8 data[], | 979 gaim_cipher_context_decrypt(GaimCipherContext *context, const guchar data[], |
980 size_t len, guint8 output[], size_t *outlen) | 980 size_t len, guchar output[], size_t *outlen) |
981 { | 981 { |
982 GaimCipher *cipher = NULL; | 982 GaimCipher *cipher = NULL; |
983 | 983 |
984 g_return_val_if_fail(context, -1); | 984 g_return_val_if_fail(context, -1); |
985 | 985 |
998 return -1; | 998 return -1; |
999 } | 999 } |
1000 } | 1000 } |
1001 | 1001 |
1002 void | 1002 void |
1003 gaim_cipher_context_set_salt(GaimCipherContext *context, guint8 *salt) { | 1003 gaim_cipher_context_set_salt(GaimCipherContext *context, guchar *salt) { |
1004 GaimCipher *cipher = NULL; | 1004 GaimCipher *cipher = NULL; |
1005 | 1005 |
1006 g_return_if_fail(context); | 1006 g_return_if_fail(context); |
1007 | 1007 |
1008 cipher = context->cipher; | 1008 cipher = context->cipher; |
1033 return -1; | 1033 return -1; |
1034 } | 1034 } |
1035 } | 1035 } |
1036 | 1036 |
1037 void | 1037 void |
1038 gaim_cipher_context_set_key(GaimCipherContext *context, guint8 *key) { | 1038 gaim_cipher_context_set_key(GaimCipherContext *context, guchar *key) { |
1039 GaimCipher *cipher = NULL; | 1039 GaimCipher *cipher = NULL; |
1040 | 1040 |
1041 g_return_if_fail(context); | 1041 g_return_if_fail(context); |
1042 | 1042 |
1043 cipher = context->cipher; | 1043 cipher = context->cipher; |