Forwarded: Tue, 09 Jan 2001 08:50:14 -0500 Forwarded: John Yin Return-Path: auyar@csit.fsu.edu Return-Path: Delivered-To: fox@csit.fsu.edu Received: from coconutpalm (unknown [144.174.137.241]) by mailer.csit.fsu.edu (Postfix) with SMTP id 8BE1F23A02 for ; Mon, 8 Jan 2001 18:33:11 -0500 (EST) Message-ID: <011d01c079cb$3cbaf020$f189ae90@csit.fsu.edu> From: "Ahmet Uyar" To: Subject: HearMe server wrapper Date: Mon, 8 Jan 2001 18:32:16 -0500 MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_NextPart_000_0119_01C079A1.536AAF10" X-Priority: 3 X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook Express 5.00.2919.6700 X-MimeOLE: Produced By Microsoft MimeOLE V5.00.2919.6700 This is a multi-part message in MIME format. ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: multipart/alternative; boundary="----=_NextPart_001_011A_01C079A1.536AAF10" ------=_NextPart_001_011A_01C079A1.536AAF10 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable Hi Dr. Fox, I have written the server wrapper for Talkserver. So right now, we can = create, destroy, modify conferences through TalkServer by using java = programs. I am sending you the program I have written, = HearMeServerWrapper and two others which are gotten from Internet to = implement SHA1 algorithm. I've also written some test functions to show how to use = HearMeServerWrapper to create, destroy and query TalkServer conferences. Note: The protocol specification we got from HearMe (ASCP 3.0) is not = the one, our Talkserver uses. Our talkserver uses I think ASCP 1.2. We = figured that out from the perl scripts. So if we can get ASCP 1.2 = specification from HearMe, it would make our job easier. Altough they = seem similar in many ways, there are also some significant differences.=20 best regards. Ahmet Uyar Ph.D. candidate Computational Science and Information Technology Florida State University=20 ------=_NextPart_001_011A_01C079A1.536AAF10 Content-Type: text/html; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable
Hi Dr. Fox,
 
I have written the server wrapper for = Talkserver.=20 So right now, we can create, destroy, modify  = conferences through=20 TalkServer by using java programs. I am sending you the program I have = written,=20 HearMeServerWrapper and two others which are gotten from Internet to = implement=20 SHA1 algorithm.
 
I've also written some test functions = to show how=20 to use HearMeServerWrapper to create, destroy and query TalkServer=20 conferences.
 
Note: The protocol specification we got = from HearMe=20 (ASCP 3.0) is not the one, our Talkserver uses. Our talkserver uses I = think ASCP=20 1.2. We figured that out from the perl scripts. So if we can get ASCP = 1.2=20 specification from HearMe, it would make our job easier. Altough they = seem=20 similar in many ways, there are also some significant differences.=20
 
best regards.
 
Ahmet Uyar
Ph.D. = candidate
Computational=20 Science and Information Technology
Florida State University=20
------=_NextPart_001_011A_01C079A1.536AAF10-- ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="HearMeServerWrapper.class" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="HearMeServerWrapper.class" yv66vgADAC0BdAoAhwC0CQCDALUJAIMAtgkAgwC3CQCDALgJAIMAuQcAugkAgwC7CQCDALwHAL0I AL4KAAoAvwkAgwDACQDBAMIHAMMKAA8AtAgAxAoADwDFCgAKAMYKAMcAyAoADwDJCgDKAMsKAIMA zAoACgDNBwDOCADPCgDQANEIANIHANMKAAoA1AoAHQDVCgCDANYKAB0A1woAHQDYBwDZBwDaCgAK ANsKACQA3AoAIwDdCgAjAN4KAAcA3woA4ADhCADiCgAHAOMIAOQKAAcA5QoABwDmBwDnCgAwALQK ADAA6AoA6QDqCgAwAOsKADAA7AoABwDtCADuCgCDAO8KAIMA8AgA8QoADwDyCADzCAD0CAD1CAD2 CAD3CAD4CAD5CAD6CgD7APwGQMOIAAAAAAAKAAcA/QgA/goAgwD/CAEACAEBCgAHAQIIAQMIAQQI AQUIAQYIAQcIAQgIAQkIAQoIAQsIAQwIAQ0KAIMBDggBDwoAgwEQCgCDAREIARIIARMKAIMBFAoA gwEVCAEWCAEXCAEYCAEZCAEaCAEbCAEcBwEdBwEeCAEfCgBoASAKAGcBIQoAZwEiCgEjASQIASUI ASYIAScIASgIASkIASoIASsIASwIAS0IAS4IAS8IATAIATEIATIIATMIATQIATUIATYIATcIATgI ATkHAToKAIMAtAoAgwE7CgDKANcHATwBAAZhY3Rpb24BABJMamF2YS9sYW5nL1N0cmluZzsBAAxz aGFyZWRTZWNyZXQBAAthY2NvdW50TmFtZQEABXBhcmFtAQATW0xqYXZhL2xhbmcvU3RyaW5nOwEA BXZhbHVlAQAFaW5kZXgBAAFJAQAEU0laRQEADUNvbnN0YW50VmFsdWUDAAAADgEACmNvbm5lY3Rp b24BABFMamF2YS9uZXQvU29ja2V0OwEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVy VGFibGUBAAxzZW5kVG9TZXJ2ZXIBABQoKUxqYXZhL2xhbmcvU3RyaW5nOwEADnNlbmRBbmRSZWNl aXZlAQAOcHJlcGFyZUNvbW1hbmQBAA1hZGRIdHRwSGVhZGVyAQAmKExqYXZhL2xhbmcvU3RyaW5n OylMamF2YS9sYW5nL1N0cmluZzsBAA1hZGRBdXRoSGVhZGVyAQAKZ2V0Q29tbWFuZAEAEXB1c2hQ YXJhbUFuZFZhbHVlAQAnKExqYXZhL2xhbmcvU3RyaW5nO0xqYXZhL2xhbmcvU3RyaW5nOylaAQAP c2V0U2hhcmVkU2VjcmV0AQAVKExqYXZhL2xhbmcvU3RyaW5nOylWAQAOc2V0QWNjb3VudE5hbWUB AAlzZXRBY3Rpb24BABUoTGphdmEvbGFuZy9TdHJpbmc7KVoBAAlnZXRBY3Rpb24BAA9nZXRTaGFy ZWRTZWNyZXQBAA5nZXRBY2NvdW50TmFtZQEACXRlc3RRdWVyeQEACnRlc3RDcmVhdGUBAAt0ZXN0 RGVzdHJveQEAB2dldFRpbWUBAARtYWluAQAWKFtMamF2YS9sYW5nL1N0cmluZzspVgEAClNvdXJj ZUZpbGUBABhIZWFyTWVTZXJ2ZXJXcmFwcGVyLmphdmEMAJYAlwwAiACJDACKAIkMAIsAiQwAkQCQ DACPAJABABBqYXZhL2xhbmcvU3RyaW5nDACMAI0MAI4AjQEAD2phdmEvbmV0L1NvY2tldAEAEGZp Zy5jc2l0LmZzdS5lZHUMAJYBPQwAlACVBwE+DAE/AUABABZqYXZhL2xhbmcvU3RyaW5nQnVmZmVy AQANY29ubmVjdGVkIHRvIAwBQQFCDAFDAUQHAUUMAUYAmwwBRwCbBwFIDAFJAKUMAJwAmwwBSgCX AQATamF2YS9pby9JT0V4Y2VwdGlvbgEAFkVycm9yIHdoZW4gY29ubmVjdGluZy4HAUsMAUwAlwEA AAEAE2phdmEvaW8vUHJpbnRXcml0ZXIMAU0BTgwAlgFPDACdAJsMAVAApQwBUQCXAQAWamF2YS9p by9CdWZmZXJlZFJlYWRlcgEAGWphdmEvaW8vSW5wdXRTdHJlYW1SZWFkZXIMAVIBUwwAlgFUDACW AVUMAVYAmwwBVwFYBwFZDAFaAVsBAAINCgwBXAFdAQABIgwBXgFbDAFXAV8BAARTSEExDAFgAJcH AWEMAWIApQwBYwCXDAFkAJsMAWUBWwEALE1lc3NhZ2UgaXMgY29ycnVwdGVkIHdoaWxlIGJlaW5n IHRyYW5zZmVyZWQuDAChAJsMAKAAnwEAP1BPU1QgL3Rlc3QgSFRUUC8xLjANCkNvbnRlbnQtVHlw ZTogdGV4dC9wbGFpbg0KQ29udGVudC1MZW5ndGg6IAwBQQFmAQAEDQoNCgEAE0FTQ1AvMS4yDQpE aWdlc3Q6ICIBAAMiDQoBACJDb250ZW50LVR5cGU6IGFwcGxpY2F0aW9uL3gtYXNjcA0KAQAQQ29u dGVudC1MZW5ndGg6IAEADkFjY291bnQtTmFtZTogAQAGIFJFUQ0KAQAKU2VxdWVuY2U6IAcBZwwB aAFpDAFqAVgBAAlFeHBpcmVzOiAMAK8AmwEAAjogAQAGQ1JFQVRFDAFrAWwBAAdERVNUUk9ZAQAF UVVFUlkBAARNQUtFAQAETU9WRQEABklOVklURQEABUVYUEVMAQAETElTVAEABlVQREFURQEABk1P RElGWQEADlRlc3RpbmcgUVVFUlkuAQAGZ3VuZHV6DACkAKUBAAZndXJoYW4MAKYApQwApwCoAQAF QWxpYXMBAAhOYW1lPSIqIgwAogCjDACaAJsBAAhTY2hlZHVsZQEAHUltbWVkaWF0ZTtMYXN0UGFy dGljaXBhbnRMZWZ0AQAQTWF4LVBhcnRpY2lwYW50cwEAATMBAAhQYXNzd29yZAEABDEyMzQBAA1D b25mZXJlbmNlLUlkAQAbamF2YS91dGlsL0dyZWdvcmlhbkNhbGVuZGFyAQAYamF2YS91dGlsL1Np bXBsZVRpbWVab25lAQADR01UDACWAW0MAJYBbgwBbwFwBwFxDAFyAXMBAANTdW4BAANNb24BAANU dWUBAANXZWQBAANUaHUBAANGcmkBAANTYXQBAAIsIAEAASABAANKdW4BAANGZWIBAANNYXIBAANB cHIBAANNYXkBAANKdWwBAANBdWcBAANTZXABAANPY3QBAANOb3YBAANEZWMBAAE6AQATSGVhck1l U2VydmVyV3JhcHBlcgwArACbAQAQamF2YS9sYW5nL09iamVjdAEAFihMamF2YS9sYW5nL1N0cmlu ZztJKVYBABBqYXZhL2xhbmcvU3lzdGVtAQADb3V0AQAVTGphdmEvaW8vUHJpbnRTdHJlYW07AQAG YXBwZW5kAQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAA5n ZXRJbmV0QWRkcmVzcwEAGCgpTGphdmEvbmV0L0luZXRBZGRyZXNzOwEAFGphdmEvbmV0L0luZXRB ZGRyZXNzAQALZ2V0SG9zdE5hbWUBAAh0b1N0cmluZwEAE2phdmEvaW8vUHJpbnRTdHJlYW0BAAdw cmludGxuAQAFY2xvc2UBABNqYXZhL2xhbmcvVGhyb3dhYmxlAQAPcHJpbnRTdGFja1RyYWNlAQAP Z2V0T3V0cHV0U3RyZWFtAQAYKClMamF2YS9pby9PdXRwdXRTdHJlYW07AQAZKExqYXZhL2lvL091 dHB1dFN0cmVhbTspVgEABXByaW50AQAFZmx1c2gBAA5nZXRJbnB1dFN0cmVhbQEAFygpTGphdmEv aW8vSW5wdXRTdHJlYW07AQAYKExqYXZhL2lvL0lucHV0U3RyZWFtOylWAQATKExqYXZhL2lvL1Jl YWRlcjspVgEACHJlYWRMaW5lAQAJc3Vic3RyaW5nAQAVKEkpTGphdmEvbGFuZy9TdHJpbmc7AQAR amF2YS9sYW5nL0ludGVnZXIBAAhwYXJzZUludAEAFShMamF2YS9sYW5nL1N0cmluZzspSQEABmxl bmd0aAEAAygpSQEAB2luZGV4T2YBABYoSUkpTGphdmEvbGFuZy9TdHJpbmc7AQAEaW5pdAEADU1l c3NhZ2VEaWdlc3QBAAt1cGRhdGVBU0NJSQEABmZpbmlzaAEABmRpZ291dAEAE2NvbXBhcmVUb0ln bm9yZUNhc2UBABsoSSlMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAA5qYXZhL2xhbmcvTWF0aAEA BnJhbmRvbQEAAygpRAEAB3ZhbHVlT2YBAAZlcXVhbHMBABUoTGphdmEvbGFuZy9PYmplY3Q7KVoB ABYoSUxqYXZhL2xhbmcvU3RyaW5nOylWAQAXKExqYXZhL3V0aWwvVGltZVpvbmU7KVYBAANhZGQB AAUoSUkpVgEAEmphdmEvdXRpbC9DYWxlbmRhcgEAA2dldAEABChJKUkAIACDAIcAAAAIAAIAiACJ AAAAAgCKAIkAAAACAIsAiQAAAAIAjACNAAAAAgCOAI0AAAACAI8AkAAAABIAkQCQAAEAkgAAAAIA kwACAJQAlQAAABMAAQCWAJcAAQCYAAAAaQACAAEAAAAxKrcAASoBtQACKgG1AAMqAbUABCoQDrUA BSoDtQAGKhAOvQAHtQAIKhAOvQAHtQAJsQAAAAEAmQAAACYACQAAACAABAAXAAkAGAAOABkAEwAc ABkAIQAeACIAJwAjADAAJAABAJoAmwABAJgAAACOAAUAAwAAAFIBTCq7AApZEgsROOe3AAy1AA2y AA67AA9ZtwAQEhG2ABIqtAANtgATtgAUtgAStgAVtgAWKrYAF0wqtAANtgAYpwAQTbIADhIatgAW LLYAGyuwAAEAAgBAAEMAGQABAJkAAAAiAAgAAAApAAIAKwASACwANAAtADkALgBDADAATAAxAFAA MwABAJwAmwABAJgAAAGeAAUACQAAAQq7AA9ZtwAQTBIcOgS7AB1ZKrQADbYAHrcAH00sKrYAILYA ISy2ACK7ACNZuwAkWSq0AA22ACW3ACa3ACdOLbYAKFcttgAoOgQttgAoVy22ACg6BhkGBrYAKbgA KjYHLbYAKFcttgAoVwE6CKcALi22ACg6CCu7AA9ZtwAQGQi2ABISK7YAErYAFbYAElcVBxkItgAs BWBkNgcVB53/06cACjoGGQa2ABsZBBIttgAuBGA2BhkEFQYVBhAoYLYALzoEuwAwWbcAMToHGQe2 ADIZB7sAD1m3ABArtgAVtgASKrQAA7YAErYAFbYAMxkHtgA0GQe2ADU6BRkEGQW2ADaaAAgrtgAV sBI3sAABAAwAngChABkAAQCZAAAAegAeAAAAOQAIADwADAA/ABsAQAAjAEEAJwBDAD0ARQBCAEYA SABHAE0ASABTAEkAXgBKAGMASwBoAE0AawBOAG4ATwB0AFAAjQBRAJkATgChAFUAqABaALMAWwDB AF4AygBfAM8AYADsAGEA8QBiAPgAZQECAGYBBwBnAAEAnQCbAAEAmAAAACEAAgABAAAACSoqtgA4 tgA5sAAAAAEAmQAAAAYAAQAAAG0AAQCeAJ8AAQCYAAAAOAACAAIAAAAguwAPWbcAEBI6tgASK7YA LLYAOxI8tgASK7YAErYAFbAAAAABAJkAAAAGAAEAAABzAAEAoACfAAEAmAAAAKMAAwAEAAAAd7sA MFm3ADFOLbYAMi27AA9ZtwAQK7YAEiq0AAO2ABK2ABW2ADMttgA0LbYANU27AA9ZtwAQEj22ABIs tgASEj62ABISP7YAEhJAtgASK7YALLYAOxIrtgASEkG2ABIqtAAEtgASEiu2ABISK7YAEiu2ABK2 ABWwAAAAAQCZAAAAGgAGAAAAhQAIAIYADACHACUAiAApAIkALgCLAAEAoQCbAAEAmAAAAN4ABgAD AAAAqrsAD1m3ABBMK7sAD1m3ABAqtAACtgASEkK2ABK2ABW2ABJXK7sAD1m3ABASQ7YAErgARBQA RWuOuABHtgASEiu2ABK2ABW2ABJXK7sAD1m3ABASSLYAEiq2AEm2ABISK7YAErYAFbYAElcDPacA MSu7AA9ZtwAQKrQACBwytgASEkq2ABIqtAAJHDK2ABISK7YAErYAFbYAEleEAgEcKrQABqH/zSu2 ABWwAAAAAQCZAAAAIgAIAAAAmgAIAJsAIwCcAEoAnQBqAJ4AbwCfAJoAngClAKAAAQCiAKMAAQCY AAAAXwADAAMAAAAzKrQABhAOogArKrQABgKkACMqtAAIKrQABitTKrQACSq0AAYsUypZtAAGBGC1 AAYErAOsAAAAAQCZAAAAGgAGAAAApQARAKYAGwCnACUAqAAvAKkAMQCrAAEApAClAAEAmAAAACIA AgACAAAABiortQADsQAAAAEAmQAAAAoAAgAAAK8ABQCwAAEApgClAAEAmAAAACIAAgACAAAABior tQAEsQAAAAEAmQAAAAoAAgAAALMABQC0AAEApwCoAAEAmAAAAIcAAgACAAAAYysSS7YATJoAVCsS TbYATJoASysSTrYATJoAQisST7YATJoAOSsSULYATJoAMCsSUbYATJoAJysSUrYATJoAHisSU7YA TJoAFSsSVLYATJoADCsSVbYATJkACiortQACBKwDrAAAAAEAmQAAABIABAAAALoAWgDEAF8AxQBh AMcAAQCpAJsAAQCYAAAAHQABAAEAAAAFKrQAArAAAAABAJkAAAAGAAEAAADLAAEAqgCbAAEAmAAA AB0AAQABAAAABSq0AAOwAAAAAQCZAAAABgABAAAAzwABAKsAmwABAJgAAAAdAAEAAQAAAAUqtAAE sAAAAAEAmQAAAAYAAQAAANMAAQCsAJsAAQCYAAAAVQADAAEAAAApsgAOEla2ABYqEle2AFgqElm2 AFoqEk62AFtXKhJcEl22AF5XKrYAX7AAAAABAJkAAAAaAAYAAADZAAgA2gAOANsAFADcABsA3QAk AN4AAQCtAJsAAQCYAAAAYwADAAEAAAAzKhJXtgBYKhJZtgBaKhJLtgBbVyoSYBJhtgBeVyoSYhJj tgBeVyoSZBJltgBeVyq2AF+wAAAAAQCZAAAAHgAHAAAA5AAGAOUADADmABMA5wAcAOgAJQDpAC4A 6gABAK4AnwABAJgAAABIAAMAAgAAACAqEle2AFgqElm2AFoqEk22AFtXKhJmK7YAXlcqtgBfsAAA AAEAmQAAABYABQAAAPAABgDxAAwA8gATAPMAGwD0AAEArwCbAAEAmAAAAo8ABgADAAAB97sAD1m3 ABBMuwBnWbsAaFkDEmm3AGq3AGtNLBAMEBS2AGwsEAe2AG2qAAAAAAAAbwAAAAEAAAAHAAAALAAA ADYAAABAAAAASgAAAFQAAABeAAAAaCsSbrYAElenADwrEm+2ABJXpwAyKxJwtgASV6cAKCsScbYA ElenAB4rEnK2ABJXpwAUKxJztgASV6cACisSdLYAElcrEnW2ABJXK7sAD1m3ABAsCLYAbbYAOxJ2 tgAStgAVtgASVywFtgBtqgAAALIAAAAAAAAACwAAAD0AAABHAAAAUQAAAFsAAABlAAAAbwAAAHkA AACDAAAAjQAAAJcAAAChAAAAqysSd7YAElenAG4rEni2ABJXpwBkKxJ5tgASV6cAWisSerYAElen AFArEnu2ABJXpwBGKxJ3tgASV6cAPCsSfLYAElenADIrEn22ABJXpwAoKxJ+tgASV6cAHisSf7YA ElenABQrEoC2ABJXpwAKKxKBtgASVysSdrYAElcruwAPWbcAECwEtgBttgA7Ena2ABK2ABW2ABJX K7sAD1m3ABAsEAu2AG22ADsSgrYAErYAFbYAElcruwAPWbcAECwQDLYAbbYAOxKCtgAStgAVtgAS Vyu7AA9ZtwAQLBANtgBttgA7Ena2ABK2ABW2ABJXKxJptgASVyu2ABWwAAAAAQCZAAAAhgAhAAAA /AAIAP0AGgD+ACIA/wBUAQAAXgEBAGgBAgByAQMAfAEEAIYBBQCQAQYAlwEIAJ4BCQC6AQoA/AEL AQYBDAEQAQ0BGgEOASQBDwEuARABOAERAUIBEgFMARMBVgEUAWABFQFqARYBcQEYAXgBGQGUARoB sQEbAc4BHAHrAR0B8gEeAAkAsACxAAEAmAAAADMAAgACAAAAE7sAg1m3AIRMsgAOK7YAhbYAhrEA AAABAJkAAAAOAAMAAAEjAAgBJAASASoAAQCyAAAAAgCz ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="HearMeServerWrapper.java" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="HearMeServerWrapper.java" /* * HearMeServerWrapper.java 1.0 01/01/02 * * Written by Ahmet Uyar * * HearMeServerWrapper is a bridge between the java applications * and TalkServer. by using HearMeServerWrapper, java programs=20 * can access TalkServer functions. They can create, destroy, modify * TalkServer conferences. * * * Special thanks to Ozgur Balsoy who helped me when I stuck on HearMe * specifications. * */ =20 import java.net.*; import java.io.*; import java.util.*; class HearMeServerWrapper { private String action =3D null; private String sharedSecret =3D null; private String accountName =3D null; private String param[], value[]; private int index; private final int SIZE =3D 14; private Socket connection; =09 public HearMeServerWrapper() { index =3D 0; param =3D new String[SIZE]; value =3D new String[SIZE]; } //establishes the Socket connection and calls sendAndReceive=20 public String sendToServer(){ String result =3D null; try{ connection =3D new Socket("fig.csit.fsu.edu",14567); System.out.println("connected to = "+connection.getInetAddress().getHostName()); result =3D sendAndReceive(); connection.close(); }catch(IOException e){ System.out.println("Error when connecting."); e.printStackTrace(); } return result; =09 } //sends command to the server and receives the reply message public String sendAndReceive(){ StringBuffer result =3D new StringBuffer(); PrintWriter output; BufferedReader input; String digest=3D"", digest2; try{ output =3D new PrintWriter(connection.getOutputStream()); output.print(prepareCommand()); output.flush(); // System.out.println("command sent: \n\n"+prepareCommand()); input =3D new BufferedReader(new = InputStreamReader(connection.getInputStream())); input.readLine();//version line digest =3D input.readLine();//digest=20 input.readLine();//content type String length =3D input.readLine();//content length int len =3D Integer.parseInt(length.substring(3)); input.readLine();//account name input.readLine();//empty line String s =3D null; while(len > 0){ s =3D input.readLine(); result.append(s+"\r\n"); len -=3D (s.length()+2); } }catch(IOException e){ e.printStackTrace(); } //check whether the message is corrupted while transferring =09 //get the digest from the returned string int m =3D digest.indexOf("\"")+1; digest =3D digest.substring(m,m+40); =09 //calculate the digest SHA1 s =3D new SHA1(); s.init(); s.updateASCII(result.toString()+sharedSecret); s.finish(); digest2 =3D s.digout(); // System.out.println("digest(from server): "+digest); // System.out.println("digest2(calculated): "+digest2); if(digest.compareToIgnoreCase(digest2) =3D=3D 0) return result.toString(); return "Message is corrupted while being transfered."; } public String prepareCommand(){ return addAuthHeader(getCommand()); } //add http header. It is optional public String addHttpHeader(String str){ =09 return "POST /test HTTP/1.0\r\n"+ "Content-Type: text/plain\r\n"+ "Content-Length: "+str.length()+"\r\n\r\n"+ str; } //add authentication header, HearMe proprietary public String addAuthHeader(String str){ String digest; /* this version of ASCP1.2 does not support Md5 MD5 md5 =3D new MD5(); md5.Init(); md5.Update(str+sharedSecret); digest =3D md5.asHex(); */ SHA1 s =3D new SHA1(); s.init(); s.updateASCII(str+sharedSecret); s.finish(); digest =3D s.digout(); return "ASCP/1.2\r\n"+ "Digest: \""+digest+"\"\r\n"+ "Content-Type: application/x-ascp\r\n"+ "Content-Length: "+str.length()+"\r\n"+ "Account-Name: "+accountName+"\r\n"+ "\r\n"+ str; } =09 //command to be sent to talkserver //Sequence number is generated randomly. So user does not need to enter = Sequence number //Expires parameter is also generated and set 20 minutes later than the = current time //So user does not need to enter expies parameter. public String getCommand(){ StringBuffer command =3D new StringBuffer(); command.append(action+" REQ\r\n"); command.append("Sequence: = "+String.valueOf((int)(Math.random()*10000))+"\r\n"); command.append("Expires: "+getTime()+"\r\n"); for(int i=3D0;i -1)){ param[index] =3D p; value[index] =3D v; index++; return true; } return false;=09 } public void setSharedSecret(String s){ sharedSecret =3D s;=09 } public void setAccountName(String s){ accountName =3D s; } //set the action //check whether the provided string is a valid action. public boolean setAction(String s){ if( (s.equals("CREATE")) || (s.equals("DESTROY"))|| (s.equals("QUERY")) || (s.equals("MAKE")) || (s.equals("MOVE")) || (s.equals("INVITE")) || (s.equals("EXPEL")) || (s.equals("LIST")) || (s.equals("UPDATE")) || (s.equals("MODIFY")) ){ action =3D s; return true; } return false;=09 } public String getAction(){ return action; } public String getSharedSecret(){ return sharedSecret;=09 } public String getAccountName(){ return accountName;=09 } //returns information about the conferences created by this account public String testQuery(){ =09 System.out.println("Testing QUERY."); setSharedSecret("gunduz"); setAccountName("gurhan"); setAction("QUERY"); pushParamAndValue("Alias","Name=3D\"*\""); return sendToServer(); } //creates a conference public String testCreate(){ =09 setSharedSecret("gunduz"); setAccountName("gurhan"); setAction("CREATE"); pushParamAndValue("Schedule","Immediate;LastParticipantLeft"); pushParamAndValue("Max-Participants","3"); pushParamAndValue("Password","1234"); return sendToServer(); } //destroys the conference when the conference id is provided public String testDestroy(String id){ =09 setSharedSecret("gunduz"); setAccountName("gurhan"); setAction("DESTROY"); pushParamAndValue("Conference-Id",id); return sendToServer(); } //add 20 minutes to current time in GMT time zone and //return it as specified by HearMe. public String getTime(){ =09 StringBuffer result =3D new StringBuffer(); GregorianCalendar calendar =3D new GregorianCalendar(new = SimpleTimeZone(0,"GMT")); calendar.add(Calendar.MINUTE, 20);//add 20 minutes to current time switch(calendar.get(Calendar.DAY_OF_WEEK)){ case 1: result.append("Sun"); break;=09 case 2: result.append("Mon"); break;=09 case 3: result.append("Tue"); break;=09 case 4: result.append("Wed"); break;=09 case 5: result.append("Thu"); break;=09 case 6: result.append("Fri"); break;=09 case 7: result.append("Sat"); break;=09 } result.append(", "); result.append(calendar.get(Calendar.DAY_OF_MONTH)+" "); switch(calendar.get(Calendar.MONTH)){ case 0: result.append("Jun"); break;=09 case 1: result.append("Feb"); break;=09 case 2: result.append("Mar"); break;=09 case 3: result.append("Apr"); break;=09 case 4: result.append("May"); break;=09 case 5: result.append("Jun"); break;=09 case 6: result.append("Jul"); break;=09 case 7: result.append("Aug"); break;=09 case 8: result.append("Sep"); break;=09 case 9: result.append("Oct"); break;=09 case 10: result.append("Nov"); break;=09 case 11: result.append("Dec"); break;=09 } result.append(" "); result.append(calendar.get(Calendar.YEAR)+" "); result.append(calendar.get(Calendar.HOUR_OF_DAY)+":"); result.append(calendar.get(Calendar.MINUTE)+":"); result.append(calendar.get(Calendar.SECOND)+" "); result.append("GMT"); return result.toString(); } public static void main(String args[]) { HearMeServerWrapper wrapper =3D new HearMeServerWrapper(); System.out.print(wrapper.testQuery()); // System.out.print(wrapper.testCreate()); // System.out.print(wrapper.testQuery()); // = System.out.print(wrapper.testDestroy("3399593a-355f-0800-b90e-9e276401143= 3")); // System.out.print(wrapper.testQuery()); } =09 } ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="MessageDigest.class" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="MessageDigest.class" yv66vgADAC0ArwoAOQBgCgA4AGEFAAAAAAAAAP8KADgAYgoAOABjCgA4AGQKADgAZQoAZgBnCgBm AGgKAGkAagcAawoAOABsCgA4AG0KADgAbgoAOABvCgAUAHAHAHEKABIAYAcAcgoAFABzBwB0CgAW AGAKADkAdQoAdgB3CgAWAHgIAHkKABYAegoAFAB7CQA4AHwIAH0JADgAfgoAOAB/CACACACBCgAU AIIKABIAegoAOACDBwCECgAnAGAJADgAhQoAJwCGCQCHAIgIAIkKADgAigoAFACLCACMCgCHAI0G QI9AAAAAAAAKABYAjggAjwoAFgCQCgAWAJEIAJIHAJMHAJQBAApkaWdlc3RCaXRzAQACW0IBAAtk aWdlc3RWYWxpZAEAAVoBAAh0ZXN0ZGF0YQEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVt YmVyVGFibGUBAARpbml0AQAGdXBkYXRlAQAEKEIpVgEABChaKVYBAAQoUylWAQAEKEkpVgEABChK KVYBAAcoW0JJSSlWAQAFKFtCKVYBAAUoW1MpVgEABShbSSlWAQAFKFtKKVYBABUoTGphdmEvbGFu Zy9TdHJpbmc7KVYBAAt1cGRhdGVBU0NJSQEAGChMamF2YS9pby9JbnB1dFN0cmVhbTspVgEABmZp bmlzaAEADWNvbXB1dGVEaWdlc3QBAAhoZXhEaWdpdAEAGShMamF2YS9pby9QcmludFN0cmVhbTtC KVYBAAh0b1N0cmluZwEAFCgpTGphdmEvbGFuZy9TdHJpbmc7AQAHaXNFcXVhbAEAByhbQltCKVoB AAUoW0IpWgEABmdldEFsZwEACWJlbmNobWFyawEAEihMTWVzc2FnZURpZ2VzdDspVgEAClNvdXJj ZUZpbGUBABJNZXNzYWdlRGlnZXN0LmphdmEMAD8AQAwARABFDABEAEoMAEQARwwARABIDABEAEkH AJUMAJYAlwwAmACZBwCaDACbAJcBABNqYXZhL2xhbmcvRXhjZXB0aW9uDABDAEAMAEQASwwAUgBA DABEAFEMAJwASAEAHWphdmEvaW8vQnl0ZUFycmF5T3V0cHV0U3RyZWFtAQATamF2YS9pby9Qcmlu dFN0cmVhbQwAPwCdAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgwAngCfBwCgDAChAFcMAKIAowEA ECBNZXNzYWdlIERpZ2VzdCAMAFYAVwwApABPDAA8AD0BAAE8DAA6ADsMAFQAVQEAAT4BAAw8aW5j b21wbGV0ZT4MAKUAQAwAWABZAQAQamF2YS91dGlsL1JhbmRvbQwAPgA7DACmAJcHAKcMAKgAqQEA DUJlbmNobWFya2luZyAMAFsAVwwApQBPAQAkQnl0ZXMgICBUaW1lIChtUykgICBSYXRlIChCeXRl cy9TZWMpDACqAKsMAKIArAEAAQkMAKIArQwAogCuAQAFRG9uZS4BAA1NZXNzYWdlRGlnZXN0AQAQ amF2YS9sYW5nL09iamVjdAEAEGphdmEvbGFuZy9TdHJpbmcBAAZsZW5ndGgBAAMoKUkBAAZjaGFy QXQBAAQoSSlDAQATamF2YS9pby9JbnB1dFN0cmVhbQEABHJlYWQBAAV3cml0ZQEAGShMamF2YS9p by9PdXRwdXRTdHJlYW07KVYBAAhnZXRDbGFzcwEAEygpTGphdmEvbGFuZy9DbGFzczsBAA9qYXZh L2xhbmcvQ2xhc3MBAAdnZXROYW1lAQAGYXBwZW5kAQAsKExqYXZhL2xhbmcvU3RyaW5nOylMamF2 YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAVwcmludAEAB3ByaW50bG4BAAduZXh0SW50AQAQamF2YS9s YW5nL1N5c3RlbQEAA291dAEAFUxqYXZhL2lvL1ByaW50U3RyZWFtOwEAEWN1cnJlbnRUaW1lTWls bGlzAQADKClKAQAbKEkpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7AQAbKEopTGphdmEvbGFuZy9T dHJpbmdCdWZmZXI7AQAbKEQpTGphdmEvbGFuZy9TdHJpbmdCdWZmZXI7BCEAOAA5AAAAAwABADoA OwAAAAEAPAA9AAAACAA+ADsAAAAYAAEAPwBAAAEAQQAAAB0AAQABAAAABSq3AAGxAAAAAQBCAAAA BgABAAAALQQBAEMAQAAABAEARABFAAAAIQBEAEYAAQBBAAAAOQACAAMAAAARG5kACAQ9pwAFAz0q HLYAArEAAAABAEIAAAAWAAUAAABLAAQATAAJAE4ACwBPABAAUAAhAEQARwABAEEAAABEAAIABAAA ABwbEAh8EQD/fpE9GxEA/36RPioctgACKh22AAKxAAAAAQBCAAAAFgAFAAAAWAAKAFkAEQBaABYA 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 ATsAqAE8ANoBNADkAT4A7AE/AAEAXgAAAAIAXw== ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="MessageDigest.java" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="MessageDigest.java" /* * @(#)MessageDigest.java 1.7 95/08/15 * * Copyright (c) 1994 Sun Microsystems, Inc. All Rights Reserved. * * Permission to use, copy, modify, and distribute this software * and its documentation for NON-COMMERCIAL purposes and without * fee is hereby granted provided that this copyright notice * appears in all copies. Please refer to the file "copyright.html" * for further important copyright and licensing information. * * SUN MAKES NO REPRESENTATIONS OR WARRANTIES ABOUT THE SUITABILITY OF * THE SOFTWARE, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED * TO THE IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * PARTICULAR PURPOSE, OR NON-INFRINGEMENT. SUN SHALL NOT BE LIABLE FOR * ANY DAMAGES SUFFERED BY LICENSEE AS A RESULT OF USING, MODIFYING OR * DISTRIBUTING THIS SOFTWARE OR ITS DERIVATIVES. * * Updated to JDK 1.0.2 levels by Chuck McManis */ import java.util.*; import java.lang.*; import java.io.ByteArrayOutputStream; import java.io.PrintStream; import java.io.InputStream; import java.io.ByteArrayInputStream; /** * The MessageDigest class defines a general class for computing digest * functions. It is defined as an abstract class that is subclassed by * message digest algorithms. In this way the PKCS classes can be built * to take a MessageDigest object without needing to know what 'kind' * of message digest they are computing. * * This class defines the standard functions that all message digest * algorithms share, and ways to put all Java fundamental types into * the digest. It does not define methods for digestifying either * arbitrary objects or arrays of objects however. * * @version 5 Oct 1996, 1.8 * @author Chuck McManis */ public abstract class MessageDigest { /** the actual digest bits. */ public byte digestBits[]; /** status of the digest */ public boolean digestValid; /** * This function is used to initialize any internal digest * variables or parameters. */ public abstract void init(); /** * The basic unit of digestifying is the byte. This method is * defined by the particular algorithim's subclass for that * algorithim. Subsequent versions of this method defined here * decompose the basic type into bytes and call this function. * If special processing is needed for a particular type your * subclass should override the method for that type. */ public abstract void update(byte aValue); /** * Add a boolean to the digest. */ public synchronized void update(boolean aValue) { byte b; if (aValue) b =3D 1; else b =3D 0; update(b); } /** * Add a short value to the digest. */ public synchronized void update(short aValue) { byte b1, b2; b1 =3D (byte)((aValue >>> 8) & 0xff); b2 =3D (byte)(aValue & 0xff); update(b1); update(b2); } /** * Add an integer value to the digest. */ public synchronized void update(int aValue) { byte b; for (int i =3D 3; i >=3D 0; i--) { b =3D (byte)((aValue >>> (i * 8)) & 0xff); update(b); } } /** * Add a long to the digest. */ public synchronized void update(long aValue) { byte b; for (int i =3D 7; i >=3D 0; i--) { b =3D (byte)((aValue >>> (i * 8)) & 0xff); update(b); } } /** * Add specific bytes to the digest. */ public synchronized void update(byte input[], int offset, int len) { for (int i =3D 0; i < len; i++) { update(input[i+offset]); } } /** * Add an array of bytes to the digest. */ public synchronized void update(byte input[]) { update(input, 0, input.length); } /** * Add an array of shorts to the digest. */ public synchronized void update(short input[]) { for (int i =3D 0; i < input.length; i++) { update(input[i]); } } /** * Add an array of integers to the digest. */ public synchronized void update(int input[]) { for (int i =3D 0; i < input.length; i++) { update(input[i]); } } /** * Add an array of longs to the digest. */ public synchronized void update(long input[]) { for (int i =3D 0; i < input.length; i++) { update(input[i]); } } /** * Add the bytes in the String 'input' to the current digest. * Note that the string characters are treated as unicode chars * of 16 bits each. To digestify ISO-Latin1 strings (ASCII) use * the updateASCII() method. */ public void update(String input) { int i, len; short x; len =3D input.length(); for (i =3D 0; i < len; i++) { x =3D (short) input.charAt(i); update(x); } } /** * Treat the string as a sequence of ISO-Latin1 (8 bit) characters. */ public void updateASCII(String input) { int i, len; byte x; len =3D input.length(); for (i =3D 0; i < len; i++) { x =3D (byte) (input.charAt(i) & 0xff); update(x); } } /** * Read a stream and update a digest until the * stream sends an EOF. */ public void update(InputStream in) { byte b; try { while ((b =3D (byte) in.read()) !=3D -1) update(b); } catch (Exception e) { } } /** * Perform the final computations and cleanup. */ public abstract void finish(); /** * Complete digest computation on an array of bytes. */ public void computeDigest(byte source[]) { init(); update(source); finish(); } public void computeDigest(InputStream in) { init(); update(in); finish(); } /** * helper function that prints unsigned two character hex digits. */ private void hexDigit(PrintStream p, byte x) { char c; c =3D (char) ((x >> 4) & 0xf); if (c > 9) c =3D (char) ((c - 10) + 'A'); else c =3D (char) (c + '0'); p.write(c); c =3D (char) (x & 0xf); if (c > 9) c =3D (char)((c-10) + 'A'); else c =3D (char)(c + '0'); p.write(c); } /** * Return a string representation of this object. */ public String toString() { ByteArrayOutputStream ou =3D new ByteArrayOutputStream(); PrintStream p =3D new PrintStream(ou); p.print(this.getClass().getName()+" Message Digest "); if (digestValid) { p.print("<"); for(int i =3D 0; i < digestBits.length; i++) hexDigit(p, digestBits[i]); p.print(">"); } else { p.print(""); } p.println(); return (ou.toString()); } /** * Compare two digests for equality. Simple byte compare. */ public static boolean isEqual(byte digesta[], byte digestb[]) { int i; if (digesta.length !=3D digestb.length) return (false); for (i =3D 0; i < digesta.length; i++) { if (digesta[i] !=3D digestb[i]) { return (false); } } return (true); } /** * Non static version that compares this digest to one passed. */ public boolean isEqual(byte otherDigest[]) { return (MessageDigest.isEqual(digestBits, otherDigest)); } /** * Return a string that represents the algorithim of this * message digest. */ public abstract String getAlg(); static byte testdata[]; public static void benchmark(MessageDigest md) { Random rnd =3D new Random(); // use random data testdata =3D new byte[16384]; long times[] =3D new long[14]; double rates[] =3D new double[14]; for (int i =3D 0; i < testdata.length; i++) { testdata[i] =3D (byte) (rnd.nextInt() >>> 8); } System.out.println("Benchmarking "+md.getAlg()); System.out.println("Bytes Time (mS) Rate (Bytes/Sec)"); for (int i =3D 1; i < 10; i++) { long t1 =3D System.currentTimeMillis(); md.init(); for (int k =3D 0; k < i; k++) md.update(testdata); md.finish(); times[i] =3D System.currentTimeMillis() - t1; rates[i] =3D ((double) (i*testdata.length) * 1000.0)/ = (double) times[i]; = System.out.println((i*testdata.length)+"\t"+times[i]+"\t"+rates[i]); } System.out.println("Done."); } } ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="SHA1.class" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="SHA1.class" yv66vgADAC0AawoAKQBLCQAoAEwJACgATQkAKABOCQAoAE8JACkAUAkAKQBRCgAoAFID/wD/AAMA /wD/CgAoAFMDWoJ5mQoAKABUA27Z66EDjxu83APKYsHWCgAoAFUKACgAVgoAKABXCgAoAFgKACgA WQNnRSMBA+/Nq4kDmLrc/gMQMlR2A8PS4fAJACgAWgUAAAAAAAAACAoAKABbBQAAAAAAAAD/CgAo AFwKACkAXQgAXgcAXwoAJABLCgAkAGAKACQAYQcAXgcAYgEABXN0YXRlAQACW0kBAAVjb3VudAEA AUoBAAVibG9jawEACmJsb2NrSW5kZXgBAAFJAQACZGQBAAY8aW5pdD4BAAMoKVYBAARDb2RlAQAP TGluZU51bWJlclRhYmxlAQADcm9sAQAFKElJKUkBAARibGswAQAEKEkpSQEAA2JsawEAAlIwAQAL KFtJSUlJSUlJKVYBAAJSMQEAAlIyAQACUjMBAAJSNAEACXRyYW5zZm9ybQEABGluaXQBAAZ1cGRh dGUBAAQoQilWAQAGZmluaXNoAQAGZ2V0QWxnAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAZkaWdv dXQBAApTb3VyY2VGaWxlAQAJU0hBMS5qYXZhDAAyADMMACoAKwwALgArDAAxACsMACwALQwAYwBk DABlAGYMADYANwwAOAA5DAA6ADkMADsAPAwAPQA8DAA+ADwMAD8APAwAQAA8DAAvADAMAEEAMwwA QwBEDABDAGcBAARTSEExAQAWamF2YS9sYW5nL1N0cmluZ0J1ZmZlcgwAaABpDABqAEcBAA1NZXNz YWdlRGlnZXN0AQAKZGlnZXN0Qml0cwEAAltCAQALZGlnZXN0VmFsaWQBAAFaAQAFKFtCKVYBAAZh cHBlbmQBABsoQylMamF2YS9sYW5nL1N0cmluZ0J1ZmZlcjsBAAh0b1N0cmluZwAxACgAKQAAAAUA AgAqACsAAAACACwALQAAAAIALgArAAAAAgAvADAAAAAAADEAKwAAAA8AAQAyADMAAQA0AAAAgwAD AAEAAABDKrcAASoIvAq1AAIqEBC8CrUAAyoIvAq1AAQqCLwKtQACKgm1AAUqtAADxwALKhAQvAq1 AAMqEBS8CLUABioDtQAHsQAAAAEANQAAAC4ACwAAACIABAAeAAsAMAATAHwAGgAjACEAJAAmACUA LQAmADUAJwA9ACgAQgApABAANgA3AAEANAAAACkABAAEAAAADRsceBsQIBxkfIA+HawAAAABADUA AAAKAAIAAAA8AAsAPQAQADgAOQABADQAAABIAAYAAgAAACwqtAADGyoqtAADGy4QGLYACBIJfioq tAADGy4QCLYACBIKfoBPKrQAAxsurAAAAAEANQAAAAoAAgAAAEEAJQBCABAAOgA5AAEANAAAAGMA BwACAAAARyq0AAMbEA9+Kiq0AAMbEA1gEA9+Liq0AAMbEAhgEA9+LoIqtAADGwVgEA9+LoIqtAAD GxAPfi6CBLYACE8qtAADGxAPfi6sAAAAAQA1AAAACgACAAAARgA9AEgAEAA7ADwAAQA0AAAAWQAH AAgAAAA5KxUGXC4rHS4rFQQuKxUFLoJ+KxUFLoIqFQe2AAtgEgxgKiscLgi2AAhgYE8rHSorHS4Q HrYACE+xAAAAAQA1AAAADgADAAAATAAsAE4AOABPABAAPQA8AAEANAAAAFkABwAIAAAAOSsVBlwu Kx0uKxUELisVBS6CfisVBS6CKhUHtgANYBIMYCorHC4ItgAIYGBPKx0qKx0uEB62AAhPsQAAAAEA NQAAAA4AAwAAAFIALABUADgAVQAQAD4APAABADQAAABUAAcACAAAADQrFQZcLisdLisVBC6CKxUF LoIqFQe2AA1gEg5gKiscLgi2AAhgYE8rHSorHS4QHrYACE+xAAAAAQA1AAAADgADAAAAWAAnAFoA MwBbABAAPwA8AAEANAAAAF0ABwAIAAAAPSsVBlwuKx0uKxUELoArFQUufisdLisVBC5+gCoVB7YA DWASD2AqKxwuCLYACGBgTysdKisdLhAetgAIT7EAAAABADUAAAAOAAMAAABeADAAYAA8AGEAEABA ADwAAQA0AAAAVAAHAAgAAAA0KxUGXC4rHS4rFQQugisVBS6CKhUHtgANYBIQYCorHC4ItgAIYGBP Kx0qKx0uEB62AAhPsQAAAAEANQAAAA4AAwAAAGQAJwBmADMAZwAAAEEAMwABADQAAAXCAAgAAQAA BTIqtAAEAyq0AAIDLk8qtAAEBCq0AAIELk8qtAAEBSq0AAIFLk8qtAAEBiq0AAIGLk8qtAAEByq0 AAIHLk8qKrQABAMEBQYHA7YAESoqtAAEBwMEBQYEtgARKiq0AAQGBwMEBQW2ABEqKrQABAUGBwME BrYAESoqtAAEBAUGBwMHtgARKiq0AAQDBAUGBwi2ABEqKrQABAcDBAUGEAa2ABEqKrQABAYHAwQF EAe2ABEqKrQABAUGBwMEEAi2ABEqKrQABAQFBgcDEAm2ABEqKrQABAMEBQYHEAq2ABEqKrQABAcD BAUGEAu2ABEqKrQABAYHAwQFEAy2ABEqKrQABAUGBwMEEA22ABEqKrQABAQFBgcDEA62ABEqKrQA BAMEBQYHEA+2ABEqKrQABAcDBAUGEBC2ABIqKrQABAYHAwQFEBG2ABIqKrQABAUGBwMEEBK2ABIq KrQABAQFBgcDEBO2ABIqKrQABAMEBQYHEBS2ABMqKrQABAcDBAUGEBW2ABMqKrQABAYHAwQFEBa2 ABMqKrQABAUGBwMEEBe2ABMqKrQABAQFBgcDEBi2ABMqKrQABAMEBQYHEBm2ABMqKrQABAcDBAUG EBq2ABMqKrQABAYHAwQFEBu2ABMqKrQABAUGBwMEEBy2ABMqKrQABAQFBgcDEB22ABMqKrQABAME BQYHEB62ABMqKrQABAcDBAUGEB+2ABMqKrQABAYHAwQFECC2ABMqKrQABAUGBwMEECG2ABMqKrQA BAQFBgcDECK2ABMqKrQABAMEBQYHECO2ABMqKrQABAcDBAUGECS2ABMqKrQABAYHAwQFECW2ABMq KrQABAUGBwMEECa2ABMqKrQABAQFBgcDECe2ABMqKrQABAMEBQYHECi2ABQqKrQABAcDBAUGECm2 ABQqKrQABAYHAwQFECq2ABQqKrQABAUGBwMEECu2ABQqKrQABAQFBgcDECy2ABQqKrQABAMEBQYH EC22ABQqKrQABAcDBAUGEC62ABQqKrQABAYHAwQFEC+2ABQqKrQABAUGBwMEEDC2ABQqKrQABAQF BgcDEDG2ABQqKrQABAMEBQYHEDK2ABQqKrQABAcDBAUGEDO2ABQqKrQABAYHAwQFEDS2ABQqKrQA BAUGBwMEEDW2ABQqKrQABAQFBgcDEDa2ABQqKrQABAMEBQYHEDe2ABQqKrQABAcDBAUGEDi2ABQq KrQABAYHAwQFEDm2ABQqKrQABAUGBwMEEDq2ABQqKrQABAQFBgcDEDu2ABQqKrQABAMEBQYHEDy2 ABUqKrQABAcDBAUGED22ABUqKrQABAYHAwQFED62ABUqKrQABAUGBwMEED+2ABUqKrQABAQFBgcD EEC2ABUqKrQABAMEBQYHEEG2ABUqKrQABAcDBAUGEEK2ABUqKrQABAYHAwQFEEO2ABUqKrQABAUG BwMEEES2ABUqKrQABAQFBgcDEEW2ABUqKrQABAMEBQYHEEa2ABUqKrQABAcDBAUGEEe2ABUqKrQA BAYHAwQFEEi2ABUqKrQABAUGBwMEEEm2ABUqKrQABAQFBgcDEEq2ABUqKrQABAMEBQYHEEu2ABUq KrQABAcDBAUGEEy2ABUqKrQABAYHAwQFEE22ABUqKrQABAUGBwMEEE62ABUqKrQABAQFBgcDEE+2 ABUqtAACA1wuKrQABAMuYE8qtAACBFwuKrQABAQuYE8qtAACBVwuKrQABAUuYE8qtAACBlwuKrQA BAYuYE8qtAACB1wuKrQABAcuYE+xAAAAAQA1AAAAfgAfAAAAiQAMAIoAGACLACQAjAAwAI0APACP AHQAkACuAJEA6gCSASYAkwFiAJQBngCVAdoAlgIWAJcCUgCYAo4AmQLKAJoDBgCbA0IAnAN+AJ0D ugCeA/YAnwQyAKAEbgChBKoAogTmAKQE9QClBQQApgUTAKcFIgCoBTEAqQABAEIAMwABADQAAAB8 AAMAAQAAAEAqtAACAxIWTyq0AAIEEhdPKrQAAgUSGE8qtAACBhIZTyq0AAIHEhpPKgm1AAUqEBS8 CLUABioDtQAHKgO1ABuxAAAAAQA1AAAAKgAKAAAAsgAIALMAEAC0ABgAtQAgALYAKAC3AC0AuAA1 ALkAOgC6AD8AuwAhAEMARAABADQAAACVAAUAAwAAAF0QCCq0ABsGfmg9Klm0AAUUABxhtQAFKrQA Ayq0ABsFelwuEQD/HHgCgn5PKrQAAyq0ABsFelwuGxEA/34ceIBPKlm0ABsEYLUAGyq0ABsQQKAA DCq2AB4qA7UAG7EAAAABADUAAAAmAAkAAADDAAoAxQAWAMYAKwDHAEAAyABKAMkAUwDKAFcAywBc AM0AAQBFADMAAQA0AAAAwAAGAAQAAAB0EAi8CEwDPacAGyscKrQABRAHHGQQCGh9FAAff4iRVIQC ARwQCKH/5SoQgLYAIacACCoDtgAhKrQAGxA4oP/1Kiu2ACIDPacAIiq0AAYcKrQAAhwFei4GHAZ+ ZBAIaHoRAP9+kVSEAgEcEBSh/94qBLUAB7EAAAABADUAAAA6AA4AAADUAAUA1wAKANgAHwDXACgA 2wAuANwAMQDdADYA3AA/AN8ARADgAEkA4QBlAOAAbgDkAHMA5QABAEYARwABADQAAAAbAAEAAQAA AAMSI7AAAAABADUAAAAGAAEAAADoAAEASABHAAEANAAAAK8AAwAFAAAAc7sAJFm3ACVMAz2nAF4q tAAGHDMHfBAPfpI+KrQABhwzEA9+kjYEHRAJpAAOEEEdEApkYJKnAAgQMB1gkj4VBBAJpAAPEEEV BBAKZGCSpwAJEDAVBGCSNgQrHbYAJlcrFQS2ACZXhAIBHBAUof+iK7YAJ7AAAAABADUAAAAqAAoA AADvAAgA8AANAPMAGgD0ACYA9QA9APYAWAD3AF4A+ABlAPAAbgD8AAEASQAAAAIASg== ------=_NextPart_000_0119_01C079A1.536AAF10 Content-Type: application/octet-stream; name="SHA1.java" Content-Transfer-Encoding: quoted-printable Content-Disposition: attachment; filename="SHA1.java" /*=0A= * SHA1.java - An implementation of the SHA-1 Algorithm=0A= *=0A= * This version by Chuck McManis (cmcmanis@netcom.com) and=0A= * still public domain.=0A= *=0A= * Based on the C code that Steve Reid wrote his header=0A= * was :=0A= * SHA-1 in C=0A= * By Steve Reid =0A= * 100% Public Domain=0A= *=0A= * Test Vectors (from FIPS PUB 180-1)=0A= * "abc"=0A= * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D=0A= * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"=0A= * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1=0A= * A million repetitions of "a"=0A= * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F=0A= */=0A= =0A= import java.util.*;=0A= =0A= /**=0A= * This is a simple port of Steve Reid's SHA-1 code into Java.=0A= * I've run his test vectors through the code and they all pass.=0A= *=0A= */=0A= public final class SHA1 extends MessageDigest {=0A= private int state[] =3D new int[5];=0A= private long count;=0A= =0A= =0A= public SHA1() {=0A= state =3D new int[5];=0A= count =3D 0;=0A= if (block =3D=3D null)=0A= block =3D new int[16];=0A= digestBits =3D new byte[20];=0A= digestValid =3D false;=0A= }=0A= =0A= /*=0A= * The following array forms the basis for the transform=0A= * buffer. Update puts bytes into this buffer and then=0A= * transform adds it into the state of the digest.=0A= */=0A= private int block[] =3D new int[16];=0A= private int blockIndex;=0A= =0A= /*=0A= * These functions are taken out of #defines in Steve's=0A= * code. Java doesn't have a preprocessor so the first=0A= * step is to just promote them to real methods.=0A= * Later we can optimize them out into inline code,=0A= * note that by making them final some compilers will=0A= * inline them when given the -O flag.=0A= */=0A= final int rol(int value, int bits) {=0A= int q =3D (value << bits) | (value >>> (32 - bits));=0A= return q;=0A= }=0A= =0A= final int blk0(int i) {=0A= block[i] =3D (rol(block[i],24)&0xFF00FF00) | = (rol(block[i],8)&0x00FF00FF);=0A= return block[i];=0A= }=0A= =0A= final int blk(int i) {=0A= block[i&15] =3D rol(block[(i+13)&15]^block[(i+8)&15]^=0A= block[(i+2)&15]^block[i&15], 1);=0A= return (block[i&15]);=0A= }=0A= =0A= final void R0(int data[], int v, int w, int x , int y, int z, int i) = {=0A= data[z] +=3D ((data[w] & (data[x] ^ data[y] )) ^ data[y]) +=0A= blk0(i) + 0x5A827999 + rol(data[v] ,5);=0A= data[w] =3D rol(data[w], 30);=0A= }=0A= =0A= final void R1(int data[], int v, int w, int x, int y, int z, int i) {=0A= data[z] +=3D ((data[w] & (data[x] ^ data[y])) ^ data[y]) +=0A= blk(i) + 0x5A827999 + rol(data[v] ,5);=0A= data[w] =3D rol(data[w], 30);=0A= }=0A= =0A= final void R2(int data[], int v, int w, int x, int y, int z, int i) {=0A= data[z] +=3D (data[w] ^ data[x] ^ data[y]) +=0A= blk(i) + 0x6ED9EBA1 + rol(data[v] ,5);=0A= data[w] =3D rol(data[w], 30);=0A= }=0A= =0A= final void R3(int data[], int v, int w, int x, int y, int z, int i) {=0A= data[z] +=3D (((data[w] | data[x]) & data[y]) | (data[w] & = data[x])) +=0A= blk(i) + 0x8F1BBCDC + rol(data[v] ,5);=0A= data[w] =3D rol(data[w], 30);=0A= }=0A= =0A= final void R4(int data[], int v, int w, int x, int y, int z, int i) {=0A= data[z] +=3D (data[w] ^ data[x] ^ data[y]) +=0A= blk(i) + 0xCA62C1D6 + rol(data[v] ,5);=0A= data[w] =3D rol(data[w], 30);=0A= }=0A= =0A= =0A= /*=0A= * Steve's original code and comments :=0A= *=0A= * blk0() and blk() perform the initial expand.=0A= * I got the idea of expanding during the round function from SSLeay=0A= *=0A= * #define blk0(i) block->l[i]=0A= * #define blk(i) (block->l[i&15] =3D = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \=0A= * ^block->l[(i+2)&15]^block->l[i&15],1))=0A= *=0A= * (R0+R1), R2, R3, R4 are the different operations used in SHA1=0A= * #define R0(v,w,x,y,z,i) = z+=3D((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=3Drol(w,30);=0A= * #define R1(v,w,x,y,z,i) = z+=3D((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=3Drol(w,30);=0A= * #define R2(v,w,x,y,z,i) = z+=3D(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=3Drol(w,30);=0A= * #define R3(v,w,x,y,z,i) = z+=3D(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=3Drol(w,30);=0A= * #define R4(v,w,x,y,z,i) = z+=3D(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=3Drol(w,30);=0A= */=0A= =0A= int dd[] =3D new int[5];=0A= =0A= /**=0A= * Hash a single 512-bit block. This is the core of the algorithm.=0A= *=0A= * Note that working with arrays is very inefficent in Java as it=0A= * does a class cast check each time you store into the array.=0A= *=0A= */=0A= =0A= void transform() {=0A= =0A= /* Copy context->state[] to working vars */=0A= dd[0] =3D state[0];=0A= dd[1] =3D state[1];=0A= dd[2] =3D state[2];=0A= dd[3] =3D state[3];=0A= dd[4] =3D state[4];=0A= /* 4 rounds of 20 operations each. Loop unrolled. */=0A= R0(dd,0,1,2,3,4, 0); R0(dd,4,0,1,2,3, 1); R0(dd,3,4,0,1,2, 2); = R0(dd,2,3,4,0,1, 3);=0A= R0(dd,1,2,3,4,0, 4); R0(dd,0,1,2,3,4, 5); R0(dd,4,0,1,2,3, 6); = R0(dd,3,4,0,1,2, 7);=0A= R0(dd,2,3,4,0,1, 8); R0(dd,1,2,3,4,0, 9); R0(dd,0,1,2,3,4,10); = R0(dd,4,0,1,2,3,11);=0A= R0(dd,3,4,0,1,2,12); R0(dd,2,3,4,0,1,13); R0(dd,1,2,3,4,0,14); = R0(dd,0,1,2,3,4,15);=0A= R1(dd,4,0,1,2,3,16); R1(dd,3,4,0,1,2,17); R1(dd,2,3,4,0,1,18); = R1(dd,1,2,3,4,0,19);=0A= R2(dd,0,1,2,3,4,20); R2(dd,4,0,1,2,3,21); R2(dd,3,4,0,1,2,22); = R2(dd,2,3,4,0,1,23);=0A= R2(dd,1,2,3,4,0,24); R2(dd,0,1,2,3,4,25); R2(dd,4,0,1,2,3,26); = R2(dd,3,4,0,1,2,27);=0A= R2(dd,2,3,4,0,1,28); R2(dd,1,2,3,4,0,29); R2(dd,0,1,2,3,4,30); = R2(dd,4,0,1,2,3,31);=0A= R2(dd,3,4,0,1,2,32); R2(dd,2,3,4,0,1,33); R2(dd,1,2,3,4,0,34); = R2(dd,0,1,2,3,4,35);=0A= R2(dd,4,0,1,2,3,36); R2(dd,3,4,0,1,2,37); R2(dd,2,3,4,0,1,38); = R2(dd,1,2,3,4,0,39);=0A= R3(dd,0,1,2,3,4,40); R3(dd,4,0,1,2,3,41); R3(dd,3,4,0,1,2,42); = R3(dd,2,3,4,0,1,43);=0A= R3(dd,1,2,3,4,0,44); R3(dd,0,1,2,3,4,45); R3(dd,4,0,1,2,3,46); = R3(dd,3,4,0,1,2,47);=0A= R3(dd,2,3,4,0,1,48); R3(dd,1,2,3,4,0,49); R3(dd,0,1,2,3,4,50); = R3(dd,4,0,1,2,3,51);=0A= R3(dd,3,4,0,1,2,52); R3(dd,2,3,4,0,1,53); R3(dd,1,2,3,4,0,54); = R3(dd,0,1,2,3,4,55);=0A= R3(dd,4,0,1,2,3,56); R3(dd,3,4,0,1,2,57); R3(dd,2,3,4,0,1,58); = R3(dd,1,2,3,4,0,59);=0A= R4(dd,0,1,2,3,4,60); R4(dd,4,0,1,2,3,61); R4(dd,3,4,0,1,2,62); = R4(dd,2,3,4,0,1,63);=0A= R4(dd,1,2,3,4,0,64); R4(dd,0,1,2,3,4,65); R4(dd,4,0,1,2,3,66); = R4(dd,3,4,0,1,2,67);=0A= R4(dd,2,3,4,0,1,68); R4(dd,1,2,3,4,0,69); R4(dd,0,1,2,3,4,70); = R4(dd,4,0,1,2,3,71);=0A= R4(dd,3,4,0,1,2,72); R4(dd,2,3,4,0,1,73); R4(dd,1,2,3,4,0,74); = R4(dd,0,1,2,3,4,75);=0A= R4(dd,4,0,1,2,3,76); R4(dd,3,4,0,1,2,77); R4(dd,2,3,4,0,1,78); = R4(dd,1,2,3,4,0,79);=0A= /* Add the working vars back into context.state[] */=0A= state[0] +=3D dd[0];=0A= state[1] +=3D dd[1];=0A= state[2] +=3D dd[2];=0A= state[3] +=3D dd[3];=0A= state[4] +=3D dd[4];=0A= }=0A= =0A= =0A= /**=0A= *=0A= * SHA1Init - Initialize new context=0A= */=0A= public void init() {=0A= /* SHA1 initialization constants */=0A= state[0] =3D 0x67452301;=0A= state[1] =3D 0xEFCDAB89;=0A= state[2] =3D 0x98BADCFE;=0A= state[3] =3D 0x10325476;=0A= state[4] =3D 0xC3D2E1F0;=0A= count =3D 0;=0A= digestBits =3D new byte[20];=0A= digestValid =3D false;=0A= blockIndex =3D 0;=0A= }=0A= =0A= /**=0A= * Add one byte to the digest. When this is implemented=0A= * all of the abstract class methods end up calling=0A= * this method for types other than bytes.=0A= */=0A= public synchronized void update(byte b) {=0A= int mask =3D (8 * (blockIndex & 3));=0A= =0A= count +=3D 8;=0A= block[blockIndex >> 2] &=3D ~(0xff << mask);=0A= block[blockIndex >> 2] |=3D (b & 0xff) << mask;=0A= blockIndex++;=0A= if (blockIndex =3D=3D 64) {=0A= transform();=0A= blockIndex =3D 0;=0A= }=0A= }=0A= =0A= =0A= /**=0A= * Complete processing on the message digest.=0A= */=0A= public void finish() {=0A= byte bits[] =3D new byte[8];=0A= int i, j;=0A= =0A= for (i =3D 0; i < 8; i++) {=0A= bits[i] =3D (byte)((count >>> (((7 - i) * 8))) & 0xff);=0A= }=0A= =0A= update((byte) 128);=0A= while (blockIndex !=3D 56)=0A= update((byte) 0);=0A= // This should cause a transform to happen.=0A= update(bits);=0A= for (i =3D 0; i < 20; i++) {=0A= digestBits[i] =3D (byte)=0A= ((state[i>>2] >> ((3-(i & 3)) * 8) ) & 0xff);=0A= }=0A= digestValid =3D true;=0A= }=0A= =0A= /** Return a string that identifies this algorithm */=0A= public String getAlg() { return "SHA1"; }=0A= =0A= /**=0A= * Print out the digest in a form that can be easily compared=0A= * to the test vectors.=0A= */=0A= public String digout() {=0A= StringBuffer sb =3D new StringBuffer();=0A= for (int i =3D 0; i < 20; i++) {=0A= char c1, c2;=0A= =0A= c1 =3D (char) ((digestBits[i] >>> 4) & 0xf);=0A= c2 =3D (char) (digestBits[i] & 0xf);=0A= c1 =3D (char) ((c1 > 9) ? 'A' + (c1 - 10) : '0' + c1);=0A= c2 =3D (char) ((c2 > 9) ? 'A' + (c2 - 10) : '0' + c2);=0A= sb.append(c1);=0A= sb.append(c2);=0A= // if (((i+1) % 4) =3D=3D 0)=0A= // sb.append(' ');=0A= }=0A= return sb.toString();=0A= }=0A= =0A= =0A= /**=0A= * This is a test program for the SHA1 algorithm. It puts=0A= * the three test vectors through the algorithm and prints=0A= * out the results (they should match.) Then it runs the=0A= * MessageDigest benchmark method to see how fast it is.=0A= * on my P133 its about 110 - 120K bytes/second.=0A= *=0A= * It then compares it to MD5, which is about 150K bytes/second.=0A= *=0A= * The reference to MoreOutputStream can be deleted. This is a=0A= * small class that opens a window to display the results. This=0A= * works around Symantec Cafe's tendency to shut down the DOS=0A= * window after showing the output, and the inability to scroll=0A= * back in a DOS window.=0A= */=0A= /*=0A= public static void main(String args[]) {=0A= int i, j;=0A= SHA1 s =3D new SHA1();=0A= // This line may be safely deleted, its to make it easy to see=0A= // the output of the program.=0A= // System.out =3D new java.io.PrintStream(new = util.MoreOutputStream());=0A= =0A= =0A= System.out.println("SHA-1 Test PROGRAM.");=0A= System.out.println("This code runs the test vectors through the = code.");=0A= =0A= // "abc"=0A= // A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D=0A= =0A= System.out.println("First test is 'abc'");=0A= String z =3D "abc";=0A= s.init();=0A= s.update((byte) 'a');=0A= s.update((byte) 'b');=0A= s.update((byte) 'c');=0A= s.finish();=0A= System.out.println(s.digout());=0A= System.out.println("A9993E36 4706816A BA3E2571 7850C26C = 9CD0D89D");=0A= =0A= =0A= // "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq"=0A= // 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1=0A= =0A= System.out.println("Next Test is = 'abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq'");=0A= z =3D "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq";=0A= s.init();=0A= s.updateASCII(z);=0A= s.finish();=0A= System.out.println(s.digout());=0A= System.out.println("84983E44 1C3BD26E BAAE4AA1 F95129E5 = E54670F1");=0A= =0A= // A million repetitions of "a"=0A= // 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F=0A= =0A= System.out.println("Last test is 1 million 'a' characters.");=0A= s.init();=0A= for (i =3D 0; i < 1000000; i++)=0A= s.update((byte) 'a');=0A= s.finish();=0A= System.out.println(s.digout());=0A= System.out.println("34AA973C D4C4DAA4 F61EEB2B DBAD2731 = 6534016F");=0A= MessageDigest.benchmark(s);=0A= MD5 mm =3D new MD5();=0A= // MessageDigest.benchmark(mm);=0A= }=0A= */=0A= }=0A= ------=_NextPart_000_0119_01C079A1.536AAF10--