--- /dev/null
+package net.pterodactylus.sone.freenet;
+
+import static freenet.support.Base64.encode;
+import static java.lang.String.format;
+
+import freenet.keys.FreenetURI;
+
+import com.google.common.annotations.VisibleForTesting;
+
+/**
+ * Encapsulates the parts of a {@link FreenetURI} that do not change while
+ * being converted from SSK to USK and/or back.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class Key {
+
+ private final byte[] routingKey;
+ private final byte[] cryptoKey;
+ private final byte[] extra;
+
+ private Key(byte[] routingKey, byte[] cryptoKey, byte[] extra) {
+ this.routingKey = routingKey;
+ this.cryptoKey = cryptoKey;
+ this.extra = extra;
+ }
+
+ @VisibleForTesting
+ public String getRoutingKey() {
+ return encode(routingKey);
+ }
+
+ @VisibleForTesting
+ public String getCryptoKey() {
+ return encode(cryptoKey);
+ }
+
+ @VisibleForTesting
+ public String getExtra() {
+ return encode(extra);
+ }
+
+ public FreenetURI toUsk(String docName, long edition, String... paths) {
+ return new FreenetURI("USK", docName, paths, routingKey, cryptoKey,
+ extra, edition);
+ }
+
+ public FreenetURI toSsk(String docName, String... paths) {
+ return new FreenetURI("SSK", docName, paths, routingKey, cryptoKey,
+ extra);
+ }
+
+ public FreenetURI toSsk(String docName, long edition, String... paths) {
+ return new FreenetURI("SSK", format("%s-%d", docName, edition), paths,
+ routingKey, cryptoKey, extra, edition);
+ }
+
+ public static Key from(FreenetURI freenetURI) {
+ return new Key(freenetURI.getRoutingKey(), freenetURI.getCryptoKey(),
+ freenetURI.getExtra());
+ }
+
+ public static String routingKey(FreenetURI freenetURI) {
+ return from(freenetURI).getRoutingKey();
+ }
+
+}