2022-08-02 17:30:59 +02:00

96 lines
2.5 KiB
Go

package main
import (
"flag"
"fmt"
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/encryptionkey"
"github.com/anytypeio/go-anytype-infrastructure-experiments/util/keys/asymmetric/signingkey"
"gopkg.in/yaml.v3"
"math/rand"
"os"
"time"
)
var (
flagAccountConfigFile = flag.String("a", "etc/nodes.yml", "path to account file")
flagBaseAddress = flag.String("ba", "127.0.0.1:4430", "base ip for each node (you should change it later)")
flagNodeCount = flag.Int("nc", 5, "the count of nodes for which we create the keys")
)
func main() {
rand.Seed(time.Now().UnixNano())
flag.Parse()
if *flagNodeCount <= 0 {
panic("node count should not be zero or less")
}
encryptionDecoder := encryptionkey.NewRSAPrivKeyDecoder()
signingDecoder := signingkey.NewEDPrivKeyDecoder()
var nodes []*config.Node
for i := 0; i < *flagNodeCount; i++ {
node, err := genRandomNodeKeys(*flagBaseAddress, encryptionDecoder, signingDecoder)
if err != nil {
panic(fmt.Sprintf("could not generate keys for node: %v", err))
}
nodes = append(nodes, node)
}
nodeInfo := config.NodeInfo{
CurrentAlias: nodes[0].Alias,
Nodes: nodes,
}
bytes, err := yaml.Marshal(nodeInfo)
if err != nil {
panic(fmt.Sprintf("could not marshal the keys: %v", err))
}
err = os.WriteFile(*flagAccountConfigFile, bytes, 0644)
if err != nil {
panic(fmt.Sprintf("could not write the generated nodes to file: %v", err))
}
}
func genRandomNodeKeys(address string, encKeyDecoder keys.Decoder, signKeyDecoder keys.Decoder) (*config.Node, error) {
encKey, _, err := encryptionkey.GenerateRandomRSAKeyPair(2048)
if err != nil {
return nil, err
}
signKey, _, err := signingkey.GenerateRandomEd25519KeyPair()
if err != nil {
return nil, err
}
encEncKey, err := encKeyDecoder.EncodeToString(encKey)
if err != nil {
return nil, err
}
encSignKey, err := signKeyDecoder.EncodeToString(signKey)
if err != nil {
return nil, err
}
return &config.Node{
Alias: randString(5),
Address: address,
SigningKey: encSignKey,
EncryptionKey: encEncKey,
}, nil
}
func randString(n int) string {
const letterBytes = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
b := make([]byte, n)
for i := 0; i < n; i++ {
idx := rand.Intn(len(letterBytes))
b[i] = letterBytes[idx]
}
return string(b)
}