/*
* File : Sha1AlgorithmHelper.java
* Created : 12 mars 2004
* By : Olivier
*
* Azureus - a Java Bittorrent client
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details ( see the LICENSE file ).
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
package org.gudy.azureus2.core3.util.test;
/**
* @author Olivier
*
*/
public class Sha1AlgorithmHelper {
public static void main(String args[]) {
algorithm2NoShift();
}
//SHA1 Algorithm v2 using only 16 ints and changing variable meaning
//Over a period of 5 iterations.
// A SHA-1 Basic operation can be discribed as:
// temp = F(a,b,c,d,e);
// e = d ; d = c ; c = G(b) ; b = a ; a = temp;
// The Goal of changing the variable meaning is to remove the allocations
// made.
// In order to do, let's replace the role of :
//
// e by d,
// d by c,
// c by b
// b by a
// a by e
//
// If we rewrite the 1st equation, we can see that :
// e = F(a,b,c,d,e); and b = G(b);
// However, next line will be :
// d = F(b,c,d,e,a); and a = G(a);
// Next will be :
// c = F(c,d,e,a,b); and e = G(e);
// b = F(d,e,a,b,c); and d = G(d);
// a = F(e,a,b,c,d); and c = G(c);
// And we loop to first 'kind' where :
// e = F(a,b,c,d,e), and b = G(b);
// On 80th iteration (that is for t=79), we've looped 80 = 5 * 16,
// so we're back to the classic representation of variables a,b,c,d,e
// and we can directly use them to increment the h0,h1,h2,h3,h4 variables.
public static void algorithm2NoShift() {
String variables = "abcde";
int mask = 0x0000000F;
for(int t = 0 ; t <= 79 ; t++) {
String a = "" + variables.charAt((85-t)%5);
String b = "" + variables.charAt((85-t+1)%5);
String c = "" + variables.charAt((85-t+2)%5);
String d = "" + variables.charAt((85-t+3)%5);
String e = "" + variables.charAt((85-t+4)%5);
int s = t & mask;
if(t >= 16) {
System.out.println("w" + s + " = w" + ((s+13) & mask) + " ^ w" + ((s+8) & mask) + " ^ w" + ((s+2) & mask) + " ^ w" + s + "; w" + s + " = (w" + s + " << 1) | (w" + s + " >>> 31) ;");
}
System.out.print(e + " += ((" + a + " << 5) | ( " + a + " >>> 27)) + w" + s + " + ");
int ft = t / 20;
if(ft == 0) {
System.out.println("((" + b +" & " + c + ") | ((~" + b +" ) & " + d + ")) + 0x5A827999 ;");
}
if(ft == 1) {
System.out.println("(" + b +" ^ " + c + " ^ " + d + ") + 0x6ED9EBA1 ;");
}
if(ft == 2) {
System.out.println("((" + b +" & " + c + ") | (" + b + " & " + d + ") | (" + c + " & " + d + ")) + 0x8F1BBCDC ;");
}
if(ft == 3) {
System.out.println("(" + b + " ^ " + c + " ^ " + d + ") + 0xCA62C1D6 ;");
}
System.out.println(b + " = (" + b + " << 30) | (" + b + " >>> 2) ;");
}
}
//SHA1 Algorithm v2 using only 16 ints (+ a,b,c,d,e and temp)
public static void algorithm2() {
int mask = 0x0000000F;
for(int t = 0 ; t <= 79 ; t++) {
int s = t & mask;
if(t >= 16) {
System.out.println("w" + s + " = w" + ((s+13) & mask) + " ^ w" + ((s+8) & mask) + " ^ w" + ((s+2) & mask) + " ^ w" + s + "; w" + s + " = (w" + s + " << 1) | (w" + s + " >>> 31) ;");
}
System.out.print("temp = ((a << 5) | (a >>> 27)) + e + w" + s + " + ");
int ft = t / 20;
if(ft == 0) {
System.out.println("((b & c) | ((~b) & d)) + 0x5A827999 ;");
}
if(ft == 1) {
System.out.println("(b ^ c ^ d) + 0x6ED9EBA1 ;");
}
if(ft == 2) {
System.out.println("((b & c) | (b & d) | (c & d)) + 0x8F1BBCDC ;");
}
if(ft == 3) {
System.out.println("(b ^ c ^ d) + 0xCA62C1D6 ;");
}
System.out.println("e=d ; d=c ; c = (b << 30) | (b >>> 2) ; b=a ; a=temp;");
}
}
public static void part1() {
for(int t = 16 ; t <= 79 ; t++) {
System.out.println( "w" + t + " = w" + (t-3) + " ^ w" + (t-8) + " ^ w" + (t-14) + " ^ w" + (t-16) + ";");
System.out.println( "w" + t + " = (w" + t + " << 1) | (w" + t + " >>> 31);");
}
}
public static void part2() {
for(int t=0; t<= 79 ; t++) {
int fn = t / 20;
System.out.print("temp = ((a << 5) | (a >>> 27)) + e + w" + t + " + ");
if(fn == 0) {
System.out.println("((b & c) | ((~b) & d)) + 0x5A827999 ;");
}
if(fn == 1) {
System.out.println("(b ^ c ^ d) + 0x6ED9EBA1 ;");
}
if(fn == 2) {
System.out.println("((b & c) | (b & d) | (c & d)) + 0x8F1BBCDC ;");
}
if(fn == 3) {
System.out.println("(b ^ c ^ d) + 0xCA62C1D6 ;");
}
System.out.println("e = d ; d = c ; c = (b<<30) | (b >>> 2); b = a; a = temp;");
}
}
}
|