* test commit * delete test commit * signing plugin - changes for review * Initial commit : beckn Signing Plugin Module * Added verification plugin post review discussion with leads below changes are made 1. Commented out the signature expiration validation code for both the signing and verification plugins. will update it based on the confirmation. * Create signing_plugin_test.go Added Test Cases for Signing Plugin * Signing and Verification Plugin Added signing plugin and verification plugin with the unit test cases, achieving the following code coverage Signing Plugin : 91.9% Verification Plugin : 92.3% * Added plugin.go to handle the dynamic loading and usage of the plugin implementation * Update the code to meet the linting standards * Added Test Cases for plugin.go 1.Added test cases for plugin.go for both signer and verifier. 2.Added new Function Close to release the resources (mock implementation) 3.Fixed camelCase Issue. * Updated the code coverage for signing plugin Raised code coverage from 85 to 92 for signing plugin * Changes for review Comments 1. updated directory names from Signer to signer 2. Updated Verifier plugin to take header value 3. Updated the config to use a pointer in the signing plugin * Updated directory name for signer and verifier * Removed the Duplicate directories Signer and Verifier * Updated the code to pass the timestamp as a parameter for the signing plugin * Updates on the review comments * Update on the Review Comments * Test commit for code coverage * Update on the review Comments 1. Renaming of NewSigner to New 2. Removed of .so files. 3. Removed external libraries. * Test commit for code coverage * udpate as per the golint standards * update on the code review comments 1. Rename of Validator to Verifier 2. Removed as a pointer for plugins 3. comment updated for Signer * Test Commit for the code coverage * test commit for code coverage * test commit for code coverage * test commit for code coverage * updated code on review comments * update on review comments * update on review comments --------- Co-authored-by: mohit3367 <mohitkatare4@gmail.com>
78 lines
2.1 KiB
Go
78 lines
2.1 KiB
Go
package signer
|
|
|
|
import (
|
|
"context"
|
|
"crypto/ed25519"
|
|
"encoding/base64"
|
|
"errors"
|
|
"fmt"
|
|
|
|
"golang.org/x/crypto/blake2b"
|
|
)
|
|
|
|
// Config holds the configuration for the signing process.
|
|
type Config struct {
|
|
}
|
|
|
|
// Signer implements the Signer interface and handles the signing process.
|
|
type Signer struct {
|
|
config *Config
|
|
}
|
|
|
|
// New creates a new Signer instance with the given configuration.
|
|
func New(ctx context.Context, config *Config) (*Signer, func() error, error) {
|
|
s := &Signer{config: config}
|
|
|
|
return s, s.Close, nil
|
|
}
|
|
|
|
// hash generates a signing string using BLAKE-512 hashing.
|
|
func hash(payload []byte, createdAt, expiresAt int64) (string, error) {
|
|
hasher, _ := blake2b.New512(nil)
|
|
|
|
_, err := hasher.Write(payload)
|
|
if err != nil {
|
|
return "", fmt.Errorf("failed to hash payload: %w", err)
|
|
}
|
|
|
|
hashSum := hasher.Sum(nil)
|
|
digestB64 := base64.StdEncoding.EncodeToString(hashSum)
|
|
|
|
return fmt.Sprintf("(created): %d\n(expires): %d\ndigest: BLAKE-512=%s", createdAt, expiresAt, digestB64), nil
|
|
}
|
|
|
|
// generateSignature signs the given signing string using the provided private key.
|
|
func generateSignature(signingString []byte, privateKeyBase64 string) ([]byte, error) {
|
|
privateKeyBytes, err := base64.StdEncoding.DecodeString(privateKeyBase64)
|
|
if err != nil {
|
|
return nil, fmt.Errorf("error decoding private key: %w", err)
|
|
}
|
|
|
|
if len(privateKeyBytes) != ed25519.PrivateKeySize {
|
|
return nil, errors.New("invalid private key length")
|
|
}
|
|
|
|
privateKey := ed25519.PrivateKey(privateKeyBytes)
|
|
return ed25519.Sign(privateKey, signingString), nil
|
|
}
|
|
|
|
// Sign generates a digital signature for the provided payload.
|
|
func (s *Signer) Sign(ctx context.Context, body []byte, privateKeyBase64 string, createdAt, expiresAt int64) (string, error) {
|
|
signingString, err := hash(body, createdAt, expiresAt)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
signature, err := generateSignature([]byte(signingString), privateKeyBase64)
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return base64.StdEncoding.EncodeToString(signature), nil
|
|
}
|
|
|
|
// Close releases resources (mock implementation returning nil).
|
|
func (s *Signer) Close() error {
|
|
return nil
|
|
}
|