Add usage example of generating a RSA private key for the Listener.

This commit is contained in:
Yawning Angel 2015-10-10 15:22:50 +00:00
parent 77023b2ed7
commit 2a8b7b287f
2 changed files with 34 additions and 2 deletions

View File

@ -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)
}

View File

@ -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
}