<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>kuemerle.com</title>
	<atom:link href="https://www.kuemerle.com/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.kuemerle.com</link>
	<description>Welcome to kuemerle.com, the home site of Joe Kuemerle.</description>
	<lastBuildDate>Fri, 08 Sep 2017 19:09:32 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.4.3</generator>
	<item>
		<title>Bring Your &#8216;A&#8217; Game To TechBash</title>
		<link>https://www.kuemerle.com/bring-your-a-game-to-techbash/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Fri, 08 Sep 2017 19:09:32 +0000</pubDate>
				<category><![CDATA[Conferences]]></category>
		<guid isPermaLink="false">https://www.kuemerle.com/?p=206</guid>

					<description><![CDATA[The second year of TechBash, a multi day technical conference at the Kalahari Resort in the Pennsyvannia Poconos, is coming October 4-6, 2017. This is an awesome conference (not in&#8230; ]]></description>
										<content:encoded><![CDATA[<p>The second year of <a href="https://techbash.com/" target="_blank">TechBash</a>, a multi day technical conference at the Kalahari Resort in the Pennsyvannia Poconos, is coming October 4-6, 2017. This is an awesome conference (not in the least because I am volunteering at it) but I think it can be even more awesome.</p>
<p>At this point in time there is no formal event scheduled for the evening of Thursday October 5, so I am coordinating a community run gaming event that night. All you need to do is be willing to play and show up that evening (details will be determined as I figure them out).</p>
<p>I will be bringing some of my games and I would love for TechBash attendees to bring some of their games to share and play as well. </p>
<p>In the past I have run a Magic: The Gathering BYOB draft (Bring Your Own Boosters) and had a lot of fun with it. If I can get at least 8 people together who are interested I will run this at TechBash. All you need to do is to bring three sealed Magic: The Gathering booster packs, and we will draft from what everyone brings. I will supply the basic land and coordinate the draft. Hit me up on <a href="https://twitter.com/jkuemerle" target="_blank">Twitter</a> or email me ( joe at kuemerle dot com ) if you are planning to join me so I can keep track of everything.</p>
<p>Thanks, and see you at TechBash!</p>
<p><a href="https://techbash.com/"><img decoding="async" alt="Register for Techbash 2017 developer conference at techbash.com" src="https://raw.githubusercontent.com/TechBash/Marketing/master/2017/Banners/banner-468x60.png"></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ready, Set, Decorate!</title>
		<link>https://www.kuemerle.com/ready-set-decorate/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Mon, 15 Dec 2014 14:35:12 +0000</pubDate>
				<category><![CDATA[Uncategorized]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=185</guid>

					<description><![CDATA[I am happy to announce that once again I am running the annual CodeMash Door Decorating Competition. You only have a few weeks left to come up with a great,&#8230; ]]></description>
										<content:encoded><![CDATA[<p>I am happy to announce that once again I am running the annual CodeMash<br />
Door Decorating Competition. You only have a few weeks left to come up<br />
with a great, award winning design that will blow the socks off the<br />
CodeMash attendees!</p>
<p>Starting on Wednesday and running through Friday at lunch I will be<br />
roaming the halls of the hotels taking pictures of decorated doors. This<br />
competition is not just to show off your skills but to continue to let<br />
those cheerleaders know that they are not the only ones who have serious<br />
conference spirit!</p>
<p>To get yourself in the mood (and to see what has been done at previous<img fetchpriority="high" decoding="async" class="alignleft" src="https://farm8.staticflickr.com/7296/11858861093_b5da68cbc5.jpg" alt="" width="281" height="500" /><br />
events), check out http://doorcomp.com and get ready to decorate. Keep<br />
that address bookmarked as you will need to know it during the<br />
conference as your vote counts. Vote for the doors you love the best.</p>
<p>My personal thanks to the incomparable <a href="https://twitter.com/EmSchw" target="_blank">Emily Schweiss</a> for donating another fabulous prize for<br />
this year.</p>
<p>And now for the amateur legalistic mumbo jumbo: note that this<br />
competition is something that I am doing personally, it is not<br />
affiliated with CodeMash, any vendors/sponsors, other speakers, the<br />
Kalahari resort or anyone else on the planet. Please remember that the<br />
doors are Kalahari property and you should not do any damage to them<br />
unless you feel like paying for a new door.</p>
<p>Thanks and I look forward to seeing what you come up with!</p>
<p><a href="https://flic.kr/p/dKmJR3"><img decoding="async" src="https://farm9.staticflickr.com/8499/8366936916_834b1a9877_z.jpg" alt="SAM_1141" width="360" height="640" /></a></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Security, Analytics and Glitter</title>
		<link>https://www.kuemerle.com/security-analytics-and-glitter/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Wed, 05 Feb 2014 04:27:36 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<category><![CDATA[Presentations]]></category>
		<category><![CDATA[Speaking]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=179</guid>

					<description><![CDATA[February is upon us and with that it means that we are only a few weeks out from one of my favorite conferences, CodepaLOUsa. If you haven’t been lucky enough&#8230; ]]></description>
										<content:encoded><![CDATA[<p>February is upon us and with that it means that we are only a few weeks out from one of my favorite conferences, <a href="http://codepalousa.com/" target="_blank">CodepaLOUsa</a>. If you haven’t been lucky enough to attend CodepaLOUsa in the past you really should check it out. It is a multi day, multi track multi disciplinary conference held in Louisville, KY and the event is always outstanding.</p>
<p>This year I am pleased to be able to give one of my favorite talks, <a href="http://www.kuemerle.com/talks/app-sec/" target="_blank">Application Security: What you don’t know can hurt you</a>. In this talk I will be going over the top vulnerabilities that can exist in your applications and in addition to showing how they can be exploited I will also cover how to defend against them.</p>
<p>I am also giving another fun talk about how to optimize agile development practices by building analytics into your applications and using the results to augment customer collaboration in the <a href="http://www.kuemerle.com/talks/agile-analytics/" target="_blank">Close The Feedback Loop. Using Application Analytics To Improve Agile Development</a> talk.</p>
<p>Finally I am going to bring something new and fun to CodepaLOUsa, a door decorating competition. I have run this at CodeMash for the past two years and now it is time to expand! Everyone is free to enter the competition, even if you are not attending the conference. During the course of the conference I am going to be walking the hallways of the conference hotel taking pictures of decorated doors and posting them to the competition voting site at <a title="https://doorcomp.azurewebsites.net/Doors/codepalousa2014" href="https://doorcomp.azurewebsites.net/Doors/codepalousa2014">https://doorcomp.azurewebsites.net/Doors/codepalousa2014</a>. This is something I am running on my own and is not an official part of the conference, please also take care to not damage your hotel room door. I will be giving at least one prize away for the door that gets the most votes, stay tuned to this blog or my <a href="https://twitter.com/jkuemerle" target="_blank">Twitter</a> account where I will post where and when I will announce the winner. </p>
<p>You can check out what previous competitors have done in years past at <a href="https://doorcomp.azurewebsites.net/Doors/codemash2014" target="_blank">CodeMash 2014</a> and <a href="https://doorcomp.azurewebsites.net/Doors/codemash2013" target="_blank">CodeMash 2013</a>.</p>
<p>I am really looking forward to CodepaLOUsa, feel free to say hi if you see me there, I’ll be the one in the kilt. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Unofficial CodeMash 2014 Activities</title>
		<link>https://www.kuemerle.com/unofficial-codemash-2014-activities/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Mon, 23 Dec 2013 18:15:25 +0000</pubDate>
				<category><![CDATA[CodeMash]]></category>
		<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=177</guid>

					<description><![CDATA[With December rapidly coming to an end I thought I would take the opportunity to bring up that beloved Winter event, CodeMash. Yes, CodeMash is just around the corner and&#8230; ]]></description>
										<content:encoded><![CDATA[<p>With December rapidly coming to an end I thought I would take the opportunity to bring up that beloved Winter event, CodeMash. Yes, CodeMash is just around the corner and in addition to all of the great sessions that will be there, the open spaces, the attendee waterpark party, the after hours sessions, the game room, the jam session and a bunch of other stuff I&#8217;ve missed in this list there are an additional two *unofficial* activities that I would like to mention, mostly because I am the coordinator for them.</p>
<p>The first one is the door decorating competition. For all the years I have attended CodeMash I have been jealous of the cheerleader conference that comes in to the Kalahari the weekend after CodeMash. I&#8217;ve walked the hallways of the hotel and seen door after door decorated with ribbons, glitter, boy band pictures and other sparkly stuff. Last year I decided enough was enough and figured that the technical community can do as good or better than these kids. So I started the first unofficial CodeMash door decorating competition, in which I encouraged the attendees at all the conference hotels to decorate their hotel room doors. To my great joy a number of people stepped up and really put some serious effort into decorating their doors. I am amazed at the creativity and quality of the entries last year, and with the help of a few gracious members of the technical community I was even able to award small prizes to the winners. </p>
<p>This year I am asking for more. I want more people to decorate their hotel room doors. Just like last year I will be prowling the hallways of all the conference hotels, with my camera at the ready, to document your creativity. Just for reference, I am considering any hotel at which the CodeMash shuttle stops as a conference hotel so even if you are not at the Kalahari I expect you to participate. In fact, just like last year, I am going to open the competition up to non-CodeMash attendees. If you are not able to make it to CodeMash but still want to participate you can decorate your office door, cubicle wall or the front door of your house, send me a picture of it and I will enter you in the competition.</p>
<p>I am hard at work on an improved voting application that should be ready in time for CodeMash. Watch this blog, the CodeMash Google Group and the <a href="https://twitter.com/search?q=codemash&#038;src=typd" target="_blank">#CodeMash</a> Twitter stream for the details when I launch it.</p>
<p>In addition, just like last year, there are a lot of overlapping sessions that I want to see and I know that I won&#8217;t be able to make it to. I am once again going to be doing my best to collect all of the presentation materials (slide decks, code samples, speaker blog entries, etc.) in one place so that everyone has a way to find these resources after the conference ends. To accomplish this I am maintaining a <a href="https://github.com/TechConf/CodeMash2014" target="_blank">GitHub repository</a> where I will do my best to accumulate all of the CodeMash session materials. If you are a speaker, attendee at a session or just a generally nice person I would really appreciate your help. The repository is public and I would love it if you could send me a pull request with the details of the session materials. I am planning on structuring it like the repository from <a href="https://github.com/jkuemerle/CodeMash2013" target="_blank">last year</a> so please feel free to contribute.</p>
<p>As I noted before neither of these are official CodeMash events, I am not affiliated with the conference, any sponsors or anything else. I just think that these are cool ideas. </p>
<p>Thanks to everyone, and I look forward to seeing you at CodeMash, I will once again be the guy in the kilt. Well, if <a href="https://twitter.com/garyshort" target="_blank">Gary Short</a> shows up then I will be one of the guys in a kilt.</p>
<p>Finally, I will also be at the <a href="http://codepalousa.com/" target="_blank">CodepaLOUsa</a> conference in February (which is yet another awesome conference, you really should go) and I will also be running another door decorating competition there as well as gathering up all of the presentation materials that I can find into another GitHub repository. If you are going to be there then please do plan on decorating your hotel room door and if you&#8217;re not yet signed up for the conference I am happy to <a href="https://www.eiseverywhere.com/cpl14?discountcode=Kuemerle" target="_blank">get you a discount</a> on registration.</p>
<p>I hope to see you around!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Transparent Encryption of Properties in .NET, Part 1a: The Bugfixes</title>
		<link>https://www.kuemerle.com/transparent-encryption-of-properties-in-net-part-1a-the-bugfixes/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Sat, 07 Dec 2013 05:26:32 +0000</pubDate>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Cryptography]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=173</guid>

					<description><![CDATA[I recently posted my initial draft of a project that will provide secure, easy to use encryption of properties and fields in .NET types. Almost immediately some very knowledgeable people&#8230; ]]></description>
										<content:encoded><![CDATA[<p>I recently posted my <a href="http://www.kuemerle.com/transparent-encryption-of-properties-in-net-part-1-the-foundation/" target="_blank">initial draft</a> of a project that will provide secure, easy to use encryption of properties and fields in .NET types. Almost immediately some very knowledgeable people reached out to me with great suggestions on areas where I used suboptimal processes, as well as a few performance concerns that are not apparent in the basic unit tests I have in place. Thanks to them I am pleased to announce a few breaking changes to the initial 0.0.1 alpha release of my <a href="https://github.com/jkuemerle/EncryptedType" target="_blank">EncryptedType</a> library.</p>
<p>First, credit where credit is due. Thanks to <a href="https://twitter.com/tomasrestrepo" target="_blank">@tomasrestrepo</a> for pointing out some areas of potential instability. Next, a huge thanks for the time and effort that <a href="https://twitter.com/sdrapkin" target="_blank">Stan Drapkin</a> put into looking through my code and having an extended conversation with me on how to make it better. If you are interested in .NET security (and why wouldn’t you be?) then take a look at Stan’s new book <a href="http://securitydriven.net/" target="_blank">Security Driven .NET</a>. It contains a huge amount of content and I plan to use it to continue to improve this project even further.</p>
<p>The first thing you will notice in the latest 0.0.3 (still alpha) release of this library is the move from a single integrity function for a type to individual integrity functions for each encrypted value. The integrity function is intended to prevent a user with read/write access to the data store but not access to the encryption keys from tampering with data by replacing the contents of one blob with the contents of another. This is to replicate the <a href="http://blogs.msdn.com/b/sqlsecurity/archive/2011/02/21/prevent-tampering-of-encrypting-data-using-add-authenticator-argument-of-encryptbykey.aspx" target="_blank">add_authenticator</a> functionality of the <a href="http://technet.microsoft.com/en-us/library/ms174361.aspx" target="_blank">ENCRYPTBYKEY</a> function in SQL Server. The intent behind this change is to minimize the reuse of HMAC keys used for data validation.</p>
<p>The next change is a performance optimization. In the initial release I was performing a PBKDF2 derivation on the master encryption key every time a value was encrypted or decrypted. Since PBKDF2 derivation is designed to be slow this is certainly not how you would want to write a production implementation. I am now caching the derived encryption key in memory for the lifecycle of the type. This means improved performance, not just with key derivation but also with master key retrieval since the key server only needs to be contacted once per key lifespan within each type. </p>
<script src="https://gist.github.com/7532705.js"></script><noscript><pre><code class="language-c# c#">public string Encrypt(string Data, string KeyName, Func&lt;string&gt; IntegrityFunction)
{
	if (null != IntegrityFunction)
		Data = AddHMAC(Data, IntegrityFunction);
	var val = System.Text.UnicodeEncoding.Unicode.GetBytes(Data);
	using (var crypter = new System.Security.Cryptography.RijndaelManaged())
	{
		var iv = new byte[crypter.BlockSize / 8].FillWithEntropy();
		KeyInfo key = GetKeyInfo(KeyName, iv, crypter);
		byte[] encrypted;
		crypter.IV = iv;
		crypter.Key = key.KeyBytes;
		crypter.Mode = CipherMode.CBC;
		using (var encrypter = crypter.CreateEncryptor())
		{
			using (var to = new MemoryStream())
			{
				using (var writer = new CryptoStream(to, encrypter, CryptoStreamMode.Write))
				{
					writer.Write(val, 0, val.Length);
					writer.FlushFinalBlock();
					encrypted = to.ToArray();
				}
			}
		}
		return string.Format(&quot;{0}\0{1}\0{2}&quot;, Convert.ToBase64String(iv), Convert.ToBase64String(encrypted), ComputeHMAC(encrypted,key.SecretBytes));
	}
}
</code></pre></noscript>
<p>On a related note, I have also fixed the HMAC algorithm and reduced it to SHA256. This is a performance optimization as using more bits for the hash then there are in the encryption is unnecessary.</p>
<p>I have also modified the encryption to not just encrypt the value but to add a message authentication value as part of the encrypted payload. I am performing the HMAC against the encrypted data as that is the <a href="http://crypto.stackexchange.com/questions/202/should-we-mac-then-encrypt-or-encrypt-then-mac" target="_blank">strongest method</a> for ensuring the data is maximally protected against tampering. By doing this, I gain additional security against tampering as the encrypted data has another layer of validation that has to stay in tact. There is also a performance gain in decryption, as I first perform the hash check of the encrypted data and if it does not match then I don’t even have to bother decrypting the data, as it is by definition invalid.</p>
<p>In order to implement message authentication of the encrypted data I needed to generate and store a unique value to use as the key for the HMAC. While there is no known weakness in reusing the encryption key as the HMAC key I chose instead to just extend the PBKDF2 derivation I am performing on the encryption master key and use the next set of bits from that function as the HMAC key.</p>
<p>Since I am already caching the key derivation I also cache the MAC secret value in the same structure. </p>
<p>With these changes I have increased the integrity of the encrypted values and further hardened the data protection process. By caching the key derivation results I have increased performance without a significant impact on the security of the library.</p>
<p>As noted in my original post I do plan to continue enhancing this library and will be diving further into the implementation in future posts. I am also going to build out some sample projects and document those as well. You can always check out the source code on <a href="https://github.com/jkuemerle/EncryptedType" target="_blank">GitHub</a> as well as on <a href="http://www.nuget.org/packages/EncryptedType/" target="_blank">NuGet</a>.</p>
<p>Please feel free to reach out to me via email or on Twitter if you have any feedback, concerns or questions. I am also very open to suggestions on related topics where this library can be useful.</p>
<p>Finally, I am writing this in early December and CodeMash is about a month away. I am once again running a <a href="http://www.kuemerle.com/codemash-2014-door-decorating-competition/" target="_blank">door decorating competition</a> during the days of the conference. If you are at any of the CodeMash hotels let your geek flag fly and show off how well you can decorate your hotel room door.</p>
<p>If you are not able to make it to CodeMash come out to <a href="http://codepalousa.com/" target="_blank">CodepaLOUsa</a> in Louisville, KY in February. I will be speaking there and also running another door decorating competition. </p>
<p>Stay secure and I hope to see you around!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Transparent Encryption of Properties in .NET, Part 1: The Foundation</title>
		<link>https://www.kuemerle.com/transparent-encryption-of-properties-in-net-part-1-the-foundation/</link>
					<comments>https://www.kuemerle.com/transparent-encryption-of-properties-in-net-part-1-the-foundation/#comments</comments>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Tue, 03 Dec 2013 20:59:33 +0000</pubDate>
				<category><![CDATA[AOP]]></category>
		<category><![CDATA[Cryptography]]></category>
		<category><![CDATA[Security]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=166</guid>

					<description><![CDATA[This is part 1 in a series of posts that will cover securely encrypting properties in POCO types. One of my favorite features of SQL Server it it’s ability to&#8230; ]]></description>
										<content:encoded><![CDATA[<p>This is part 1 in a series of posts that will cover securely encrypting properties in POCO types.</p>
<p>One of my favorite features of SQL Server it it’s ability to easily encrypt my sensitive data by using it’s built in column level data encryption features. I like that the cryptographic implementation is done correctly, using strong algorithms and following the correct encryption protocols. Often when developers have to implement their own encryption logic they miss items such as always using a <a href="https://en.wikipedia.org/wiki/Cryptographic_nonce" target="_blank">nonce</a> as an initialization vector every time they encrypt the data, using weak encryption keys or <a href="http://www.codinghorror.com/blog/2009/05/why-isnt-my-encryption-encrypting.html" target="_blank">incorrectly using the algorithms</a>. Another practice that leads to vulnerabilities is not correctly managing the encryption key, or worse, hardcoding encryption keys in the application or configuration files. I especially like that the data encryption functionality in SQL Server makes it so easy to properly encrypt and decrypt data.</p>
<p>I do have times that I need to securely store sensitive information but am not able to work directly with SQL Server. I may not even be using a relational database to store my data. This is why I decided to write a set of good encryption templates that can be used with a number of backend data stores. I also wanted to make the encryption easy to use with previously written code and as low friction as possible for a developer to introduce.</p>
<p>Since I am also a big proponent of reducing boilerplate code by using Aspect Orientated Programming techniques I decided to implement the data encryption functionality in a set of aspects for <a href="http://www.postsharp.net/" target="_blank">PostSharp</a>. The free Express version of PostSharp should be enough to get started with these aspects. Now all a developer has to do to get strongly encrypted properties and fields is to decorate their existing POCO types with a few attributes and let PostSharp add the common encryption logic automatically at compile time.</p>
<p>In this blog post I am going to cover the details of the property (and field) encryption logic. Other posts in this series will cover additional items, such as providing the ability to perform lookups on encrypted data, specific key management features as well as&nbsp; the details of an implementation specifically for <a href="https://www.nuget.org/packages/EncryptedType.RavenDB" target="_blank">RavenDB</a>.</p>
<p>All of the code I am discussing is released under an <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">open source license</a>, the master repository is on <a href="https://github.com/jkuemerle/EncryptedType" target="_blank">GitHub</a>.&nbsp; You can also easily bring this functionality into your own projects by installing the packages from <a href="https://www.nuget.org/packages/EncryptedType/" target="_blank">NuGet</a>.</p>
<h2>Good Encryption</h2>
<p>Good data encryption is not an easy thing to get right. There are a number of pitfalls that even security focused developers can stumble into. With that in mind, I have attempted to make my data encryption as correct as possible. I am providing the code and packages with absolutely no guarantees that they are free from security defects. This code is for demonstration purposes and you should not use it blindly. Make sure that it is appropriate for your needs and please do let me know if you find any flaws or bugs in it and I will work to correct them.</p>
<p>With the disclaimer out of the way lets dig into the core functionality, encrypting and decrypting data.</p>
<script src="https://gist.github.com/7532705.js"></script><noscript><pre><code class="language-c# c#">public string Encrypt(string Data, string KeyName, Func&lt;string&gt; IntegrityFunction)
{
	if (null != IntegrityFunction)
		Data = AddHMAC(Data, IntegrityFunction);
	var val = System.Text.UnicodeEncoding.Unicode.GetBytes(Data);
	using (var crypter = new System.Security.Cryptography.RijndaelManaged())
	{
		var iv = new byte[crypter.BlockSize / 8].FillWithEntropy();
		KeyInfo key = GetKeyInfo(KeyName, iv, crypter);
		byte[] encrypted;
		crypter.IV = iv;
		crypter.Key = key.KeyBytes;
		crypter.Mode = CipherMode.CBC;
		using (var encrypter = crypter.CreateEncryptor())
		{
			using (var to = new MemoryStream())
			{
				using (var writer = new CryptoStream(to, encrypter, CryptoStreamMode.Write))
				{
					writer.Write(val, 0, val.Length);
					writer.FlushFinalBlock();
					encrypted = to.ToArray();
				}
			}
		}
		return string.Format(&quot;{0}\0{1}\0{2}&quot;, Convert.ToBase64String(iv), Convert.ToBase64String(encrypted), ComputeHMAC(encrypted,key.SecretBytes));
	}
}
</code></pre></noscript>
<p>Our encryption method attempts to ensure that all the data encrypted is done so securely. There is also an option to add integrity verification to the encryption process. </p>
<p>The integrity function will calculate a Hashed Message Authentication Code (HMAC) of the cleartext data before it is encrypted. We concatenate the cleartext data and HMAC before we encrypt it.</p>
<p>Once we have calculated the HMAC it is time to start encrypting the data All the .NET cryptographic functions work on byte arrays so I have standardized on a decision that I will represent all strings in Unicode. This ensures that I am able to successfully decrypt data&nbsp; that has been encrypted by my functions by assuming that all payload data is a Unicode encrypted string. The first step in encrypting the data is to convert the string to a byte array.</p>
<p>Next, before we encrypt the data we need to generate a unique value that will be used as the Initialization Vector (IV). This is a nonce (a number that will only be used once) and each time we encrypt data we need to generate a new nonce. To do this I have created a helper extension method, <em>FillWithEntropy</em>, that will take a byte array and fill it with a cryptographically random set of values. Note that the standard <strong>System.Random</strong> functions are not sufficiently random for anything to do with cryptography and should never be used.</p>
<script src="https://gist.github.com/7533382.js"></script><noscript><pre><code class="language-c# c#">public static byte[] FillWithEntropy(this byte[] ToFill)
{
    var rng = new RNGCryptoServiceProvider();
    rng.GetBytes(ToFill);
    return ToFill;
}
</code></pre></noscript>
<p>Finally, we need the encryption key itself. In my code I have taken pains to ensure that any encryption keys are stored separately from the encrypted data as well as not being directly accessible to my program. This enforces a good separation of concerns and increases data security. I have abstracted this separation by creating an&nbsp; <strong>IKeyServer</strong> interface that will be used to return an implementation of a key server. That key server provides the <em>GetKey</em> method which will return the symmetric encryption key base value from the key store.</p>
<p>Now that we have our base encryption key value I run it through the <em>Rfc2898DeriveBytes</em> function to return a hashed byte array that is then used as the actual encryption key for the data.</p>
<p>With a unique IV and a non-obvious encryption key I ensure that the code will use the strongest implementation of a standard encryption algorithm. This means that I make sure to use the Cypher Block Chaining mode of my algorithm to ensure that my ciphertext cannot be easily tampered with.</p>
<p>Then, to make it easier to deal with encrypted data throughout the rest of the application I encode both it and the IV as Base64 strings. Finally, I concatenate both the IV and encrypted data together into a single string to make it easier to keep them together for future decryption.</p>
<p>The decryption process is a reversal of the encryption, where I split off the IV from the payload, decrypt the data using the same algorithm implementation and key and optionally verify any HMAC that is encrypted with the data. If all the decryption logic works I return the cleartext encoded as a Unicode string to the caller.&nbsp;&nbsp; </p>
<h2>Key Management</h2>
<p>While implementing a fully featured key server is the subject of a future blog post I will review some of the basics of the key management functionality of my solution. All key values are stored separate from the encrypted data, this will ensure that any attackers have a higher bar to clear to extract any useful information from my encrypted data. </p>
<p>I interoperate with the key server by interacting with the <em>IKeyServer</em> interface which provides access to the actual encryption keys without tying my code to any particular concrete implementation of a key server. This gives me the flexibility of a number of different storage technologies and security layers to protect my encryption keys.</p>
<p>In order to decrypt the data I need to be able to retrieve the correct encryption key. To enable this I need to store some sort of pointer alongside the encrypted data that denotes which key was used to encrypt it. I accomplish this with the <strong>EncryptionKeys</strong> dictionary&nbsp; in the type definition. This dictionary is responsible for storing the identifier of each key that is used to encrypt the given property. With my implementation we can have multiple properties, each encrypted with a different encryption key. By doing this we increase the strength of our encryption by minimizing the reuse of encryption keys. This can also form the basis of a strong data visibility restriction implementation, as, by withholding specific encryption key values from users we make it impossible for unauthorized users to access sensitive data since the cleartext of that data is never on their systems to start with. </p>
<p>The primary method I need to encrypt and decrypt data is the <em>GetKey</em> method. All I need to do is pass in the identifier of the key that was used to encrypt the property and it will return the encryption key. </p>
<p>Other useful methods on the interface are the <em>Map</em> method which will return a dictionary of property names and key identifiers that the server knows about. This is useful for administratively specifying which keys encrypt which properties without needing to define key identifiers in the source code. A <em>Keys</em> method can also be implemented that will return a list of which keys are currently available from the server.</p>
<h2>Automatic Implementation</h2>
<p>Rather than manually implement all the required code in base classes and expect other developers to correctly implement the functionality I am taking advantage of Aspect Orientated Programming to perform the boilerplate implementation of my encryption logic. This will ensure that the correct code is injected into the compiled assembly. Now all any developer has to do is decorate their types and properties with the given attributes and they will automatically receive this functionality in their program.</p>
<p>To perform all the work necessary to store encrypted data a developer just has to decorate their type definition with the <strong>[EncryptedType]</strong> attribute. For any fields or properties that need to be secured the developer just has to decorate them with the <strong>[EncryptedValue]</strong> attribute.</p>
<p>By using PostSharp I also gain the ability to transparently override the field and property getters and setters to make sure that the cleartext data is never persisted into the object. This is useful not only from a local security perspective as unencrypted data is never stored in the processes memory space, but it also is vital in situations where the object is serialized for storage or transmission. By overriding both the setter and getter I ensure that any serialization of the object will not return cleartext data as the data will always be encrypted and the field or property will always return the encrypted value.</p>
<p>As with all encryption at some point in time you need to get back the cleartext value of the data. To support this in as easy as way as possible for the consuming developer the <em>IEncryptedType</em> interface provides the <em>ClearText</em> method. Calling the ClearText method with the property name will return the unencrypted value of the field or property (provided the encryption key is both available and correct).</p>
<p>Since I am not a fan of having magic strings in my codebase and I really like to have IntelliSense I have also created an extension method, <em>AsClear</em>, that will extract the name of the property from a given expression and then return the cleartext value of that property. </p>
<h2>Usage</h2>
<p>Finally it is time to put all of this work into practice. While I will be writing future blog posts detailing a full implementation of all the features, the below code from my(sparse) tests demonstrates how to use the encryption. </p>
<p>I first define a type that will have an encrypted property and decorate the SSN property as the one I want to encrypt. Next I store a social security number in the SSN property and verify that when I read the value of the property through the standard getter that the value is encrypted. Finally I test that the decryption works correctly by retrieving the cleartext version of the property data by casting to <em>IEncryptedType</em> and calling the <em>AsClear</em> extension method on the SSN property.</p>
<script src="https://gist.github.com/7776705.js"></script><noscript><pre><code class="language-c# c#">[EncryptedType]
public class EncTest {
	public string ID { get; set; }
	[EncryptedValue]
	public string SSN { get; set; }

	public string IntegrityValue() { return this.ID; }

	public EncTest() {
		this.ID = Guid.NewGuid().ToString();
	}

}

[Test]
public void TestAspect()
{
	var n = new EncTest();
	var s = new CeloClavis.TestServer();
	((IEncryptedType)n).KeyServer = s;
	((IEncryptedType)n).EncryptionKeys = s.Map;
	((IEncryptedType)n).Integrity(&quot;SSN&quot;, n.IntegrityValue);   
	n.SSN = &quot;111-11-1111&quot;;
	Assert.AreNotEqual(&quot;111-11-1111&quot;, n.SSN);
}

[Test]
public void TestDecryption()
{
	var n = new EncTest();
	var s = new CeloClavis.TestServer();
	((IEncryptedType)n).KeyServer = s;
	((IEncryptedType)n).EncryptionKeys = s.Map;
	((IEncryptedType)n).Integrity(() =&gt; n.SSN, n.IntegrityValue);
	n.SSN = &quot;111-11-1111&quot;;
	Assert.AreEqual(&quot;111-11-1111&quot;, ((IEncryptedType)n).AsClear(() =&gt; n.SSN));
}
</code></pre></noscript>
<h2>Get the bits</h2>
<p>All of the code required to implement transparent encryption of fields and properties is available under an <a href="http://www.apache.org/licenses/LICENSE-2.0.html" target="_blank">Apache open source license</a>. I plan to continue working on this code and improving it. If you would like to see the code or contribute to it I have it in a GitHub repository. Please feel free to let me know your feedback. I would love to see this project grow and be useful to people.</p>
<p>For easy use in your own solution you can install a prebuilt version of the code from NuGet.&nbsp; At a minimum you will need both the <a href="https://www.nuget.org/packages/IEncryptedType" target="_blank">IEncryptedType</a> and the <a href="https://www.nuget.org/packages/EncryptedType" target="_blank">EncryptedType</a> packages. </p>
<p>You can also get a <a href="https://www.nuget.org/packages/EncryptedType.RavenDB" target="_blank">RavenDB specific implementation</a> that ensures that only a minimal set of serialized properties actually required to support the encryption/decryption will be persisted to the storage engine.</p>
<h2>In Conclusion (for now)</h2>
<p>This is the first post in my series, future installments will dive deeper into the specifics of the PostSharp implementation, enhance the logic to allow for effective and secure seeking through encrypted data, build a fully functional key server and create storage specific implementations of the code.</p>
<p>I hope you get some good use of this code. I am always open to hearing about specific use cases, feature requests or bug reports. You can email me, hit me up on Twitter or find me at a community event.</p>
<p>Feel free to take the code out for a test drive by grabbing it from <a href="https://www.nuget.org/packages/EncryptedType" target="_blank">NuGet</a> or just check out the <a href="https://github.com/jkuemerle/EncryptedType" target="_blank">codebase</a> and see how it works. As always do try to stay safe out there.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.kuemerle.com/transparent-encryption-of-properties-in-net-part-1-the-foundation/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title>CodeMash 2014 Door Decorating Competition</title>
		<link>https://www.kuemerle.com/codemash-2014-door-decorating-competition/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Sat, 23 Nov 2013 22:58:35 +0000</pubDate>
				<category><![CDATA[CodeMash]]></category>
		<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=164</guid>

					<description><![CDATA[It’s that time once again. With CodeMash rapidly approaching there is one more thing you should be preparing for. In addition to all the great sessions, exciting activities and general&#8230; ]]></description>
										<content:encoded><![CDATA[<p>It’s that time once again. With CodeMash rapidly approaching there is one more thing you should be preparing for. In addition to all the great sessions, exciting activities and general fun I am once again running a door decorating competition.</p>
<p><img decoding="async" src="http://farm9.staticflickr.com/8499/8366936916_834b1a9877_n.jpg"><img decoding="async" src="http://farm9.staticflickr.com/8472/8367922046_cdd90c43b8_n_d.jpg"><img decoding="async" src="http://farm9.staticflickr.com/8323/8366942412_bcc534e3c1_n_d.jpg"></p>
<p>Last year we really showed those cheerleaders what properly decorated doors looks like so this year we need to step up our game. I would like to get more people involved so that there are more decorated doors at all of the CodeMash hotels.</p>
<p>Start planning now for January and you could be the winner of this fabulous first place prize or some other fun prizes I am working to get together.</p>
<p><img decoding="async" src="https://pbs.twimg.com/media/BX3SxnDCIAAzog7.jpg" width="400"></p>
<p>As with last years competition this is something I am running on a personal basis and is completely unofficial. This is not an officially organized CodeMash function and is not affiliated with the conference, any of the sponsors or conference hotels. You can choose to participate at your own risk and please remember to take care and not damage your hotel room door. Thanks and I hope to see you at CodeMash! </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Combining and Compressing JavaScript and CSS During Deployment</title>
		<link>https://www.kuemerle.com/combining-and-compressing-javascript-and-css-during-deployment/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Wed, 30 Oct 2013 04:53:44 +0000</pubDate>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Build]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=162</guid>

					<description><![CDATA[One of my favorite things to do is to automate repetitive processes, I have been a proponent of scripted build and deploy systems since I was building them for .NET&#8230; ]]></description>
										<content:encoded><![CDATA[<p>One of my favorite things to do is to automate repetitive processes, I have been a proponent of scripted build and deploy systems since I was building them for .NET 1 .1 applications with Nant and CruiseControl.</p>
<p>Recently I introduced a <a href="http://inedo.com/buildmaster/overview" target="_blank">BuildMaster</a> server into my day job. With the growing number of applications I am responsible for managing and the tight deadlines for client work I needed an easy to use and reliable tool to automate both builds and deployments.&nbsp; We selected BuildMaster after building proof of concept deployments with a number of tools and it stood out as one of the easiest to install and implement. </p>
<p>By taking advantage of BuildMaster’s&nbsp; set of extensions I have been able to easily accomplish most of the tasks I needed to accomplish for deploying various .NET and pure HTML applications, however there was one feature missing.</p>
<p>We were building an interactive pure HTML application for a client and ended up with the usual explosion of JavaScript and CSS assets from various third party libraries as well as a number of our own assets. Between the desktop specific, mobile specific and common assets we had over 25 JavaScript files and more than a dozen CSS files. During the course of development I was asked if there was a way that we could reduce the sheer number of files that we were delivering, not just to make the handoff process easier, but also to increase the performance of the application by minimizing the number of requests required to render each page. In addition, while we were using minified versions of many of the third party JavaScript files we still had our own code to deal with as well as lots of wasted bytes in the CSS files.</p>
<p>I looked around and while there were plenty of compression options I didn’t want to bring in an entirely new technology stack for a deployment that mainly consisted of getting files from source control and copying them to a server. I decided that I was going to integrate the asset combination and compression directly into my existing BuildMaster deployment plan by building my own extension. I chose to use the <a href="https://yuicompressor.codeplex.com/" target="_blank">YUI Compressor for .NET</a> project to perform the asset combination and compression.</p>
<p>I wanted the consolidation and compression to happen at build time so that the other developers and designers I was working with did not have to deal with minified files. On the other hand, there are still some things that can break, so I made sure my deployment plan would automatically run and push new builds out to an integration server for immediate testing and feedback.</p>
<p>I could have started off with the <a href="http://inedo.com/support/tutorials/writing-a-simple-action-using-the-buildmaster-sdk" target="_blank">documentation</a> for building a custom action in BuildMaster, but since I have already contributed to a <a href="https://github.com/inedo/bmx-azure" target="_blank">number</a> <a href="https://github.com/Inedo/bmx-amazon" target="_blank">of</a> <a href="https://github.com/Inedo/bmx-jenkins" target="_blank">other</a>&nbsp;<a href="https://github.com/Inedo/bmx-hudson" target="_blank">extensions</a> I had a pretty good idea of what to do.</p>
<p>After some tweaking work I have what I think is a nice BuildMaster wrapper around the YUI Compressor and I received permission to publish the source code to this extension so that others can take advantage of this action. The source code is up on GitHub, at <a title="https://github.com/PrecisionDialogue/bmx-pd-web" href="https://github.com/PrecisionDialogue/bmx-pd-web">https://github.com/PrecisionDialogue/bmx-pd-web</a>. </p>
<p>The action is mostly a wrapper around the YUI Compressor but there are a number of settings that allow you to deeply customize what is going to be done to the assets.</p>
<p><img decoding="async" src="https://dl.dropboxusercontent.com/u/118896/yuiCompress.png"></p>
<p>The input files for each asset type consist of one or more filespecs, each on their own line. Each line is also interpreted so that you can use wildcards (including the BuildMaster <strong>~\</strong> syntax to represent the working directory). The union of all of the matching files is what will be processed.&nbsp; You can also configure one or more regular expressions to denote filename patterns to be excluded. Each line of the exclusion regular expression is evaluated against the set of files and matching filenames are excluded from being combined, minified and/or deleted. </p>
<p>This action can combine asset files, compress asset files or do both. All activity takes place in the working directory of the files so when combining files I recommend using the “Delete original files” option to remove extraneous files.</p>
<p>The “Preserve subdirectories” option is useful if you use relative paths within your assets and need to preserve that structure. If you are combining files and preserving subdirectories a single file of the output name will be created in every subdirectory that has appropriate content.</p>
<p>If you don’t want to combine files but just need to compress them you can select the “Compress (JS/CSS) files in place” option. This option will ignore the output filename and just compress each matching artifact file. This is useful if you have path or filename dependent code in your scripts.</p>
<p>The rest of the options for each asset are the same as in the YUI Compressor and should work the same.</p>
<p>With this action I am now able to easily combine and minify CSS and JavaScript files reliably and ensure that only the correct compressed versions are promoted into the application environments. </p>
<p>I hope you find this useful and I am always happy to receive feedback. </p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Automation Galore</title>
		<link>https://www.kuemerle.com/automation-galore/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Mon, 08 Jul 2013 17:52:02 +0000</pubDate>
				<category><![CDATA[Automation]]></category>
		<category><![CDATA[Build]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=147</guid>

					<description><![CDATA[I know that I have gone dark for the past few months but I haven’t stopped doing interesting things with technology, it is just that I have been immersed in&#8230; ]]></description>
										<content:encoded><![CDATA[<p>I know that I have gone dark for the past few months but I haven’t stopped doing interesting things with technology, it is just that I have been immersed in creating code and content for <a href="http://www.inedo.com" target="_blank">Inedo</a>. If you are looking for a great end to end solution for managing application deployments, which is a lot more than just automating compilation, the work that Inedo has done in <a href="http://inedo.com/buildmaster" target="_blank">BuildMaster</a> is impressive.</p>
<p>I have always been a big fan of automating deployments, it makes life so much easier for both developers and the operations teams if there is a single, reliable and auditable way of ensuring the right code changes get deployed to the right environments. It is even better if the system is automated and provides the right tooling to ensure separation of privileges so that all compliance requirements can be easily met.</p>
<p>I am very proud to have worked on deployment automation features in BuildMaster to enable more robust and reliable deployments to both Amazon Web Services and Windows Azure.</p>
<p>First, I have worked with Amazon Web Services for a number of years, running some large scale systems using EC2 instances and lots of EBS volumes for SQL Server databases. I previously automated deployments using MSDeploy combined with lots of PowerShell but never had as integrated a solution as I would have liked. Expanding the <a href="http://inedo.com/buildmaster/features/platforms/aws" target="_blank">AWS features</a> of BuildMaster allowed me to finally implement the end to end promotion and deployment pipeline I always wanted. <a href="http://aws.amazon.com/cloudformation/" target="_blank">CloudFormation</a> is an interesting base to build on, the template pattern lends itself well to easily managing multiple similar environments.&nbsp; Using BuildMaster to manage the templates as well as configure and manage CloudFormation stacks during deployment allowed me to build a <a href="http://inedo.com/specifics/cardlab" target="_blank">reference implementation</a> that provided discrete testing environments and&nbsp; high scalability while also controlling runtime costs by running a local integration environment and a smaller scale cloud based staging environment.</p>
<p>I have been very involved in watching Windows Azure evolve into a very capable cloud platform since its launch. With that, I was very excited to expand BuildMaster’s <a href="http://inedo.com/buildmaster/features/platforms/azure" target="_blank">Windows Azure features</a>. With the tooling that is now in place there is no longer any reason developers should ever have to deploy code directly into production from Visual Studio again.</p>
<p>Building features and documentation for Windows Azure allowed me to deeply explore the Windows Azure feature set and API. I had a great time building on the API and was able to implement features that allow for <a href="http://inedo.com/support/tutorials/automating-azure-cloud-services-deployments-with-buildmaster" target="_blank">end to end deployment and management of Windows Azure Cloud Services</a> as well as better <a href="http://inedo.com/support/tutorials/using-buildmaster-to-deploy-azure-web-sites" target="_blank">promotion and deployment of Azure Web Sites</a>. By running the integration environment premises and managing a minimal staging environment both bug fix turnaround time and runtime costs were able to be minimized. Also, the automation and security model made separation of duties painless and friction free. </p>
<p>I was able to do more than just work with cloud deployments and got to dip back into the Java world by implementing features for automating Maven builds, integrating with both <a href="http://inedo.com/buildmaster/extensions/hudson" target="_blank">Hudson</a> and <a href="http://inedo.com/buildmaster/extensions/jenkins" target="_blank">Jenkins</a> as well as managing <a href="http://inedo.com/buildmaster/extensions/artifactory" target="_blank">Artifactory</a> repositories.</p>
<p>One of the most favorite things about my time at Inedo was that they have begun exposing the source code for <a href="http://github.com/inedo" target="_blank">BuildMaster extensions</a> on GitHub. This makes it much easier for people to take advantage of the BuildMaster SDK and build a rich community of extensions that can solve every deployment need.</p>
<p>There is much more to talk about, including my projects to enhance <a href="http://inedo.com/proget" target="_blank">ProGet</a>, a professional quality NuGet server for inside the firewall but that will have to wait for another time. </p>
<p>I am going to be at DevLink in late August and am planning my fall schedule now. I am an <a href="http://ineta.org/Speakers/SearchCommunitySpeakers.aspx?SpeakerId=ed47e85a-e220-4c0d-abdf-648532f9ac9e" target="_blank">INETA Community speaker</a> and would love to give a <a href="http://www.kuemerle.com/talks" target="_blank">talk</a> at your user group or conference. I hope to see you at an event in the future!</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Shaking Things Up In 2013</title>
		<link>https://www.kuemerle.com/shaking-things-up-in-2013/</link>
		
		<dc:creator><![CDATA[Joe Kuemerle]]></dc:creator>
		<pubDate>Mon, 11 Feb 2013 14:56:51 +0000</pubDate>
				<category><![CDATA[Community]]></category>
		<guid isPermaLink="false">http://www.kuemerle.com/?p=135</guid>

					<description><![CDATA[With the new year upon us I would like to take this opportunity to announce that I am moving to a new position. Effective February 20 I am joining Gibraltar&#8230; ]]></description>
										<content:encoded><![CDATA[<p>With the new year upon us I would like to take this opportunity to announce that I am moving to a new position. Effective February 20 I am joining <a href="http://www.gibraltarsoftware.com" target="_blank">Gibraltar Software</a> and I will be working on <a href="http://www.gibraltarsoftware.com/loupe/Default.aspx" target="_blank">Loupe</a>. You can check out the new functionality at a webinar near you, <a href="https://attendee.gotowebinar.com/rt/3961799128000824064" target="_blank">sign up here</a>.&nbsp; </p>
<p>I am thrilled to be back working on developer tools again, and I am looking forward to working with the awesome team at Gibraltar.&nbsp; I am going to remain in Ohio and telecommute so I will definitely still be around at all of the great technical events in the region.</p>
<p>The first tasks I am going to be working on are in partnership with <a href="http://www.inedo.com/" target="_blank">Inedo</a>. I will be working on the awesomeness that is <a href="http://www.inedo.com/proget" target="_blank">ProGet</a> and <a href="http://www.inedo.com/buildmaster/overview" target="_blank">BuildMaster</a>.&nbsp; I have been a big proponent of automated build and deploy systems for many years and BuildMaster looks like it is going to be a lot of fun.&nbsp; It certainly looks to be easier to use than wiring up a CruiseControl build script to deploy my shiny new .NET 2.0 Windows services onto multiple production servers when the server administrator pushed the “Build” button.&nbsp; </p>
<p>I have been working with getting a NuGet&nbsp; server to play nicely for a number of in house libraries and I am excited to see ProGet maturing. I think that there is a lot of benefit for companies to host their own NuGet feeds in house and ProGet makes it dead simple to not only host your own internal libraries as NuGet packages but also to shadow the publicly available third party libraries we all depend on.</p>
<p>If you are going to be at <a href="http://codepalousa.com" target="_blank">CodepaLOUsa</a> please join me as I talk about all of the fun I am having building a website and API with a single codebase using <a href="http://servicestack.net" target="_blank">ServiceStack.NET</a> in my <a href="http://codepalousa.com/speakers/speaker-directory/itemlist/user/112-joekuemerle" target="_blank">Hey, You Got Your API In My Website!</a> session. This is a great experience for me to try to get back some of my rusty Linux skills as I work on hosting my web application under Mono.&nbsp; </p>
<p>Speaking of CodepaLOUsa I am going to be running an encore door decorating competition, just like the one I ran at CodeMash.&nbsp; You can see how creative some of the CodeMasher’s got <a href="http://codemash.doorcomp.com/" target="_blank">here</a> and I expect even greater things from the CodepaLOUsa crowd. CodeMash may have the bacon but Louisville has bourbon! I even have some kind sponsors who stepped up so I will be able to offer a prize or two for the finalists.</p>
<p>If you are looking for links to some of the great content that was presented at CodeMash I am maintaining a <a href="https://github.com/jkuemerle/CodeMash2013" target="_blank">GitHub repository</a> with links to slides, notes, blog posts and even code repositories that the various CodeMash speakers have made public. I welcome pull requests so please do let me know if there is any other public content that I may have missed.</p>
<p>I am sad to be leaving my current position at <a href="http://www.bookingbuilder.com/Content/" target="_blank">BookingBuilder Technologies</a>, they have been a great place to work and have always been very supportive of my community involvement. If you know anyone who is interested in working on a full stack .NET system covering everything from SQL Server to WPF and ASP.NET there is now an opening. You can see the details <a href="http://careers.stackoverflow.com/jobs/30342/lead-sr-developer-job-description-bookingbuilder-technologies" target="_blank">here</a>. The job (and whole company) is 100% telecommute so you can work from anywhere. I also have a number of extra <a href="http://careers.stackoverflow.com" target="_blank">StackOverflow Careers</a> invitations, please reach out to me if you would like one.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
