X-Git-Url: https://the.earth.li/gitweb/?a=blobdiff_plain;ds=inline;f=keyarray.c;h=85485556929ac0421665a41fc2ceaf6c01f43a5f;hb=70842462a490e56a607a48b2d27807816c4d8a80;hp=cb846de5811f5477e12e8b626c4d2036c6668a90;hpb=5e1b22d763640c4d7a09d07920403d8d491b4410;p=onak.git
diff --git a/keyarray.c b/keyarray.c
index cb846de..8548555 100644
--- a/keyarray.c
+++ b/keyarray.c
@@ -13,10 +13,11 @@
* more details.
*
* You should have received a copy of the GNU General Public License along with
- * this program; if not, write to the Free Software Foundation, Inc., 51
- * Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * this program. If not, see .
*/
+#include
+#include
#include
#include
#include
@@ -24,8 +25,21 @@
#include
#include "keyarray.h"
+#include "keystructs.h"
-bool array_find(struct keyarray *array, uint64_t key)
+int fingerprint_cmp(struct openpgp_fingerprint *a,
+ struct openpgp_fingerprint *b)
+{
+ if (a->length < b->length) {
+ return -1;
+ } else if (a->length > b->length) {
+ return 1;
+ } else {
+ return memcmp(a->fp, b->fp, a->length);
+ }
+}
+
+bool array_find(struct keyarray *array, struct openpgp_fingerprint *fp)
{
bool found;
int top = 0;
@@ -38,19 +52,19 @@ bool array_find(struct keyarray *array, uint64_t key)
top = array->count - 1;
while ((top - bottom) > 1) {
curpos = (top + bottom) / 2;
- if (key > array->keys[curpos]) {
+ if (fingerprint_cmp(fp, &array->keys[curpos]) > 0) {
bottom = curpos;
} else {
top = curpos;
}
}
- found = (array->keys[top] == key);
+ found = (fingerprint_cmp(fp, &array->keys[top]) == 0);
}
return found;
}
-bool array_add(struct keyarray *array, uint64_t key)
+bool array_add(struct keyarray *array, struct openpgp_fingerprint *fp)
{
bool found;
int top = 0;
@@ -58,20 +72,20 @@ bool array_add(struct keyarray *array, uint64_t key)
int curpos = 0;
found = false;
- if (array->keys != NULL && array->count > 0) {
+ if (array->size != 0 && array->count > 0) {
bottom = -1;
top = array->count - 1;
while ((top - bottom) > 1) {
curpos = (top + bottom) / 2;
- if (key > array->keys[curpos]) {
+ if (fingerprint_cmp(fp, &array->keys[curpos]) > 0) {
bottom = curpos;
} else {
top = curpos;
}
}
- found = (array->keys[top] == key);
+ found = (fingerprint_cmp(fp, &array->keys[top]) == 0);
- if (key > array->keys[top]) {
+ if (fingerprint_cmp(fp, &array->keys[top]) > 0) {
curpos = top + 1;
} else {
curpos = top;
@@ -80,23 +94,25 @@ bool array_add(struct keyarray *array, uint64_t key)
if (!found) {
if (array->size == 0) {
- array->keys = malloc(16 * sizeof(uint64_t));
+ array->keys = malloc(16 *
+ sizeof(struct openpgp_fingerprint));
array->size = 16;
array->count = 1;
- array->keys[0] = key;
+ array->keys[0] = *fp;
} else {
if (array->count >= array->size) {
array->size *= 2;
array->keys = realloc(array->keys,
- array->size * sizeof(uint64_t));
+ array->size *
+ sizeof(struct openpgp_fingerprint));
}
if (curpos < array->count) {
memmove(&array->keys[curpos+1],
&array->keys[curpos],
- sizeof(uint64_t) *
+ sizeof(struct openpgp_fingerprint) *
(array->count - curpos));
}
- array->keys[curpos] = key;
+ array->keys[curpos] = *fp;
array->count++;
}
}
@@ -114,3 +130,70 @@ void array_free(struct keyarray *array)
return;
}
+
+static uint8_t hex2bin(char c)
+{
+ if (c >= '0' && c <= '9') {
+ return (c - '0');
+ } else if (c >= 'a' && c <= 'f') {
+ return (c - 'a' + 10);
+ } else if (c >= 'A' && c <= 'F') {
+ return (c - 'A' + 10);
+ }
+
+ return 255;
+}
+
+bool array_load(struct keyarray *array, const char *file)
+{
+ struct openpgp_fingerprint fp;
+ char curline[1024];
+ FILE *fpfile;
+ int i;
+
+ fpfile = fopen(file, "r");
+
+ if (fpfile != NULL) {
+ if (!fgets(curline, sizeof(curline) - 1, fpfile)) {
+ fclose(fpfile);
+ return false;
+ }
+
+ while (!feof(fpfile)) {
+ /* Strip any trailing white space */
+ for (i = strlen(curline) - 1;
+ i >= 0 && isspace(curline[i]); i--) {
+ curline[i] = 0;
+ }
+ i++;
+ //if ((i % 2) != 0) {
+ // break;
+ //}
+ i >>= 1;
+ if (curline[0] == '#') {
+ // Comment line, ignore
+ } else if (i == FINGERPRINT_V3_LEN ||
+ i == FINGERPRINT_V4_LEN ||
+ i == FINGERPRINT_V5_LEN) {
+ fp.length = i;
+ for (i = 0; i < fp.length; i++) {
+ fp.fp[i] = hex2bin(curline[i * 2]);
+ fp.fp[i] <<= 4;
+ fp.fp[i] |=
+ hex2bin(curline[i * 2 + 1]);
+ }
+ array_add(array, &fp);
+ } else {
+ printf("Bad line.\n");
+ }
+
+ if (!fgets(curline, sizeof(curline) - 1, fpfile)) {
+ break;
+ }
+ }
+
+ fclose(fpfile);
+ }
+
+ return (array->count != 0);
+}