package net.i2p.util; import java.util.Locale; import net.i2p.I2PAppContext; import net.i2p.data.Base32; import net.i2p.data.Base64; import net.i2p.data.DataFormatException; import net.i2p.data.Destination; import net.i2p.data.Hash; /** * Convert any kind of destination String to a hash * Supported: * Base64 dest * Base64 dest.i2p * Base64 Hash * Base64 Hash.i2p * Base32 Hash * Base32 desthash.b32.i2p * example.i2p * * @author zzz */ public class ConvertToHash { /** * Convert any kind of destination String to a hash * * @return null on failure */ public static Hash getHash(String peer) { if (peer == null) return null; String peerLC = peer.toLowerCase(Locale.US); // b64 hash if (peer.length() == 44 && !peerLC.endsWith(".i2p")) { byte[] b = Base64.decode(peer); if (b != null && b.length == Hash.HASH_LENGTH) return Hash.create(b); } // b64 hash.i2p if (peer.length() == 48 && peerLC.endsWith(".i2p")) { byte[] b = Base64.decode(peer.substring(0, 44)); if (b != null && b.length == Hash.HASH_LENGTH) return Hash.create(b); } // b64 dest.i2p if (peer.length() >= 520 && peerLC.endsWith(".i2p")) { try { Destination d = new Destination(); d.fromBase64(peer.substring(0, peer.length() - 4)); return d.calculateHash(); } catch (DataFormatException dfe) {} } // b64 dest if (peer.length() >= 516 && !peerLC.endsWith(".i2p")) { try { Destination d = new Destination(); d.fromBase64(peer); return d.calculateHash(); } catch (DataFormatException dfe) {} } // b32 hash.b32.i2p // do this here rather than in naming service so it will work // even if the leaseset is not found if (peer.length() == 60 && peerLC.endsWith(".b32.i2p")) { byte[] b = Base32.decode(peer.substring(0, 52)); if (b != null && b.length == Hash.HASH_LENGTH) return Hash.create(b); } // b32 hash if (peer.length() == 52 && !peerLC.endsWith(".i2p")) { byte[] b = Base32.decode(peer); if (b != null && b.length == Hash.HASH_LENGTH) return Hash.create(b); } // example.i2p Destination d = I2PAppContext.getGlobalContext().namingService().lookup(peer); if (d != null) return d.calculateHash(); return null; } /** * @since 0.9.28 */ public static void main(String args[]) { if (args.length == 0) { System.err.println("Usage: converttohash [hostname|b32|destination]..."); return; } for (int i = 0; i < args.length; i++) { Hash h = getHash(args[i]); System.out.println(h != null ? h.toBase64() : "conversion failed"); } } }