diff options
-rw-r--r-- | src/org/gnu/clojure/gnunet/crypto.clj | 15 | ||||
-rw-r--r-- | src/org/gnu/clojure/gnunet/hello.clj | 29 | ||||
-rw-r--r-- | src/org/gnu/clojure/gnunet/identity.clj | 33 | ||||
-rw-r--r-- | src/org/gnu/clojure/gnunet/message.clj | 25 |
4 files changed, 76 insertions, 26 deletions
diff --git a/src/org/gnu/clojure/gnunet/crypto.clj b/src/org/gnu/clojure/gnunet/crypto.clj new file mode 100644 index 0000000..eb1283b --- /dev/null +++ b/src/org/gnu/clojure/gnunet/crypto.clj @@ -0,0 +1,15 @@ +(ns org.gnu.clojure.gnunet.crypto) + +(defn generate-rsa-keypair + "Generate a 2048 bit RSA keypair." + [] + (let [rsa (java.security.KeyPairGenerator/getInstance "RSA") + spec (java.security.spec.RSAKeyGenParameterSpec. 2048 (bigint 257))] + (.initialize rsa spec) + (.generateKeyPair rsa))) + +(defn sha-512 + "Compute the SHA-512 digest of a sequence of bytes." + [x] + (let [sha (java.security.MessageDigest/getInstance "SHA-512")] + (.digest sha (byte-array x))))
\ No newline at end of file diff --git a/src/org/gnu/clojure/gnunet/hello.clj b/src/org/gnu/clojure/gnunet/hello.clj index a8392db..b024f63 100644 --- a/src/org/gnu/clojure/gnunet/hello.clj +++ b/src/org/gnu/clojure/gnunet/hello.clj @@ -1,2 +1,29 @@ -(ns org.gnu.clojure.gnunet.hello) +(ns org.gnu.clojure.gnunet.hello + (:use (org.gnu.clojure.gnunet message identity))) +(def message-type-hello 16) + +(defn encode-transport + [transport] + (concat + (.getBytes (:name transport) "UTF-8") + (list (byte 0)) + (encode-int32 (count (:encoded-address transport))) + (encode-int64 (.getTime (:expiration transport))) + (:encoded-address transport))) + +(defn encode-hello + "Encode a hello message." + [public-key transports] + (let [padding (encode-int32 0) + encoded-key (encode-rsa-public-key public-key) + encoded-transports (mapcat encode-transport transports) + size (+ header-size + (count padding) + (count encoded-key) + (count encoded-transports))] + (concat + (encode-header size message-type-hello) + padding + encoded-key + encoded-transports))) diff --git a/src/org/gnu/clojure/gnunet/identity.clj b/src/org/gnu/clojure/gnunet/identity.clj index 7eb3e03..f6cecfd 100644 --- a/src/org/gnu/clojure/gnunet/identity.clj +++ b/src/org/gnu/clojure/gnunet/identity.clj @@ -1,47 +1,30 @@ -(ns org.gnu.clojure.gnunet.identity) +(ns org.gnu.clojure.gnunet.identity + (:use (org.gnu.clojure.gnunet crypto message))) (defn bit-count-to-bytes [x] (quot (+ 7 x) 8)) (defn encode-bigint - "Convert a bigInteger to a sequence of bytes in bigendian." + "Convert a bigInteger to a sequence of bytes in network order." [x] (let [len (bit-count-to-bytes (.bitLength x)) a (.toByteArray x)] (drop (- (alength a) len) a))) -(defn encode-short - "Convert a short to a sequence of bytes in bigendian." - [x] - (list (byte (quot x 256)) (byte (rem x 256)))) - (defn encode-rsa-public-key - "Convert an RSA public key to a sequence of bytes in gnunet format" + "Convert an RSA public key to a sequence of bytes in gnunet format." [key] (let [modulus (encode-bigint (.getModulus key)) modulus-len (count modulus) exponent (encode-bigint (.getPublicExponent key)) exponent-len (count exponent)] (concat - (encode-short (+ modulus-len exponent-len 4)) - (encode-short modulus-len) + (encode-int16 (+ modulus-len exponent-len 4)) + (encode-int16 modulus-len) modulus exponent - (encode-short 0)))) - -(defn generate-rsa-keypair - "Generate a 2048 bit RSA keypair" - [] - (let [rsa (java.security.KeyPairGenerator/getInstance "RSA") - spec (java.security.spec.RSAKeyGenParameterSpec. 2048 (bigint 257))] - (.initialize rsa spec) - (.generateKeyPair rsa))) - -(defn sha-512 - [x] - (let [sha (java.security.MessageDigest/getInstance "SHA-512")] - (.digest sha (byte-array x)))) + (encode-int16 0)))) (defn generate-id - "Generate the SHA-512 hash of the encoded public key" + "Generate the SHA-512 digest of the encoded public key." [keypair] (sha-512 (encode-rsa-public-key (.getPublic keypair)))) diff --git a/src/org/gnu/clojure/gnunet/message.clj b/src/org/gnu/clojure/gnunet/message.clj new file mode 100644 index 0000000..9d0b74d --- /dev/null +++ b/src/org/gnu/clojure/gnunet/message.clj @@ -0,0 +1,25 @@ +(ns org.gnu.clojure.gnunet.message) + +(defn encode-int16 + "Convert a 16-bit integer to a sequence of bytes in network order." + [x] + (list (byte (quot x 256)) (byte (rem x 256)))) + +(defn encode-int32 + "Convert a 32-bit integer to a sequence of bytes in network order." + [x] + (concat (encode-int16 (quot x 65536)) (encode-int16 (rem x 65536)))) + +(defn encode-int64 + "Convert a 64-bit integer to a sequence of bytes in network order." + [x] + (concat (encode-int32 (quot x 4294967269)) (encode-int32 (rem x 4294967269)))) + +(defn encode-header + "Encode a gnunet message header." + [size message-type] + (concat + (encode-int16 size) + (encode-int16 message-type))) + +(def header-size (count (encode-header 0 0)))
\ No newline at end of file |