diff --git a/crack.c b/crack.c
index cd81cacbe8b5991f368d8b48eea7fb8d976dbac3..fe2dfb3055d3428d18163d758d0e6c8c410e2338 100644
--- a/crack.c
+++ b/crack.c
@@ -6,58 +6,153 @@
 #include "sha256.h"
 
 // constants
+#define BUFFERSIZE 256
+
 #define PWD4_FILENAME "pwd4sha256"
 #define PWD6_FILENAME "pwd6sha256"
+#define PWD4_NUMBERS 10
 #define PWD_NUMBERS 30
-#define BUFFERSIZE 256
+
+#define ASCII_FROM 32
+#define ASCII_TO 126
+#define ASCII_NUM_FROM 48
+#define ASCII_NUM_TO 57
+#define ASCII_UPPERCASE_FROM 65
+#define ASCII_UPPERCASE_TO 90
+#define ASCII_LOWERCASE_FROM 97
+#define ASCII_LOWERCASE_TO 122
 
 // methods reference
-void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]);
+void check_guess(BYTE guess[],
+                 BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE], int checked[]);
+void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n,
+                   int checked[]);
+void int_array_init(int array[], int n);
 
 int main(int argc, char** argv) {
-
     if (argc == 1) {
-        // record 30 passwords
-        FILE* pwdfp;
-        unsigned char buffer[SHA256_BLOCK_SIZE];
+        // store 30 passwords to guess
+        FILE* fp;
+        BYTE buffer[SHA256_BLOCK_SIZE];
+        // create array to store hashes password
+        BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE];
         int status;
+        
+        fp = fopen(PWD4_FILENAME, "rb");
 
-        pwdfp = fopen(PWD4_FILENAME, "rb");
+        int i;
+        for (i = 0; i < PWD4_NUMBERS; i++) {
+            // read 32 bytes to buffer
+            status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp);
 
-        // read 32 bytes to buffer
-        status = fread(buffer, SHA256_BLOCK_SIZE, 1, pwdfp);
+            if (status < 0) {
+                fprintf(stderr, "ERROR, reading binary file failed\n");
+                exit(0);
+            }
 
-        if (status < 0) {
-            fprintf(stderr, "ERROR reading binary file\n");
-            exit(0);
+            strcpy((char*)&pwd[i], (char*)&buffer);
         }
+        fclose(fp);
 
-        printf("%u\n", buffer);
+        fp = fopen(PWD6_FILENAME, "rb");
 
-        fclose(pwdfp);
+        for (; i < PWD_NUMBERS; i++) {
+            // read 32 bytes to buffer
+            status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp);
 
-    } else if (argc == 2) {
+            if (status < 0) {
+                fprintf(stderr, "ERROR, reading binary file failed\n");
+                exit(0);
+            }
 
+            strcpy((char*)&pwd[i], (char*)&buffer);
+        }
+        fclose(fp);
+
+        // create guess and check it
+        // crazy test
+        BYTE guess[5] = {"aaaa"};
+        // guess[4] = '\0';
+        int checked[10];
+        int_array_init(checked, 10);
+
+
+        check_n_guess(guess, pwd, 10, checked);
+
+        // int first, second, third, fourth;
+        // for (first = ASCII_FROM; first <= ASCII_TO; first++) {
+        //     guess[0] = first;
+        //     for (second = ASCII_FROM; second <= ASCII_TO; second++) {
+        //         guess[1] = second;
+        //         for (third = ASCII_FROM; third <= ASCII_TO; third++) {
+        //             guess[2] = third;
+        //             for (fourth = ASCII_FROM; fourth <= ASCII_TO; fourth++) {
+        //                 guess[3] = fourth;
+        //                 check_n_guess(guess, pwd, 10, checked);
+        //             }
+        //         }
+        //     }
+        // }
+    } else if (argc == 2) {
+        // This part for good guess
     } else if (argc == 3) {
-        FILE* guessfp;
-        FILE* pwdfp;
-        char buffer[BUFFERSIZE];
+        FILE* fp;
+        BYTE buffer[BUFFERSIZE];
+
+        // read password file and store hashes passwords
+        fp = fopen(argv[2], "rb");
+        int status;
+
+        // get the number of input passwords
+        int pwdcount = 0, pwdsize = 0;
+
+        fseek(fp, 0, SEEK_END);
+        pwdsize = ftell(fp);
+        pwdcount = pwdsize / SHA256_BLOCK_SIZE;
+
+        if (pwdsize % SHA256_BLOCK_SIZE) {
+            fprintf(stderr, "ERROR, undefined password input file size\n");
+            exit(0);
+        }
+
+        // create array to store hashes passwords
+        BYTE pwd[pwdcount][SHA256_BLOCK_SIZE];
+
+        int i;
+        for (i = 0; i < pwdcount; i++) {
+            // read 32 bytes to buffer
+            status = fread(buffer, SHA256_BLOCK_SIZE, 1, fp);
 
-        guessfp = fopen(argv[1], "r");
-        pwdfp = fopen(argv[2], "rb");
+            if (status < 0) {
+                fprintf(stderr, "ERROR, reading binary file failed\n");
+                exit(0);
+            }
+
+            strcpy((char*)&pwd[i], (char*)&buffer);
+        }
+        fclose(fp);
+
+        // read guess from file and check guess
+        fp = fopen(argv[1], "r");
+
+        // create flag arrays to avoid repeat check
+        int checked[pwdcount];
+        int_array_init(checked, pwdcount);
 
-        while (fgets(buffer, sizeof(buffer), guessfp) != NULL) {
-            printf("%s", buffer);
+        while (fgets((char*)&buffer, BUFFERSIZE, fp) != NULL) {
+            // get rid of \n for buffer
+            buffer[strlen((char*)&buffer) - 1] = '\0';
+            check_n_guess(buffer, pwd, pwdcount, checked);
         }
 
-        fclose(guessfp);
-        fclose(pwdfp);
+        fclose(fp);
     }
 
     return 0;
 }
 
-void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) {
+void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE],
+                 int checked[]) {
     SHA256_CTX ctx;
     BYTE buf[SHA256_BLOCK_SIZE];
     size_t guess_len = strlen((char*)&guess);
@@ -68,14 +163,16 @@ void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) {
     sha256_final(&ctx, buf);
 
     if (guess_len == 4) {
-        for (i = 0; i < 10; i++) {
-            if (!memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+        for (i = 0; i < PWD4_NUMBERS; i++) {
+            if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+                checked[i] = 1;
                 printf("%s %d\n", guess, i + 1);
             }
         }
     } else if (guess_len == 6) {
-        for (i = 10; i < 30; i++) {
-            if (!memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+        for (i = PWD4_NUMBERS; i < PWD_NUMBERS; i++) {
+            if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+                checked[i] = 1;
                 printf("%s %d\n", guess, i + 1);
             }
         }
@@ -83,4 +180,29 @@ void check_guess(BYTE guess[], BYTE pwd[PWD_NUMBERS][SHA256_BLOCK_SIZE]) {
         fprintf(stderr, "ERROR, undefine guess length\n");
         exit(0);
     }
+}
+
+void check_n_guess(BYTE guess[], BYTE pwd[][SHA256_BLOCK_SIZE], int n,
+                   int checked[]) {
+    SHA256_CTX ctx;
+    BYTE buf[SHA256_BLOCK_SIZE];
+    size_t guess_len = strlen((char*)&guess);
+    int i;
+
+    sha256_init(&ctx);
+    sha256_update(&ctx, guess, guess_len);
+    sha256_final(&ctx, buf);
+
+    
+    for (i = 0; i < n; i++) {
+        printf("%d %s %s\n", checked[i], buf, pwd[i]);
+        if (!checked[i] && !memcmp(pwd[i], buf, SHA256_BLOCK_SIZE)) {
+            checked[i] = 1;
+            printf("%s %d\n", guess, i + 1);
+        }
+    }
+}
+
+void int_array_init(int array[], int n) {
+    for (int i = 0; i < n; i++) array[i] = 0;
 }
\ No newline at end of file