1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
|
/*
* VAX/VMS Password hashing routines:
*
* uses the System Service SYS$HASH_PASSWORD
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
* the above copyright notice appear in all copies and that both that
* copyright notice and this permission notice appear in supporting
* documentation. No representations are made about the suitability of this
* software for any purpose. It is provided "as is" without express or
* implied warranty.
*
*/
#include <syidef.h>
#include <descrip.h>
#include <string.h>
#include <starlet.h>
/*
* Hashing routine
*/
hash_vms_password(output_buf,input_buf,input_length,username,encryption_type,salt)
char *output_buf;
char *input_buf;
int input_length;
char *username;
int encryption_type;
unsigned short salt;
{
struct dsc$descriptor_s password;
struct dsc$descriptor_s user;
/*
* Check the VMS Version. If this is V5.4 or later, then
* we can use the new system service SYS$HASH_PASSWORD. Else
* fail and return garbage.
*/
static char VMS_Version[32];
struct {
unsigned short int Size;
unsigned short int Code;
char *Buffer;
unsigned short int *Resultant_Size;
} Item_List[2]={32, SYI$_VERSION, VMS_Version, 0, 0, 0};
struct {int Size; char *Ptr;} Descr1;
/*
* Get the information
*/
sys$getsyiw(0,0,0,Item_List,0,0,0);
/*
* Call the old routine if this isn't V5.4 or later...
*/
#ifndef __DECC
if ((VMS_Version[1] < '5') ||
((VMS_Version[1] == '5') && (VMS_Version[3] < '4'))) {
printf("Unsupported OS version\n");
return(1);
}
#endif /* !__DECC */
/*
* Call the SYS$HASH_PASSWORD system service...
*/
password.dsc$b_dtype = DSC$K_DTYPE_T;
password.dsc$b_class = DSC$K_CLASS_S;
password.dsc$w_length = input_length;
password.dsc$a_pointer = input_buf;
user.dsc$b_dtype = DSC$K_DTYPE_T;
user.dsc$b_class = DSC$K_CLASS_S;
user.dsc$w_length = strlen(username);
user.dsc$a_pointer = username;
sys$hash_password (&password, encryption_type, salt, &user, output_buf);
}
|