-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathxml-security-lib-foxcryptong.prg
196 lines (142 loc) · 4.42 KB
/
xml-security-lib-foxcryptong.prg
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
*
* XMLSecurityLib - foxCryptoNG implementation
*
IF !SYS(16) $ SET("Procedure")
SET PROCEDURE TO (SYS(16)) ADDITIVE
ENDIF
#INCLUDE "xml-security.h"
#DEFINE SAFETHIS ASSERT !USED("This") AND TYPE("This") == "O"
DEFINE CLASS XMLSecurityLibFoxCryptoNG AS XMLSecurityLib
Crypto = .NULL.
_MemberData = "<VFPData>" + ;
'<memberdata name="crypto" type="property" display="Crypto"/>' + ;
"</VFPData>"
FUNCTION Init
TRY
IF _VFP.StartMode = 0
This.Crypto = NEWOBJECT("foxCryptoNG", (LOCFILE("foxCryptoNG.prg")))
ELSE
This.Crypto = NEWOBJECT("foxCryptoNG", "foxCryptoNG.prg")
ENDIF
CATCH
This.Crypto = .NULL.
ENDTRY
IF ISNULL(This.Crypto)
RETURN .NULL.
ENDIF
ENDFUNC
*!* FUNCTION DecryptPrivate (Data AS String, XMLKey AS XMLSecurityKey) AS String
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION DecryptPublic (Data AS String, XMLKey AS XMLSecurityKey) AS String
*!* RETURN ""
*!* ENDFUNC
FUNCTION DecryptSymmetric (Data AS String, XMLKey AS XMLSecurityKey) AS String
IF !(UPPER(LEFT(m.XMLKey.CryptParams("Algorithm"), 3)) == "AES")
RETURN .NULL.
ENDIF
LOCAL PaddedData AS String
LOCAL EncryptedData AS String
LOCAL SecretKey AS String
LOCAL IV AS String
LOCAL BSize AS Integer
m.BSize = m.XMLKey.CryptParams("BlockSize")
m.IV = LEFT(m.Data, m.BSize)
m.EncryptedData = SUBSTR(m.Data, m.BSize + 1)
m.SecretKey = m.XMLKey.Key
LOCAL Decrypted AS String
m.Decrypted = .NULL.
m.PaddedData = This.Crypto.Decrypt_AES(m.EncryptedData, m.SecretKey, m.IV)
IF !EMPTY(m.PaddedData)
m.Decrypted = This.UnpadISO10126(LEFT(m.PaddedData, LEN(m.PaddedData) - m.BSize))
ENDIF
RETURN m.Decrypted
ENDFUNC
*!* FUNCTION EncryptPrivate (Data AS String, XMLKey AS XMLSecurityKey) AS String
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION EncryptPublic (Data AS String, XMLKey AS XMLSecurityKey) AS String
*!* RETURN ""
*!* ENDFUNC
FUNCTION EncryptSymmetric (Data AS String, XMLKey AS XMLSecurityKey) AS String
LOCAL PaddedData AS String
LOCAL SecretKey AS String
LOCAL IV AS String
LOCAL BSize AS Integer
LOCAL Encrypted AS String
IF !(UPPER(LEFT(m.XMLKey.CryptParams("Algorithm"), 3)) == "AES")
RETURN .NULL.
ENDIF
m.BSize = m.XMLKey.CryptParams("BlockSize")
m.PaddedData = This.PadISO10126(m.Data, m.BSize)
m.IV = This.RandomBytes(m.BSize)
m.SecretKey = m.XMLKey.Key
IF ISNULL(m.SecretKey) OR EMPTY(m.SecretKey)
m.SecretKey = This.RandomBytes(m.XMLKey.CryptParams("KeySize"))
m.XMLKey.Key = m.SecretKey
ENDIF
m.Encrypted = This.Crypto.Encrypt_AES(m.PaddedData, m.SecretKey, m.IV)
IF !EMPTY(m.Encrypted)
RETURN m.IV + m.Encrypted
ELSE
RETURN .NULL.
ENDIF
ENDFUNC
*!* FUNCTION GetPrivateKey (Cert AS String, Password AS String) AS String
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION GetPublicKey (Cert AS String, IsCert AS Boolean) AS String
*!* RETURN ""
*!* ENDFUNC
FUNCTION RandomBytes (Size AS Integer) AS String
LOCAL BIndex AS Integer
LOCAL RandomBytes AS Blob
LOCAL XoredBytes AS Blob
m.RandomBytes = 0h
m.XoredBytes = 0h
FOR m.BIndex = 1 TO m.Size
m.RandomBytes = m.RandomBytes + CAST(CHR(INT(RAND() * 255)) AS Blob)
m.XoredBytes = CAST(CHR(INT(RAND() * 255)) AS Blob) + m.XoredBytes
ENDFOR
m.RandomBytes = BITXOR(m.RandomBytes, m.XoredBytes)
RETURN m.RandomBytes
ENDFUNC
FUNCTION Hash (AlgorithmCode AS String, ToHash AS String) AS String
LOCAL HashedData AS String
DO CASE
CASE m.AlgorithmCode == HASH_SHA1
m.AlgorithmName = "SHA1"
CASE m.AlgorithmCode == HASH_SHA256
m.AlgorithmName = "SHA256"
CASE m.AlgorithmCode == HASH_SHA384
m.AlgorithmName = "SHA384"
CASE m.AlgorithmCode == HASH_SHA512
m.AlgorithmName = "SHA512"
CASE m.AlgorithmCode == HASH_RIPEMD160
m.AlgorithmName = "RIPEMD160"
OTHERWISE
RETURN .NULL.
ENDCASE
m.HashedData = This.Crypto.HashData(m.AlgorithmName, m.ToHash)
IF EMPTY(m.HashedData)
RETURN .NULL.
ELSE
RETURN STRCONV(m.HashedData, 16)
ENDIF
ENDFUNC
FUNCTION SHA1 (ToHash AS String) AS String
RETURN STRCONV(This.Hash(HASH_SHA1, m.ToHash), 15)
ENDFUNC
*!* FUNCTION SignData (Data AS String, XMLKey AS XMLSecurityKey)
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION VerifySignature (Data AS String, Signature AS String, XMLKey AS XMLSecurityKey)
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION X509Export (Cert AS String) AS String
*!* RETURN ""
*!* ENDFUNC
*!* FUNCTION X509Parse (Cert AS String) AS Collection
*!* RETURN .NULL.
*!* ENDFUNC
ENDDEFINE