github.com/bigzoro/my_simplechain@v0.0.0-20240315012955-8ad0a2a29bb9/p2p/secure/utils.go (about)

     1  package secure
     2  
     3  import (
     4  	"encoding/asn1"
     5  	"errors"
     6  	"fmt"
     7  	"math/big"
     8  )
     9  
    10  type ECDSASignature struct {
    11  	R, S *big.Int
    12  }
    13  
    14  func UnmarshalECDSASignature(raw []byte) (*big.Int, *big.Int, error) {
    15  	// Unmarshal
    16  	sig := new(ECDSASignature)
    17  	_, err := asn1.Unmarshal(raw, sig)
    18  	if err != nil {
    19  		return nil, nil, fmt.Errorf("failed unmashalling signature [%s]", err)
    20  	}
    21  
    22  	// Validate sig
    23  	if sig.R == nil {
    24  		return nil, nil, errors.New("invalid signature, R must be different from nil")
    25  	}
    26  	if sig.S == nil {
    27  		return nil, nil, errors.New("invalid signature, S must be different from nil")
    28  	}
    29  
    30  	if sig.R.Sign() != 1 {
    31  		return nil, nil, errors.New("invalid signature, R must be larger than zero")
    32  	}
    33  	if sig.S.Sign() != 1 {
    34  		return nil, nil, errors.New("invalid signature, S must be larger than zero")
    35  	}
    36  
    37  	return sig.R, sig.S, nil
    38  }
    39  func MarshalECDSASignature(r, s *big.Int) ([]byte, error) {
    40  	return asn1.Marshal(ECDSASignature{r, s})
    41  }
    42  func isECDSASignatureAlgorithm(algid asn1.ObjectIdentifier) bool {
    43  	// This is the set of ECDSA algorithms supported by Go 1.14 for CRL
    44  	// signatures.
    45  	ecdsaSignaureAlgorithms := []asn1.ObjectIdentifier{
    46  		{1, 2, 840, 10045, 4, 1},    // oidSignatureECDSAWithSHA1
    47  		{1, 2, 840, 10045, 4, 3, 2}, // oidSignatureECDSAWithSHA256
    48  		{1, 2, 840, 10045, 4, 3, 3}, // oidSignatureECDSAWithSHA384
    49  		{1, 2, 840, 10045, 4, 3, 4}, // oidSignatureECDSAWithSHA512
    50  	}
    51  	for _, id := range ecdsaSignaureAlgorithms {
    52  		if id.Equal(algid) {
    53  			return true
    54  		}
    55  	}
    56  	return false
    57  }