C API for pgcrypto ================== UN*X crypt() ============ #include char * px_crypt(const char *psw, const char *salt, char *buf, unsigned buflen); returns buf or NULL for error. unsigned px_gen_salt(const char *salt_type, char *dst, int rounds); returns salt size. dst should be PX_MAX_SALT_LEN bytes. 'rounds' is algorithm specific. 0 means default for that algorithm. Random ====== int px_get_random_bytes(uint8 *dst, int num) Crypto "objects" ================ PX_MD - Message digest PX_HMAC - HMAC (Hash MAC) PX_Cipher - cipher+mode: provided by libs PX_Combo - higher-level encryption -> padding, [MD] Objects are activated with following functions: int px_find_digest(const char *name, PX_MD **res); int px_find_hmac(const char *name, PX_HMAC **res); int px_find_cipher(const char *name, PX_Cipher **res); int px_find_combo(const char *name, PX_Combo **res); returns 0 on success, < 0 on error. If successful, *res contains pointer to new object. Message Digest ============== uint px_md_result_size(PX_MD *md) returns final result size in bytes void px_md_reset(PX_MD *md) resets md to clean state uint px_md_block_size(PX_MD *md) return algorithm block size in bytes void px_md_update(PX_MD *md, const uint8 *data, uint dlen) updates hash state with new data void px_md_finish(PX_MD *md, uint8 *buf) puts final hash state into buf. buf should have room for px_md_result_size() bytes. void px_md_free(PX_MD *md) frees resources. HMAC (Hash Message Authentication Code) ======================================= int px_hmac_init(PX_HMAC *hmac, const uint8 *key, uint klen) initalized hmac state with key. uint px_hmac_result_size(PX_HMAC *md) returns final result size in bytes void px_hmac_reset(PX_HMAC *md) resets md to state after _init() uint px_hmac_block_size(PX_HMAC *md) return algorithm block size in bytes void px_hmac_update(PX_HMAC *md, const uint8 *data, uint dlen) updates hash state with new data void px_hmac_finish(PX_HMAC *md, uint8 *buf) puts final hash state into buf. buf should have room for px_hmac_result_size() bytes. void px_hmac_free(PX_HMAC *md) frees resources. Cipher ====== uint px_cipher_key_size(PX_Cipher *c) returns max key size in bytes uint px_cipher_block_size(PX_Cipher *c) returns cipher+mode block size in bytes. So blowfish in CFB mode should return 1. uint px_cipher_iv_size(PX_Cipher *c) returns IV size in bytes. int px_cipher_init(PX_Cipher *c, uint8 *key, uint klen, uint8 *iv) initializes cipher with supplied key and iv. int px_cipher_encrypt(PX_Cipher *c, uint8 *data, uint dlen, uint8 *res) encrypts data. res must have room for dlen bytes. data must be multiple of px_cipher_block_size(). int px_cipher_decrypt(PX_Cipher *c, uint8 *data, uint dlen, uint8 *res) decrypts data. res must have room for dlen bytes. void px_cipher_free(PX_Cipher *c) frees resources assiocated. PX_Combo ======== uint px_combo_encrypt_len(PX_Combo *c, uint dlen) calculates max result length for dlen of data. uint px_combo_decrypt_len(PX_Combo *c, uint dlen) calculates result length for dlen of data. int px_combo_init(PX_Combo *c, uint8 *key, uint klen, uint8 *iv, uint ivlen) initializes c with key and iv. If cipher uses fixed length keys, key will be padded with zeroes to needed length. int px_combo_encrypt(PX_Combo *c, uint8 *data, uint dlen, uint8 *res, uint rlen) int px_combo_decrypt(PX_Combo *c, uint8 *data, uint dlen, uint8 *res, uint rlen) void px_combo_free(PX_Combo *c) frees resources assiocated.