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);