package com.subgraph.orchid.config; import java.util.HashMap; import java.util.Map; import com.subgraph.orchid.TorException; import com.subgraph.orchid.circuits.hs.HSDescriptorCookie; import com.subgraph.orchid.circuits.hs.HSDescriptorCookie.CookieType; import com.subgraph.orchid.data.Base32; import com.subgraph.orchid.encoders.Base64; public class TorConfigHSAuth { private final Map<String, HSDescriptorCookie> map = new HashMap<String, HSDescriptorCookie>(); void add(String key, String b64Value) { final HSDescriptorCookie cookie = createFromBase64(b64Value); final String k = validateKey(key); map.put(k, cookie); } private String validateKey(String key) { final String k = (key.endsWith(".onion")) ? key.substring(0, (key.length() - 6)) : key; try { byte[] decoded = Base32.base32Decode(k); if(decoded.length != 10) { throw new IllegalArgumentException(); } return k; } catch (TorException e) { throw new IllegalArgumentException(e.getMessage()); } } HSDescriptorCookie get(String key) { return map.get(validateKey(key)); } private HSDescriptorCookie createFromBase64(String b64) { if(b64.length() != 22) { throw new IllegalArgumentException(); } final byte[] decoded = Base64.decode(b64 + "A="); final byte lastByte = decoded[decoded.length - 1]; final int flag = (lastByte & 0xFF) >> 4; final byte[] cookie = new byte[decoded.length - 1]; System.arraycopy(decoded, 0, cookie, 0, cookie.length); switch(flag) { case 0: return new HSDescriptorCookie(CookieType.COOKIE_BASIC, cookie); case 1: return new HSDescriptorCookie(CookieType.COOKIE_STEALTH, cookie); default: throw new TorException("Illegal cookie descriptor with flag value: "+ flag); } } }