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 }