/** * Determine if this is or is not a credit card number. * Return 1 if it is, 0 if it is not. * buf[-WINDOW_MARGIN] must be accessible. * buf[len+WINDOW_MARGIN] must be accessible */ bool valid_ccn(const char *buf,int buflen) { /* Make the digits array */ if(buflen>19) RETURN(0,"Too long"); char digits[20]; // just the digits memset(digits,0,sizeof(digits)); if(extract_digits_and_test(buf,buflen,digits)) RETURN(0,"failed nondigit count"); if(prefix_test(digits)) RETURN(0,"failed prefix test"); if(ccv1_test(digits)) RETURN(0,"failed ccv1 test"); if(pattern_test(digits)) RETURN(0,"failed pattern test"); if(histogram_test(digits)) RETURN(0,"failed histogram test"); int before_window = 4; // what we care about before int after_window = 4; // what we care about before /* If the 4 characters before or after are hex digits but not decimal digits, * then this is probably not a credit card number. * We're probably instead in a sea of hex. So abort. */ if(only_hex_digits(buf-before_window,before_window) && !only_dec_digits(buf-before_window,before_window)){ RETURN(0,"failed before hex test"); } if(only_hex_digits(buf+buflen,after_window) && !only_dec_digits(buf+buflen,after_window)){ RETURN(0,"failed after hex test"); } return 1; }
static ssize_t set_test_pattern(struct device *dev, struct device_attribute *attr, const char *buf, size_t size) { ssize_t ret = -EINVAL; int test; if(sscanf(buf, "%d",&test) !=1){ printk("[PMIC K-PJT] bad arguments "); } ret = size; pattern_test(test); return ret; }
static int validate_ccn_debug(const char *buf,int buflen) { char digits[64]; printf("running tests. 0 means passed, -1 means failed.\n\n"); printf("nondigit_test(%s) = %d\n",buf,extract_digits_and_test(buf,buflen,digits)); printf("prefix_test(%s) = %d \n",digits,prefix_test(digits)); printf("ccv1_test(%s) = %d \n",digits,ccv1_test(digits)); printf("histogram_test(%s) = %d \n",digits,histogram_test(digits)); printf("pattern_test(%s) = %d \n",digits,pattern_test(digits)); printf("only_hex_digits(%s) = %d\n",buf,only_hex_digits(buf,strlen(buf))); printf("only_dec_digits(%s) = %d\n",buf,only_dec_digits(buf,strlen(buf))); return validate_ccn(buf,buflen); }