/* ========================================================================== PWDcheck - Verify password using VMS 5.4 sys$hash_password Returns: 0 - Password is invalid 1 - Password is valid Other - VMS error status ========================================================================== */ #include #include #include "iupop3_vms.h" int PWDcheck(char *username, char *password) { int status; short salt; long uafhash[2] = {0,0}; long tmphash[2] = {0,0}; unsigned char algorithm; struct dsc$descriptor_s user_desc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; struct dsc$descriptor_s pwd_desc = {0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0}; user_desc.dsc$a_pointer = username; user_desc.dsc$w_length = strlen(username); pwd_desc.dsc$a_pointer = password; pwd_desc.dsc$w_length = strlen(password); itemopen(inlist_ptr,inlist); itemadd(inlist_ptr,sizeof(salt),UAI$_SALT,&salt,0); itemadd(inlist_ptr,sizeof(uafhash),UAI$_PWD,uafhash,0); itemadd(inlist_ptr,sizeof(algorithm),UAI$_ENCRYPT,&algorithm,0); itemclose(inlist_ptr); status = sys$getuai(0,0,&user_desc,inlist,0,0,0); if (!vms_error(status)) { status = sys$hash_password(&pwd_desc,algorithm,salt,&user_desc,&tmphash); if (!vms_error(status)) status = ((tmphash[0] == uafhash[0]) && (tmphash[1] == uafhash[1])); } return(status); }