【新月実装】需【Clojure・ClojureScript】

f596df3c anonymous 2016-01-12 06:19
「需」は使いやすさと高可用性を目標として新規に開発された新月実装です。P2Pネットワーク「新月」の匿名掲示版への ゲートウェイを提供します。開発にはClojureとClojureScriptを使用しています。

https://github.com/meriken/ju

「需」は公開ゲートウェイ「ゆぐちゃんねる」で使用される予定です。

[[【公開ゲートウェイ】ゆぐちゃんねる]]
a424f7cf anonymous 2016-01-12 06:33
そろそろ「新着まとめ読み」機能を実装しようっと。
CookieではなくWeb SQL Database APIを使う予定です。
1ceb9463 anonymous 2016-01-12 12:42
あれ、Indexed Database APIもサポートしなきゃいけないのかな?
面倒くさいな~
82bb71c1 anonymous 2016-01-12 12:47
Web storageにすれば一本化できるのか。これにしようっと。
59e97285 anonymous 2016-01-12 12:47
>>1ceb9463
http://www.tohoho-web.com/html5/web_sql_db.html
>ただし、Web SQLデータベースが、特定のソフトウェア(SQLite)の実装に基づくのは中立性に欠けるとの観点から、現在では Web SQL Database の検討は停止しており、代わりに Indexed Database API を利用することが推奨されています。
1f5738e3 anonymous 2016-01-12 18:02
Web storageで普通に行けそうです。Cookieよりもずっと楽ですね。
3c8f2c91 anonymous 2016-01-12 20:30
スレタイに色を付けて更新されたスレがひと目で分かるようになりました。
スレッド一覧は自動的に更新されるのでなかなか便利です。
80a09534 anonymous 2016-01-12 20:49 1452599361.jpg (109KB)
見た目はこんな感じです。なかなか使えるようになってきました。
03807d83 anonymous 2016-01-14 23:50
現在げんなりしながら署名機能を実装中。
一応dとnが計算できたっぽい。
68923498 anonymous 2016-01-15 01:10
が、朔の値とは一致せず。なぜだ…

1452747955<>00086019d30c4ba3795c2e74f712ace6<>body:test<>pubkey:DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA<>sign:DmjCwvX8DMpsEr30bGB8XIXMgTO6Iwz8Yb5Q0CjACoqZK1kvkYluXjiW3n24QMzZ5qPb3Z49JLPV4ekLL0yRJA<>target:body
eaf50e3b anonymous 2016-01-15 01:35
ってやっぱり素数テストが問題なのかな。やれやれ。
53582aaa anonymous 2016-01-15 02:18
実際にapollo.pyを動かしてみたら、原因は素数テストではなく凡ミスだったことが判明。
どうやらうまくいきそうです。
2ddc3727 anonymous 2016-01-15 03:11
@markdown
一応署名機能の実装のめどがたちました。

```clojure
(require 'clojure.math.numeric-tower)
(require 'digest)
(require 'clojure.data.codec.base64)
(let [siganture-key "test"
      hashs (str (digest/md5 siganture-key)
                 (digest/md5 (str siganture-key "pad1"))
                 (digest/md5 (str siganture-key "pad2"))
                 (digest/md5 (str siganture-key "pad3")))
      match (re-find #"^(.{56})(.{72})$" hashs)
      str-to-bigint (fn [s]
                   (apply +
                          (map
                            (fn [[x y] n] (* (bigint (Integer/parseInt (str x y) 16)) (clojure.math.numeric-tower/expt 256 n)))
                            (partition 2 s)
                            (range (/ (count s) 2)))))
      p (str-to-bigint (nth match 1))
      q (str-to-bigint (nth match 2))
      is-nth-bit-on? (fn [num n] (pos? (rem (quot num (clojure.math.numeric-tower/expt 2 (dec n))) 2)))
      p (if (is-nth-bit-on? p 216) p (+ p (clojure.math.numeric-tower/expt 2 215)))
      q (if (is-nth-bit-on? p 280) q (+ q (clojure.math.numeric-tower/expt 2 279)))
      p (bigint (.nextProbablePrime (biginteger p)))
      q (bigint (.nextProbablePrime (biginteger q)))
      t 30531
      e 65537
      expt-mod (fn [b e n] (bigint (.modPow (biginteger b) (biginteger e) (biginteger n))))
      base64-table
      {0 "A" 16 "Q" 32 "g" 48 "w"
       1 "B" 17 "R" 33 "h" 49 "x"
       2 "C" 18 "S" 34 "i" 50 "y"
       3 "D" 19 "T" 35 "j" 51 "z"
       4 "E" 20 "U" 36 "k" 52 "0"
       5 "F" 21 "V" 37 "l" 53 "1"
       6 "G" 22 "W" 38 "m" 54 "2"
       7 "H" 23 "X" 39 "n" 55 "3"
       8 "I" 24 "Y" 40 "o" 56 "4"
       9 "J" 25 "Z" 41 "p" 57 "5"
       10 "K" 26 "a" 42 "q" 58 "6"
       11 "L" 27 "b" 43 "r" 59 "7"
       12 "M" 28 "c" 44 "s" 60 "8"
       13 "N" 29 "d" 45 "t" 61 "9"
       14 "O" 30 "e" 46 "u" 62 "+"
       15 "P" 31 "f" 47 "v" 63 "/" }
      bigint-to-base64 (fn bigint-to-base64
                         [n]
                         (if (>= n 64)
                           (concat (list (get base64-table (rem n 64))) (bigint-to-base64 (quot n 64)))
                           (list (get base64-table n))))
      add-padding (fn [s] (str s (apply str (repeat (- 86 (count s)) "A"))))]
  (loop [p p
         q q]
    (let [n (* p q)
          d (bigint (.modInverse (biginteger e) (biginteger (* (dec p) (dec q)))))]
      (if (= (expt-mod t (* e d) n) t)
        [(add-padding (apply str (bigint-to-base64 n))) (add-padding (apply str (bigint-to-base64 d)))]
        (recur (+ p 2) (+ q 2))))))
```

これを実行すると公開鍵と秘密鍵が生成されます。

```
=>
["DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA"
 "BAcp0SUgUOSY+TrLhy/MEszzq0Obadi3EhXDEUUD9FmOkv7vhPiNrgg2HR8DmuFiPcXNHdqu44wyGRX5bmdcQA"]
```

コードの整理はまだですが、とりあえずこれで一安心です。
ec3d48fd anonymous 2016-01-15 04:37
@markdown
と思ってたら肝心の署名がうまくいかないorz また凡ミスじゃあるまいな。
```
>>> apollo.key_pair("test")
('DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA', 'BAcp0SUgUOSY+TrLhy/MEszzq0Obadi3EhXDEUUD9FmOkv7vhPiNrgg2HR8DmuFiPcXNHdqu44wyGRX5bmdcQA')
```

```
1452747955<>00086019d30c4ba3795c2e74f712ace6<>body:test<>pubkey:DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9VhApcrYy94XhMBKONo5H14c8STrriPJnCcVA<>sign:DmjCwvX8DMpsEr30bGB8XIXMgTO6Iwz8Yb5Q0CjACoqZK1kvkYluXjiW3n24QMzZ5qPb3Z49JLPV4ekLL0yRJA<>target:body
```

```
>>> apollo.sign("body:test", "DpmzfQSOhbpxE7xuaiEao3ztv9NAJi/loTs2N43f5hC3XpT3z9
VhApcrYy94XhMBKONo5H14c8STrriPJnCcV", "BAcp0SUgUOSY+TrLhy/MEszzq0Obadi3EhXDEUUD9
FmOkv7vhPiNrgg2HR8DmuFiPcXNHdqu44wyGRX5bmdcQ")
'zukxIcwBehZdPgWmsTjk4A5sAEnI0H+kHpOXx+NWnIoZVp/kQMSYJVFXpGRB7YVVNEKy4LvfYe9Z42w
OxDS9TA'
```

Top of this page. | <<last <<new 0 1 2

limit: 15360KB

(【新月実装】需【Clojure・ClojureScript】/214/0.5MB)


Powered by shinGETsu.