Jump to content
php.lv forumi

Capicom.SignedData un Unicode


usver

Recommended Posts

Ar javascript un ActiveXObject() tiek taisīts Capicom.SignedData un pēc tam tas veiksmīgi tiek arī parakstīts.

Viss ir smuki, pēc tam validējas un tā, bet - Capicom, neprasot piekrišanu, visu pārtaisa par unikodu. Līdz ar to parakstītie dati kļūst gandrīz 2x garāki, nekā to oriģināls.

Meklējot atradu norādes, ka kādreiz esot eksistējis http://discuss.microsoft.com/archives/capicom.html - arhīvs ar šāda tipa jautājumiem, taču tagad tas nav pieejams.

Izmantojot to pašu uz VBScript un .NET, būtu piemērojams šāds risinājums - http://www.codeproject.com/KB/security/CapicomUTF8.aspx , taču nezinu, kā iekš Javascript aizstāt funkciju "System.Text.Encoding.UTF8.GetBytes". Vai kādam ir zināms, kā iedot tekstu Capicom.SignedData klase tā, lai pēc tam nenotiktu pārveidojumi?

Link to comment
Share on other sites

Saskaņā ar labo stilu, atzīmējos arī par atrisinājumu - jo izdevās šo te piedabūt darboties (hip-hip-urrā ;))

 

tātad - bija kods:

<script type="text/javascript" language="javascript">
function sign_contents(txt_to_sign){
	.. 
			var Signer = new ActiveXObject("Capicom.Signer");
			var Utilities = new ActiveXObject("Capicom.Utilities"); 
			var SignedData = new ActiveXObject("Capicom.SignedData");	

			SignedData.Content = txt_to_sign;	// Shis visu vardarbīgi konvertē uz 2baitu simboliem :(

			Signer.Certificate = MyCertificate;
			var signature = SignedData.Sign(Signer, false, 0);
		 .. 
		 ..
	}
</script>

Visa lielā problēma - liec, ko vien gribi iekš SignedData.Content, viņš vienalga pēc ielikšanas visu konvertēs uz Unicode. Mēģinot iebarot viņam datus ar Capicom.Utilities funkcijām BinaryStringToByteArray vai ByteArrayToBinaryString, arī neizdodas - nav gaidītā efekta vai pat seko sūtījums dillēs "incorrect parameter" un iexplore nokāriens.

 

Risinājums: uztaisīt kokteili no valodām, iesaistot arī VBScript, kurš, kā jau M$ brīnums, natīvi sadarbojas ar Capicom. Tieši aiz <body> sākuma (savādāk IE bļaustās) ielikt šādu funkciju:

		<script language="vbscript" type="text/vbscript">
	<!--
	Function Unicode2Ansi(unicodestring)
		Dim lngLoop
		Dim strChar
		Ustr2Bstr = ""

		For lngLoop = 1 to Len(unicodestring)
			strChar = Mid(unicodestring, lngLoop, 1)
			Unicode2ANSI = Unicode2ANSI & ChrB(AscB(strChar))
		Next
	End function
	-->
</SCRIPT>

.. un pēc tam parakstīšanas vietā to saukt ar

				SignedData.Content = Unicode2Ansi( txt_to_sign ); // VB f-ju pasaucam no Javascript

eventuālās problēmas: varbūt vajadzēs savādāku konvertāciju, un nevis uz ANSI, bet gan UTF-8, taču to noskaidrosim testēšanas gaitā ;)

Link to comment
Share on other sites

×
×
  • Create New...