=pod =head1 NAME pwquality - Documentation of the libpwquality API =head1 SYNOPSIS #include pwquality_settings_t *pwquality_default_settings(void); void pwquality_free_settings(pwquality_settings_t *pwq); int pwquality_read_config(pwquality_settings_t *pwq, const char *cfgfile, void **auxerror); int pwquality_set_option(pwquality_settings_t *pwq, const char *option); int pwquality_set_int_value(pwquality_settings_t *pwq, int setting, int value); int pwquality_set_str_value(pwquality_settings_t *pwq, int setting, const char *value); int pwquality_get_int_value(pwquality_settings_t *pwq, int setting, int *value); int pwquality_get_str_value(pwquality_settings_t *pwq, int setting, const char **value); int pwquality_generate(pwquality_settings_t *pwq, int entropy_bits, char **password); int pwquality_check(pwquality_settings_t *pwq, const char *password, const char *oldpassword, const char *user, void **auxerror); const char *pwquality_strerror(char *buf, size_t len, int errcode, void *auxerror); =head1 DESCRIPTION Function pwquality_default_settings() allocates and returns default pwquality settings to be used in other library calls. The allocated opaque structure has to be freed with the pwquality_free_settings() call. The pwquality_read_config() parses the configuration file (if I is NULL then the default one). If I is not NULL it also possibly returns auxiliary error information that must be passed into pwquality_strerror() function. =over 4 =item B The library first tries to parse all F<*.conf> configuration files from F<< .d >> directory if it exists. Order of parsing determines what values will be in effect - the latest wins. =back Function pwquality_set_option() is useful for setting the options as configured on a pam module command line in form of I=I. Getter and setter functions for the individual integer and string setting values are: pwquality_set_int_value(), pwquality_set_str_value(), pwquality_get_int_value(), and pwquality_get_str_value(). In case of the string getter the caller must copy the string before another calls that can manipulate the I settings object. The pwquality_generate() function generates a random password of I entropy and checks it according to the settings. The I<*password> is allocated on the heap by the library. The I value is adjusted to fit within the B and B range before generating a password. The pwquality_check() function checks the I according to the settings. It returns either score (value between 0 and 100), negative error number, and possibly also auxiliary error information that must be passed into the pwquality_strerror() function. The I is optional and can be NULL. The I is used for checking the I against the user name and potentially other L information and can be NULL. The I can be NULL - in that case the auxiliary error information is not returned. However if it is non-NULL not passing the returned I<*auxerror> into pwquality_strerror() can lead to memory leaks. The score of a password depends on the value of the setting B. If it is set higher, the score for the same passwords will be lower. Function pwquality_strerror() translates the I and I auxiliary data into a localized text message. If I is NULL the function uses an internal static buffer which makes the function non-reentrant in that case. The returned pointer is not guaranteed to point to the I. The function deallocates eventual I data passed into it, thus it must not be called twice with the same I data. =head1 RETURN VALUES In general the functions which return B return 0 as success value and negative values as concrete B error code. pwquality_strerror() does not allocate data and so it cannot fail. The returned positive or zero score from pwquality_check() should not be used for rejection of passwords, it should be used only as approximate indicator of entropy present in the password with values such as 0-30 being low, 30-60 medium, and 60-100 high. =head1 EXAMPLE Typical use of the libpwquality API: #include ... pwquality_settings_t *pwq; int rv; void *auxerror; char buf[PWQ_MAX_ERROR_MESSAGE_LEN]; pwq = pwquality_default_settings(); if (pwq == NULL) { fprintf(stderr, "Error: %s\n", pwquality_strerror(buf, sizeof(buf), PWQ_ERROR_MEM_ALLOC, NULL)); return -1; } if ((rv=pwquality_read_config(pwq, NULL, &auxerror)) != 0) { pwquality_free_settings(pwq); fprintf(stderr, "Error: %s\n", pwquality_strerror(buf, sizeof(buf), rv, auxerror)); return -1; } rv = pwquality_check(pwq, buf, NULL, user, &auxerror); pwquality_free_settings(pwq); if (rv >= 0) { fprintf(stderr, "Password entropy score is: %d\n", rv); } else { fprintf(stderr, "Password is rejected with error: %s\n", pwquality_strerror(buf, sizeof(buf), rv, auxerror)); } =head1 SEE ALSO L =head1 AUTHORS Tomas Mraz