// Copyright (c) 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "chrome/browser/autofill/validation.h" #include "base/string_util.h" #include "chrome/browser/autofill/credit_card.h" namespace autofill { bool IsValidCreditCardNumber(const string16& text) { string16 number = CreditCard::StripSeparators(text); // Credit card numbers are at most 19 digits in length [1]. 12 digits seems to // be a fairly safe lower-bound [2]. // [1] http://www.merriampark.com/anatomycc.htm // [2] http://en.wikipedia.org/wiki/Bank_card_number const size_t kMinCreditCardDigits = 12; const size_t kMaxCreditCardDigits = 19; if (number.size() < kMinCreditCardDigits || number.size() > kMaxCreditCardDigits) return false; // Use the Luhn formula [3] to validate the number. // [3] http://en.wikipedia.org/wiki/Luhn_algorithm int sum = 0; bool odd = false; for (string16::reverse_iterator iter = number.rbegin(); iter != number.rend(); ++iter) { if (!IsAsciiDigit(*iter)) return false; int digit = *iter - '0'; if (odd) { digit *= 2; sum += digit / 10 + digit % 10; } else { sum += digit; } odd = !odd; } return (sum % 10) == 0; } bool IsValidCreditCardSecurityCode(const string16& text) { if (text.size() < 3U || text.size() > 4U) return false; for (string16::const_iterator iter = text.begin(); iter != text.end(); ++iter) { if (!IsAsciiDigit(*iter)) return false; } return true; } } // namespace autofill