verify_live.c 4.7 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * Example fingerprint verification program
 * Copyright (C) 2007 Daniel Drake <dsd@gentoo.org>
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
 */

#include <stdio.h>
#include <stdlib.h>
22
#include <unistd.h>
23 24 25 26 27

#include <libfprint/fprint.h>

struct fp_dscv_dev *discover_device(struct fp_dscv_dev **discovered_devs)
{
28 29 30 31 32 33 34
	struct fp_dscv_dev *ddev = discovered_devs[0];
	struct fp_driver *drv;
	if (!ddev)
		return NULL;
	
	drv = fp_dscv_dev_get_driver(ddev);
	printf("Found device claimed by %s driver\n", fp_driver_get_full_name(drv));
35 36 37
	return ddev;
}

Daniel Drake's avatar
Daniel Drake committed
38 39
struct fp_print_data *enroll(struct fp_dev *dev) {
	struct fp_print_data *enrolled_print = NULL;
40
	int r;
Daniel Drake's avatar
Daniel Drake committed
41 42 43 44 45

	printf("You will need to successfully scan your finger %d times to "
		"complete the process.\n", fp_dev_get_nr_enroll_stages(dev));

	do {
46 47 48 49 50 51 52 53
		sleep(1);
		printf("\nScan your finger now.\n");
		r = fp_enroll_finger(dev, &enrolled_print);
		if (r < 0) {
			printf("Enroll failed with error %d\n", r);
			return NULL;
		}
		switch (r) {
Daniel Drake's avatar
Daniel Drake committed
54 55 56 57 58 59 60 61 62 63 64 65
		case FP_ENROLL_COMPLETE:
			printf("Enroll complete!\n");
			break;
		case FP_ENROLL_FAIL:
			printf("Enroll failed, something wen't wrong :(\n");
			return NULL;
		case FP_ENROLL_PASS:
			printf("Enroll stage passed. Yay!\n");
			break;
		case FP_ENROLL_RETRY:
			printf("Didn't quite catch that. Please try again.\n");
			break;
Daniel Drake's avatar
Daniel Drake committed
66 67 68 69 70 71 72
		case FP_ENROLL_RETRY_TOO_SHORT:
			printf("Your swipe was too short, please try again.\n");
			break;
		case FP_ENROLL_RETRY_CENTER_FINGER:
			printf("Didn't catch that, please center your finger on the "
				"sensor and try again.\n");
			break;
73 74 75 76
		case FP_ENROLL_RETRY_REMOVE_FINGER:
			printf("Scan failed, please remove your finger and then try "
				"again.\n");
			break;
Daniel Drake's avatar
Daniel Drake committed
77
		}
78
	} while (r != FP_ENROLL_COMPLETE);
Daniel Drake's avatar
Daniel Drake committed
79 80 81 82 83 84

	if (!enrolled_print) {
		fprintf(stderr, "Enroll complete but no print?\n");
		return NULL;
	}

85
	printf("Enrollment completed!\n\n");
Daniel Drake's avatar
Daniel Drake committed
86 87 88
	return enrolled_print;
}

89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
int verify(struct fp_dev *dev, struct fp_print_data *data)
{
	int r;

	do {
		sleep(1);
		printf("\nScan your finger now.\n");
		r = fp_verify_finger(dev, data);
		if (r < 0) {
			printf("verification failed with error %d :(\n", r);
			return r;
		}
		switch (r) {
		case FP_VERIFY_NO_MATCH:
			printf("NO MATCH!\n");
			return 0;
		case FP_VERIFY_MATCH:
			printf("MATCH!\n");
			return 0;
		case FP_VERIFY_RETRY:
			printf("Scan didn't quite work. Please try again.\n");
			break;
		case FP_VERIFY_RETRY_TOO_SHORT:
			printf("Swipe was too short, please try again.\n");
			break;
		case FP_VERIFY_RETRY_CENTER_FINGER:
			printf("Please center your finger on the sensor and try again.\n");
			break;
		case FP_VERIFY_RETRY_REMOVE_FINGER:
			printf("Please remove finger from the sensor and try again.\n");
			break;
		}
	} while (1);
}

124 125
int main(void)
{
126
	int r = 1;
127 128
	struct fp_dscv_dev *ddev;
	struct fp_dscv_dev **discovered_devs;
Daniel Drake's avatar
Daniel Drake committed
129 130
	struct fp_dev *dev;
	struct fp_print_data *data;
131

132 133 134
	setenv ("G_MESSAGES_DEBUG", "all", 0);
	setenv ("LIBUSB_DEBUG", "3", 0);

135 136 137 138 139 140 141 142 143
	r = fp_init();
	if (r < 0) {
		fprintf(stderr, "Failed to initialize libfprint\n");
		exit(1);
	}

	discovered_devs = fp_discover_devs();
	if (!discovered_devs) {
		fprintf(stderr, "Could not discover devices\n");
144
		goto out;
145 146 147 148 149
	}

	ddev = discover_device(discovered_devs);
	if (!ddev) {
		fprintf(stderr, "No devices detected.\n");
150
		goto out;
151 152
	}

Daniel Drake's avatar
Daniel Drake committed
153
	dev = fp_dev_open(ddev);
154
	fp_dscv_devs_free(discovered_devs);
Daniel Drake's avatar
Daniel Drake committed
155 156
	if (!dev) {
		fprintf(stderr, "Could not open device.\n");
157
		goto out;
Daniel Drake's avatar
Daniel Drake committed
158 159 160 161 162 163 164
	}

	printf("Opened device. It's now time to enroll your finger.\n\n");
	data = enroll(dev);
	if (!data)
		goto out_close;

165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181

	printf("Normally we'd save that print to disk, and recall it at some "
		"point later when we want to authenticate the user who just "
		"enrolled. In the interests of demonstration, we'll authenticate "
		"that user immediately.\n");

	do {
		char buffer[20];

		verify(dev, data);
		printf("Verify again? [Y/n]? ");
		fgets(buffer, sizeof(buffer), stdin);
		if (buffer[0] != '\n' && buffer[0] != 'y' && buffer[0] != 'Y')
			break;
	} while (1);

	fp_print_data_free(data);
Daniel Drake's avatar
Daniel Drake committed
182 183
out_close:
	fp_dev_close(dev);
184 185
out:
	fp_exit();
186
	return r;
187 188
}

Daniel Drake's avatar
Daniel Drake committed
189