This patch adds hsub support to aamfetch. For details about hsub, see . To use hsub, configure an esub rule, but enter "#" (without the quotes) as password. --- diff -u source/esub/Esub.1.1.1.1.java source/esub/Esub.java --- source/esub/Esub.1.1.1.1.java Sun Nov 01 20:59:41 2009 +++ source/esub/Esub.java Sun Nov 01 21:25:16 2009 @@ -31,6 +31,22 @@ } public boolean verify(String subject, String password, String esub) { + // use hsub if the password is "#" + if (password.equals("#")) { + try { + byte[] esubBytes = unhex(esub); + if (esubBytes.length != 24) return false; + MessageDigest sha1 = MessageDigest.getInstance + ("SHA-256", "BC"); + sha1.update(esubBytes, 0, 8); + sha1.update(subject.getBytes("ISO-8859-1")); + byte[] hash = sha1.digest(); + return hex(hash).substring(0,32).equals + (hex(esubBytes).substring(16)); + } catch (Exception ex) { + ex.printStackTrace(); + } + } return verify(hash(subject), hash(password), unhex(esub)); } @@ -51,6 +67,25 @@ } public String encode(String subject, String password) { + // use hsub if the password is "#" + if (password.equals("#")) { + try { + MessageDigest sha1 = MessageDigest.getInstance + ("SHA-256", "BC"); + byte[] iv = new byte[8]; + new SecureRandom().nextBytes(iv); + sha1.update(iv); + sha1.update(subject.getBytes("ISO-8859-1")); + byte[] hash = sha1.digest(); + byte[] res = new byte[24]; + System.arraycopy(iv, 0, res, 0, 8); + System.arraycopy(hash, 0, res, 8, 16); + return hex(res); + } catch (Exception ex) { + ex.printStackTrace(); + return null; + } + } return hex(encode(hash(subject), hash(password))); } @@ -124,5 +159,33 @@ System.out.println("Equal: "+esub1.equals(esub2)); System.out.println("Verify: "+e.verify(sub, pw, esub1)); System.out.println("Verify: "+e.verify(sub, pw, esub2)); + + // hsub tests + String subject = "My first HSUB Test"; + esub1 = e.encode(subject, "#"); + esub2 = e.encode(subject, "#"); + System.out.println(esub1); + System.out.println(esub2); + System.out.println("Equal: "+esub1.equals(esub2)); + System.out.println("Verify: "+e.verify(subject, "#", esub1)); + System.out.println("Verify: "+e.verify(subject, "#", esub2)); + res = e.verify(subject, "#", + "20ef87ce52c9cc32f892de02dcb6dcaa7739b3ca3929c732"); + System.out.println("Correct: " +res); + res = e.verify(subject, "#", + "72e376f05a680913951e469913ca24ded241cdb18dc82ea9"); + System.out.println("Correct: " +res); + res = e.verify(subject, "#", + "4344ddac2423951cd99353226a4ccdc3a567204b5af05f3e"); + System.out.println("Correct: " +res); + res = e.verify("Xylophone City", "#", + "36508980d496dfd9db884b5fd147df950f258bba0674ab0a"); + System.out.println("Correct: " +res); + res = e.verify("A snowy day in October", "#", + "f6e203ac99379e4fe557e3dacc5dfe3d117a88d6e7ca9c9d"); + System.out.println("Correct: " +res); + res = e.verify(subject, "#", + "20ef87ce52c9cc32f892de02dcb6dcaa7739b3ca3929c731"); + System.out.println("Incorrect: " +res); } }