diff options
| -rw-r--r-- | main.c | 3 | ||||
| -rw-r--r-- | snac.c | 33 | ||||
| -rw-r--r-- | snac.h | 3 |
3 files changed, 39 insertions, 0 deletions
| @@ -16,5 +16,8 @@ int main(int argc, char *argv[]) | |||
| 16 | snac_open(&snac, "mike"); | 16 | snac_open(&snac, "mike"); |
| 17 | snac_log(&snac, xs_str_new("ok")); | 17 | snac_log(&snac, xs_str_new("ok")); |
| 18 | 18 | ||
| 19 | char *passwd = xs_dict_get(snac.config, "passwd"); | ||
| 20 | printf("%d\n", check_password("mike", "1234", passwd)); | ||
| 21 | |||
| 19 | return 0; | 22 | return 0; |
| 20 | } | 23 | } |
| @@ -90,3 +90,36 @@ void snac_debug(snac *snac, int level, d_char *str) | |||
| 90 | fprintf(stderr, "%s [%s] %s\n", tm, snac->uid, msg); | 90 | fprintf(stderr, "%s [%s] %s\n", tm, snac->uid, msg); |
| 91 | } | 91 | } |
| 92 | } | 92 | } |
| 93 | |||
| 94 | |||
| 95 | d_char *hash_password(char *uid, char *passwd, char *nonce) | ||
| 96 | /* hashes a password */ | ||
| 97 | { | ||
| 98 | xs *d_nonce = NULL; | ||
| 99 | xs *combi; | ||
| 100 | xs *hash; | ||
| 101 | |||
| 102 | if (nonce == NULL) | ||
| 103 | nonce = d_nonce = xs_fmt("%08x", random()); | ||
| 104 | |||
| 105 | combi = xs_fmt("%s:%s:%s", nonce, uid, passwd); | ||
| 106 | hash = xs_sha1_hex(combi, strlen(combi)); | ||
| 107 | |||
| 108 | return xs_fmt("%s:%s", nonce, hash); | ||
| 109 | } | ||
| 110 | |||
| 111 | |||
| 112 | int check_password(char *uid, char *passwd, char *hash) | ||
| 113 | /* checks a password */ | ||
| 114 | { | ||
| 115 | int ret = 0; | ||
| 116 | xs *spl = xs_splitn(hash, ":", 1); | ||
| 117 | |||
| 118 | if (xs_list_len(spl) == 2) { | ||
| 119 | xs *n_hash = hash_password(uid, passwd, xs_list_get(spl, 0)); | ||
| 120 | |||
| 121 | ret = (strcmp(hash, n_hash) == 0); | ||
| 122 | } | ||
| 123 | |||
| 124 | return ret; | ||
| 125 | } | ||
| @@ -33,3 +33,6 @@ void snac_debug(snac *snac, int level, d_char *str); | |||
| 33 | #define snac_log(snac, str) snac_debug(snac, 0, str) | 33 | #define snac_log(snac, str) snac_debug(snac, 0, str) |
| 34 | 34 | ||
| 35 | int validate_uid(char *uid); | 35 | int validate_uid(char *uid); |
| 36 | |||
| 37 | d_char *hash_password(char *uid, char *passwd, char *nonce); | ||
| 38 | int check_password(char *uid, char *passwd, char *hash); | ||