mirror of
https://github.com/sigcn/pg.git
synced 2025-11-03 09:10:48 +08:00
implement PacketBroadcaster
This commit is contained in:
@@ -4,12 +4,10 @@ import (
|
|||||||
"fmt"
|
"fmt"
|
||||||
"math/rand"
|
"math/rand"
|
||||||
"net/http"
|
"net/http"
|
||||||
"strings"
|
|
||||||
|
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
|
|
||||||
"github.com/rkonfj/peerguard/p2p"
|
"github.com/rkonfj/peerguard/p2p"
|
||||||
"github.com/rkonfj/peerguard/peer"
|
|
||||||
"github.com/spf13/cobra"
|
"github.com/spf13/cobra"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -73,13 +71,13 @@ func runInteraction(network, peerID string, servers []string) error {
|
|||||||
var read string
|
var read string
|
||||||
_, err := fmt.Scanln(&read)
|
_, err := fmt.Scanln(&read)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
fmt.Println("ERR", err)
|
||||||
}
|
|
||||||
msg := strings.Split(read, ",")
|
|
||||||
if len(msg) != 2 {
|
|
||||||
fmt.Println("usage: peer,msg")
|
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
packetConn.WriteTo([]byte(msg[1]), peer.PeerID(msg[0]))
|
count, err := packetConn.Broadcast([]byte(read))
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
fmt.Println(count, "peers sent")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
109
cmd/demo/demo.go
109
cmd/demo/demo.go
@@ -1,109 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"crypto/aes"
|
|
||||||
"crypto/cipher"
|
|
||||||
"crypto/rand"
|
|
||||||
"encoding/base64"
|
|
||||||
"fmt"
|
|
||||||
"io"
|
|
||||||
)
|
|
||||||
|
|
||||||
// TokenAuthSystem 包含加密密钥
|
|
||||||
type TokenAuthSystem struct {
|
|
||||||
key []byte
|
|
||||||
}
|
|
||||||
|
|
||||||
// NewTokenAuthSystem 创建一个新的 TokenAuthSystem 实例
|
|
||||||
func NewTokenAuthSystem(key []byte) *TokenAuthSystem {
|
|
||||||
return &TokenAuthSystem{key: key}
|
|
||||||
}
|
|
||||||
|
|
||||||
// PKCS7Padding 添加PKCS7填充
|
|
||||||
func PKCS7Padding(data []byte, blockSize int) []byte {
|
|
||||||
padding := blockSize - len(data)%blockSize
|
|
||||||
padText := bytes.Repeat([]byte{byte(padding)}, padding)
|
|
||||||
return append(data, padText...)
|
|
||||||
}
|
|
||||||
|
|
||||||
// PKCS7UnPadding 移除PKCS7填充
|
|
||||||
func PKCS7UnPadding(data []byte) []byte {
|
|
||||||
padding := data[len(data)-1]
|
|
||||||
return data[:len(data)-int(padding)]
|
|
||||||
}
|
|
||||||
|
|
||||||
// GenerateToken 生成加密后的 token
|
|
||||||
func (tas *TokenAuthSystem) GenerateToken(data string) (string, error) {
|
|
||||||
block, err := aes.NewCipher(tas.key)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
// 添加PKCS7填充
|
|
||||||
dataBytes := PKCS7Padding([]byte(data), aes.BlockSize)
|
|
||||||
|
|
||||||
cipherText := make([]byte, aes.BlockSize+len(dataBytes))
|
|
||||||
iv := cipherText[:aes.BlockSize]
|
|
||||||
if _, err := io.ReadFull(rand.Reader, iv); err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
mode := cipher.NewCBCEncrypter(block, iv)
|
|
||||||
mode.CryptBlocks(cipherText[aes.BlockSize:], dataBytes)
|
|
||||||
|
|
||||||
return base64.StdEncoding.EncodeToString(cipherText), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
// VerifyToken 验证并解密 token
|
|
||||||
func (tas *TokenAuthSystem) VerifyToken(token string) (string, error) {
|
|
||||||
block, err := aes.NewCipher(tas.key)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
cipherText, err := base64.StdEncoding.DecodeString(token)
|
|
||||||
if err != nil {
|
|
||||||
return "", err
|
|
||||||
}
|
|
||||||
|
|
||||||
if len(cipherText) < aes.BlockSize {
|
|
||||||
return "", fmt.Errorf("invalid token")
|
|
||||||
}
|
|
||||||
|
|
||||||
iv := cipherText[:aes.BlockSize]
|
|
||||||
cipherText = cipherText[aes.BlockSize:]
|
|
||||||
|
|
||||||
mode := cipher.NewCBCDecrypter(block, iv)
|
|
||||||
mode.CryptBlocks(cipherText, cipherText)
|
|
||||||
|
|
||||||
// 移除PKCS7填充
|
|
||||||
decryptedData := PKCS7UnPadding(cipherText)
|
|
||||||
|
|
||||||
return string(decryptedData), nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func main() {
|
|
||||||
// 替换为你自己的密钥
|
|
||||||
key := []byte("32-byte-secret-key-1234567890123")
|
|
||||||
|
|
||||||
// 创建 TokenAuthSystem 实例
|
|
||||||
tokenAuthSystem := NewTokenAuthSystem(key)
|
|
||||||
|
|
||||||
// 生成一个 token
|
|
||||||
dataToEncrypt := "user_id:12345"
|
|
||||||
token, err := tokenAuthSystem.GenerateToken(dataToEncrypt)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Token generation failed:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println("Generated Token:", token)
|
|
||||||
|
|
||||||
// 验证 token
|
|
||||||
decryptedData, err := tokenAuthSystem.VerifyToken(token)
|
|
||||||
if err != nil {
|
|
||||||
fmt.Println("Token verification failed:", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
fmt.Println("Decrypted Data:", decryptedData)
|
|
||||||
}
|
|
||||||
24
disco/udp.go
24
disco/udp.go
@@ -2,6 +2,7 @@ package disco
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"encoding/hex"
|
"encoding/hex"
|
||||||
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log/slog"
|
"log/slog"
|
||||||
"net"
|
"net"
|
||||||
@@ -299,6 +300,29 @@ func (n *UDPConn) WriteToUDP(p []byte, peerID peer.PeerID) (int, error) {
|
|||||||
return 0, ErrUseOfClosedConnection
|
return 0, ErrUseOfClosedConnection
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *UDPConn) Broadcast(b []byte) (peerCount int, err error) {
|
||||||
|
c.peersMapMutex.RLock()
|
||||||
|
peerCount = len(c.peersMap)
|
||||||
|
peers := make([]peer.PeerID, 0, peerCount)
|
||||||
|
for k := range c.peersMap {
|
||||||
|
peers = append(peers, k)
|
||||||
|
}
|
||||||
|
c.peersMapMutex.RUnlock()
|
||||||
|
|
||||||
|
var errs []error
|
||||||
|
for _, peer := range peers {
|
||||||
|
_, err := c.WriteToUDP(b, peer)
|
||||||
|
if err != nil {
|
||||||
|
errs = append(errs, err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(errs) > 0 {
|
||||||
|
err = errors.Join(errs...)
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func ListenUDP(port int, disableIPv4, disableIPv6 bool, id peer.PeerID) (*UDPConn, error) {
|
func ListenUDP(port int, disableIPv4, disableIPv6 bool, id peer.PeerID) (*UDPConn, error) {
|
||||||
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: port})
|
conn, err := net.ListenUDP("udp", &net.UDPAddr{Port: port})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -14,6 +14,10 @@ import (
|
|||||||
"storj.io/common/base58"
|
"storj.io/common/base58"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type PacketBroadcaster interface {
|
||||||
|
Broadcast([]byte) error
|
||||||
|
}
|
||||||
|
|
||||||
type PeerPacketConn struct {
|
type PeerPacketConn struct {
|
||||||
closedSig chan struct{}
|
closedSig chan struct{}
|
||||||
readTimeout chan struct{}
|
readTimeout chan struct{}
|
||||||
@@ -138,6 +142,11 @@ func (c *PeerPacketConn) SetWriteBuffer(bytes int) error {
|
|||||||
return c.udpConn.SetWriteBuffer(bytes)
|
return c.udpConn.SetWriteBuffer(bytes)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Broadcast broadcast packet to all found peers using direct udpConn
|
||||||
|
func (c *PeerPacketConn) Broadcast(b []byte) (int, error) {
|
||||||
|
return c.udpConn.Broadcast(b)
|
||||||
|
}
|
||||||
|
|
||||||
// ListenPacket listen the p2p network for read/write packets
|
// ListenPacket listen the p2p network for read/write packets
|
||||||
func ListenPacket(network string, cluster peer.PeermapCluster, opts ...Option) (*PeerPacketConn, error) {
|
func ListenPacket(network string, cluster peer.PeermapCluster, opts ...Option) (*PeerPacketConn, error) {
|
||||||
id := make([]byte, 32)
|
id := make([]byte, 32)
|
||||||
|
|||||||
Reference in New Issue
Block a user