@@ -1014,6 +1014,106 @@ func TestKeyImportFromX509ECDSAPublicKey(t *testing.T) {
1014
1014
}
1015
1015
}
1016
1016
1017
+ func TestECDSASignatureEncoding (t * testing.T ) {
1018
+ v := []byte {0x30 , 0x07 , 0x02 , 0x01 , 0x8F , 0x02 , 0x02 , 0xff , 0xf1 }
1019
+ _ , err := asn1 .Unmarshal (v , & ecdsaSignature {})
1020
+ if err == nil {
1021
+ t .Fatalf ("Unmarshalling should fail for [% x]" , v )
1022
+ }
1023
+ t .Logf ("Unmarshalling correctly failed for [% x] [%s]" , v , err )
1024
+
1025
+ v = []byte {0x30 , 0x07 , 0x02 , 0x01 , 0x8F , 0x02 , 0x02 , 0x00 , 0x01 }
1026
+ _ , err = asn1 .Unmarshal (v , & ecdsaSignature {})
1027
+ if err == nil {
1028
+ t .Fatalf ("Unmarshalling should fail for [% x]" , v )
1029
+ }
1030
+ t .Logf ("Unmarshalling correctly failed for [% x] [%s]" , v , err )
1031
+
1032
+ v = []byte {0x30 , 0x07 , 0x02 , 0x01 , 0x8F , 0x02 , 0x81 , 0x01 , 0x01 }
1033
+ _ , err = asn1 .Unmarshal (v , & ecdsaSignature {})
1034
+ if err == nil {
1035
+ t .Fatalf ("Unmarshalling should fail for [% x]" , v )
1036
+ }
1037
+ t .Logf ("Unmarshalling correctly failed for [% x] [%s]" , v , err )
1038
+
1039
+ v = []byte {0x30 , 0x07 , 0x02 , 0x01 , 0x8F , 0x02 , 0x81 , 0x01 , 0x8F }
1040
+ _ , err = asn1 .Unmarshal (v , & ecdsaSignature {})
1041
+ if err == nil {
1042
+ t .Fatalf ("Unmarshalling should fail for [% x]" , v )
1043
+ }
1044
+ t .Logf ("Unmarshalling correctly failed for [% x] [%s]" , v , err )
1045
+
1046
+ v = []byte {0x30 , 0x0A , 0x02 , 0x01 , 0x8F , 0x02 , 0x05 , 0x00 , 0x00 , 0x00 , 0x00 , 0x8F }
1047
+ _ , err = asn1 .Unmarshal (v , & ecdsaSignature {})
1048
+ if err == nil {
1049
+ t .Fatalf ("Unmarshalling should fail for [% x]" , v )
1050
+ }
1051
+ t .Logf ("Unmarshalling correctly failed for [% x] [%s]" , v , err )
1052
+
1053
+ }
1054
+
1055
+ func TestECDSALowS (t * testing.T ) {
1056
+ // Ensure that signature with low-S are generated
1057
+ k , err := currentBCCSP .KeyGen (& bccsp.ECDSAKeyGenOpts {Temporary : false })
1058
+ if err != nil {
1059
+ t .Fatalf ("Failed generating ECDSA key [%s]" , err )
1060
+ }
1061
+
1062
+ msg := []byte ("Hello World" )
1063
+
1064
+ digest , err := currentBCCSP .Hash (msg , & bccsp.SHAOpts {})
1065
+ if err != nil {
1066
+ t .Fatalf ("Failed computing HASH [%s]" , err )
1067
+ }
1068
+
1069
+ signature , err := currentBCCSP .Sign (k , digest , nil )
1070
+ if err != nil {
1071
+ t .Fatalf ("Failed generating ECDSA signature [%s]" , err )
1072
+ }
1073
+
1074
+ R , S , err := unmarshalECDSASignature (signature )
1075
+ if err != nil {
1076
+ t .Fatalf ("Failed unmarshalling signature [%s]" , err )
1077
+ }
1078
+
1079
+ if S .Cmp (curveHalfOrders [k .(* ecdsaPrivateKey ).privKey .Curve ]) >= 0 {
1080
+ t .Fatal ("Invalid signature. It must have low-S" )
1081
+ }
1082
+
1083
+ valid , err := currentBCCSP .Verify (k , signature , digest , nil )
1084
+ if err != nil {
1085
+ t .Fatalf ("Failed verifying ECDSA signature [%s]" , err )
1086
+ }
1087
+ if ! valid {
1088
+ t .Fatal ("Failed verifying ECDSA signature. Signature not valid." )
1089
+ }
1090
+
1091
+ // Ensure that signature with high-S are rejected.
1092
+ for {
1093
+ R , S , err = ecdsa .Sign (rand .Reader , k .(* ecdsaPrivateKey ).privKey , digest )
1094
+ if err != nil {
1095
+ t .Fatalf ("Failed generating signature [%s]" , err )
1096
+ }
1097
+
1098
+ if S .Cmp (curveHalfOrders [k .(* ecdsaPrivateKey ).privKey .Curve ]) > 0 {
1099
+ break
1100
+ }
1101
+ }
1102
+
1103
+ sig , err := marshalECDSASignature (R , S )
1104
+ if err != nil {
1105
+ t .Fatalf ("Failing unmarshalling signature [%s]" , err )
1106
+ }
1107
+
1108
+ valid , err = currentBCCSP .Verify (k , sig , digest , nil )
1109
+ if err == nil {
1110
+ t .Fatal ("Failed verifying ECDSA signature. It must fail for a signature with high-S" )
1111
+ }
1112
+ if valid {
1113
+ t .Fatal ("Failed verifying ECDSA signature. It must fail for a signature with high-S" )
1114
+ }
1115
+ }
1116
+
1017
1117
func TestAESKeyGen (t * testing.T ) {
1018
1118
1019
1119
k , err := currentBCCSP .KeyGen (& bccsp.AESKeyGenOpts {Temporary : false })
0 commit comments