webpush-client-go/examples/ece/main.go

70 lines
1.3 KiB
Go

package main
import (
"crypto/ecdh"
"crypto/sha256"
"log"
"git.min.rip/min/webpush-client-go/rfc8291"
)
var (
CURVE = ecdh.P256()
HASH = sha256.New
PLAINTEXT = "Plain text message!!!"
)
func appserver(authSecret []byte, useragentPublicKey *ecdh.PublicKey) []byte {
_, salt, privateKey := rfc8291.NewSecrets(CURVE)
ece := rfc8291.NewRFC8291(HASH)
encrypted, err := ece.Encrypt(
[]byte(PLAINTEXT),
salt,
authSecret,
useragentPublicKey,
privateKey,
)
if err != nil {
log.Panicln("Encryption Error:", err)
}
return encrypted
}
func main() {
// UserAgent
authSecret, _, useragentPrivateKey := rfc8291.NewSecrets(CURVE)
ece := rfc8291.NewRFC8291(HASH)
// AppServer
encrypted := appserver(authSecret, useragentPrivateKey.PublicKey())
// UserAgent
payload, err := rfc8291.Unmarshal(encrypted)
if err != nil {
log.Panicln("RFC8291 Unmarshal Error:", err)
}
// In RFC8291, KeyID is the AppServer's Public Key
appserverPublicKey, err := ecdh.P256().NewPublicKey(payload.KeyId)
if err != nil {
log.Panicln("Load PublicKey Error", err)
}
plaintext, err := ece.Decrypt(
payload.CipherText,
payload.Salt,
authSecret,
useragentPrivateKey,
appserverPublicKey,
)
if err != nil {
log.Panicln("RFC8291 Decrypt Error", err)
}
log.Println("Valid Message: ", PLAINTEXT)
log.Println("Decrypted Text:", string(plaintext))
}