Merge remote-tracking branch 'origin/debian' into debian
[mech_eap.git] / libeap / tests / test-sha1.c
diff --git a/libeap/tests/test-sha1.c b/libeap/tests/test-sha1.c
new file mode 100644 (file)
index 0000000..3269d4d
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Test program for SHA1 and MD5
+ * Copyright (c) 2003-2006, Jouni Malinen <j@w1.fi>
+ *
+ * This software may be distributed under the terms of the BSD license.
+ * See README for more details.
+ */
+
+#include "includes.h"
+
+#include "common.h"
+#include "crypto/crypto.h"
+
+
+static int cavp_shavs(const char *fname)
+{
+       FILE *f;
+       int ret = 0;
+       char buf[15000], *pos, *pos2;
+       u8 msg[6400];
+       int msg_len = 0, tmp_len;
+       u8 md[20], hash[20];
+       int ok = 0;
+
+       printf("CAVP SHAVS test vectors from %s\n", fname);
+
+       f = fopen(fname, "r");
+       if (f == NULL) {
+               printf("%s does not exist - cannot validate CAVP SHAVS test vectors\n",
+                       fname);
+               return 0;
+       }
+
+       while (fgets(buf, sizeof(buf), f)) {
+               pos = os_strchr(buf, '=');
+               if (pos == NULL)
+                       continue;
+               pos2 = pos - 1;
+               while (pos2 >= buf && *pos2 == ' ')
+                       *pos2-- = '\0';
+               *pos++ = '\0';
+               while (*pos == ' ')
+                       *pos++ = '\0';
+               pos2 = os_strchr(pos, '\r');
+               if (!pos2)
+                       pos2 = os_strchr(pos, '\n');
+               if (pos2)
+                       *pos2 = '\0';
+               else
+                       pos2 = pos + os_strlen(pos);
+
+               if (os_strcmp(buf, "Len") == 0) {
+                       msg_len = atoi(pos);
+               } else if (os_strcmp(buf, "Msg") == 0) {
+                       tmp_len = os_strlen(pos);
+                       if (msg_len == 0 && tmp_len == 2)
+                               tmp_len = 0;
+                       if (msg_len != tmp_len * 4) {
+                               printf("Unexpected Msg length (msg_len=%u tmp_len=%u, Msg='%s'\n",
+                                      msg_len, tmp_len, pos);
+                               ret++;
+                               break;
+                       }
+
+                       if (hexstr2bin(pos, msg, msg_len / 8) < 0) {
+                               printf("Invalid hex string '%s'\n", pos);
+                               ret++;
+                               break;
+                       }
+               } else if (os_strcmp(buf, "MD") == 0) {
+                       const u8 *addr[1];
+                       size_t len[1];
+
+                       tmp_len = os_strlen(pos);
+                       if (tmp_len != 2 * 20) {
+                               printf("Unexpected MD length (MD='%s'\n",
+                                      pos);
+                               ret++;
+                               break;
+                       }
+
+                       if (hexstr2bin(pos, md, 20) < 0) {
+                               printf("Invalid hex string '%s'\n", pos);
+                               ret++;
+                               break;
+                       }
+
+                       addr[0] = msg;
+                       len[0] = msg_len / 8;
+                       if (sha1_vector(1, addr, len, hash) < 0 ||
+                           os_memcmp(hash, md, 20) != 0)
+                               ret++;
+                       else
+                               ok++;
+               }
+       }
+
+       fclose(f);
+
+       if (ret)
+               printf("Test case failed\n");
+       else
+               printf("%d test vectors OK\n", ok);
+
+       return ret;
+}
+
+
+int main(int argc, char *argv[])
+{
+       int ret = 0;
+
+       if (cavp_shavs("CAVP/SHA1ShortMsg.rsp"))
+               ret++;
+       if (cavp_shavs("CAVP/SHA1LongMsg.rsp"))
+               ret++;
+
+       return ret;
+}