1*0a6a1f1dSLionel Sambuc /* $NetBSD: heim-auth.h,v 1.1.1.2 2014/04/24 12:45:51 pettai Exp $ */ 2ebfedea0SLionel Sambuc 3ebfedea0SLionel Sambuc /* 4ebfedea0SLionel Sambuc * Generate challange for APOP and CRAM-MD5 5ebfedea0SLionel Sambuc */ 6ebfedea0SLionel Sambuc 7ebfedea0SLionel Sambuc char * 8ebfedea0SLionel Sambuc heim_generate_challenge(const char *hostname); /* hostname can be NULL, the local hostname is used */ 9ebfedea0SLionel Sambuc 10ebfedea0SLionel Sambuc /* 11ebfedea0SLionel Sambuc * APOP 12ebfedea0SLionel Sambuc */ 13ebfedea0SLionel Sambuc 14ebfedea0SLionel Sambuc char * 15ebfedea0SLionel Sambuc heim_apop_create(const char *challenge, const char *password); 16ebfedea0SLionel Sambuc 17ebfedea0SLionel Sambuc int 18ebfedea0SLionel Sambuc heim_apop_verify(const char *challenge, const char *password, const char *response); 19ebfedea0SLionel Sambuc 20ebfedea0SLionel Sambuc /* 21ebfedea0SLionel Sambuc * CRAM-MD5 22ebfedea0SLionel Sambuc */ 23ebfedea0SLionel Sambuc 24ebfedea0SLionel Sambuc typedef struct heim_HMAC_MD5_STATE_s { 25ebfedea0SLionel Sambuc uint32_t istate[4]; 26ebfedea0SLionel Sambuc uint32_t ostate[4]; 27ebfedea0SLionel Sambuc } heim_CRAM_MD5_STATE; 28ebfedea0SLionel Sambuc 29ebfedea0SLionel Sambuc typedef struct heim_cram_md5 *heim_cram_md5; 30ebfedea0SLionel Sambuc 31ebfedea0SLionel Sambuc char * 32ebfedea0SLionel Sambuc heim_cram_md5_create(const char *challenge, const char *password); 33ebfedea0SLionel Sambuc 34ebfedea0SLionel Sambuc int 35ebfedea0SLionel Sambuc heim_cram_md5_verify(const char *challenge, const char *password, const char *response); 36ebfedea0SLionel Sambuc 37ebfedea0SLionel Sambuc void 38ebfedea0SLionel Sambuc heim_cram_md5_export(const char *password, heim_CRAM_MD5_STATE *state); 39ebfedea0SLionel Sambuc 40ebfedea0SLionel Sambuc heim_cram_md5 41ebfedea0SLionel Sambuc heim_cram_md5_import(void *data, size_t len); 42ebfedea0SLionel Sambuc 43ebfedea0SLionel Sambuc int 44ebfedea0SLionel Sambuc heim_cram_md5_verify_ctx(heim_cram_md5 ctx, const char *challenge, const char *response); 45ebfedea0SLionel Sambuc 46ebfedea0SLionel Sambuc void 47ebfedea0SLionel Sambuc heim_cram_md5_free(heim_cram_md5 ctx); 48ebfedea0SLionel Sambuc 49ebfedea0SLionel Sambuc /* 50ebfedea0SLionel Sambuc * DIGEST-MD5 51ebfedea0SLionel Sambuc * 52ebfedea0SLionel Sambuc * heim_digest_t d; 53ebfedea0SLionel Sambuc * 54ebfedea0SLionel Sambuc * d = heim_digest_create(1, HEIM_DIGEST_TYPE_DIGEST_MD5_HTTP); 55ebfedea0SLionel Sambuc * 56ebfedea0SLionel Sambuc * if ((s = heim_digest_generate_challange(d)) != NULL) abort(); 57ebfedea0SLionel Sambuc * send_to_client(s); 58ebfedea0SLionel Sambuc * response = read_from_client(); 59ebfedea0SLionel Sambuc * 60ebfedea0SLionel Sambuc * heim_digest_parse_response(d, response); 61ebfedea0SLionel Sambuc * 62ebfedea0SLionel Sambuc * const char *user = heim_digest_get_key(d, "username"); 63ebfedea0SLionel Sambuc * heim_digest_set_key(d, "password", "sommar17"); 64ebfedea0SLionel Sambuc * 65ebfedea0SLionel Sambuc * if (heim_digest_verify(d, &response)) abort(); 66ebfedea0SLionel Sambuc * 67ebfedea0SLionel Sambuc * send_to_client(response); 68ebfedea0SLionel Sambuc * 69ebfedea0SLionel Sambuc * heim_digest_release(d); 70ebfedea0SLionel Sambuc */ 71ebfedea0SLionel Sambuc 72ebfedea0SLionel Sambuc typedef struct heim_digest_desc *heim_digest_t; 73ebfedea0SLionel Sambuc 74ebfedea0SLionel Sambuc heim_digest_t 75ebfedea0SLionel Sambuc heim_digest_create(int server, int type); 76ebfedea0SLionel Sambuc 77ebfedea0SLionel Sambuc #define HEIM_DIGEST_TYPE_AUTO 0 78ebfedea0SLionel Sambuc #define HEIM_DIGEST_TYPE_RFC2069 1 79ebfedea0SLionel Sambuc #define HEIM_DIGEST_TYPE_MD5 2 80ebfedea0SLionel Sambuc #define HEIM_DIGEST_TYPE_MD5_SESS 3 81ebfedea0SLionel Sambuc 82ebfedea0SLionel Sambuc void 83ebfedea0SLionel Sambuc heim_digest_init_set_key(heim_digest_t context, const char *key, const char *value); 84ebfedea0SLionel Sambuc 85ebfedea0SLionel Sambuc const char * 86ebfedea0SLionel Sambuc heim_digest_generate_challenge(heim_digest_t context); 87ebfedea0SLionel Sambuc 88ebfedea0SLionel Sambuc int 89ebfedea0SLionel Sambuc heim_digest_parse_challenge(heim_digest_t context, const char *challenge); 90ebfedea0SLionel Sambuc 91ebfedea0SLionel Sambuc int 92ebfedea0SLionel Sambuc heim_digest_parse_response(heim_digest_t context, const char *response); 93ebfedea0SLionel Sambuc 94ebfedea0SLionel Sambuc const char * 95ebfedea0SLionel Sambuc heim_digest_get_key(heim_digest_t context, const char *key); 96ebfedea0SLionel Sambuc 97ebfedea0SLionel Sambuc int 98ebfedea0SLionel Sambuc heim_digest_set_key(heim_digest_t context, const char *key, const char *value); 99ebfedea0SLionel Sambuc 100ebfedea0SLionel Sambuc void 101ebfedea0SLionel Sambuc heim_digest_set_user_password(heim_digest_t context, const char *password); 102ebfedea0SLionel Sambuc 103ebfedea0SLionel Sambuc void 104ebfedea0SLionel Sambuc heim_digest_set_user_h1hash(heim_digest_t context, void *ptr, size_t size); 105ebfedea0SLionel Sambuc 106ebfedea0SLionel Sambuc int 107ebfedea0SLionel Sambuc heim_digest_verify(heim_digest_t context, char **response); 108ebfedea0SLionel Sambuc 109ebfedea0SLionel Sambuc const char * 110ebfedea0SLionel Sambuc heim_digest_create_response(heim_digest_t context); 111ebfedea0SLionel Sambuc 112ebfedea0SLionel Sambuc void 113ebfedea0SLionel Sambuc heim_digest_get_session_key(heim_digest_t context, void **key, size_t *keySize); 114ebfedea0SLionel Sambuc 115ebfedea0SLionel Sambuc void 116ebfedea0SLionel Sambuc heim_digest_release(heim_digest_t context); 117