@@ -1014,6 +1014,106 @@ func TestKeyImportFromX509ECDSAPublicKey(t *testing.T) {
10141014	}
10151015}
10161016
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+ 
10171117func  TestAESKeyGen (t  * testing.T ) {
10181118
10191119	k , err  :=  currentBCCSP .KeyGen (& bccsp.AESKeyGenOpts {Temporary : false })
0 commit comments