1 7 package org.jboss.crypto.digest; 8 9 import java.io.ByteArrayOutputStream ; 10 import java.security.MessageDigest ; 11 import java.security.MessageDigestSpi ; 12 import java.security.NoSuchAlgorithmException ; 13 import java.security.ProviderException ; 14 15 21 public class SHAInterleave extends MessageDigestSpi 22 { 23 private static final int SHA_HASH_LEN = 20; 24 25 private ByteArrayOutputStream evenBytes; 26 private ByteArrayOutputStream oddBytes; 27 private int count; 28 private boolean skipLeadingZeros; 29 private MessageDigest sha; 30 31 35 public SHAInterleave() 36 { 37 try 38 { 39 sha = MessageDigest.getInstance("SHA"); 40 } 41 catch(NoSuchAlgorithmException e) 42 { 43 throw new ProviderException ("Failed to obtain SHA MessageDigest"); 44 } 45 evenBytes = new ByteArrayOutputStream (); 46 oddBytes = new ByteArrayOutputStream (); 47 engineReset(); 48 } 49 50 protected int engineGetDigestLength() 51 { 52 return 2 * SHA_HASH_LEN; 53 } 54 55 65 protected byte[] engineDigest() 66 { 67 byte[] E = evenBytes.toByteArray(); 68 byte[] G = sha.digest(E); 69 byte[] F = oddBytes.toByteArray(); 71 int offset = 0; 72 if( count % 2 == 1 ) 73 offset = 1; 74 sha.reset(); 75 sha.update(F, offset, F.length-offset); 76 byte[] H = sha.digest(); 77 int length = G.length + H.length; 78 byte[] digest = new byte[length]; 79 for(int i = 0; i < G.length; ++i) 80 digest[2 * i] = G[i]; 81 for(int i = 0; i < H.length; ++i) 82 digest[2 * i + 1] = H[i]; 83 engineReset(); 84 return digest; 85 } 86 87 90 protected void engineReset() 91 { 92 skipLeadingZeros = true; 93 count = 0; 94 evenBytes.reset(); 95 oddBytes.reset(); 96 sha.reset(); 97 } 98 99 104 protected void engineUpdate(byte input) 105 { 106 if( skipLeadingZeros == true && input == 0 ) 107 return; 108 skipLeadingZeros = false; 109 if( count % 2 == 0 ) 110 evenBytes.write(input); 111 else 112 oddBytes.write(input); 113 count ++; 114 } 115 116 125 protected void engineUpdate(byte[] input, int offset, int len) 126 { 127 for(int i = offset; i < offset+len; i ++) 128 engineUpdate(input[i]); 129 } 130 131 } 132 | Popular Tags |