vacman_controller 0.8.0 → 0.9.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/ext/vacman_controller/dpx.c +55 -1
- data/ext/vacman_controller/main.c +3 -0
- data/ext/vacman_controller/serialize.c +37 -1
- data/ext/vacman_controller/vacman_controller.h +5 -1
- data/lib/vacman_controller/token.rb +20 -2
- data/lib/vacman_controller/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e0ca16e795a315dcd5ef2264252c02822ee49dea
|
4
|
+
data.tar.gz: 8ae0fdc80a88b506d2bb6c15791e12c3a13122ab
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 27ec0832a4df5c74031f088cccebcc86be7356b344c4d2f68499293260c5df18d737f3994d5b1e586618fecd733e0d26703300998b6c601867464a680294a8fb
|
7
|
+
data.tar.gz: 18c0f21970fddd3cb094715040ba578b7919d025689545cbea7cbc7e7fed330d2c3a73a61026120aaf11a3f1c6a3946201cfb0fb469754536a7578cb769d3bdb
|
data/ext/vacman_controller/dpx.c
CHANGED
@@ -31,11 +31,26 @@ VALUE vacman_dpx_import(VALUE module, VALUE filename, VALUE key) {
|
|
31
31
|
appl_names,
|
32
32
|
&token_count);
|
33
33
|
|
34
|
+
/* Open the DPX */
|
34
35
|
if (result != 0) {
|
35
36
|
vacman_library_error("AAL2DPXInit", result);
|
36
37
|
return Qnil;
|
37
38
|
}
|
38
39
|
|
40
|
+
/* Get static vector for token activation code generation */
|
41
|
+
aat_ascii sw_out_static_vector[4094+1];
|
42
|
+
aat_int32 sw_out_static_vector_len = sizeof(sw_out_static_vector);
|
43
|
+
result = AAL2DPXGetStaticVector(&dpx_handle,
|
44
|
+
&g_KernelParms,
|
45
|
+
sw_out_static_vector,
|
46
|
+
&sw_out_static_vector_len);
|
47
|
+
|
48
|
+
/* If no static vector is present, clear the buffer */
|
49
|
+
if (result != 0) {
|
50
|
+
memset(sw_out_static_vector, 0, sizeof(sw_out_static_vector));
|
51
|
+
}
|
52
|
+
|
53
|
+
/* Get the tokens */
|
39
54
|
aat_ascii sw_out_serial_No[22+1];
|
40
55
|
aat_ascii sw_out_type[5+1];
|
41
56
|
aat_ascii sw_out_authmode[2+1];
|
@@ -62,7 +77,7 @@ VALUE vacman_dpx_import(VALUE module, VALUE filename, VALUE key) {
|
|
62
77
|
|
63
78
|
VALUE hash = rb_hash_new();
|
64
79
|
|
65
|
-
|
80
|
+
vacman_digipass_to_rbhash_sv(&dpdata, sw_out_static_vector, hash);
|
66
81
|
|
67
82
|
rb_ary_push(list, hash);
|
68
83
|
}
|
@@ -71,3 +86,42 @@ VALUE vacman_dpx_import(VALUE module, VALUE filename, VALUE key) {
|
|
71
86
|
|
72
87
|
return list;
|
73
88
|
}
|
89
|
+
|
90
|
+
|
91
|
+
/*
|
92
|
+
* Generate token activation code
|
93
|
+
*/
|
94
|
+
VALUE vacman_dpx_generate_token_activation(VALUE module, VALUE token) {
|
95
|
+
TDigipassBlob dpdata;
|
96
|
+
|
97
|
+
aat_ascii static_vector[4094+1];
|
98
|
+
vacman_rbhash_to_digipass_sv(token, &dpdata, static_vector, sizeof(static_vector));
|
99
|
+
|
100
|
+
TDigipassBlob *dpdata_ary[8] = { &dpdata, 0, 0, 0, 0, 0, 0, 0 };
|
101
|
+
|
102
|
+
aat_int32 actv_flags = ACTV_OFFLINE;
|
103
|
+
aat_ascii serial_num[14+1];
|
104
|
+
aat_ascii actv_code[4142+1];
|
105
|
+
|
106
|
+
aat_int32 result = AAL2GenActivationCodeXErc(dpdata_ary, /* DPData */
|
107
|
+
1, /* Appl_count */
|
108
|
+
&g_KernelParms, /* CallParms */
|
109
|
+
static_vector, /* aStaticVectorIn DIGIPASS parameter setting */
|
110
|
+
NULL, /* aSharedData for encryption */
|
111
|
+
NULL, /* aAlea for encryption */
|
112
|
+
&actv_flags, /* ActivationFlags */
|
113
|
+
serial_num, /* aSerialNumberSuffix */
|
114
|
+
actv_code, /* aXFAD */
|
115
|
+
NULL); /* aXERC */
|
116
|
+
|
117
|
+
if (result != 0) {
|
118
|
+
vacman_library_error("AAL2GenActivationCodeXErc", result);
|
119
|
+
return Qnil;
|
120
|
+
}
|
121
|
+
|
122
|
+
VALUE ret = rb_hash_new();
|
123
|
+
rb_hash_aset(ret, rb_str_new2("serial"), rb_str_new2(serial_num));
|
124
|
+
rb_hash_aset(ret, rb_str_new2("activation"), rb_str_new2(actv_code));
|
125
|
+
|
126
|
+
return ret;
|
127
|
+
}
|
@@ -22,7 +22,10 @@ void Init_vacman_low_level(void) {
|
|
22
22
|
|
23
23
|
/* Global methods */
|
24
24
|
rb_define_singleton_method(lowlevel, "library_version", vacman_library_version, 0);
|
25
|
+
|
26
|
+
/* DPX methods */
|
25
27
|
rb_define_singleton_method(lowlevel, "import", vacman_dpx_import, 2);
|
28
|
+
rb_define_singleton_method(lowlevel, "generate_activation", vacman_dpx_generate_token_activation, 1);
|
26
29
|
|
27
30
|
/* Token methods */
|
28
31
|
rb_define_singleton_method(lowlevel, "token_property_names", vacman_token_get_property_names, 0);
|
@@ -36,7 +36,30 @@ void vacman_rbhash_to_digipass(VALUE token, TDigipassBlob* dpdata) {
|
|
36
36
|
}
|
37
37
|
|
38
38
|
/*
|
39
|
-
* Convert a
|
39
|
+
* Convert a Ruby Hash with the required keys to a TDigipassBlob structure,
|
40
|
+
* and extract the token static vector into the buffer pointed to by dpsv,
|
41
|
+
* copying at most dpsv_len bytes.
|
42
|
+
*
|
43
|
+
* The inner beauty of using an hash to store this data back and forth is
|
44
|
+
* that optional data such as the static vector can only be taken into account
|
45
|
+
* in routines that need it, leaving it completely opaque for the rest of the
|
46
|
+
* code.
|
47
|
+
*
|
48
|
+
* Given that the token hash is meant to be updated by the calls, and given
|
49
|
+
* that everything is allocated on the stack, this stays threadsafe and does
|
50
|
+
* not induce oddities as no routine here is removing keys from the provided
|
51
|
+
* hash - only using the ones that are needed.
|
52
|
+
*/
|
53
|
+
void vacman_rbhash_to_digipass_sv(VALUE token, TDigipassBlob* dpdata, aat_ascii* dpsv, aat_int32 dpsv_len) {
|
54
|
+
vacman_rbhash_to_digipass(token, dpdata);
|
55
|
+
|
56
|
+
VALUE sv = rbhash_get_key(token, "sv", T_STRING);
|
57
|
+
|
58
|
+
strncpy(dpsv, rb_string_value_cstr(&sv), dpsv_len);
|
59
|
+
}
|
60
|
+
|
61
|
+
/*
|
62
|
+
* Convert a TDigipassBlob structure into a Ruby Hash.
|
40
63
|
*/
|
41
64
|
void vacman_digipass_to_rbhash(TDigipassBlob* dpdata, VALUE hash) {
|
42
65
|
char buffer[256];
|
@@ -57,6 +80,19 @@ void vacman_digipass_to_rbhash(TDigipassBlob* dpdata, VALUE hash) {
|
|
57
80
|
rb_hash_aset(hash, rb_str_new2("flags2"), rb_fix_new(dpdata->DPFlags[1]));
|
58
81
|
}
|
59
82
|
|
83
|
+
/*
|
84
|
+
* Convert the given TDigipassBlob and the given token static vector into a
|
85
|
+
* Ruby hash.
|
86
|
+
*
|
87
|
+
* Calls vacman_digipass_to_rbhash() and then adds to it the additional "sv"
|
88
|
+
* key with the token static vector passed in as a C string.
|
89
|
+
*/
|
90
|
+
void vacman_digipass_to_rbhash_sv(TDigipassBlob* dpdata, aat_ascii* dpsv, VALUE hash) {
|
91
|
+
vacman_digipass_to_rbhash(dpdata, hash);
|
92
|
+
|
93
|
+
rb_hash_aset(hash, rb_str_new2("sv"), rb_str_new2(dpsv));
|
94
|
+
}
|
95
|
+
|
60
96
|
/*
|
61
97
|
* Gets the given property from the given token hash and raises an Error
|
62
98
|
* if the following conditions occur:
|
@@ -37,11 +37,15 @@ VALUE vacman_token_verify_password(VALUE module, VALUE token, VALUE password);
|
|
37
37
|
VALUE vacman_token_generate_password(VALUE module, VALUE token);
|
38
38
|
|
39
39
|
/* Token interchange format between Ruby and libaal2 (serialize.c) */
|
40
|
-
void vacman_rbhash_to_digipass(VALUE token, TDigipassBlob* dpdata);
|
41
40
|
void vacman_digipass_to_rbhash(TDigipassBlob* dpdata, VALUE hash);
|
41
|
+
void vacman_digipass_to_rbhash_sv(TDigipassBlob* dpdata, aat_ascii* dpsv, VALUE hash);
|
42
|
+
|
43
|
+
void vacman_rbhash_to_digipass(VALUE token, TDigipassBlob* dpdata);
|
44
|
+
void vacman_rbhash_to_digipass_sv(VALUE token, TDigipassBlob* dpdata, aat_ascii* dpsv, aat_int32 dpsv_len);
|
42
45
|
|
43
46
|
/* DPX methods (dpx.c) */
|
44
47
|
VALUE vacman_dpx_import(VALUE module, VALUE filename, VALUE key);
|
48
|
+
VALUE vacman_dpx_generate_token_activation(VALUE module, VALUE token);
|
45
49
|
|
46
50
|
#if defined(__cplusplus)
|
47
51
|
#if 0
|
@@ -79,8 +79,8 @@ module VacmanController
|
|
79
79
|
end
|
80
80
|
|
81
81
|
|
82
|
-
# Generate an
|
83
|
-
# on the hardware token.
|
82
|
+
# Generate an OTP from this token. This does the same as hitting the
|
83
|
+
# button on the hardware token.
|
84
84
|
#
|
85
85
|
# == Returns:
|
86
86
|
# The OTP as a String. The OTP is only valid for a limited time period.
|
@@ -92,6 +92,24 @@ module VacmanController
|
|
92
92
|
end
|
93
93
|
|
94
94
|
|
95
|
+
# Generate activation data from the token blob and the digipass parameters
|
96
|
+
# embodied in the token static initialisation vector.
|
97
|
+
#
|
98
|
+
# == Returns:
|
99
|
+
# The token serial number and the activation code as an Array, suitable
|
100
|
+
# for multiple assignment.
|
101
|
+
#
|
102
|
+
# Not all tokens support activation data generation. This is determined by
|
103
|
+
# the DPX having a static vector or not. You can check whether your token
|
104
|
+
# instance has a static vector by assessing the presence of the 'sv' key
|
105
|
+
# in the token hash.
|
106
|
+
#
|
107
|
+
def activation
|
108
|
+
ad = VacmanController::LowLevel.generate_activation(@token_hash)
|
109
|
+
[ ad.fetch('serial').scan(/\d(\d)/).flatten.join, ad.fetch('activation') ]
|
110
|
+
end
|
111
|
+
|
112
|
+
|
95
113
|
# Set this token's PIN
|
96
114
|
#
|
97
115
|
# == Parameters:
|
metadata
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: vacman_controller
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.9.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Marcus Lankenau
|
@@ -137,7 +137,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
137
137
|
version: '0'
|
138
138
|
requirements: []
|
139
139
|
rubyforge_project:
|
140
|
-
rubygems_version: 2.5.2
|
140
|
+
rubygems_version: 2.5.2
|
141
141
|
signing_key:
|
142
142
|
specification_version: 4
|
143
143
|
summary: Ruby layer to access VASCO Vacman Controller functions
|