forked from ibmruntimes/node-zcrypto
-
Notifications
You must be signed in to change notification settings - Fork 0
/
zcrypto_impl.cc
208 lines (166 loc) · 7.78 KB
/
zcrypto_impl.cc
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
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
/*
* Licensed Materials - Property of IBM
* (C) Copyright IBM Corp. 2020. All Rights Reserved.
* US Government Users Restricted Rights - Use, duplication or disclosure restricted by GSA ADP Schedule Contract with IBM Corp.
*/
#include "zcrypto.h"
#include <unistd.h>
#include <sys/stat.h>
#include <_Nascii.h>
extern "C" int __chgfdccsid(int fd, unsigned short ccsid);
extern "C" int createKDB_impl( const char* filename, const char* password, int length, int expiration, gsk_handle* handle) {
std::string str;
char * filename_e = (char*)malloc(strlen(filename) + 1);
memcpy(filename_e, filename, strlen(filename) + 1);
__a2e_l(filename_e, strlen(filename_e) + 1);
char * password_e = (char*)malloc(strlen(password) + 1);
memcpy(password_e, password, strlen(password) + 1);
__a2e_l(password_e, strlen(password_e) + 1);
int orig = __ae_thread_swapmode(__AE_EBCDIC_MODE);
int rc = gsk_create_database ( filename_e, password_e, gskdb_dbtype_key, length, expiration, handle);
__ae_thread_swapmode(orig);
free(filename_e);
free(password_e);
return rc;
}
extern "C" int openKDB_impl( const char* filename, const char* password, gsk_handle* handle) {
std::string str;
char * filename_e = (char*)malloc(strlen(filename) + 1);
memcpy(filename_e, filename, strlen(filename) + 1);
__a2e_l(filename_e, strlen(filename_e) + 1);
char * password_e = (char*)malloc(strlen(password) + 1);
memcpy(password_e, password, strlen(password) + 1);
__a2e_l(password_e, strlen(password_e) + 1);
int num_records;
gskdb_database_type type;
int orig = __ae_thread_swapmode(__AE_EBCDIC_MODE);
int rc = gsk_open_database( filename_e, password_e, 1, handle, &type, &num_records);
__ae_thread_swapmode(orig);
free(filename_e);
free(password_e);
return rc;
}
extern "C" char* errorString_impl( int error ) {
int orig = __ae_thread_swapmode(__AE_EBCDIC_MODE);
const char* errorStr_e = gsk_strerror( error );
__ae_thread_swapmode(orig);
char * errorStr_a = (char*)malloc(strlen(errorStr_e) + 1);
memcpy(errorStr_a, errorStr_e, strlen(errorStr_e) + 1);
__e2a_l(errorStr_a, strlen(errorStr_a) + 1);
return errorStr_a;
}
extern "C" int openKeyRing_impl( const char* ring_name, gsk_handle* handle) {
std::string str;
char * ring_name_e = (char*)malloc(strlen(ring_name) + 1);
memcpy(ring_name_e, ring_name, strlen(ring_name) + 1);
__a2e_l(ring_name_e, strlen(ring_name_e) + 1);
int num_records;
int orig = __ae_thread_swapmode(__AE_EBCDIC_MODE);
int rc = gsk_open_keyring( ring_name_e, handle, &num_records);
__ae_thread_swapmode(orig);
return rc;
}
extern "C" int exportKeyToFile_impl(const char* filename, const char* password, const char* label, gsk_handle* handle) {
gsk_buffer stream = {0, 0};
char * password_e = (char*)malloc(strlen(password) + 1);
memcpy(password_e, password, strlen(password) + 1);
__a2e_l(password_e, strlen(password_e) + 1);
char * label_e = (char*)malloc(strlen(label) + 1);
memcpy(label_e, label, strlen(label) + 1);
__a2e_l(label_e, strlen(label_e) + 1);
int rc = gsk_export_key(*handle, label_e, gskdb_export_pkcs12v3_binary, x509_alg_pbeWithSha1And3DesCbc
, password_e, &stream);
if (rc !=0 ) { return rc; }
FILE *fileptr;
fileptr = fopen(filename, "wb"); // Open the file in binary mode
write(fileno(fileptr), stream.data, stream.length);
fclose(fileptr); // Close the file
fileptr = fopen(filename, "a+"); // Open the file in binary mode
__chgfdccsid(fileno(fileptr), FT_BINARY);
fclose(fileptr); // Close the file
return rc;
}
extern "C" int exportCertToFile_impl(const char* filename, const char* label, gsk_handle* handle) {
gsk_buffer stream = {0, 0};
char * label_e = (char*)malloc(strlen(label) + 1);
memcpy(label_e, label, strlen(label) + 1);
__a2e_l(label_e, strlen(label_e) + 1);
int rc = gsk_export_certificate(*handle, label_e, gskdb_export_der_binary, &stream);
if (rc !=0 ) { return rc; }
FILE *fileptr;
fileptr = fopen(filename, "wb"); // Open the file in binary mode
write(fileno(fileptr), stream.data, stream.length);
fclose(fileptr); // Close the file
fileptr = fopen(filename, "a+"); // Open the file in binary mode
__chgfdccsid(fileno(fileptr), FT_BINARY);
fclose(fileptr); // Close the file
return rc;
}
extern "C" int exportCertToBuffer_impl(const char* label, gsk_buffer* stream, gsk_handle* handle) {
char * label_e = (char*)malloc(strlen(label) + 1);
memcpy(label_e, label, strlen(label) + 1);
__a2e_l(label_e, strlen(label_e) + 1);
int rc = gsk_export_certificate(*handle, label_e, gskdb_export_der_binary, stream);
return rc;
}
extern "C" int exportKeyToBuffer_impl(const char* password, const char* label, gsk_buffer* stream, gsk_handle* handle) {
char * password_e = (char*)malloc(strlen(password) + 1);
memcpy(password_e, password, strlen(password) + 1);
__a2e_l(password_e, strlen(password_e) + 1);
char * label_e = (char*)malloc(strlen(label) + 1);
memcpy(label_e, label, strlen(label) + 1);
__a2e_l(label_e, strlen(label_e) + 1);
int rc = gsk_export_key(*handle, label_e, gskdb_export_pkcs12v3_binary, x509_alg_pbeWithSha1And3DesCbc
, password_e, stream);
return rc;
}
extern "C" int importKey_impl(const char* filename, const char* password, const char* label, gsk_handle* handle) {
FILE *fileptr;
char * buffer;
long filelen;
char * filename_e = (char*)malloc(strlen(filename) + 1);
memcpy(filename_e, filename, strlen(filename) + 1);
__a2e_l(filename_e, strlen(filename_e) + 1);
char * password_e = (char*)malloc(strlen(password) + 1);
memcpy(password_e, password, strlen(password) + 1);
__a2e_l(password_e, strlen(password_e) + 1);
char * label_e = (char*)malloc(strlen(label) + 1);
memcpy(label_e, label, strlen(label) + 1);
__a2e_l(label_e, strlen(label_e) + 1);
fileptr = fopen(filename, "rb"); // Open the file in binary mode
fseek(fileptr, 0, SEEK_END); // Jump to the end of the file
filelen = ftell(fileptr); // Get the current byte offset in the file
rewind(fileptr); // Jump back to the beginning of the file
buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file
gsk_buffer stream = {(unsigned int)((filelen+1)*sizeof(char)), (void*)buffer};
int rc = gsk_import_key(*handle, label_e, password_e, &stream);
return rc;
}
// The supplied stream can represent either the ASN.1 DER encoding for the certificate or the Cryptographic Message Syntax (PKCS #7)
int importCertificate(char* filename, char* label, gsk_handle* handle) {
FILE *fileptr;
char *buffer;
long filelen;
fileptr = fopen(filename, "rb"); // Open the file in binary mode
fseek(fileptr, 0, SEEK_END); // Jump to the end of the file
filelen = ftell(fileptr); // Get the current byte offset in the file
rewind(fileptr); // Jump back to the beginning of the file
buffer = (char *)malloc((filelen+1)*sizeof(char)); // Enough memory for file + \0
fread(buffer, filelen, 1, fileptr); // Read in the entire file
fclose(fileptr); // Close the file
gsk_buffer stream = {(unsigned int)((filelen+1)*sizeof(char)), (void*)buffer};
int rc = gsk_import_certificate(*handle, label, &stream);
return rc;
}
// The supplied stream can represent either the ASN.1 DER encoding for the certificate or the Cryptographic Message Syntax (PKCS #7)
int exportCertificate(char* filename, char* label, gsk_handle* handle) {
gsk_buffer stream = {0, 0};
int rc = gsk_export_certificate (*handle, label, gskdb_export_der_binary, &stream);
FILE *fileptr;
fileptr = fopen(filename, "wb"); // Open the file in binary mode
fwrite(stream.data, stream.length, 1, fileptr);
fclose(fileptr); // Close the file
return rc;
}