From 2a8b7b287f85fce9ec98bb8c5335aa4c3fda3979 Mon Sep 17 00:00:00 2001 From: Yawning Angel Date: Sat, 10 Oct 2015 15:22:50 +0000 Subject: [PATCH] Add usage example of generating a RSA private key for the Listener. --- examples/listener/listener.go | 20 ++++++++++++++++++-- utils/pkcs1/rsa.go | 16 ++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/examples/listener/listener.go b/examples/listener/listener.go index d017f43..c7e7f42 100644 --- a/examples/listener/listener.go +++ b/examples/listener/listener.go @@ -8,11 +8,14 @@ package main import ( + "crypto/rand" + "crypto/rsa" "io" "log" "net/http" "github.com/yawning/bulb" + "github.com/yawning/bulb/utils/pkcs1" ) func onionServer(w http.ResponseWriter, req *http.Request) { @@ -38,8 +41,21 @@ func main() { log.Fatalf("Authentication failed: %v", err) } - // Create an ephemeral port 80 Onion Service. - l, err := c.Listener(80, nil) + // Generate a private key and create a port 80 Onion Service. + // + // For one-shot services:` l, err := c.Listener(80, nil)` is considerably + // easier. + pk, err := rsa.GenerateKey(rand.Reader, 1024) + if err != nil { + log.Fatalf("Failed to generate RSA key") + } + id, err := pkcs1.OnionAddr(&pk.PublicKey) + if err != nil { + log.Fatalf("Failed to derive onion ID: %v", err) + } + log.Printf("Expected ID: %v", id) + + l, err := c.Listener(80, pk) if err != nil { log.Fatalf("Failed to get Listener: %v", err) } diff --git a/utils/pkcs1/rsa.go b/utils/pkcs1/rsa.go index 05b15a4..beb740e 100644 --- a/utils/pkcs1/rsa.go +++ b/utils/pkcs1/rsa.go @@ -12,8 +12,11 @@ package pkcs1 import ( "crypto/rsa" + "crypto/sha1" "encoding/asn1" + "encoding/base32" "math/big" + "strings" ) type pkcs1RSAPrivKey struct { @@ -83,3 +86,16 @@ func DecodePublicKeyDER(b []byte) (*rsa.PublicKey, []byte, error) { rest, err := asn1.Unmarshal(b, pk) return pk, rest, err } + +// OnionAddr returns the Tor Onion Service address corresponding to a given +// rsa.PublicKey. +func OnionAddr(pk *rsa.PublicKey) (string, error) { + der, err := EncodePublicKeyDER(pk) + if err != nil { + return "", err + } + h := sha1.Sum(der) + hb32 := base32.StdEncoding.EncodeToString(h[:10]) + + return strings.ToLower(hb32), nil +}