Mercurial > hg4j
comparison src/com/tmate/hgkit/ll/DigestHelper.java @ 42:92c3d0920d58
Real integrity check, with exception. DigestHelper refactored to accomodate new needs
| author | Artem Tikhomirov <tikhomirov.artem@gmail.com> |
|---|---|
| date | Fri, 14 Jan 2011 04:29:03 +0100 |
| parents | 858d1b2458cb |
| children |
comparison
equal
deleted
inserted
replaced
| 41:858d1b2458cb | 42:92c3d0920d58 |
|---|---|
| 7 import java.io.InputStream; | 7 import java.io.InputStream; |
| 8 import java.security.MessageDigest; | 8 import java.security.MessageDigest; |
| 9 import java.security.NoSuchAlgorithmException; | 9 import java.security.NoSuchAlgorithmException; |
| 10 | 10 |
| 11 /** | 11 /** |
| 12 * TODO sha1_binary to give array for Nodeid.equalsTo | 12 * <pre> |
| 13 * | 13 * DigestHelper dh; |
| 14 * dh.sha1(...).asHexString(); | |
| 15 * or | |
| 16 * dh = dh.sha1(...); | |
| 17 * nodeid.equalsTo(dh.asBinary()); | |
| 18 * </pre> | |
| 14 * @author artem | 19 * @author artem |
| 15 */ | 20 */ |
| 16 public class DigestHelper { | 21 public class DigestHelper { |
| 17 private MessageDigest sha1; | 22 private MessageDigest sha1; |
| 23 private byte[] digest; | |
| 18 | 24 |
| 19 public DigestHelper() { | 25 public DigestHelper() { |
| 20 } | 26 } |
| 21 | 27 |
| 22 private MessageDigest getSHA1() { | 28 private MessageDigest getSHA1() { |
| 30 } | 36 } |
| 31 return sha1; | 37 return sha1; |
| 32 } | 38 } |
| 33 | 39 |
| 34 | 40 |
| 35 public String sha1(Nodeid nodeid1, Nodeid nodeid2, byte[] data) { | 41 public DigestHelper sha1(Nodeid nodeid1, Nodeid nodeid2, byte[] data) { |
| 36 return sha1(nodeid1.cloneData(), nodeid2.cloneData(), data); | 42 return sha1(nodeid1.cloneData(), nodeid2.cloneData(), data); |
| 37 } | 43 } |
| 38 | 44 |
| 39 // sha1_digest(min(p1,p2) ++ max(p1,p2) ++ final_text) | 45 // sha1_digest(min(p1,p2) ++ max(p1,p2) ++ final_text) |
| 40 public String sha1(byte[] nodeidParent1, byte[] nodeidParent2, byte[] data) { | 46 public DigestHelper sha1(byte[] nodeidParent1, byte[] nodeidParent2, byte[] data) { |
| 41 MessageDigest alg = getSHA1(); | 47 MessageDigest alg = getSHA1(); |
| 42 if ((nodeidParent1[0] & 0x00FF) < (nodeidParent2[0] & 0x00FF)) { | 48 if ((nodeidParent1[0] & 0x00FF) < (nodeidParent2[0] & 0x00FF)) { |
| 43 alg.update(nodeidParent1); | 49 alg.update(nodeidParent1); |
| 44 alg.update(nodeidParent2); | 50 alg.update(nodeidParent2); |
| 45 } else { | 51 } else { |
| 46 alg.update(nodeidParent2); | 52 alg.update(nodeidParent2); |
| 47 alg.update(nodeidParent1); | 53 alg.update(nodeidParent1); |
| 48 } | 54 } |
| 49 byte[] digest = alg.digest(data); | 55 digest = alg.digest(data); |
| 50 assert digest.length == 20; | 56 assert digest.length == 20; |
| 51 return toHexString(digest, 0, 20); | 57 return this; |
| 58 } | |
| 59 | |
| 60 public String asHexString() { | |
| 61 if (digest == null) { | |
| 62 throw new IllegalStateException("Shall init with sha1() call first"); | |
| 63 } | |
| 64 return toHexString(digest, 0, digest.length); | |
| 65 } | |
| 66 | |
| 67 // by reference, be careful not to modify (or #clone() if needed) | |
| 68 public byte[] asBinary() { | |
| 69 if (digest == null) { | |
| 70 throw new IllegalStateException("Shall init with sha1() call first"); | |
| 71 } | |
| 72 return digest; | |
| 52 } | 73 } |
| 53 | 74 |
| 54 // XXX perhaps, digest functions should throw an exception, as it's caller responsibility to deal with eof, etc | 75 // XXX perhaps, digest functions should throw an exception, as it's caller responsibility to deal with eof, etc |
| 55 public byte[] sha1(InputStream is /*ByteBuffer*/) throws IOException { | 76 public DigestHelper sha1(InputStream is /*ByteBuffer*/) throws IOException { |
| 56 MessageDigest alg = getSHA1(); | 77 MessageDigest alg = getSHA1(); |
| 57 byte[] buf = new byte[1024]; | 78 byte[] buf = new byte[1024]; |
| 58 int c; | 79 int c; |
| 59 while ((c = is.read(buf)) != -1) { | 80 while ((c = is.read(buf)) != -1) { |
| 60 alg.update(buf, 0, c); | 81 alg.update(buf, 0, c); |
| 61 } | 82 } |
| 62 byte[] digest = alg.digest(); | 83 digest = alg.digest(); |
| 63 return digest; | 84 return this; |
| 64 } | 85 } |
| 65 | 86 |
| 66 public static String toHexString(byte[] data, final int offset, final int count) { | 87 public static String toHexString(byte[] data, final int offset, final int count) { |
| 67 char[] result = new char[count << 1]; | 88 char[] result = new char[count << 1]; |
| 68 final String hexDigits = "0123456789abcdef"; | 89 final String hexDigits = "0123456789abcdef"; |
