﻿<?xml version="1.0" encoding="utf-8"?><rss version="2.0"><channel><title>NullifyNetwork</title><link>http://www.nullify.net/</link><generator>C5 RSS Module</generator><description>Technical fixes, development commentary and help articles by Simon Soanes</description><copyright>Copyright Simon Soanes. All rights reserved.</copyright><languate>en-gb</languate><lastBuildDate>Fri, 24 May 2013 06:55:29</lastBuildDate><item><title>Work and life</title><description>&lt;p&gt;Not sure anyone is still reading this, but I've not really been blogging while contracting for semi-obvious reasons; I'll be leaving this post here at the top just to confirm I am still alive and will post&amp;nbsp;some interesting stuff about both Workflow Foundation and 3D engine development in the future.&lt;/p&gt;
&lt;p&gt;All but a few of my servers are now upgraded to Server 2012 or FreeBSD&amp;nbsp;and I'm ditching the remaining Linux ones, overall I've been finding&amp;nbsp;Server 2012 a solid platform and while the initial version had power management bugs and various other quirks updates have really improved it.&amp;nbsp; It has made things like Active Directory extremely lightweight too.&lt;/p&gt;
&lt;p&gt;I've also been making a 3d engine in my spare time (though only putting in a concerted effort over holidays!) so should have plenty to say about geometry/meshes, collision detection, mouse movement, shaders and physics.&amp;nbsp; I also toyed with flow-field pathfinding and am amazed how effective it can be with so little code so hopefully that'll be the subject of a few blog posts on its own.&lt;/p&gt;
&lt;p&gt;TFS 2012 has been an awesome platform for doing builds and keeping track of what I was working on given quite lengthy gaps too.&lt;/p&gt;</description><link>http://www.nullify.net/Article/28352</link><pubDate>Sun, 14 Apr 2013 22:02:57</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=28352</guid></item><item><title>Visual Studio 2012 Theme Editor</title><description>&lt;p&gt;You can download the theme editor from &lt;a title="Theme Editor" href="http://visualstudiogallery.msdn.microsoft.com/366ad100-0003-4c9a-81a8-337d4e7ace05"&gt;here&lt;/a&gt;. &amp;nbsp;I have started to get used to the colours to be honest, though they are still substantially worse than the VS2010 scheme. &amp;nbsp;Commence the addition of colour!&lt;/p&gt;</description><link>http://www.nullify.net/Article/28350</link><pubDate>Sun, 09 Sep 2012 22:32:54</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=28350</guid></item><item><title>IPv6</title><description>&lt;p&gt;I'm still contracting so haven't posted much at all but I am still alive! &amp;nbsp;This is just a quick note because it's nice to see people like Microsoft have taken world IPv6 launch day seriously and enabled their main websites permanently with AAAA records.&lt;/p&gt;
&lt;p&gt;Unfortunatey major UK ISP's haven't yet enabled it for their customers (JANET excluded), but the smaller ones (and international carriers) are shining through and able to provide service.&lt;/p&gt;
&lt;p&gt;I took the IPv6 Enabled logo off my site; however I'm proud to say it has been enabled here for the last eight years or so.&lt;/p&gt;</description><link>http://www.nullify.net/Article/28349</link><pubDate>Wed, 06 Jun 2012 08:41:46</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=28349</guid></item><item><title>Silverlight 5 Released</title><description>&lt;p&gt;Microsoft have just released version 5 of Silverlight, the &lt;a href="http://go.microsoft.com/fwlink/?LinkId=229318"&gt;tools for VS2010&lt;/a&gt;, the developer runtime and the full runtime!&lt;/p&gt;
&lt;p&gt;Hopefully this isn't the end of Silverlight as the media are currently speculating, I'm hopeful that there'll be an announcement of a Silverlight 6 but either way Silverlight 5 has a ten year support cycle and is the underlying technology behind Windows Phone 7 and Windows 8 (albeit with different naming, etc.).&lt;/p&gt;
&lt;p&gt;I've been very impressed with the capabilities of WPF/Silverlight and hope that it gets the resources it deserves.&lt;/p&gt;</description><link>http://www.nullify.net/Article/28348</link><pubDate>Sat, 10 Dec 2011 12:40:30</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=28348</guid></item><item><title>Entity Framework 4 and Replication Guids (RowGuid)</title><description>&lt;p&gt;This has been delaying my release of an upgraded version of this blog for months now, and has also meant that I have chosen to use Linq To SQL on several large projects when working&amp;nbsp;(Linq To SQL fully supports this scenario despite being the 2nd class citizen in entity mapping at Microsoft), Paul Patterson explains it quite well here so I can be lazy and just link to his article:-&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.paulspatterson.com/technology/dot-net-development/entity-framework-4-and-sql-uniqueidentifier-bug/"&gt;http://www.paulspatterson.com/technology/dot-net-development/entity-framework-4-and-sql-uniqueidentifier-bug/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I wasn't willing to employ his fix though, it was frustrating and would get overwritten whenever the schema was updated however I have just found that there is a hotfix for this now available from Microsoft so that you can correctly configure the EDMX in entity framework to support the rowguid correctly:-&lt;/p&gt;
&lt;p&gt;&lt;a href="http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=37957"&gt;http://connect.microsoft.com/VisualStudio/Downloads/DownloadDetails.aspx?DownloadID=37957&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This isn't perfect as you still need to manually set the StoreGeneratedPattern option on the rowguid columns to Identity, but it is certainly better than the total failure that was the case before!&amp;nbsp; Hopefully they will consider better support for replication, guid's and server-generated values&amp;nbsp;in future versions.&lt;/p&gt;
&lt;p&gt;I guess this means I can finally switch to Entity Framework and get my new site version released... :)&lt;/p&gt;</description><link>http://www.nullify.net/Article/345</link><pubDate>Fri, 30 Sep 2011 21:32:18</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=345</guid></item><item><title>World IPv6 Day</title><description>&lt;p&gt;Haven't had time to blog around work (figured I should at least post once a year though), but&amp;nbsp;I'm pleased to see large companies suddenly enabling their IPv6 implementations today, it has been a rough ride. &amp;nbsp;I've seen a gradual climb in IPv6 end users (and web and mail servers) for some time now and it's very pleasing to see it gradually approaching critical mass.&lt;/p&gt;
&lt;p&gt;With my network fully IPv6 enabled for some time now thanks to Hurricane Electric (and more recently Goscomb Technologies too) I am looking forward to the time when there's no more NAT being deployed, or at least not in the same fashion.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; I'm glad to see Microsoft as one of the first companies to get their sites advertising their AAAA records today, curtesy of Akamai. &amp;nbsp;The rapid climb towards 100% amongst the participating companies is excellent to see, partcularly as the agreed start time is midnight UTC rather than british summer time when this post is being made (visible at&amp;nbsp;&lt;span class="Apple-style-span" style="word-spacing: 0px; "&gt;&lt;a href="http://www.worldipv6day.org/participants-dashboard/index.html"&gt;http://www.worldipv6day.org/participants-dashboard/index.html&lt;/a&gt;&lt;/span&gt;&lt;span class="Apple-style-span" style="word-spacing: 0px; "&gt;&amp;nbsp;and&amp;nbsp;&lt;/span&gt;&lt;span class="Apple-style-span" style="word-spacing: 0px; "&gt;&lt;a href="http://v6day.ripe.net/cgi-bin/index.cgi"&gt;http://v6day.ripe.net/cgi-bin/index.cgi&lt;/a&gt;&lt;/span&gt;)&lt;/p&gt;</description><link>http://www.nullify.net/Article/28344</link><pubDate>Wed, 08 Jun 2011 00:01:41</pubDate><category>IPv6</category><guid>http://www.nullify.net/ViewArticle.aspx?article=28344</guid></item><item><title>Still contracting...</title><description>&lt;p&gt;Just a quick note to say that I've been contracting for a while now and have avoided posting anything/not had much to post about but that I'm still around.&lt;/p&gt;
&lt;p&gt;I did go to the Microsoft PDC's virtual event in Reading, UK so should really have been evangelizing about how great it is that there'll be private Azure clouds now but I've not really had a proper opportunity to investigate that yet, but perhaps the next post will be related to that.&lt;/p&gt;</description><link>http://www.nullify.net/Article/344</link><pubDate>Sun, 21 Nov 2010 18:41:15</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=344</guid></item><item><title>Yubikey decryption/authentication class</title><description>&lt;p&gt;So I have encountered a situation where I need to use two factor authentication and recently bought a couple of &lt;a href="http://www.yubico.com/"&gt;Yubico&amp;nbsp;YubiKey&lt;/a&gt;'s to investigate them as a potential solution where I can't use smart cards (mostly with other users who can't install the appropriate drivers or on locked down systems/internet cafe's).&lt;/p&gt;
&lt;p&gt;They are fairly cheap (particularly in bulk) and provide similar functionality to an RSA Securid but without the need to type the password (they act as a keyboard and type onto the computer, but can't be modified by the computer in question). &amp;nbsp;They also have two 'slots' for different tokens, you can touch the button once for one and touch and hold for a second one time key.&lt;/p&gt;
&lt;p&gt;Whilst there's plenty of code examples around for them (the company are extremely open), I haven't found a simple, logical C# library/class I could use to do authentication locally (they supply ones for remote auth on their servers) - there were always multiple files and loads of code in peoples projects.&lt;/p&gt;
&lt;p&gt;My intention is to write a Windows SubAuthentication DLL (in C++ but I learn in C#) to use with these keys which also still checks your normal password - so when remote desktop'ing, using something that authenticates to Windows or using the Windows Radius server (NPS) to authenticate VPN's you can choose to either supply your normal password, or if you're on a system you don't trust you can use your username/low security pin code and Yubikey.&lt;/p&gt;
&lt;p&gt;So here's my take on the decoding of a Yubikey's input - note that I'm not interested in making a software token though so the class doesn't generate values for the random value (if you wanted to do this you just need to ask RNGCryptoProvider for a few bytes of random though) and there's also no incrementing of the sessions, in-session use counters or timestamps included - however I did include the code to encrypt it appropriately if you do supply all the values.&lt;/p&gt;
&lt;p&gt;To use this class you just need to call it like so - where privateKey is a byte[] array with the private key in and otpCode is a string like "fkfthfffktbnreffrghcldrffeclcgkt" output from a touch of the Yubikey:-&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;&amp;nbsp;otp&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;.FromModHex(privateKey,&amp;nbsp;otpCode);&lt;br /&gt;&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(otp.UidMatch(checkIdentity))&lt;br /&gt;{&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"Decoded&amp;nbsp;the&amp;nbsp;YubiKey's&amp;nbsp;OTP&amp;nbsp;code:-"&lt;/span&gt;);&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"\tSession:\t"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;otp.SessionCounter.ToString());&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"\tCount&amp;nbsp;in&amp;nbsp;session:\t"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;otp.SessionUseCount.ToString());&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"\tTime&amp;nbsp;(high):\t"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;otp.TimestampHighPart.ToString());&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"\tTime&amp;nbsp;(low):\t"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;otp.TimestampLowPart.ToString());&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"\tTime&amp;nbsp;(low):\t"&lt;/span&gt;&amp;nbsp;+&amp;nbsp;otp.Uid.ToString());&lt;br /&gt;}&lt;br /&gt;&lt;span style="color: maroon;"&gt;else&lt;/span&gt;&lt;br /&gt;{&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;Console&lt;/span&gt;.WriteLine(&lt;span style="color: blue;"&gt;"Failed&amp;nbsp;to&amp;nbsp;identify&amp;nbsp;the&amp;nbsp;keys&amp;nbsp;correct&amp;nbsp;OTP"&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;And you can decode the private key/identity as they're displayed in the YubiKey personalisation tool with the following handy (but not super efficient) hex to byte algorithms:-&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;StringHexDecode(&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;hexData)&lt;br /&gt;{&lt;br /&gt;	&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;();&lt;br /&gt;	&lt;span style="color: maroon;"&gt;foreach&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;b&amp;nbsp;&lt;span style="color: maroon;"&gt;in&lt;/span&gt;&amp;nbsp;hexData.Split(&lt;span style="color: blue;"&gt;'&amp;nbsp;'&lt;/span&gt;))&lt;br /&gt;	{&lt;br /&gt;		data.Add(&lt;span style="color: #2b91af;"&gt;Convert&lt;/span&gt;.ToByte(b,&amp;nbsp;16));&lt;br /&gt;	}&lt;br /&gt;	&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;data.ToArray();&lt;br /&gt;}&lt;br /&gt; &lt;br /&gt;&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;StringHexEncode(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;hexData)&lt;br /&gt;{&lt;br /&gt;	&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.ToString(hexData).Replace(&lt;span style="color: blue;"&gt;'-'&lt;/span&gt;,&amp;nbsp;&lt;span style="color: blue;"&gt;'&amp;nbsp;'&lt;/span&gt;);&lt;br /&gt;}&lt;/pre&gt;
&lt;p&gt;And&amp;nbsp;finally here's the actual Yubikey class including the algorithm to decrypt the data that the USB dongles actually output in 'ModHex' which is an odd keyboard language independent format but seems to work quite well:-&lt;/p&gt;
&lt;pre style="font-family: consolas;"&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;A&amp;nbsp;YubiKey&amp;nbsp;OTP&amp;nbsp;is&amp;nbsp;symmetric&amp;nbsp;two-factor&amp;nbsp;auth&amp;nbsp;key,&amp;nbsp;this&amp;nbsp;class&amp;nbsp;allows&amp;nbsp;decoding&amp;nbsp;and&amp;nbsp;validating&amp;nbsp;them&lt;/span&gt;&lt;br /&gt;&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;
{&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;YubiKey()&lt;br /&gt;	{&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;CRC_OK_RESIDUE&amp;nbsp;=&amp;nbsp;0xf0b8;

	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Unique&amp;nbsp;(secret)&amp;nbsp;ID.&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;Uid&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[6];
	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Session&amp;nbsp;counter&amp;nbsp;(incremented&amp;nbsp;by&amp;nbsp;1&amp;nbsp;at&amp;nbsp;each&amp;nbsp;startup).&amp;nbsp;&amp;nbsp;High&amp;nbsp;bit&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;indicates&amp;nbsp;whether&amp;nbsp;caps-lock&amp;nbsp;triggered&amp;nbsp;the&amp;nbsp;token.&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UInt16&lt;/span&gt;&amp;nbsp;SessionCounter;
	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Timestamp&amp;nbsp;incremented&amp;nbsp;by&amp;nbsp;approx&amp;nbsp;8Hz&amp;nbsp;(low&amp;nbsp;part).&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UInt16&lt;/span&gt;&amp;nbsp;TimestampLowPart;
	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Timestamp&amp;nbsp;(high&amp;nbsp;part).&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;nbsp;TimestampHighPart;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Number&amp;nbsp;of&amp;nbsp;times&amp;nbsp;used&amp;nbsp;within&amp;nbsp;session&amp;nbsp;+&amp;nbsp;activation&amp;nbsp;flags.&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;
	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;nbsp;SessionUseCount;
	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Pseudo-random&amp;nbsp;value.&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UInt16&lt;/span&gt;&amp;nbsp;RandomValue;
	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;CRC16&amp;nbsp;value&amp;nbsp;of&amp;nbsp;all&amp;nbsp;fields.&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;UInt16&lt;/span&gt;&amp;nbsp;CRC;&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Does&amp;nbsp;the&amp;nbsp;included&amp;nbsp;UID&amp;nbsp;match&amp;nbsp;the&amp;nbsp;one&amp;nbsp;we&amp;nbsp;expected?&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"uid"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;bool&lt;/span&gt;&amp;nbsp;UidMatch(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;uid)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: maroon;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;uid.Length;&amp;nbsp;i++)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(Uid[i]&amp;nbsp;!=&amp;nbsp;uid[i])&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;false&lt;/span&gt;;&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;true&lt;/span&gt;;&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt; #region&lt;/span&gt;&amp;nbsp;Post&amp;nbsp;Decryption&amp;nbsp;Conversion&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;calculateCrc(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;b)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;crc&amp;nbsp;=&amp;nbsp;0xffff;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;b.Length;&amp;nbsp;i&amp;nbsp;+=&amp;nbsp;1)&lt;br /&gt;		{&lt;br /&gt;			crc&amp;nbsp;^=&amp;nbsp;b[i]&amp;nbsp;&amp;amp;&amp;nbsp;0xFF;&lt;br /&gt;			&lt;span style="color: maroon;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;8;&amp;nbsp;j++)&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;n&amp;nbsp;=&amp;nbsp;crc&amp;nbsp;&amp;amp;&amp;nbsp;1;&lt;br /&gt;				crc&amp;nbsp;&amp;gt;&amp;gt;=&amp;nbsp;1;&lt;br /&gt;				&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(n&amp;nbsp;!=&amp;nbsp;0)&lt;br /&gt;				{&lt;br /&gt;					crc&amp;nbsp;^=&amp;nbsp;0x8408;&lt;br /&gt;				}&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;crc;&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;&amp;nbsp;OtpFromRawByteArray(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;input)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(input.Length&amp;nbsp;&amp;lt;&amp;nbsp;16)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKeyException&lt;/span&gt;(&lt;span style="color: blue;"&gt;"Invalid&amp;nbsp;OTP&amp;nbsp;data&amp;nbsp;-&amp;nbsp;the&amp;nbsp;amount&amp;nbsp;supplied&amp;nbsp;was&lt;br /&gt;insufficient&amp;nbsp;for&amp;nbsp;a&amp;nbsp;six&amp;nbsp;byte&amp;nbsp;identity."&lt;/span&gt;);&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(calculateCrc(input)&amp;nbsp;!=&amp;nbsp;CRC_OK_RESIDUE)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKeyException&lt;/span&gt;(&lt;span style="color: blue;"&gt;"CRC&amp;nbsp;was&amp;nbsp;invalid&amp;nbsp;on&amp;nbsp;that&amp;nbsp;OTP"&lt;/span&gt;);&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;&amp;nbsp;u&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;();&lt;br /&gt;		u.Uid&amp;nbsp;=&amp;nbsp;input.Take(6).ToArray();&lt;br /&gt;		u.SessionCounter&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.ToUInt16(input,&amp;nbsp;6);&lt;br /&gt;		u.TimestampLowPart&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.ToUInt16(input,&amp;nbsp;8);&lt;br /&gt;		u.TimestampHighPart&amp;nbsp;=&amp;nbsp;input[10];&lt;br /&gt;		u.SessionUseCount&amp;nbsp;=&amp;nbsp;input[11];&lt;br /&gt;		u.RandomValue&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.ToUInt16(input,&amp;nbsp;12);&lt;br /&gt;		u.CRC&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.ToUInt16(input,&amp;nbsp;14);&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;u;&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;RawByteArrayFromOtp(&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;&amp;nbsp;input)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;&amp;nbsp;data&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;();&lt;br /&gt;		data.AddRange(input.Uid);&lt;br /&gt;		data.AddRange(&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.GetBytes(input.SessionCounter));&lt;br /&gt;		data.AddRange(&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.GetBytes(input.TimestampLowPart));&lt;br /&gt;		data.Add(input.TimestampHighPart);&lt;br /&gt;		data.Add(input.SessionUseCount);&lt;br /&gt;		data.AddRange(&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.GetBytes(input.RandomValue));&lt;br /&gt;		data.AddRange(&lt;span style="color: #2b91af;"&gt;BitConverter&lt;/span&gt;.GetBytes(input.CRC));&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;data.ToArray();&lt;br /&gt;	}&lt;br /&gt;&lt;span style="color: blue;"&gt; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt; #region&lt;/span&gt;&amp;nbsp;Cryptographic&amp;nbsp;wrapper&lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;AESEncrypt(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;data,&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;key,&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;iv)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;Aes&lt;/span&gt;&amp;nbsp;enc&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Aes&lt;/span&gt;.Create();&lt;br /&gt;		enc.Key&amp;nbsp;=&amp;nbsp;key;&lt;br /&gt;		enc.IV&amp;nbsp;=&amp;nbsp;iv;&lt;br /&gt;		enc.Padding&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PaddingMode&lt;/span&gt;.None;&lt;br /&gt;		&lt;span style="color: maroon;"&gt;using&lt;/span&gt;&amp;nbsp;(ICryptoTransform&amp;nbsp;transform&amp;nbsp;=&amp;nbsp;enc.CreateEncryptor())&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;output&amp;nbsp;=&amp;nbsp;transform.TransformFinalBlock(data,&amp;nbsp;0,&amp;nbsp;data.Length);&lt;br /&gt;			&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;output;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;AESDecrypt(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;data,&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;key,&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;iv)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;Aes&lt;/span&gt;&amp;nbsp;aesImplementation&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Aes&lt;/span&gt;.Create();&lt;br /&gt;		aesImplementation.Key&amp;nbsp;=&amp;nbsp;key;&lt;br /&gt;		aesImplementation.IV&amp;nbsp;=&amp;nbsp;iv;&lt;br /&gt;		aesImplementation.Padding&amp;nbsp;=&amp;nbsp;&lt;span style="color: #2b91af;"&gt;PaddingMode&lt;/span&gt;.None;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;using&lt;/span&gt;&amp;nbsp;(ICryptoTransform&amp;nbsp;transform&amp;nbsp;=&amp;nbsp;aesImplementation.CreateDecryptor())&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;output&amp;nbsp;=&amp;nbsp;transform.TransformFinalBlock(data,&amp;nbsp;0,&amp;nbsp;data.Length);&lt;br /&gt; &lt;br /&gt;			&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;output;&lt;br /&gt;		}&lt;br /&gt;	}&lt;br /&gt;&lt;span style="color: blue;"&gt; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt; #region&lt;/span&gt;&amp;nbsp;ModHex&amp;nbsp;Support&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;private&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;const&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;alphabet&amp;nbsp;=&amp;nbsp;&lt;span style="color: blue;"&gt;"cbdefghijklnrtuv"&lt;/span&gt;;&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;ModHexEncode(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;data)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;&amp;nbsp;result&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;StringBuilder&lt;/span&gt;();&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;data.Length;&amp;nbsp;i++)&lt;br /&gt;		{&lt;br /&gt;			result.Append(alphabet[(data[i]&amp;nbsp;&amp;gt;&amp;gt;&amp;nbsp;4)&amp;nbsp;&amp;amp;&amp;nbsp;0xf]);&lt;br /&gt;			result.Append(alphabet[data[i]&amp;nbsp;&amp;amp;&amp;nbsp;0xf]);&lt;br /&gt;		}&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;result.ToString();&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;internal&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;ModHexDecode(&lt;span style="color: #2b91af;"&gt;String&lt;/span&gt;&amp;nbsp;s)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;&amp;nbsp;baos&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;List&lt;/span&gt;&amp;lt;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;&amp;gt;();&lt;br /&gt;		&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;len&amp;nbsp;=&amp;nbsp;s.Length;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;bool&lt;/span&gt;&amp;nbsp;toggle&amp;nbsp;=&amp;nbsp;&lt;span style="color: maroon;"&gt;false&lt;/span&gt;;&lt;br /&gt;		&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;keep&amp;nbsp;=&amp;nbsp;0;&lt;br /&gt; &lt;br /&gt;		&lt;span style="color: maroon;"&gt;for&lt;/span&gt;&amp;nbsp;(&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;len;&amp;nbsp;i++)&lt;br /&gt;		{&lt;br /&gt;			&lt;span style="color: maroon;"&gt;char&lt;/span&gt;&amp;nbsp;ch&amp;nbsp;=&amp;nbsp;s[i];&lt;br /&gt;			&lt;span style="color: maroon;"&gt;int&lt;/span&gt;&amp;nbsp;n&amp;nbsp;=&amp;nbsp;alphabet.IndexOf(ch.ToString().ToLower());&lt;br /&gt;			&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(n&amp;nbsp;==&amp;nbsp;-1)&lt;br /&gt;			{&lt;br /&gt;				&lt;span style="color: maroon;"&gt;throw&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKeyException&lt;/span&gt;(s&amp;nbsp;+&amp;nbsp;&lt;span style="color: blue;"&gt;"&amp;nbsp;is&amp;nbsp;not&amp;nbsp;properly&amp;nbsp;encoded"&lt;/span&gt;);&lt;br /&gt;			}&lt;br /&gt; &lt;br /&gt;			toggle&amp;nbsp;=&amp;nbsp;!toggle;&lt;br /&gt; &lt;br /&gt;			&lt;span style="color: maroon;"&gt;if&lt;/span&gt;&amp;nbsp;(toggle)&lt;br /&gt;			{&lt;br /&gt;				keep&amp;nbsp;=&amp;nbsp;n;&lt;br /&gt;			}&lt;br /&gt;			&lt;span style="color: maroon;"&gt;else&lt;/span&gt;&lt;br /&gt;			{&lt;br /&gt;				baos.Add((&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;)((keep&amp;nbsp;&amp;lt;&amp;lt;&amp;nbsp;4)&amp;nbsp;|&amp;nbsp;n));&lt;br /&gt;			}&lt;br /&gt;		}&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;baos.ToArray();&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;&lt;span style="color: blue;"&gt; #region&lt;/span&gt;&amp;nbsp;Factory&amp;nbsp;helpers&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Create&amp;nbsp;a&amp;nbsp;Yubikey&amp;nbsp;object&amp;nbsp;from&amp;nbsp;the&amp;nbsp;mod&amp;nbsp;hex&amp;nbsp;and&amp;nbsp;the&amp;nbsp;private&amp;nbsp;key&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"privateKey"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;private&amp;nbsp;key&amp;nbsp;to&amp;nbsp;decrypt&amp;nbsp;with&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"modHex"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;modhex&amp;nbsp;content&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;A&amp;nbsp;yubikey&amp;nbsp;object&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;static&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKey&lt;/span&gt;&amp;nbsp;FromModHex(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;privateKey,&amp;nbsp;&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;modHex)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: green;"&gt;//no&amp;nbsp;IV&amp;nbsp;in&amp;nbsp;use&lt;/span&gt;&lt;br /&gt;		&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;inputOTP&amp;nbsp;=&amp;nbsp;ModHexDecode(modHex);&lt;br /&gt;		&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;decrypted&amp;nbsp;=&amp;nbsp;AESDecrypt(inputOTP,&amp;nbsp;privateKey,&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[16]);&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;OtpFromRawByteArray(decrypted);&lt;br /&gt;	}&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;Convert&amp;nbsp;this&amp;nbsp;yubikey&amp;nbsp;instance&amp;nbsp;into&amp;nbsp;a&amp;nbsp;mod-hex&amp;nbsp;OTP&amp;nbsp;string&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/summary&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;param&amp;nbsp;name=&lt;/span&gt;&lt;span style="color: gray;"&gt;"privateKey"&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;private&amp;nbsp;key&amp;nbsp;to&amp;nbsp;encrypt&amp;nbsp;with&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/param&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: gray;"&gt;///&lt;/span&gt;&lt;span style="color: green;"&gt;&amp;nbsp;&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;returns&amp;gt;&lt;/span&gt;&lt;span style="color: green;"&gt;The&amp;nbsp;modhext&amp;nbsp;content&lt;/span&gt;&lt;span style="color: gray;"&gt;&amp;lt;/returns&amp;gt;&lt;/span&gt;&lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;ToModHex(&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;privateKey)&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;clearotp&amp;nbsp;=&amp;nbsp;RawByteArrayFromOtp(&lt;span style="color: maroon;"&gt;this&lt;/span&gt;);&lt;br /&gt;		&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[]&amp;nbsp;encrypted&amp;nbsp;=&amp;nbsp;AESEncrypt(clearotp,&amp;nbsp;privateKey,&amp;nbsp;&lt;span style="color: maroon;"&gt;new&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;byte&lt;/span&gt;[16]);&lt;br /&gt;		&lt;span style="color: maroon;"&gt;return&lt;/span&gt;&amp;nbsp;ModHexEncode(encrypted);&lt;br /&gt;	}&lt;br /&gt;&lt;span style="color: blue;"&gt; #endregion&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;	&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;&lt;span style="color: maroon;"&gt;class&lt;/span&gt;&amp;nbsp;&lt;span style="color: #2b91af;"&gt;YubiKeyException&lt;/span&gt;&amp;nbsp;:&amp;nbsp;&lt;span style="color: #2b91af;"&gt;Exception&lt;/span&gt;&lt;br /&gt;	{&lt;br /&gt;		&lt;span style="color: maroon;"&gt;public&lt;/span&gt;&amp;nbsp;YubiKeyException(&lt;span style="color: maroon;"&gt;string&lt;/span&gt;&amp;nbsp;message)&amp;nbsp;:&amp;nbsp;&lt;span style="color: maroon;"&gt;base&lt;/span&gt;(message)&lt;br /&gt;		{&lt;br /&gt; &lt;br /&gt;		}&lt;br /&gt;	}
}&lt;/pre&gt;
&lt;p&gt;Once decrypted it is a simple matter to verify it is a key with a particular code (the simple act of decryption should do that but there's a UID included inside too) and that the Session counter and SessionUseCount have been incremented appropriately to prevent re-use of existing keys.&lt;/p&gt;
&lt;p&gt;Note that if you are trying to decode a key which has a prefix added you are interested in the last 32 characters of the output - the first few characters by default on a key are a static identifier so that it's possible to identify which encryption key to use to decrypt the token; I've turned this off and favour the user having to enter their own username/password prior to using the key.&lt;/p&gt;</description><link>http://www.nullify.net/Article/343</link><pubDate>Sat, 31 Jul 2010 16:58:27</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=343</guid></item><item><title>Sorry for the lack of posts!</title><description>&lt;p&gt;Just a quick note that posting will resume at some point as I'm going to start some more hobby projects, due to some issues with Zorg Solutions though I took a contract and I try to avoid posting about anything work related on my blog.&lt;/p&gt;
&lt;p&gt;I've not been doing much proper software development out of work, just helping the odd person with things and making sure I am up-to-speed with things like Windows Azure, Visual Studio 2010 and the new features of C++0x (I ended up doing quite a bit of C++ at my previous job at one point, and found I can do stuff in it with just a bit more time spent working out what library to use than C#, so it seems sensible to keep up to speed with it!).&lt;/p&gt;</description><link>http://www.nullify.net/Article/342</link><pubDate>Sat, 05 Jun 2010 11:27:44</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=342</guid></item><item><title>Luhn check digit algorithm</title><description>&lt;p&gt;Here's one from my distant past but which may be useful to me at some point today.  I can actually see plenty of quicker ways to achieve this but it's also well tested for generating/checking credit card check digits:-&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Creates/appends Luhn/Mod10 check digits to a specified numeric string&lt;/span&gt;
    &lt;span class="rem"&gt;/// Goes belly up with a text string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; LuhnCheck
    {
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Initialise the LuhnCheck class with a number&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;numberToAddDigitTo&amp;quot;&amp;gt;The number to do work on&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; LuhnCheck(&lt;span class="kwrd"&gt;string&lt;/span&gt; numberToAddDigitTo)
        {
            _numberToAddDigitTo = numberToAddDigitTo;
            setupok = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
        }
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Initialise the LuhnCheck class without a number to start with&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; LuhnCheck()
        {
            _numberToAddDigitTo = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;
        }

        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; _numberToAddDigitTo;
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// The number to work on&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; NumberToAddDigitTo
        {
            get
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; _numberToAddDigitTo;
            }
            set
            {
                _numberToAddDigitTo = &lt;span class="kwrd"&gt;value&lt;/span&gt;;
                setupok = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
            }
        }
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; setupok = &lt;span class="kwrd"&gt;false&lt;/span&gt;;

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Add the check digit to the string and return the whole string&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;The whole string with added check digit&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AddCheckDigit()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (setupok)
            {
                NumberToAddDigitTo += Convert.ToString(CreateCheckDigit());
                &lt;span class="kwrd"&gt;return&lt;/span&gt; NumberToAddDigitTo;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;&amp;quot;Please specify the number to add the digit to.&amp;quot;&lt;/span&gt;);
            }
        }
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Creates a check digit without using it&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;The check digit&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CreateCheckDigit()
        {
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (setupok)
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; CreateCheckDigit(NumberToAddDigitTo);
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentException(&lt;span class="str"&gt;&amp;quot;Please specify the number to calculate the digit for.&amp;quot;&lt;/span&gt;);
            }
        }
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Creates the check digit for a specified numeric string - it does not add it, only calculates it&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;numberToAddDigitTo&amp;quot;&amp;gt;The number to work the check digit out for&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;The check digit&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; CreateCheckDigit(&lt;span class="kwrd"&gt;string&lt;/span&gt; numberToAddDigitTo)
        {
            &lt;span class="kwrd"&gt;string&lt;/span&gt; validChars = &lt;span class="str"&gt;&amp;quot;0123456789&amp;quot;&lt;/span&gt;;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;char&lt;/span&gt; c &lt;span class="kwrd"&gt;in&lt;/span&gt; numberToAddDigitTo)
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!(validChars.IndexOf(c) &amp;gt;= 0))
                    &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; FormatException(&lt;span class="str"&gt;&amp;quot;The value passed in was not a valid number&amp;quot;&lt;/span&gt;);
            }

            &lt;span class="kwrd"&gt;string&lt;/span&gt; tocheckdigit = numberToAddDigitTo + &lt;span class="str"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;; &lt;span class="rem"&gt;//We add zero to use it to calculate&lt;/span&gt;
            &lt;span class="rem"&gt;//the number from the correct point - since we'll be alternating between multiplying it by one or two&lt;/span&gt;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; strlen = tocheckdigit.Length;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; ncheck = 0;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; nweight = 1; &lt;span class="rem"&gt;//this will alternate between one and two&lt;/span&gt;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; intermediary = 0;
            &lt;span class="kwrd"&gt;string&lt;/span&gt; tosplit = &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;;

            &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = 1; i &amp;lt;= strlen; i++) &lt;span class="rem"&gt;//loop through the card number string&lt;/span&gt;
            {
                intermediary = nweight * Convert.ToInt32(Convert.ToString(tocheckdigit[strlen - i])); &lt;span class="rem"&gt;//make intermediary&lt;/span&gt;
&lt;span class="rem"&gt;//be the multiple of the variance and the card number&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (intermediary &amp;gt; 9) &lt;span class="rem"&gt;//if it's bigger than ten...&lt;/span&gt;
                {
                    tosplit = Convert.ToString(intermediary);
                    &lt;span class="rem"&gt;//Split the two digits&lt;/span&gt;
                    &lt;span class="kwrd"&gt;int&lt;/span&gt; firstdigit = Convert.ToInt32(Convert.ToString(tosplit[0]));
                    &lt;span class="kwrd"&gt;int&lt;/span&gt; seconddigit = Convert.ToInt32(Convert.ToString(tosplit[1]));
                    &lt;span class="rem"&gt;//Then add them together&lt;/span&gt;
                    intermediary = firstdigit + seconddigit;
                }
                &lt;span class="rem"&gt;//Add the intermediary result to the rolling total&lt;/span&gt;
                ncheck += intermediary;
                &lt;span class="rem"&gt;//Change the variance as per the Luhn formula&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (nweight == 2)
                {
                    nweight = 1;
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    nweight = 2;
                }
            }
            &lt;span class="rem"&gt;//ncheck now has the total&lt;/span&gt;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; remainder = 0;
            &lt;span class="rem"&gt;//Work out the remainder&lt;/span&gt;
            Math.DivRem(ncheck, 10, &lt;span class="kwrd"&gt;out&lt;/span&gt; remainder);
            &lt;span class="rem"&gt;//return ten minus the remainder (if it's zero then it divides perfectly by ten so is valid,&lt;/span&gt;
            &lt;span class="rem"&gt;//but since we're CREATING a check digit we want to know how far off the result is and how much we&lt;/span&gt;
	    &lt;span class="rem"&gt;//need to correct it using the check digit)&lt;/span&gt;
            &lt;span class="kwrd"&gt;if&lt;/span&gt; (10 - remainder == 10)
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; 0;
            }
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
            {
                &lt;span class="kwrd"&gt;return&lt;/span&gt; 10 - remainder;
            }

        }
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Whether the number stored in the object is a valid MOD 10/Luhn check digited number&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsValid
        {
            get
            {
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (CreateCheckDigit() == 0)
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                }
            }
        }
    }&lt;/pre&gt;</description><link>http://www.nullify.net/Article/341</link><pubDate>Wed, 31 Mar 2010 10:41:03</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=341</guid></item><item><title>Command Line Arguments in .NET are Broken</title><description>&lt;p&gt;Attempting to pass paths with a space or any other command line argument that requires being enclosed in quotes was causing me some mild frustration, it looks like the .NET implementation that fills args is incorrectly mangling the data that is passed into it. &amp;nbsp;A major bug that shouldn't have gotten through QA exists somewhere...&lt;/p&gt;
&lt;p&gt;If you pass a path into a program that is foreach-ing over the args collection through the debug properties in visual studio (and presumably through anywhere else!) you go from:-&lt;/p&gt;
&lt;p&gt;&lt;span style="font-family: 'Courier New'; "&gt;program.exe /path &amp;quot;c:\my documents\&amp;quot; /dostuff 1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Turn into two rather than four arguments:-&lt;/p&gt;
&lt;p&gt;args[0] is &lt;span style="font-family: 'Courier New'; "&gt;/path&lt;/span&gt;&lt;br /&gt;
args[1] is&amp;nbsp;&lt;span style="font-family: 'Courier New'; "&gt;c:\my documents&amp;quot; /dostuff 1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Which is downright strange, as you'd expect to get:-&lt;/p&gt;
&lt;p&gt;args[0] is &lt;span style="font-family: 'Courier New'; "&gt;/path&lt;/span&gt;&lt;br /&gt;
args[1] is&amp;nbsp;&lt;span style="font-family: 'Courier New'; "&gt;c:\my documents\&lt;/span&gt;&lt;br /&gt;
args[2] is &lt;span style="font-family: 'Courier New'; "&gt;/dostuff&lt;/span&gt;&lt;br /&gt;
args[3] is &lt;span style="font-family: 'Courier New'; "&gt;1&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;What on earth are they doing to cause such a mess to command line arguments... Anyway, whilst I'm not sure when this started but thankfully the Environment.CommandLine is left intact and undamaged, so you can do something like this to fix the problem:-&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] FixedExtractCmdLineElements()
        {
            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; elements = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();

            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] firstParts = Environment.CommandLine.Split(&lt;span class="str"&gt;' '&lt;/span&gt;);

            &lt;span class="rem"&gt;//reparse it&lt;/span&gt;
            StringBuilder temporaryPart = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; inside = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; part &lt;span class="kwrd"&gt;in&lt;/span&gt; firstParts)
            {
                &lt;span class="rem"&gt;//are we inside a quoted part, or did we just find a quote?&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!inside &amp;amp;&amp;amp; !part.Contains(&lt;span class="str"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;))
                {
                    elements.Add(part);
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (inside)
                    {
                        &lt;span class="rem"&gt;//we are still inside a quote...&lt;/span&gt;
                        temporaryPart.Append(&lt;span class="str"&gt;&amp;quot; &amp;quot;&lt;/span&gt; + part);

                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (part.Contains(&lt;span class="str"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;))
                        {
                            &lt;span class="rem"&gt;//then we are also at the end!&lt;/span&gt;
                            elements.Add(temporaryPart.Replace(&lt;span class="str"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;).ToString()); &lt;span class="rem"&gt;//add the part minus its quotes to the array&lt;/span&gt;
                            &lt;span class="rem"&gt;//all done!&lt;/span&gt;
                            inside = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                        }
                    }
                    &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    {
                        &lt;span class="rem"&gt;//else we just found a quote!&lt;/span&gt;
                        inside = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                        temporaryPart = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(part);
                    }
                }
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; elements.ToArray();
        }&lt;/pre&gt;</description><link>http://www.nullify.net/Article/340</link><pubDate>Wed, 24 Mar 2010 13:34:52</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=340</guid></item><item><title>Quick AES encryption methods in .NET</title><description>&lt;p&gt;This is mostly so I don't have to ever type this in again, but it's most useful when you're also using an RSACryptoProvider to encrypt and send the key to the other end where you're decrypting whatever you are sending, but I thought these might be of use to someone... &amp;nbsp;There's really nothing complicated to these at all.&lt;/p&gt;
&lt;p&gt;Note that the iv (initialisation vector) should be some random data that you pass with the encrypted data, but it does not &lt;em&gt;need &lt;/em&gt;to be protected. &amp;nbsp;It's used to prevent two duplicate bits of input data outputting the exact same (and therefore being obvious), and to prevent someone making you encrypt something special in a way that you can have your private key exposed.&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AESEncrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt; input, &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] key, &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] iv)
{
    Aes enc = Aes.Create();
    enc.Key = key;
    enc.IV = iv;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (ICryptoTransform transform = enc.CreateEncryptor())
    {
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] data = Encoding.Unicode.GetBytes(input);
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] output = transform.TransformFinalBlock(data, 0, data.Length);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; Convert.ToBase64String(output);
    }
}

&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; AESDecrypt(&lt;span class="kwrd"&gt;string&lt;/span&gt; input, &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] key, &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] iv)
{
    Aes aesImplementation = Aes.Create();
    aesImplementation.Key = key;
    aesImplementation.IV = iv;

    &lt;span class="kwrd"&gt;using&lt;/span&gt; (ICryptoTransform transform = aesImplementation.CreateDecryptor())
    {
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] data = Convert.FromBase64String(input);
        &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] output = transform.TransformFinalBlock(data, 0, data.Length);

        &lt;span class="kwrd"&gt;return&lt;/span&gt; Encoding.Unicode.GetString(output);
    }
}&lt;/pre&gt;</description><link>http://www.nullify.net/Article/339</link><pubDate>Fri, 19 Mar 2010 15:05:33</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=339</guid></item><item><title>WCF serialisation and deserialisation without sending the object over WCF...</title><description>&lt;p&gt;I needed to send some data over another medium to WCF and wanted to retain my current objects and classes, but also to retain the serialisation format for ease of direct input at the other end of this communications 'tube'. &amp;nbsp;I was actually sending these messages over XMPP after encrypting them, which is what the next post will be about... &amp;nbsp;It's worth noting that serialization using WCF is marginally faster than the more capable XmlSerializer but at the same time this has its own quirks and tends to produce more verbose XML.&lt;/p&gt;
&lt;p&gt;So here's methods to serialise and deserialise DataContract marked up objects to XML&amp;nbsp;strings:-&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ContractObjectToXml&amp;lt;T&amp;gt;(T obj)
        {
            DataContractSerializer dataContractSerializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(obj.GetType());

            String text;
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream())
            {
                dataContractSerializer.WriteObject(memoryStream, obj);
                text = Encoding.UTF8.GetString(memoryStream.ToArray());
            }
            &lt;span class="kwrd"&gt;return&lt;/span&gt; text;
        }

        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; T XmlToContractObject&amp;lt;T&amp;gt;(&lt;span class="kwrd"&gt;string&lt;/span&gt; data)
        {
            DataContractSerializer dataContractSerializer = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataContractSerializer(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T));

            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] binary = Encoding.UTF8.GetBytes(data);
            &lt;span class="kwrd"&gt;using&lt;/span&gt; (MemoryStream memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream(binary))
            {
                &lt;span class="kwrd"&gt;object&lt;/span&gt; o = dataContractSerializer.ReadObject(memoryStream);
                &lt;span class="kwrd"&gt;return&lt;/span&gt; (T)o;
            }
        }&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;&amp;nbsp;&lt;/pre&gt;
&lt;pre class="csharpcode"&gt;(Google thinks I&amp;nbsp;should spell Serialise incorrectly as Serialize so I'm very conflicted about which I&amp;nbsp;should use in this article as anyone searching would probably look for the American spelling...!)&lt;/pre&gt;</description><link>http://www.nullify.net/Article/338</link><pubDate>Fri, 19 Mar 2010 15:03:37</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=338</guid></item><item><title>SQL Compact Edition with multiple threads</title><description>&lt;p&gt;I was experiencing problems with SQL compact edition (complete .NET framework freezes) and found that not only is it not thread safe (fairly obvious) but it's doesn't like to even have multiple instances of itself on the same thread - it deadlocks a lot if it does. &amp;nbsp;I also found that if it runs out of instances then it unloads from memory and has to be reloaded again afterwards, so avoiding that can result in a many tens of thousands of percent performance improvement.&lt;/p&gt;
&lt;p&gt;So here's a small class I wrote to track the connection per thread based on someone elses on the Internet (they were just creating one per thread, in this one it is creating one per thread and maintaining the lifespan of that connection to close it when the thread it was for has been closed). &amp;nbsp;I'll probably add per-connection-string pooling but figured that the important thing is the concept of the solution to the COM deadlocks and total freezing of the framework in this.&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span class="rem"&gt;/// Manages open connections on a per-thread basis&lt;/span&gt;
&lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;abstract&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; SqlCeConnectionPool
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, IDbConnection&amp;gt; threadConnectionMap = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, IDbConnection&amp;gt;();

    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, Thread&amp;gt; threadMap = &lt;span class="kwrd"&gt;new&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, Thread&amp;gt;();

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// The connection map&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; Dictionary&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;, IDbConnection&amp;gt; ThreadConnectionMap
    {
        get { &lt;span class="kwrd"&gt;return&lt;/span&gt; SqlCeConnectionPool.threadConnectionMap; }
    }

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Gets the connection string.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;value&amp;gt;The connection string.&amp;lt;/value&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; ConnectionString
    {
        get;
        set;
    }

    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Gets a connection for this thread, maintains one open one of each.&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;remarks&amp;gt;Don't do this with anything but SQL compact edition or you'll run out of connections - compact edition is not&lt;/span&gt;
    &lt;span class="rem"&gt;/// connection pooling friendly and unloads itself too often otherwise so that is why this class exists&amp;lt;/remarks&amp;gt; &lt;/span&gt;
    &lt;span class="rem"&gt;   &amp;nbsp;/// &amp;lt;returns&amp;gt;An open connection&amp;lt;/returns&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; IDbConnection Connection
    {
        get
        {
            &lt;span class="kwrd"&gt;lock&lt;/span&gt; (threadConnectionMap)
            {
                &lt;span class="rem"&gt;//do some quick maintenance on existing connections (closing those that have no thread)&lt;/span&gt;
                List&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt; removeItems = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;int&lt;/span&gt;&amp;gt;();
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (var kvp &lt;span class="kwrd"&gt;in&lt;/span&gt; threadConnectionMap)
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (threadMap.ContainsKey(kvp.Key))
                    {
                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (!threadMap[kvp.Key].IsAlive)
                        {
                            &lt;span class="rem"&gt;//close the connection&lt;/span&gt;
                            kvp.Value.Close();
                            removeItems.Add(kvp.Key);
                        }
                    }
                    &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    {
                        kvp.Value.Close();
                        removeItems.Add(kvp.Key);
                    }
                }
                &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i &lt;span class="kwrd"&gt;in&lt;/span&gt; removeItems)
                {
                    threadMap.Remove(i);
                    threadConnectionMap.Remove(i);
                }

                &lt;span class="rem"&gt;//now issue the appropriate connection for our current thread&lt;/span&gt;
                &lt;span class="kwrd"&gt;int&lt;/span&gt; threadId = Thread.CurrentThread.ManagedThreadId;

                IDbConnection connection = &lt;span class="kwrd"&gt;null&lt;/span&gt;;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (threadConnectionMap.ContainsKey(threadId))
                {
                    connection = threadConnectionMap[threadId];
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    connection = &lt;span class="kwrd"&gt;new&lt;/span&gt; SqlCeConnection(ConnectionString);
                    connection.Open();
                    threadConnectionMap.Add(threadId, connection);
                    threadMap.Add(threadId, Thread.CurrentThread);
                }

                &lt;span class="kwrd"&gt;return&lt;/span&gt; connection;
            }
        }
    }
}&lt;/pre&gt;</description><link>http://www.nullify.net/Article/336</link><pubDate>Wed, 03 Mar 2010 09:26:03</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=336</guid></item><item><title>Zorganiser almost ready for beta test...</title><description>&lt;p&gt;My integration/automation system 'Zorganiser' is almost ready for a closed beta test (albeit with a limited set of features but enough to be useful!). &amp;nbsp;It'll let you control automated tasks on any number of computers, so you can do things like tell 50 webservers to install a particular application, run a particular Windows Workflow or to just shift data around between your installed agents - for example to take data from one business application and deliver it to another in a slightly tweaked format regardless of where the two applications are. &amp;nbsp;You can also configure one event to trigger another - so the workflow could poll something and then trigger an event across all your workstations or servers.&lt;/p&gt;
&lt;p&gt;I already have a few people who are interested in testing it, but if you're also interested please e-mail me at (redacted)!&lt;/p&gt;</description><link>http://www.nullify.net/Article/335</link><pubDate>Tue, 02 Mar 2010 17:04:35</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=335</guid></item><item><title>Dedicated server hosting - almost a year with 1and1...</title><description>&lt;p&gt;Due to a variety of my circumstances changing and the way the exchange rate was fluctuating I changed from having all-US servers to using &lt;a href="http://order.1and1.co.uk/xml/order/Server?affiliate_id=189976"&gt;rented dedicated servers from 1and1 internet&lt;/a&gt; - billed in UK pounds. Right now it's particularly appropriate with both the Euro and the Pound hugely devalued against the US dollar.&lt;/p&gt;
&lt;p&gt;I didn't expect much - the plan I picked was&amp;nbsp;half literally half the price I was paying before but I got a higher specification server, unlimited bandwidth with no concern about overages anymore or anything of the sort and a significant improvement on the latency to my Texas based servers (which is understandable given the speed of light, but the network is also less congested and I can regularly get 85Mbps and less than 20ms to the UK when testing it).&lt;/p&gt;
&lt;p&gt;So I've been with them almost a year now and the availability has far exceeded that of my previous datacenter - I've had about 2 minutes downtime the entire time, so I thought I would mention it as it's relevant to a project I'm working on at the moment...&lt;/p&gt;
&lt;p&gt;Fortunately that does mean I've not managed to see if their support is any good, but the service certainly is.&lt;/p&gt;
&lt;p&gt;Be warned that their network setup is not really conducive to VMWare or virtualisation in general - they use 1 ip sized subnets and gateways that you can always access even though they aren't in your subnet through some TCP/IP stack tweaks (I think it's &amp;quot;All subnets are local&amp;quot; combined with the switches having some custom configuration, but I've not yet figured it out and it's the first time I've seen something similar done). &amp;nbsp;Their network does have a nice Cisco switch based firewall for every custom because of the strange setup though, and it lets you have public IP's from different subnets so it's got its advantages (no renumbering!).&lt;/p&gt;</description><link>http://www.nullify.net/Article/334</link><pubDate>Tue, 02 Mar 2010 16:58:54</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=334</guid></item><item><title>File dialog filter string format</title><description>&lt;p&gt;Just a very quick reminder to myself that the file dialogs filter string (OpenFileDialog.Filter and SaveFileDialog.Filter) format it is &amp;quot;Description|*.ext;AnotherDescription|*.txt&amp;quot; etc.&lt;/p&gt;
&lt;p&gt;I always seem to get this around the wrong way for some reason.&lt;/p&gt;</description><link>http://www.nullify.net/Article/333</link><pubDate>Fri, 19 Feb 2010 13:00:09</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=333</guid></item><item><title>MethodAccessException: System.Runtime.CompilerServices.StrongBox`1..ctor(System.__Canon)</title><description>&lt;p&gt;I'm trying to use a Linq datacontext from a partial trust environment (well, after Assert'ing my way back up) and I'm getting the spectacularly verbose error:-&lt;/p&gt;
&lt;p&gt;System.Runtime.CompilerServices.StrongBox`1..ctor(System.__Canon)&lt;/p&gt;
&lt;p&gt;Which looks like it's lacking an actual human-readable error but at least it's distinct!&lt;/p&gt;
&lt;p&gt;In my case rather than asserting the individually needed parts I had to assert full-trust from my intermediary class (the one that is signed by a strongname to allow it to always be full-trust in my custom AppDomain - see &lt;a href="http://www.nullify.net/Article/315.aspx"&gt;my article on creating a restricted AppDomain&lt;/a&gt;&amp;nbsp;- see one of the comments in the code example) between the untrusted plugins (things inside the appdomain with the restrictions applied can call into this and anything the intermediary class does is unrestricted but even things it calls get the inherited permissions from the caller) and the Linq data context user:-&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;			&lt;/span&gt;PermissionSet set = new PermissionSet(PermissionState.Unrestricted); //fulltrust especially for Linq :(&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;			&lt;/span&gt;//removed my carefully crafted assert set for Linq/SQLCE in exchange for the above being unrestricted:-&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;//set.AddPermission(new FileIOPermission(PermissionState.Unrestricted));&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;//set.AddPermission(new AspNetHostingPermission(AspNetHostingPermissionLevel.Unrestricted));&lt;br /&gt;
&lt;span class="Apple-tab-span" style="white-space:pre"&gt;			&lt;/span&gt;set.Assert();&lt;/p&gt;
&lt;p&gt;&lt;span class="Apple-tab-span" style="white-space: pre; "&gt;			&lt;/span&gt;//Make the call to whatever uses the linq datacontext&lt;/p&gt;
&lt;div&gt;Which was a little annoying, but worth knowing. &amp;nbsp;(The assertion will revert when the stack pops from the method this is in, however do be aware not to allow anything under this method to allow the plugin to execute a delegate or something).&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;
&lt;div&gt;I did find a possible workaround of moving a member variable I was accessing into a local variable in the Linq query, but this didn't work in my case where asserting this did.&lt;/div&gt;
&lt;div&gt;&amp;nbsp;&lt;/div&gt;</description><link>http://www.nullify.net/Article/332</link><pubDate>Thu, 18 Feb 2010 10:00:50</pubDate><category>Blog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=332</guid></item><item><title>CSV to Datatable parser</title><description>&lt;p&gt;I'm sure there's an easier way to do this, but I've been maintaining my own class to do the job for a while now and keep needing to find it in my code library every time I use it - I figure it might be useful to others:-&amp;nbsp;&lt;/p&gt;
&lt;!-- code formatted by http://manoli.net/csharpformat/ --&gt;
&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;
&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Data;

&lt;span class="kwrd"&gt;namespace&lt;/span&gt; CSVParser
{
    &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
    &lt;span class="rem"&gt;/// Simon's stock CSV parser class&lt;/span&gt;
    &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CSVParser
    {
        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Takes the CSV files contents and creates a data table from it&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;csvFileContents&amp;quot;&amp;gt;The entire contents of a CSV file split by line (rather than the filename)&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;validateLayout&amp;quot;&amp;gt;Validate the file to check conformance of the layout with expected standards&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;topRowIsHeader&amp;quot;&amp;gt;The top row is the header row, take it as the column names rather than data&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;returns&amp;gt;A datatable&amp;lt;/returns&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; DataTable DataTableFromCSV(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] csvFileContents, &lt;span class="kwrd"&gt;bool&lt;/span&gt; validateLayout, &lt;span class="kwrd"&gt;bool&lt;/span&gt; topRowIsHeader)
        {
            DataTable outputDataTable = &lt;span class="kwrd"&gt;new&lt;/span&gt; DataTable();
            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;[]&amp;gt; csvFileRows = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;[]&amp;gt;();
            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; columns = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();

            &lt;span class="preproc"&gt;#region&lt;/span&gt; Pre-parse the file
            &lt;span class="kwrd"&gt;int&lt;/span&gt; columnCount = 0;

            &lt;span class="kwrd"&gt;bool&lt;/span&gt; gotHeaders = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            &lt;span class="kwrd"&gt;int&lt;/span&gt; rowNumber = 0;

            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; line &lt;span class="kwrd"&gt;in&lt;/span&gt; csvFileContents)
            {
                &lt;span class="kwrd"&gt;string&lt;/span&gt;[] parts = ExtractCSVElements(line);

                &lt;span class="rem"&gt;//initial set of header names but only if the top row is header option is set&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!gotHeaders &amp;amp;&amp;amp; topRowIsHeader)
                {
                    columns.AddRange(parts);
                    columnCount = parts.Length;
                    gotHeaders = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (parts.Length &amp;gt; 0)
                    {
                        csvFileRows.Add(parts);
                    }
                }

                &lt;span class="kwrd"&gt;if&lt;/span&gt; (parts.Length &amp;gt; columnCount)
                {
                    &lt;span class="rem"&gt;//if set to validate the layout and that the first row contains the headers then we know any extra columns are wrong&lt;/span&gt;
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (validateLayout &amp;amp;&amp;amp; gotHeaders)
                    {
                        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;&amp;quot;Row has extra data columns: &amp;quot;&lt;/span&gt; + rowNumber.ToString());
                    }

                    &lt;span class="rem"&gt;//new column detected mid-data-set!&lt;/span&gt;
                    &lt;span class="kwrd"&gt;for&lt;/span&gt; (&lt;span class="kwrd"&gt;int&lt;/span&gt; i = columnCount; i &amp;lt; parts.Length; i++)
                    {
                        columns.Add(&lt;span class="str"&gt;&amp;quot;Column &amp;quot;&lt;/span&gt; + i.ToString());
                    }

                    columnCount = parts.Length;
                }

                &lt;span class="rem"&gt;//we always ignore zero length rows as the last line can be empty&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (parts.Length &amp;lt; columnCount &amp;amp;&amp;amp; parts.Length != 0)
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (validateLayout)
                    {
                        &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Exception(&lt;span class="str"&gt;&amp;quot;Row has missing data columns: &amp;quot;&lt;/span&gt; + rowNumber.ToString());
                    }
                }


                rowNumber++;
            }

            &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

            &lt;span class="preproc"&gt;#region&lt;/span&gt; Build the data tables layout and data

            &lt;span class="rem"&gt;//columns&lt;/span&gt;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; column &lt;span class="kwrd"&gt;in&lt;/span&gt; columns)
            {
                outputDataTable.Columns.Add(column);
            }

            &lt;span class="rem"&gt;//rows&lt;/span&gt;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt;[] row &lt;span class="kwrd"&gt;in&lt;/span&gt; csvFileRows)
            {
                outputDataTable.Rows.Add(row);
            }
            &lt;span class="preproc"&gt;#endregion&lt;/span&gt;

            &lt;span class="kwrd"&gt;return&lt;/span&gt; outputDataTable;
        }

        &lt;span class="rem"&gt;/// &amp;lt;summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// Extract the elements of a line from a CSV file with support for quotes&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;/summary&amp;gt;&lt;/span&gt;
        &lt;span class="rem"&gt;/// &amp;lt;param name=&amp;quot;line&amp;quot;&amp;gt;The data to parse&amp;lt;/param&amp;gt;&lt;/span&gt;
        &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;[] ExtractCSVElements(&lt;span class="kwrd"&gt;string&lt;/span&gt; line)
        {
            List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; elements = &lt;span class="kwrd"&gt;new&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt;();

            &lt;span class="rem"&gt;//do the initial split, based on commas&lt;/span&gt;
            &lt;span class="kwrd"&gt;string&lt;/span&gt;[] firstParts = line.Split(&lt;span class="str"&gt;','&lt;/span&gt;);

            &lt;span class="rem"&gt;//reparse it&lt;/span&gt;
            StringBuilder temporaryPart = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(&lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;);
            &lt;span class="kwrd"&gt;bool&lt;/span&gt; inside = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
            &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (&lt;span class="kwrd"&gt;string&lt;/span&gt; part &lt;span class="kwrd"&gt;in&lt;/span&gt; firstParts)
            {
                &lt;span class="rem"&gt;//are we inside a quoted part, or did we just find a quote?&lt;/span&gt;
                &lt;span class="kwrd"&gt;if&lt;/span&gt; (!inside //we're not inside
                &amp;amp;&amp;amp; (!part.Contains(&amp;quot;\&amp;quot;&amp;quot;) //and we don't contain a quote
                 || ( //or we're handling a single quote enclosed element
                        part.StartsWith(&amp;quot;\&amp;quot;&amp;quot;) //we start with a quote
                        &amp;amp;&amp;amp; part.EndsWith(&amp;quot;\&amp;quot;&amp;quot;) //and we end with a quote)
                    )
                )
                {
                    elements.Add(part);
                }
                &lt;span class="kwrd"&gt;else&lt;/span&gt;
                {
                    &lt;span class="kwrd"&gt;if&lt;/span&gt; (inside)
                    {
                        &lt;span class="rem"&gt;//we are still inside a quote...&lt;/span&gt;
                        temporaryPart.Append(&lt;span class="str"&gt;&amp;quot;,&amp;quot;&lt;/span&gt; + part);

                        &lt;span class="kwrd"&gt;if&lt;/span&gt; (part.Contains(&lt;span class="str"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;))
                        {
                            &lt;span class="rem"&gt;//then we are also at the end!&lt;/span&gt;
                            elements.Add(temporaryPart.Replace(&lt;span class="str"&gt;&amp;quot;\&amp;quot;&amp;quot;&lt;/span&gt;, &lt;span class="str"&gt;&amp;quot;&amp;quot;&lt;/span&gt;).ToString()); &lt;span class="rem"&gt;//add the part minus its quotes to the array&lt;/span&gt;
                            &lt;span class="rem"&gt;//all done!&lt;/span&gt;
                            inside = &lt;span class="kwrd"&gt;false&lt;/span&gt;;
                        }
                    }
                    &lt;span class="kwrd"&gt;else&lt;/span&gt;
                    {
                        &lt;span class="rem"&gt;//else we just found a quote!&lt;/span&gt;
                        inside = &lt;span class="kwrd"&gt;true&lt;/span&gt;;
                        temporaryPart = &lt;span class="kwrd"&gt;new&lt;/span&gt; StringBuilder(part);
                    }
                }
            }

            &lt;span class="kwrd"&gt;return&lt;/span&gt; elements.ToArray();
        }
    }
}
&lt;/pre&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;</description><link>http://www.nullify.net/Article/331</link><pubDate>Tue, 09 Feb 2010 10:41:44</pubDate><category>CodeBlog</category><guid>http://www.nullify.net/ViewArticle.aspx?article=331</guid></item><item><title>Come work for me in Basingstoke!</title><description>&lt;p&gt;&lt;strong&gt;Edit: &lt;/strong&gt;Due to some investment problems I can no longer employ anyone, sorry :(&lt;/p&gt;
&lt;p&gt;My new company - &lt;a href="http://www.zorg.co.uk/"&gt;Zorg Solutions&lt;/a&gt; Ltd is now looking for at least one software developer to fill out a team, preferably you'll be an enthusiastic multi-skilled person but we're flexible and will distribute work based on what you can do.&lt;/p&gt;
&lt;p&gt;Do you have a background as a C# software developer that has done either Winforms or ASP.NET in the past? &amp;nbsp;You will need to have at least a couple of years of experience developing with the .NET framework but I will be willing to take hobby or open source work as experience if it's provable that you did it. &amp;nbsp;This could be a great opportunity to jump into the software development world for someone - there's no requirement for a degree or other certification. &amp;nbsp;Any experience of Windows Azure, Silverlight or WPF would be an advantage.&lt;/p&gt;
&lt;p&gt;Or do you have any experience (hobby or professionally) in electronics, firmware, C/C++? &amp;nbsp;We have contracts for some hardware development and the opportunity to work with and program the hardware we'll build - probably Atmel microprocessors or PIC microcontrollers, but even some Linux on ARM9 based chips.&lt;/p&gt;
&lt;p&gt;If you answered yes to either of these questions and would be willing to commute to Basingstoke then I am interested in hearing from you! &amp;nbsp;Any experience of the following would make you stand out but is not essential:-&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;SQL experience (preferably SQL server's T-SQL dialect)&lt;/li&gt;
    &lt;li&gt;Windows Workflow Foundation&lt;/li&gt;
    &lt;li&gt;Biztalk&lt;/li&gt;
    &lt;li&gt;Silverlight&lt;/li&gt;
    &lt;li&gt;Mono&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Salary will be negotiable (but as an idea we would be willing to pay either side of &amp;pound;35k) and based on experience. &amp;nbsp;Working hours and benefits will be fully negotiable - we can be very flexible and understand if you have personal commitments. &amp;nbsp;Training and an MSDN subscription will also be provided!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;If you apply (just send me your CV) or contact me now to discuss in more detail then you will be ahead of the conventional advertisements for these roles - we'll be putting them out conditional on responses to this posting and a few other enquiries - so you have nothing to lose! &amp;nbsp;&lt;/strong&gt;No recruiters yet please!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Edit:&lt;/strong&gt; Due to some investment problems I can no longer employ anyone, sorry :(&lt;/p&gt;</description><link>http://www.nullify.net/Article/330</link><pubDate>Fri, 29 Jan 2010 11:05:18</pubDate><category>Work</category><guid>http://www.nullify.net/ViewArticle.aspx?article=330</guid></item></channel></rss>