Ask for keys from the SAM API as a one-off event in i2pkeys. Set up for implementing crypto.Public/Private keys, crypto.Signer
This commit is contained in:
2
go.mod
2
go.mod
@ -3,7 +3,9 @@ module github.com/eyedeekay/sam3
|
||||
go 1.12
|
||||
|
||||
require (
|
||||
github.com/eyedeekay/goSam v0.32.31-0.20210122211817-f97683379f23
|
||||
github.com/google/renameio v1.0.0 // indirect
|
||||
github.com/riobard/go-x25519 v0.0.0-20190716001027-10cc4d8d0b33
|
||||
github.com/rogpeppe/go-internal v1.6.2 // indirect
|
||||
golang.org/x/tools v0.0.0-20201125231158-b5590deeca9b // indirect
|
||||
honnef.co/go/tools v0.0.1-2020.1.6 // indirect
|
||||
|
@ -2,6 +2,9 @@ package i2pkeys
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"crypto"
|
||||
"crypto/ed25519"
|
||||
"crypto/rand"
|
||||
"crypto/sha256"
|
||||
"encoding/base32"
|
||||
"encoding/base64"
|
||||
@ -9,6 +12,8 @@ import (
|
||||
"io"
|
||||
"os"
|
||||
"strings"
|
||||
|
||||
"github.com/eyedeekay/goSam"
|
||||
)
|
||||
|
||||
var (
|
||||
@ -98,6 +103,52 @@ func (k I2PKeys) Addr() I2PAddr {
|
||||
return k.Address
|
||||
}
|
||||
|
||||
func (k I2PKeys) Public() crypto.PublicKey {
|
||||
return k.Address
|
||||
}
|
||||
|
||||
func (k I2PKeys) Private() []byte {
|
||||
src := strings.Split(k.String(), k.Addr().String())[0]
|
||||
var dest []byte
|
||||
_, err := i2pB64enc.Decode(dest, []byte(src))
|
||||
panic(err)
|
||||
return dest
|
||||
}
|
||||
|
||||
type SecretKey interface {
|
||||
Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) (signature []byte, err error)
|
||||
}
|
||||
|
||||
func (k I2PKeys) SecretKey() SecretKey {
|
||||
var pk ed25519.PrivateKey = k.Private()
|
||||
return pk
|
||||
}
|
||||
|
||||
func (k I2PKeys) PrivateKey() crypto.PrivateKey {
|
||||
var pk ed25519.PrivateKey = k.Private()
|
||||
_, err := pk.Sign(rand.Reader, []byte("nonsense"), crypto.Hash(0))
|
||||
if err != nil {
|
||||
//TODO: Elgamal, P256, P384, P512, GOST? keys?
|
||||
}
|
||||
return pk
|
||||
}
|
||||
|
||||
func (k I2PKeys) Ed25519PrivateKey() *ed25519.PrivateKey {
|
||||
return k.SecretKey().(*ed25519.PrivateKey)
|
||||
}
|
||||
|
||||
/*func (k I2PKeys) ElgamalPrivateKey() *ed25519.PrivateKey {
|
||||
return k.SecretKey().(*ed25519.PrivateKey)
|
||||
}*/
|
||||
|
||||
//func (k I2PKeys) Decrypt(rand io.Reader, msg []byte, opts crypto.DecrypterOpts) (plaintext []byte, err error) {
|
||||
//return k.SecretKey().(*ed25519.PrivateKey).Decrypt(rand, msg, opts)
|
||||
//}
|
||||
|
||||
func (k I2PKeys) Sign(rand io.Reader, digest []byte, opts crypto.SignerOpts) (signature []byte, err error) {
|
||||
return k.SecretKey().(*ed25519.PrivateKey).Sign(rand, digest, opts)
|
||||
}
|
||||
|
||||
// Returns the keys (both public and private), in I2Ps base64 format. Use this
|
||||
// when you create sessions.
|
||||
func (k I2PKeys) String() string {
|
||||
@ -237,3 +288,30 @@ func (addr I2PAddr) DestHash() (h I2PDestHash) {
|
||||
func Base32(anything string) string {
|
||||
return I2PAddr(anything).Base32()
|
||||
}
|
||||
|
||||
func NewDestination(samaddr string, sigType ...string) (I2PKeys, error) {
|
||||
if samaddr == "" {
|
||||
samaddr = "127.0.0.1:7656"
|
||||
}
|
||||
client, err := goSam.NewClient(samaddr)
|
||||
if err != nil {
|
||||
return I2PKeys{}, err
|
||||
}
|
||||
var sigtmp string
|
||||
if len(sigType) > 0 {
|
||||
sigtmp = sigType[0]
|
||||
}
|
||||
pub, priv, err := client.NewDestination(sigtmp)
|
||||
if err != nil {
|
||||
return I2PKeys{}, err
|
||||
}
|
||||
addr, err := NewI2PAddrFromBytes([]byte(pub))
|
||||
if err != nil {
|
||||
return I2PKeys{}, err
|
||||
}
|
||||
keys := NewKeys(addr, priv+pub)
|
||||
if err != nil {
|
||||
return I2PKeys{}, err
|
||||
}
|
||||
return keys, nil
|
||||
}
|
||||
|
Reference in New Issue
Block a user