github.com/projectdiscovery/nuclei/v2@v2.9.15/pkg/templates/signer/util.go (about)

     1  package signer
     2  
     3  import (
     4  	"bytes"
     5  	"encoding/hex"
     6  	"errors"
     7  	"fmt"
     8  )
     9  
    10  const (
    11  	SignaturePattern = "# digest: "
    12  	SignatureFmt     = SignaturePattern + "%x"
    13  )
    14  
    15  func RemoveSignatureFromData(data []byte) []byte {
    16  	return bytes.Trim(ReDigest.ReplaceAll(data, []byte("")), "\n")
    17  }
    18  
    19  func Sign(sign *Signer, data []byte) (string, error) {
    20  	if sign == nil {
    21  		return "", errors.New("invalid nil signer")
    22  	}
    23  	cleanedData := RemoveSignatureFromData(data)
    24  	signatureData, err := sign.Sign(cleanedData)
    25  	if err != nil {
    26  		return "", err
    27  	}
    28  
    29  	return fmt.Sprintf(SignatureFmt, signatureData), nil
    30  }
    31  
    32  func Verify(sign *Signer, data []byte) (bool, error) {
    33  	if sign == nil {
    34  		return false, errors.New("invalid nil verifier")
    35  	}
    36  	digestData := ReDigest.Find(data)
    37  	if len(digestData) == 0 {
    38  		return false, errors.New("digest not found")
    39  	}
    40  
    41  	digestData = bytes.TrimSpace(bytes.TrimPrefix(digestData, []byte(SignaturePattern)))
    42  	digest, err := hex.DecodeString(string(digestData))
    43  	if err != nil {
    44  		return false, err
    45  	}
    46  
    47  	cleanedData := RemoveSignatureFromData(data)
    48  
    49  	return sign.Verify(cleanedData, digest)
    50  }