/* * kakumei_pass.h * * Password handling for kakumei. * * Author: Dario Rodriguez dario@softhome.net * This progran is licensed under the terms of the Affero GPL v1+ */ #include #include #include #include #include #include #include #include "kakumei.h" #include "libscrypt.h" int pass_new(kakumei *ka, char *user, char *passwd) { int fd; char filename[1024]; char mcf[SCRYPT_MCF_LEN+1]; int len; if(kakumei_uservalid(ka,user)!=0) return(-1); snprintf(filename,sizeof(filename)-1,"%s/%s/passwd",USERSDIR,user); filename[sizeof(filename)-1]='\0'; memset(mcf,0,sizeof(mcf)); libscrypt_hash(mcf,passwd,SCRYPT_N,SCRYPT_r,SCRYPT_p); if((fd=open(filename,O_WRONLY|O_TRUNC|O_CREAT,0600))==-1) return(-1); len=strlen(mcf); if(write(fd,mcf,len)!=len) { close(fd),fd=-1; return(-1); } close(fd),fd=-1; return(0); } int pass_check(kakumei *ka, char *user, char *passwd) { int fd; char filename[1024]; char mcf[SCRYPT_MCF_LEN+1]; if(kakumei_userexists(ka,user)!=0) return(-1); snprintf(filename,sizeof(filename)-1,"%s/%s/passwd",USERSDIR,user); filename[sizeof(filename)-1]='\0'; if((fd=open(filename,O_RDONLY))==-1) return(-1); memset(mcf,0,sizeof(mcf)); read(fd,mcf,sizeof(mcf)-1); close(fd),fd=-1; if(libscrypt_check(mcf,passwd)<=0) return(-1); return(0); }