15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "rlz/lib/crc8.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// The CRC lookup table used for ATM HES (Polynomial = 0x07).
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// These are 256 unique 8-bit values.
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const unsigned char kCrcTable[256] = {
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x00, 0x07, 0x0E, 0x09, 0x1C, 0x1B, 0x12, 0x15,
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x38, 0x3F, 0x36, 0x31, 0x24, 0x23, 0x2A, 0x2D,
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x70, 0x77, 0x7E, 0x79, 0x6C, 0x6B, 0x62, 0x65,
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x48, 0x4F, 0x46, 0x41, 0x54, 0x53, 0x5A, 0x5D,
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xE0, 0xE7, 0xEE, 0xE9, 0xFC, 0xFB, 0xF2, 0xF5,
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xD8, 0xDF, 0xD6, 0xD1, 0xC4, 0xC3, 0xCA, 0xCD,
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x90, 0x97, 0x9E, 0x99, 0x8C, 0x8B, 0x82, 0x85,
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xA8, 0xAF, 0xA6, 0xA1, 0xB4, 0xB3, 0xBA, 0xBD,
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xC7, 0xC0, 0xC9, 0xCE, 0xDB, 0xDC, 0xD5, 0xD2,
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xFF, 0xF8, 0xF1, 0xF6, 0xE3, 0xE4, 0xED, 0xEA,
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xB7, 0xB0, 0xB9, 0xBE, 0xAB, 0xAC, 0xA5, 0xA2,
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x8F, 0x88, 0x81, 0x86, 0x93, 0x94, 0x9D, 0x9A,
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x27, 0x20, 0x29, 0x2E, 0x3B, 0x3C, 0x35, 0x32,
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x1F, 0x18, 0x11, 0x16, 0x03, 0x04, 0x0D, 0x0A,
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x57, 0x50, 0x59, 0x5E, 0x4B, 0x4C, 0x45, 0x42,
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x6F, 0x68, 0x61, 0x66, 0x73, 0x74, 0x7D, 0x7A,
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x89, 0x8E, 0x87, 0x80, 0x95, 0x92, 0x9B, 0x9C,
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xB1, 0xB6, 0xBF, 0xB8, 0xAD, 0xAA, 0xA3, 0xA4,
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xF9, 0xFE, 0xF7, 0xF0, 0xE5, 0xE2, 0xEB, 0xEC,
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xC1, 0xC6, 0xCF, 0xC8, 0xDD, 0xDA, 0xD3, 0xD4,
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x69, 0x6E, 0x67, 0x60, 0x75, 0x72, 0x7B, 0x7C,
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x51, 0x56, 0x5F, 0x58, 0x4D, 0x4A, 0x43, 0x44,
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x19, 0x1E, 0x17, 0x10, 0x05, 0x02, 0x0B, 0x0C,
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x21, 0x26, 0x2F, 0x28, 0x3D, 0x3A, 0x33, 0x34,
365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x4E, 0x49, 0x40, 0x47, 0x52, 0x55, 0x5C, 0x5B,
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x76, 0x71, 0x78, 0x7F, 0x6A, 0x6D, 0x64, 0x63,
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x3E, 0x39, 0x30, 0x37, 0x22, 0x25, 0x2C, 0x2B,
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x06, 0x01, 0x08, 0x0F, 0x1A, 0x1D, 0x14, 0x13,
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xAE, 0xA9, 0xA0, 0xA7, 0xB2, 0xB5, 0xBC, 0xBB,
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0x96, 0x91, 0x98, 0x9F, 0x8A, 0x8D, 0x84, 0x83,
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xDE, 0xD9, 0xD0, 0xD7, 0xC2, 0xC5, 0xCC, 0xCB,
435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  0xE6, 0xE1, 0xE8, 0xEF, 0xFA, 0xFD, 0xF4, 0xF3
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace anonymous
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace rlz_lib {
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Crc8::Generate(const unsigned char *data, int length,
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                    unsigned char* check_sum) {
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!check_sum)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *check_sum = 0;
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // The inital and final constants are as used in the ATM HEC.
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned char kInitial = 0x00;
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  static const unsigned char kFinal = 0x55;
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char crc = kInitial;
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  for (int i = 0; i < length; ++i) {
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    crc = kCrcTable[(data[i] ^ crc) & 0xFFU];
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *check_sum =  crc ^ kFinal;
695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)bool Crc8::Verify(const unsigned char* data, int length,
735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                  unsigned char check_sum, bool* matches) {
745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!matches)
755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *matches = false;
785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!data)
795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  unsigned char calculated_crc;
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  if (!Generate(data, length, &calculated_crc))
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    return false;
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  *matches = check_sum == calculated_crc;
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  return true;
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace rlz_lib
91