Mercurial > pidgin.yaz
comparison src/protocols/yahoo/yahoo.c @ 7127:4c0b7e7118ee
[gaim-migrate @ 7694]
.
committer: Tailor Script <tailor@pidgin.im>
author | Sean Egan <seanegan@gmail.com> |
---|---|
date | Thu, 02 Oct 2003 22:46:56 +0000 |
parents | bf630f7dfdcd |
children | 8246bd3141ae |
comparison
equal
deleted
inserted
replaced
7126:eda3de6dacbb | 7127:4c0b7e7118ee |
---|---|
1005 unsigned char magic_key_char[4]; | 1005 unsigned char magic_key_char[4]; |
1006 const unsigned char *magic_ptr; | 1006 const unsigned char *magic_ptr; |
1007 | 1007 |
1008 unsigned int magic[64]; | 1008 unsigned int magic[64]; |
1009 unsigned int magic_work = 0; | 1009 unsigned int magic_work = 0; |
1010 unsigned int value = 0; | 1010 |
1011 | 1011 char comparison_src[20]; |
1012 int x; | 1012 int x; |
1013 int cnt = 0; | 1013 int cnt = 0; |
1014 int magic_cnt = 0; | 1014 int magic_cnt = 0; |
1015 int magic_len; | 1015 int magic_len; |
1016 int times = 0; | |
1017 | 1016 |
1018 memset(&pass_hash_xor1, 0, 64); | 1017 memset(&pass_hash_xor1, 0, 64); |
1019 memset(&pass_hash_xor2, 0, 64); | 1018 memset(&pass_hash_xor2, 0, 64); |
1020 memset(&crypt_hash_xor1, 0, 64); | 1019 memset(&crypt_hash_xor1, 0, 64); |
1021 memset(&crypt_hash_xor2, 0, 64); | 1020 memset(&crypt_hash_xor2, 0, 64); |
1105 byte1 ^= byte2; | 1104 byte1 ^= byte2; |
1106 | 1105 |
1107 magic[magic_cnt+1] = byte1; | 1106 magic[magic_cnt+1] = byte1; |
1108 } | 1107 } |
1109 | 1108 |
1110 /* Magic: Phase 3. Final phase; this gives us our | 1109 /* Magic: Phase 3. This computes 20 bytes. The first 4 bytes are used as our magic |
1111 * key. */ | 1110 * key (and may be changed later); the next 16 bytes are an MD5 sum of the magic key |
1112 | 1111 * plus 3 bytes. The 3 bytes are found by looping, and they represent the offsets |
1113 magic_cnt = 1; | 1112 * into particular functions we'll later call to potentially alter the magic key. |
1114 | 1113 * |
1115 for (;;) { | 1114 * %-) |
1116 unsigned int cl = magic[magic_cnt] & 0xff; | 1115 */ |
1117 unsigned int bl = magic[magic_cnt+1] & 0xff; | 1116 |
1118 | 1117 magic_cnt = 1; |
1119 if (!bl || !cl) | 1118 x = 0; |
1120 break; | 1119 |
1121 | 1120 do { |
1122 if (magic_cnt > magic_len) | 1121 unsigned int bl = 0; |
1123 break; | 1122 unsigned int cl = magic[magic_cnt++]; |
1124 | 1123 |
1125 if (cl <= 0x7f) | 1124 if (magic_cnt >= magic_len) |
1126 bl = cl; | 1125 break; |
1127 else { | 1126 |
1128 if (cl >= 0x0e0) { | 1127 if (cl > 0x7F) { |
1129 cl = cl & 0x0f; | 1128 if (cl < 0xe0) |
1130 cl = cl << 6; | 1129 bl = cl = (cl & 0x1f) << 6; |
1131 bl = bl & 0x3f; | 1130 else { |
1132 bl = cl + bl; | 1131 bl = magic[magic_cnt++]; |
1133 bl = bl << 6; | 1132 cl = (cl & 0x0f) << 6; |
1134 } else { | 1133 bl = ((bl & 0x3f) + cl) << 6; |
1135 cl = cl & 0x1f; | 1134 } |
1136 cl = cl << 6; | |
1137 bl = cl; | |
1138 } | |
1139 | 1135 |
1140 cl = magic[magic_cnt+2]; | 1136 cl = magic[magic_cnt++]; |
1141 | 1137 bl = (cl & 0x3f) + bl; |
1142 if (!cl) | 1138 } else |
1143 break; | 1139 bl = cl; |
1144 | 1140 |
1145 cl = cl & 0x3f; | 1141 comparison_src[x++] = (bl & 0xff00) >> 8; |
1146 bl = bl + cl; | 1142 comparison_src[x++] = bl & 0xff; |
1147 } | 1143 } while (x < 20); |
1148 | 1144 |
1149 /* Result is bl. | 1145 /* First four bytes are magic key. */ |
1150 */ | 1146 for (x = 0; x < 4; x++) |
1151 | 1147 magic_key_char[x] = comparison_src[x]; |
1152 magic_cnt += 3; | 1148 |
1153 | |
1154 if (times == 0) { | |
1155 value |= (bl & 0xff) << 8; | |
1156 value |= (bl & 0xff00) >> 8; | |
1157 } else { | |
1158 value |= (bl & 0xff) << 24; | |
1159 value |= (bl & 0xff00) << 8; | |
1160 break; | |
1161 } | |
1162 | |
1163 times++; | |
1164 } | |
1165 | |
1166 /* Dump magic key into a char for SHA1 action. */ | |
1167 magic_key_char[0] = value & 0xff; | |
1168 magic_key_char[1] = (value >> 8) & 0xff; | |
1169 magic_key_char[2] = (value >> 16) & 0xff; | |
1170 magic_key_char[3] = (value >> 24) & 0xff; | |
1171 | 1149 |
1172 /* Get password and crypt hashes as per usual. */ | 1150 /* Get password and crypt hashes as per usual. */ |
1173 md5_init(&ctx); | 1151 md5_init(&ctx); |
1174 md5_append(&ctx, pass, strlen(pass)); | 1152 md5_append(&ctx, pass, strlen(pass)); |
1175 md5_finish(&ctx, result); | 1153 md5_finish(&ctx, result); |