<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:media="http://search.yahoo.com/mrss/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Payment Systems Blog</title>
	
	<link>http://www.paymentsystemsblog.com</link>
	<description>David D. Bergert</description>
	<lastBuildDate>Sun, 29 Aug 2010 15:37:18 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
		<!-- podcast_generator="podPress/8.8" - maintenance_release="8.8.4" -->
		<copyright>2007-2008 </copyright>
		<managingEditor>podcast@paymentsystemsblog.com (Dave Bergert)</managingEditor>
		<webMaster>podcast@paymentsystemsblog.com (Dave Bergert)</webMaster>
		<category>posts</category>
		<ttl>1440</ttl>
		<itunes:keywords>Payment Systems, ISO8583, PABP, PA-DSS, PCI, Security, Credit, Debit</itunes:keywords>
		<itunes:subtitle />
		<itunes:summary>Payment Systems Podcast is a podcast that address the subject of Payments Systems, their operations, development, security and other experiences related to payment processing.</itunes:summary>
		<itunes:author>Dave Bergert</itunes:author>
		<itunes:category text="Technology" />
<itunes:category text="Business" />
<itunes:category text="Technology">
	<itunes:category text="Software How-To" />
</itunes:category>
		<itunes:owner>
			<itunes:name>Dave Bergert</itunes:name>
			<itunes:email>podcast@paymentsystemsblog.com</itunes:email>
		</itunes:owner>
		<itunes:block>No</itunes:block>
		<itunes:explicit>no</itunes:explicit>
		<itunes:image href="http://www.paymentsystemsblog.com/images/pspodcast.png" />
		<image>
			<url>http://www.paymentsystemsblog.com/images/pspodcast.png</url>
			<title>Payment Systems Blog</title>
			<link>http://www.paymentsystemsblog.com</link>
			<width>144</width>
			<height>144</height>
		</image>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/PaymentSystemsBlog" /><feedburner:info uri="paymentsystemsblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Compression</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/9KF9g6wAT7w/</link>
		<comments>http://www.paymentsystemsblog.com/2010/08/29/compression/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 15:34:39 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/?p=698</guid>
		<description><![CDATA[
 
Sometimes you don&#8217;t get to define the requirements, they sometimes appear to serve a higher purpose that you can&#8217;t begin to understand. All you know is that they are requirements, and there were decisions made for various reasons. Sometimes you have to play the cards that you are dealt. But it is still your choice [...]]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; margin-left: 200; margin-right: 200" src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/08/data.jpeg" border="0" alt="data.jpeg" width="350" height="316" /></p>
<p> </p>
<p>Sometimes you don&#8217;t get to define the requirements, they sometimes appear to serve a higher purpose that you can&#8217;t begin to understand. All you know is that they are requirements, and there were decisions made for various reasons. Sometimes you have to play the cards that you are dealt. But it is still your choice in how to play them.</p>
<p>I&#8217;m talking about message formats here, In a specific transaction processing system there are two requirements that we must adhere to:</p>
<ol>
<li>Accept a 8,000 &#8211; 10,000 bytes incoming fixed message format.</li>
<li>Log the Raw Message Request and Responses for all interface connections</li>
</ol>
<p>Regarding #1 I&#8217;d prefer to see a variable message format here instead, but I understand the need of an existing system to talk in the language this it is used to. Item #2 had me very concerned when I first heard of it, with my PCI background, I was ready to put my foot down and call people crazy &#8211; (Imagining the request to log raw messages that contained track data, pin blocks, card verification numbers)  To my surprise this was not for a financial transaction processing system but for one of a different purpose.  One that exists in a highly regulated word with data retention requirements and the need integrity of the raw transaction messages for compliance and legal reasons.</p>
<p>The challenge I had logging the raw messages where their sheer size &#8211; 10K and when you are looking at 4-6 legs of a transaction &#8211; client request, client response, endpoint request, endpoint response, and other transaction paths that sometimes seem recursive, we have 50K of logging for a single transaction &#8211; times 3 to 5 million transactions per day &#8211; that is 150 GB to 250 GB per day of logging !</p>
<p>The easiest solution was to look into compression &#8211; how much time would compressing the data stream before logging it take ? Would this impact transaction processing time ? How was the raw messages used ? If we compress the message, what needs to occur on applications on the other end, what language and platform are they written in, what is a portable algorithm ?</p>
<p>It turns out the these messages contains many repeating unused fields with default values &#8211; these compress very well:</p>
<p> </p>
<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/08/image001.png" border="0" alt="image001.png" width="605" height="596" /></p>
<p> </p>
<p>Enter <a href="http://en.wikipedia.org/wiki/Gzip">gzip</a> &#8211; On our platform Java&#8217;s <a href="http://download.oracle.com/javase/6/docs/api/java/util/zip/GZIPInputStream.html?is-external=true">GZipInputStream</a> and for our clients tools the .NET <a href="http://msdn.microsoft.com/en-us/library/system.io.compression.gzipstream.aspx">GZipStream</a>.</p>
<p>How did this work out ?</p>
<p> </p>
<pre><span style="font-family: 'courier new', monospace;">raw_size    comp_size   Compression %</span><br style="font-family: 'courier new', monospace;" /><span style="font-family: 'courier new', monospace;">------------------------------------------</span><br style="font-family: 'courier new', monospace;" /><span style="font-family: 'courier new', monospace;">3975        393         90.1    </span><br style="font-family: 'courier new', monospace;" /><span style="font-family: 'courier new', monospace;">10599       484         95.4﻿</span></pre>
<p> </p>
<p>How much disk storage and SAN space and upgrades were saved <img src='http://www.paymentsystemsblog.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  Priceless.</p>
<p> </p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/9KF9g6wAT7w" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/08/29/compression/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/08/29/compression/</feedburner:origLink></item>
		<item>
		<title>Swiping the Card at a Customer’s location</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/_F-99seTSY0/</link>
		<comments>http://www.paymentsystemsblog.com/2010/08/29/swiping-the-card-at-a-customers-location/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 14:39:04 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/?p=690</guid>
		<description><![CDATA[




 
I had the opportunity recently to visit one of our OLS.Switch customer’s retail locations. This particular customer doesn&#8217;t have a presence in the region that I work in, so I was very excited to Swipe my Card.  Probably too excited, actually, because I think I explained every line of the receipt, including the myriad of [...]]]></description>
			<content:encoded><![CDATA[<p><img style="display: block; margin-left: auto; margin-right: auto;" src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/08/iStock_000002827883XSmall.jpg" border="0" alt="iStock_000002827883XSmall.jpg" width="425" height="282" /></p>
<table width=100% align=center>
<tbody>
</tbody>
</table>
<p> </p>
<p><span style="font-size: 14px;">I had the opportunity recently to visit one of our <a href="http://www.olsdallas.com">OLS.Switch</a> customer’s retail locations. This particular customer doesn&#8217;t have a presence in the region that I work in, so I was very excited to Swipe my Card.  Probably too excited, actually, because I think I explained every line of the receipt, including the myriad of transactions that occurred, the number of message formats, transaction types, database entities, application logic, and network connections to various internal and external endpoints to my wife, who after twenty minutes didn&#8217;t share the same level of enthusiasm that I maintained throughout the conversation. </span></p>
<p>
<p><span style="font-size: 14px;">It is always fun to know what happens &#8220;inside the box&#8221; and that which seems magical to others. When I started my career at a small Third party processor this exercise was quite common, after we did system maintenance in the middle of the early morning, we would drive to the nearest corner store or gas station to test our issuing systems and connections via performing transactions on cards that we issued for.  We even got to reward ourselves with transaction amounts over $25, as we couldn&#8217;t allow Stand-In-Processing to approve these transactions, we wanted to ensure that our Issuing system authorized these transactions. </span></p>
<p>
<p style="font-size: 14px;">It is even more exciting to have taken part in the design, development and implementation of a given transaction. The exhilaration continues when you realize that I&#8217;m only 1 of about 5 million transactions per day that our software powers here.</p>
<p><p style="font-size: 14px;">Let&#8217;s do a walkthrough of the transaction that I performed:</p>
<p style="font-size: 14px;">
<p><span style="font-size: medium;">Cashier:  Hi, Welcome. Are you enrolled in our ________ rewards program ? </span></p>
<p>Me: Yes, I don&#8217;t have my card &#8211; can you lookup by phone number ?<span style="font-family: arial, sans-serif; font-size: small;"> ﻿</span></p>
<p><span style="font-family: arial, sans-serif; font-size: small;"> </span>Cashier:  Sure  &lt;Enters in number that I provide&gt;</p>
<p><em><strong>Transaction #1 : Loyalty Card Lookup based on Phone Number also includes my point balance, level </strong></em></p>
<p>Cashier: Can you confirm your address ?,great, that&#8217;s you. Your total is $ xx.xx , Debit or Credit ?</p>
<p><span style="font-family: arial, sans-serif; font-size: small;"> </span></p>
<p>Me:  &lt;Swipes my Mastercard &gt;</p>
<p><em><strong>Transaction #2 : Transaction Market Basket Analysis, Discount calculation, interfacing to an Offering Engine, Serializing of Coupons to print on receipt for future usage and coupon validation requests. </strong></em></p>
<p><em><strong><span style="font-style: normal; font-weight: normal;"><em><strong>Transaction #3 : Credit Card Authorization </strong></em></span><br /></strong></em></p>
<p>Cashier: Thank you very much for shopping at _______, By using your _________ card you saved $ x.xx, Hope you have a nice day.</p>
<p>Me: Thank you and running outside to share the exiting world of transaction processing to my wife.</p>
<p> </p>
<p><span style="font-size: 14px;">The 20 mintues that followed including me discussing the following.</span><br /><span style="font-family: arial, sans-serif; font-size: small;"> </span></p>
<ul>
<li><span style="font-size: 14px;">The finer points of Loyalty Card Lookups, including how to return a list of cards, and how to address multiple requests as the cashier scrolls to fetch the next batch of card numbers for folks with common names, the challenges of either cardholders or cashiers using common phone numbers. </span></li>
<li><span style="font-size: medium;"><span style="font-size: 14px;">Card Type and BIN Based Routing to external endpoints and message translation from one interface to another</span></span></li>
<li><span style="font-size: medium;"><span style="font-size: 14px;">Sending large transaction requests with detailed shopping cart detail.</span></span></li>
<li><span style="font-size: medium;"><span style="font-size: 14px;">Algorithms to generate coupon numbers that are difficult to be abused by coupon generation scripts.</span></span></li>
<li><span style="font-size: medium;"><span style="font-size: 14px;">Substitution logic and the template engine to display various messages and transaction variable on to cashier receipts.</span></span></li>
<li><span style="font-size: medium;"><span style="font-size: 14px;">The various batch jobs and processes that are ran to import, extract various data to support the processes.</span></span></li>
</ul>
<p> </p>
<p>Just another day in the life of payment application software developer.</p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p> </p>
<p style="margin: 0.0px 0.0px 0.0px 0.0px; font: 12.0px Helvetica;"><span style="letter-spacing: 0.0px;"><br /></span></p>
<p> </p>
<p> </p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/_F-99seTSY0" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/08/29/swiping-the-card-at-a-customers-location/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/08/29/swiping-the-card-at-a-customers-location/</feedburner:origLink></item>
		<item>
		<title>Measuring External Duration of Endpoints</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/U0hvqAgNFkk/</link>
		<comments>http://www.paymentsystemsblog.com/2010/04/10/measuring-external-duration-of-endpoints/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 13:24:05 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/?p=678</guid>
		<description><![CDATA[
We performed load testing a of new application with a client recently and a recurring question repeatedly came up: &#8220;How long was the transaction in  OLS.Switch and how long was it at the endpoint ?&#8221;
It is an important question &#8211; one that is used to monitor application performance as well as to assist in [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/04/stopwatch.jpeg" alt="stopwatch.jpeg" border="0" style="margin: 5px; padding: 5px;0" width="87px" height="118px" align="left" /></p>
<p>We performed load testing a of new application with a client recently and a recurring question repeatedly came up: &#8220;How long was the transaction in  <a href="http://www.olsdallas.com">OLS.Switch</a> and how long was it at the endpoint ?&#8221;</p>
<p>It is an important question &#8211; one that is used to monitor application performance as well as to assist in troubleshooting purposes &#8211; and one we can clearly answer &#8211; the transaction took &#8211; a total of 5.6 seconds &#8211; and we waited up to our configured endpoint timeout of 5 seconds before we timed-out the transaction.  Or &#8211; the transaction took 156 ms &#8211;  26 ms of those against a local response simulator.</p>
<p>In our application we use a <a href="http://jpos.svn.sourceforge.net/viewvc/jpos?view=rev&#038;revision=2704">profiler</a> to trace execution time of each of our Transaction Participants: In which we see in our application logs as:</p>
<h5>A normal transaction:</h5>
<pre  name="code" class="java">
<profiler>
  open [0/0]
  parse-request [7/7]
  create-*******-tranlog [9/16]
  populate-********-tranlog [1/17]
  validate-********* [42/59]
  validate-********* [1/60]
  validate-******** [0/60]
  create-*********-request [24/84]
  query-****** [26/110]
  prepare-**********-response [40/150]
  close [6/156]
  send-response [0/156]
  end [157/157]
</profiler>
</pre>
<h5>A timed-out transaction:</h5>
<pre  name="code" class="java">
<profiler>
  open [2/2]
  parse-request [23/25]
  create-*******-tranlog [91/116]
  populate-*******-tranlog [1/117]
  validate-******* [67/184]
  validate-*******-card [31/215]
  validate-************** [1/216]
  create-********-request [32/248]
  query-******* [5000/5248]
  prepare-***********-response [67/5315]
  close [284/5599]
  send-response [0/5599]
  end [5600/5600]
</profiler>
</pre>
<p><em>(* note these traces are from a test app running on my macbook and are for illustrative purposes only *)</em></p>
<p>While we can answer the question by reviewing application logs &#8211; it is harder to perform any analysis on a series of transactions, specifically for external duration. We can do currently for total duration, however &#8211; this is valuable from the device perspective for how long a transaction took to process.</p>
<p>
Logging the external duration along with our total duration for switched-out transactions and we now have:</p>
<p><img src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/04/duration.png" alt="duration.png" align="center" border="0" width="155" height="642" /></p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/U0hvqAgNFkk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/04/10/measuring-external-duration-of-endpoints/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/04/10/measuring-external-duration-of-endpoints/</feedburner:origLink></item>
		<item>
		<title>OLS is PCI Compliant</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/oaHlORDpf_s/</link>
		<comments>http://www.paymentsystemsblog.com/2010/03/25/ols-is-pci-compliant/#comments</comments>
		<pubDate>Thu, 25 Mar 2010 12:06:30 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/?p=670</guid>
		<description><![CDATA[






Just a short note to share that OLS has received word from our QSA via a &#8220;PCI Certificate of Validation&#8221; Letter for our newly launched hosted payment service offering OLS.Host.
Congrats to our Operations, Systems and Security Gurus for all of their hard work on this !
]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td>
<img src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/03/PCI.gif" alt="PCI.gif" border="0" width="341" height="109" />
</td>
</tr>
</table>
<p>Just a short note to share that <a href="http://www.olsdallas.com">OLS</a> has received word from our QSA via a &#8220;PCI Certificate of Validation&#8221; Letter for our newly launched hosted payment service offering OLS.Host.</p>
<p>Congrats to our Operations, Systems and Security Gurus for all of their hard work on this !</p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/oaHlORDpf_s" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/03/25/ols-is-pci-compliant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/03/25/ols-is-pci-compliant/</feedburner:origLink></item>
		<item>
		<title>PIN Block Formats – The Basics</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/7QxI0Wbm2CQ/</link>
		<comments>http://www.paymentsystemsblog.com/2010/03/03/pin-block-formats/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 16:02:19 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[ATM]]></category>
		<category><![CDATA[PIN]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2010/03/03/pin-block-formats/</guid>
		<description><![CDATA[I had a call yesterday about approved TG-3 (Which is now called TR-39 ) ANSI PIN Block Formats.
The TR-39 Audit Procedures state that ISO 9564–1 Format 0 (ISO-0) and Format 3 (ISO-3) are the only approved formats:
4.1.3 X9 Approved PIN Block Formats

Documented procedures exist and are followed that ensure any cleartext PIN-block format combined with [...]]]></description>
			<content:encoded><![CDATA[<p>I had a call yesterday about approved <a href="http://www.x9.org/standards/free/">TG-3</a> (Which is now called TR-39 ) ANSI PIN Block Formats.</p>
<p>The TR-39 Audit Procedures state that ISO 9564–1 Format 0 (ISO-0) and Format 3 (ISO-3) are the only approved formats:</p>
<blockquote><p><em>4.1.3 </em><span style="-webkit-text-decorations-in-effect: underline;"><em>X9 Approved PIN Block Formats</em></span><em><br />
</em></p>
<p class="MsoNormal" style="margin-bottom: 6.0pt;"><em>Documented procedures exist and are followed that ensure any cleartext PIN-block format combined with a PIN encryption process has the characteristic that, for different accounts, encryption of the same PIN value under a given encryption key does not predictably produce the same encrypted result. (Note: any cleartext PIN block, formats 0 and 3 meet this requirement, as specified in X9.8-1).</em></p>
<p><span style="font-size: 10.0pt; font-family: Arial;"><em>Reference X9.8-1 &#8211; Sec. 4(c), Sec. 6.2, Sec. 8.3.1, Sec.8.3.2, and Sec. 8.3.5</em></span><!--EndFragment--></p></blockquote>
<p>In case you are curious here are <a href="http://usa.visa.com/merchants/risk_management/cisp_pin_security.html">Visa&#8217;s PIN Security Requirements</a></p>
<blockquote><p><em>Requirement 3:<br />
</em></p>
<p><em>For online interchange transactions, PINs are only encrypted using ISO 9564–1 PIN block formats 0, 1 or 3. Format 2 must be used for PINs that are submitted from the IC card reader to the IC card. Other ISO approved formats may be used.</em></p></blockquote>
<p>This requirement further states:</p>
<blockquote><p><em>PINs enciphered using ISO format 0 or ISO format 3 must not be translated into any other PIN block format other than ISO format 0 or ISO format 3. PINs enciphered using ISO format 1 may be translated into ISO format 0 or ISO format 3,</em> <strong><em>but must not be translated back into ISO format 1.</em></strong></p></blockquote>
<p>(This last paragraph addresses an attack on Pin Blocks that can be translated in to format 1 on a HSM which would expose the clear PIN)</p>
<p><strong><br />
</strong></p>
<h3><strong>Let&#8217;s take a look at a few Pin Block formats:</strong></h3>
<p>For our examples:</p>
<p>P &#8211; PIN Number</p>
<p>F &#8211; Hex 0xF</p>
<p>A- Last 12 digits of PAN not including check digit</p>
<p>R &#8211; Random Hex Character (0-9, A-F)</p>
<p>Let us use the account number 4111111111111111 and PIN Number 1234 (examples use a PIN Length of 4 but could be 4-12 digits)</p>
<h3><strong>&#8220;Pin Pad&#8221; format or IBM 3624</strong></h3>
<p><em>PPPP FFFF FFFF FFFF</em></p>
<p>our Pin Block</p>
<p>1234 FFFF FFFF FFFF</p>
<p>Notes: Not allowed and is an old legacy method &#8211; not approved to be used.</p>
<h3><strong>ISO-0</strong></h3>
<p><strong><span style="font-weight: normal;"><em>04PP PPFF FFFF FFFF   (0 = ISO-0 Format, 4 = length of PIN)</em></span></strong></p>
<p><em>XOR with<br />
</em></p>
<p><strong><span style="font-weight: normal;"><em>0000 AAAA AAAA AAAA (Formatted PAN)</em></span><br />
</strong></p>
<p>our Pin Block:</p>
<p>0412 34FF FFFF FFFF</p>
<p>XOR</p>
<p>0000 1111 1111 1111</p>
<p>=</p>
<p>0412 25EE EEEE EEEE</p>
<p>Notes: Introduces variability in the PIN block by XOR&#8217;ing with a Formatted PAN &#8211; Best practice is to use ISO-3 instead of ISO-0 as there are attacks against ISO-0</p>
<h3><strong>ISO-1</strong></h3>
<p><strong><span style="font-weight: normal;"><em>1412 34RR RRRR RRRR</em></span> <span style="font-weight: normal;"><em>(1 = ISO-0 Format, 4 = length of PIN)</em></span><br />
</strong></p>
<p>our Pin Block:</p>
<p><strong><span style="font-weight: normal;">1412 348D 665A C5A3</span><br />
</strong></p>
<p><strong><span style="font-weight: normal;">Notes: Introduces variability in the PIN block by using Random padding chars &#8211; Best practice is not to allow HSM&#8217;s to accept or use this PIN Block format. Not allowed by TR-39 but is VISA.</span><br />
</strong></p>
<h3><strong>ISO-3</strong></h3>
<p><em>34PP PPRR RRRR RRRR (3 = ISO-3 Format, 4 = length of PIN)<br />
</em></p>
<p><em>XOR with<br />
</em></p>
<p><strong><span style="font-weight: normal;"><em>0000 AAAA AAAA AAAA (Formatted PAN)</em></span></strong></p>
<p><strong><span style="font-weight: normal;">our Pin Block:</span><br />
</strong></p>
<p>3412 34C8 CBA4 285C</p>
<p>XOR</p>
<p>0000 1111 1111 1111</p>
<p>=</p>
<p>3412 25D9 dAB5 394D</p>
<p>Notes: Introduces variability in the PIN block by using Random padding chars and  by XOR&#8217;ing with a Formatted PAN &#8211; Best practice is to use this format.</p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/7QxI0Wbm2CQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/03/03/pin-block-formats/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/03/03/pin-block-formats/</feedburner:origLink></item>
		<item>
		<title>Sales Employment Opportunity Here</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/25XHWmkfTUw/</link>
		<comments>http://www.paymentsystemsblog.com/2010/03/03/sales-employment-opportunity-here/#comments</comments>
		<pubDate>Wed, 03 Mar 2010 15:08:03 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2010/03/03/sales-employment-opportunity-here/</guid>
		<description><![CDATA[
OLS is in the market for a sales representative.
Please refer to our LinkedIn job posting for more details.
]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/03/201003030904.jpg" width="180" height="120" alt="201003030904.jpg" style="float:left; margin-top:5px; margin-right:5px; margin-bottom:5px; margin-left:5px; padding-top:10px; padding-right:10px; padding-bottom:10px; padding-left:10px;" /></p>
<p>OLS is in the market for a sales representative.</p>
<p>Please refer to <a href="http://www.linkedin.com/jobs?viewJob=&amp;jobId=881253">our LinkedIn job posting</a> for more details.</p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/25XHWmkfTUw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/03/03/sales-employment-opportunity-here/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/03/03/sales-employment-opportunity-here/</feedburner:origLink></item>
		<item>
		<title>CaseSwitch – Source Port Routing</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/Za9tHw-ZoXI/</link>
		<comments>http://www.paymentsystemsblog.com/2010/03/02/caseswitch-source-port-routing/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 17:45:52 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2010/03/02/caseswitch-source-port-routing/</guid>
		<description><![CDATA[We have implemented a new component to our Java and jPOS fueled Payment Switch &#8211; OLS.Switch which we have called the CaseSwitch. The vast majority of our switching algorithms are based on either the determination of CardType &#8211; which dictates which outbound endpoint we send that transaction to, or on Card Bin Ranges.
An example of [...]]]></description>
			<content:encoded><![CDATA[<p><a title="We" href="http://www.olsdallas.com">We</a> have implemented a new component to our <a title="Java" href="http://java.com/en/">Java</a> and <a href="http://www.jpos.org">jPOS</a> fueled Payment Switch &#8211; <a title="OLS.Switch" href="http://www.olsswitch.com">OLS.Switch</a> which we have called the CaseSwitch. The vast majority of our switching algorithms are based on either the determination of CardType &#8211; which dictates which outbound endpoint we send that transaction to, or on Card Bin Ranges.</p>
<p><strong>An example of a Bin Range:</strong></p>
<table>
<tr>
<td>
<p style="text-align: center;"><img class="aligncenter" src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/03/BinRanges.png" alt="BinRanges.png" width="480" height="281" /></p>
</td>
</tr>
</table>
<p>
If a CardNumber&#8217;s Bin or IIN &#8211; matches our Bin Range configurations &#8211; We will select the appropriate EndPoint. In this example if we have a VISA or MC Card we switch it out to a FDR Gateway. If we were connecting to a to MasterCard MIP or Visa VAP or DEX then we would have a MC and VISA EndPoint defined with our BankNet and VisaNet interfaces and switch the transactions to those endpoints.</p>
<p><strong>An example of a Card Type:</strong></p>
<p>We have certain transaction types that we know where they go because of their Card Type &#8211; Many of these are internal authorization hosts such as implementations of Authorized Returns, MethCheck, Loyalty, Couponing. Others are transactions where the transaction type also dictates the card type &#8211; such as those to GreenDot, InComm and other external hosts where a BIN Range lookup is unnecessary.</p>
<p><strong>Source (Port) Based Routing</strong></p>
<p>We recently had a requirement for Source-Based Routing &#8211; where depending on the source port that would dictate the outbound transaction path(s).</p>
<p>In our Server we accept the incoming transaction and then place a Context varaible we call PORT that tells us which Server Port the transaction came in on. One we have that additional data we can perform a Logic Branch in our Transaction Manager that looks like this.</p>
<p>This allows us to define transaction paths based on the incoming port of the server, so in this example.</p>
<pre><strong>&lt;participant class=”com.ols.switch.CaseSwitch” logger=”Q2″ realm=”Switch”&gt;
&lt;property name=”switch” value=”PORT” /&gt;
&lt;property name=”case 5001" value=”LookUpResponse Log Close Send Debug” /&gt;
&lt;property name=”case 5002" value=”QueryRemoteHost_xxx Log Close Send Debug” /&gt;
&lt;property name=”case 5005" value=”QueryRemoteHost_yyy Log Close Send Debug” /&gt;
&lt;property name=”default” value=”Log Close Debug” /&gt;
&lt;/participant&gt;</strong></pre>
<p>Port 5001 &#8211; we perform an authorization locally</p>
<p>Port 5002 &#8211; we switch out the transaction and reformat it to endpoint xxx &#8211; message format and interchanges requirements.</p>
<p>Port 5005 &#8211; we switch out the transaction and reformat it to endpoint yyy &#8211; message format and interchanges requirements.</p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/Za9tHw-ZoXI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/03/02/caseswitch-source-port-routing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/03/02/caseswitch-source-port-routing/</feedburner:origLink></item>
		<item>
		<title>Signed Overpunch or Zoned Decimal or what are these weird characters in numeric fields ???</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/1m6RspCxlvg/</link>
		<comments>http://www.paymentsystemsblog.com/2010/02/24/signed-overpunch-or-zoned-decimal-or-what-are-these-weird-characters-in-numeric-fields/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 16:50:05 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2010/02/24/signed-overpunch-or-zoned-decimal-or-what-are-these-weird-characters-in-numeric-fields/</guid>
		<description><![CDATA[
We interface to many different systems and sometimes we get to talk to IBM Mainframes or message formats that uses Signed Overpunch
Where we see numberic values like &#8220;100000{&#8221; , &#8220;100999I&#8221;, or &#8220;100495N&#8221;
Signed Overpunch is used in order to save a byte the last character can indicate both sign (+ / -) and value.
These types are [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.paymentsystemsblog.com/wp-content/uploads/2010/02/cobol.jpg" width="90" height="139" alt="cobol.jpg" style="float:left; margin-right:10px; margin-left:10px; padding-right:10px; padding-bottom:10px;" /></p>
<p><a href="http:/www.olsdallas.com">We</a> interface to many different systems and sometimes we get to talk to IBM Mainframes or message formats that uses <a href="http://en.wikipedia.org/wiki/Signed_overpunch">Signed Overpunch</a></p>
<p>Where we see numberic values like &#8220;100000{&#8221; , &#8220;100999I&#8221;, or &#8220;100495N&#8221;</p>
<p>Signed Overpunch is used in order to save a byte the last character can indicate both sign (+ / -) and value.</p>
<p>These types are defined in COBOL Copybook this looks like:</p>
<p>S9(3)V9(4);</p>
<p>which equate to :</p>
<p>100000{ = 100.0000</p>
<p>100999I = 100.9999</p>
<p>100495N = -100.4955</p>
<p>Here is a snippet of Java Code that we use to handle this:</p>
<pre  name="code" class="java">
    public static final char[] gt_0 = {
        '{', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I'
    };
    public static final char[] lt_0 = {
        '}', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R'
    };

   protected static String convertToCobolSignedString (String aString) {
        int aInt = Integer.parseInt(aString);
        char[] conv = (aInt >= 0) ? gt_0 : lt_0;
        int lastChar = (int) aInt % 10;
        StringBuffer sb = new StringBuffer (Integer.toString(aInt));
        sb.setCharAt (sb.length()-1, conv[lastChar]);
        return sb.toString();
    }
</pre>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/1m6RspCxlvg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2010/02/24/signed-overpunch-or-zoned-decimal-or-what-are-these-weird-characters-in-numeric-fields/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2010/02/24/signed-overpunch-or-zoned-decimal-or-what-are-these-weird-characters-in-numeric-fields/</feedburner:origLink></item>
		<item>
		<title>Velocity Manager and Velocity Profiles</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/y13j2CBmLhY/</link>
		<comments>http://www.paymentsystemsblog.com/2009/11/24/velocity-manager-and-velocity-profiles/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 22:32:36 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2009/11/24/velocity-manager-and-velocity-profiles/</guid>
		<description><![CDATA[I recently put together a document that describes our Issuer implementation of Transaction Velocity Checks during the authorization process. We use a facility called the Velocity Manager to implement authorization rules that are based on frequency of transactions over a given time period. Velocity profiles can be used to implement extensible velocity-based logic.


Here is the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently put together a document that describes <a href="http://www.olsdallas.com/">our</a> Issuer implementation of Transaction Velocity Checks during the authorization process. <span style="font-family: Arial; line-height: 18px;">We use a facility called the Velocity Manager to implement authorization rules that are based on frequency of transactions over a given time period. Velocity profiles can be used to implement extensible velocity-based logic.</span></p>
<p><!--StartFragment--><br />
<!--EndFragment--></p>
<p>Here is the data-structure that defines our Velocity Limits:</p>
<table align="center">
<tbody>
<tr>
<td>
<p>
        <img src="http://www.paymentsystemsblog.com/wp-content/uploads/2009/11/Velocity-Profile.png" width="480" height="352" alt="Velocity Profile.png" /></p>
</td>
</tr>
</tbody>
</table>
<p>Here is a snapshot of a configured Velocity Limit based on Accumulated Transaction Amounts:</p>
<table align="center">
<tbody>
<tr>
<td></td>
</tr>
<tr>
<td>
<p>
        <img src="http://www.paymentsystemsblog.com/wp-content/uploads/2009/11/500-limit.png" width="412" height="480" alt="500 limit.png" /></p>
</td>
</tr>
</tbody>
</table>
<p>Here is a snapshot of a configured Velocity Limit based on Transaction Counts over a given period:</p>
<table align="center">
<tbody>
<tr>
<td></td>
</tr>
<tr>
<td>
<p>
        <img src="http://www.paymentsystemsblog.com/wp-content/uploads/2009/11/10-txns.png" width="408" height="480" alt="10 txns.png" /></p>
</td>
</tr>
</tbody>
</table>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/y13j2CBmLhY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2009/11/24/velocity-manager-and-velocity-profiles/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2009/11/24/velocity-manager-and-velocity-profiles/</feedburner:origLink></item>
		<item>
		<title>Continuous integration</title>
		<link>http://feedproxy.google.com/~r/PaymentSystemsBlog/~3/zjiqnwV2pss/</link>
		<comments>http://www.paymentsystemsblog.com/2009/11/24/continuous-integration/#comments</comments>
		<pubDate>Tue, 24 Nov 2009 15:29:04 +0000</pubDate>
		<dc:creator>db</dc:creator>
				<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://www.paymentsystemsblog.com/2009/11/24/continuous-integration/</guid>
		<description><![CDATA[Testing acquirer side implementations are hard. The incoming message formats and communication protocols from the card acceptors ( Payment Terminals, Point-of-Sale Machines, Store Controllers) are known and the endpoint&#8217;s message formats and communication protocols are also known. The challenge is testing and validating the translated incoming messages to various outbound endpoints, their communication protocols and [...]]]></description>
			<content:encoded><![CDATA[<p>Testing acquirer side implementations are hard. The incoming message formats and communication protocols from the card acceptors ( Payment Terminals, Point-of-Sale Machines, Store Controllers) are known and the endpoint&#8217;s message formats and communication protocols are also known. The challenge is testing and validating the translated incoming messages to various outbound endpoints, their communication protocols and message formats. Some end-points provide simulators (very very few) others will allow test access over leased lines and communication equipment over a separate test ip/port combination. This works well for our customers to perform user acceptance and certification -to these endpoints &#8211; this isn&#8217;t viable for regression and testing during phases and development before code delivery. We have solved some of this with various custom build response simulators that have basic logic &#8211; typically transaction amount prompted to provide alternating response messages. These response messages are built from message specs or are built from captured network traffic on test systems. We can only be sure we are simulating basic transaction types and request and response channels, however. Oh, and then there is always <a href="http://jpos.org/blog/2006/06/bcfh/">this</a> problem.</p>
<p>Issuer side implementations are easier test &#8211; you can feed into the authorization host both simulated network and local transaction sets to test implemented authorization rules and other features.</p>
<table align="center">
<tbody>
<tr>
<td>
<p><img src="http://www.paymentsystemsblog.com/wp-content/uploads/2009/11/testing.jpg" width="420" height="288" alt="testing.jpg" style="margin-top:10px; margin-right:10px; margin-bottom:10px; margin-left:10px; padding-top:10px; padding-right:10px; padding-bottom:10px; padding-left:10px; border:1px #000000 dotted;" /></p>
</td>
</tr>
</tbody>
</table>
<p>In 2009 <a href="http://olsdallas.com/">we</a> built and launched a new Issuing Payment Switch and tested it using <a href="http://en.wikipedia.org/wiki/Continuous_Integration">Continuous Integration</a> techniques. This system has 3 primary interfaces.</p>
<ol>
<li>Network &#8211; connected to an association&#8217;s network to recieve incoming transactions based on BIN ranges.</li>
<li>Local &#8211; Card Management style interface &#8211; Manage Cardholder, Cards, and Accounts on the system &#8211; and allow local transaction sets to be performed.</li>
<li>Flat File generation: Authorized File, Financial File, and a Card Status and Balances File. Flat file processing &#8211; clearing/settlement/reconciliation files.</li>
</ol>
<p><a href="http://www.martinfowler.com/articles/continuousIntegration.html">Continuous Integration</a> as defined by Martin Fowler:</p>
<p><i>Continuous Integration is a software development practice where members of a team integrate their work frequently, usually each person integrates at least daily &#8211; leading to multiple integrations per day. Each integration is verified by an automated build (including test) to detect integration errors as quickly as possible. Many teams find that this approach leads to significantly reduced integration problems and allows a team to develop cohesive software more rapidly. This article is a quick overview of Continuous Integration summarizing the technique and its current usage.</i></p>
<p>CI&#8217;s general steps:</p>
<ol>
<li>Maintain a code repository</li>
<li>Automate the build</li>
<li>Make the build self-testing</li>
<li>Everyone commits every day</li>
<li>Every commit (to mainline) should be built</li>
<li>Keep the build fast</li>
<li>Test in a clone of the production environment</li>
<li>Make it easy to get the latest deliverables</li>
<li>Everyone can see the results of the latest build</li>
<li>Automate Deployment</li>
</ol>
<p>
Our CI model is based on an implementation that is scheduled multiple times a day &#8211; It checks out the code from our software repository, compiles it, builds a new database and schema and required setup data, starts our software services up &#8211; performs unit tests, shutdown the software services, and we receive an email and attachments that tell us if the code compiled and the results of the unit tests and which ones were successful and unsuccessful. The email attachments we receive contain the run log zipped of the transactions, and a unit test report.<br />
Our Unit tests are written using the <a href="http://groovy.codehaus.org/">Groovy</a> Programming Language and we leverage the <a href="http://testng.org/doc/index.html">TestNG</a> testing framework. We act as a network client to our switch which was built and ran from the current source, and perform both Network and Local Side testing. The system is also setup using some of the Local Transaction sets, Here is a short list of a few of the transaction types:<br />
Local:</p>
<ul>
<li>Add Cardholder</li>
<li>Add Card</li>
<li>Add Account</li>
<li>Debit Account (Load Funds)</li>
<li>Set Cardholder/Card/Account Status (Active/Lost/Stolen/Suspended/etc)</li>
<li>Local Debit and Credits</li>
<li>Balance Inquiry</li>
<li>Expire Authorization</li>
<li>View Transaction History</li>
</ul>
<p>Network:</p>
<ul>
<li>Authorization</li>
<li>Completions</li>
<li>Chargebacks</li>
<li>Representments</li>
<li>Force Posts</li>
<li>Returns</li>
<li>Reverals</li>
</ul>
<p>
The combination of local and network transaction types are tested against various test cases.<br />
If we setup a Cardholder with AVS information and run an AVS Authorization &#8211; do we get the expected results, and for each AVS result code ? Does an authorization on a statused card get approved ? Do transactions with amounts greater then, equal to, or less then the cardholder&#8217;s available balance get authorized or declined properly ? Authorization on a Card not Found ? You get the idea.<br />
We build and test our issuer platform a few times a day &#8211; each developer can also run the test suite locally on their development environment, this ensures that future changes doesn&#8217;t impact existing functionality. On a test failure &#8211; relevant information in included in the autotest emails so issue discovery can be identified by our business analysts and developers without logging into test systems.<br />
Oh, and Please don&#8217;t break the build <img src='http://www.paymentsystemsblog.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p></p>
<img src="http://feeds.feedburner.com/~r/PaymentSystemsBlog/~4/zjiqnwV2pss" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.paymentsystemsblog.com/2009/11/24/continuous-integration/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.paymentsystemsblog.com/2009/11/24/continuous-integration/</feedburner:origLink></item>
	</channel>
</rss>
