/*
 ==========================================================================
 PWDcheck - Verify password using VMS 5.4 sys$hash_password

 Returns:
   0     - Password is invalid
   1     - Password is valid
   Other - VMS error status
 ==========================================================================
*/

#include <uaidef.h>
#include <descrip.h>
#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);
}
