/* * Created on Mar 1, 2004 * Algorithm: * Copyright (c) 2004 David Hammerton * * port to java: * Copyright (c) 2004 Joseph Barnett */ package itunes.util; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; /** * @author jbarnett */ public class Hasher { //taken from calculations in libopendaap //private static String staticHash = "98814088228B81E0AB021433618EC27B"; private static String calcHash = ""; private static boolean staticCalculated = false; private static final String hexchars = "0123456789ABCDEF"; private static final String appleCopyright = "Copyright 2003 Apple Computer, Inc."; private static MessageDigest md; private static final int HASH_SIZE = 32; static { try { md = MessageDigest.getInstance("md5"); } catch (NoSuchAlgorithmException e) { e.printStackTrace(); } } private static String DigestToString(byte[] digest) { String string=""; int i; for (i = 0; i < digest.length; i++) { byte tmp = digest[i]; string += hexchars.charAt((tmp >> 4) & 0x0f); string += hexchars.charAt(tmp & 0x0f); } return string; } private static synchronized void calculateStaticHash() { if (staticCalculated) return; for (int i = 0; i < 256; i++) { if ((i & 0x80) != 0) md.update("Accept-Language".getBytes()); else md.update("user-agent".getBytes()); if ((i & 0x40) != 0) md.update("max-age".getBytes()); else md.update("Authorization".getBytes()); if ((i & 0x20) != 0) md.update("Client-DAAP-Version".getBytes()); else md.update("Accept-Encoding".getBytes()); if ((i & 0x10) != 0) md.update("daap.protocolversion".getBytes()); else md.update("daap.songartist".getBytes()); if ((i & 0x08) != 0) md.update("daap.songcomposer".getBytes()); else md.update("daap.songdatemodified".getBytes()); if ((i & 0x04) != 0) md.update("daap.songdiscnumber".getBytes()); else md.update("daap.songdisabled".getBytes()); if ((i & 0x02) != 0) md.update("playlist-item-spec".getBytes()); else md.update("revision-number".getBytes()); if ((i & 0x01) != 0) md.update("session-id".getBytes()); else md.update("content-codes".getBytes()); String newHash =DigestToString(md.digest()); calcHash += newHash; } staticCalculated = true; } public static String GenerateHash(String url, int accessIndex) { int start = HASH_SIZE * accessIndex; int end = start + HASH_SIZE; calculateStaticHash(); md.update(url.getBytes()); md.update(appleCopyright.getBytes()); md.update(calcHash.substring(start, end).getBytes()); return DigestToString(md.digest()); } }