summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Barksdale <amatus.amongus@gmail.com>2010-04-09 00:02:41 -0700
committerDavid Barksdale <amatus.amongus@gmail.com>2010-04-09 00:02:41 -0700
commit60f07805444c4d660b132df83fd1d544d0ca261a (patch)
treec2069017aad3b13a1f6989dd7c59118ce4ebeb82
parent862ef1b98643d9def18309072f78143a52e83b7b (diff)
Some more work on hello messages.
-rw-r--r--src/org/gnu/clojure/gnunet/crypto.clj15
-rw-r--r--src/org/gnu/clojure/gnunet/hello.clj29
-rw-r--r--src/org/gnu/clojure/gnunet/identity.clj33
-rw-r--r--src/org/gnu/clojure/gnunet/message.clj25
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