-
Notifications
You must be signed in to change notification settings - Fork 4
/
Copy pathxml-security-lib.prg
181 lines (133 loc) · 5.27 KB
/
xml-security-lib.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
*
* XMLSecurityLib
*
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 XMLSecurityLib AS Custom
_MemberData = "<VFPData>" + ;
'<memberdata name="convertrsa" type="method" display="ConvertRSA"/>' + ;
'<memberdata name="decryptprivate" type="method" display="DecryptPrivate"/>' + ;
'<memberdata name="decryptPublic" type="method" display="DecryptPublic"/>' + ;
'<memberdata name="decryptsymmetric" type="method" display="DecryptSymmetric"/>' + ;
'<memberdata name="encryptprivate" type="method" display="EncryptPrivate"/>' + ;
'<memberdata name="encryptPublic" type="method" display="EncryptPublic"/>' + ;
'<memberdata name="encryptsymmetric" type="method" display="EncryptSymmetric"/>' + ;
'<memberdata name="getprivatekey" type="method" display="GetPrivateKey"/>' + ;
'<memberdata name="getpublickey" type="method" display="GetPublicKey"/>' + ;
'<memberdata name="padiso10126" type="method" display="PadISO10126"/>' + ;
'<memberdata name="randombytes" type="method" display="RandomBytes"/>' + ;
'<memberdata name="hash" type="method" display="Hash"/>' + ;
'<memberdata name="sha1" type="method" display="SHA1"/>' + ;
'<memberdata name="signdata" type="method" display="SignData"/>' + ;
'<memberdata name="unpadiso10126" type="method" display="UnpadISO10126"/>' + ;
'<memberdata name="verifysignature" type="method" display="VerifySignature"/>' + ;
'<memberdata name="x509export" type="method" display="X509Export"/>' + ;
'<memberdata name="x509parse" type="method" display="X509Parse"/>' + ;
"</VFPData>"
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
RETURN ""
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
RETURN ""
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
RETURN ""
ENDFUNC
FUNCTION Hash (AlgorithmCode AS String, ToHash AS String) AS String
RETURN ""
ENDFUNC
FUNCTION SHA1 (ToHash AS String) AS String
RETURN ""
ENDFUNC
FUNCTION SignData (Data AS String, XMLKey AS XMLSecurityKey)
RETURN ""
ENDFUNC
FUNCTION VerifySignature (Data AS String, Signature AS String, XMLKey AS XMLSecurityKey)
RETURN .F.
ENDFUNC
FUNCTION ConvertRSA (Modulus AS String, Exponent AS String) AS String
LOCAL ExponentEncoding AS String
LOCAL ModulusEncoding AS String
LOCAL SequenceEncoding AS String
LOCAL BitStringEncoding AS String
LOCAL RSAAlgorithmIdentifier AS String
LOCAL PublicKeyInfo AS String
LOCAL Encoding AS String
m.ExponentEncoding = This.MakeASNSegment(0x02, m.Exponent)
m.ModulusEncoding = This.MakeASNSegment(0x02, m.Modulus)
m.SequenceEncoding = This.MakeASNSegment(0x30, m.ModulusEncoding + m.ExponentEncoding)
m.BitStringEncoding = This.MakeASNSegment(0x03, m.SequenceEncoding)
m.RSAAlgorithmIdentifier = "" + 0h300D06092A864886F70D0101010500
m.PublicKeyInfo = This.MakeASNSegment(0x30, m.RSAAlgorithmIdentifier + m.BitStringEncoding)
m.PublicKeyInfo = STRCONV(m.PublicKeyInfo, 13)
m.Encoding = "-----BEGIN PUBLIC KEY-----" + LF
DO WHILE !EMPTY(m.PublicKeyInfo)
m.Encoding = m.Encoding + LEFT(m.PublicKeyInfo, 64) + LF
m.PublicKeyInfo = SUBSTR(m.PublicKeyInfo, 65)
ENDDO
m.Encoding = m.Encoding + "-----END PUBLIC KEY-----" + LF
RETURN m.Encoding
ENDFUNC
HIDDEN FUNCTION MakeASNSegment (Type AS Integer, String AS String) AS String
LOCAL Segment AS String
LOCAL Length AS Integer
DO CASE
CASE m.Type = 0x02 AND ASC(LEFT(m.String, 1)) > 0x7f
m.Segment = CHR(0) + m.String
CASE m.Type = 0x03
m.Segment = CHR(0) + m.String
OTHERWISE
m.Segment = m.String
ENDCASE
m.Length = LEN(m.Segment)
DO CASE
CASE m.Length < 128
m.Segment = CHR(m.Type) + CHR(m.Length) + m.Segment
CASE m.Length < 0x0100
m.Segment = CHR(m.Type) + CHR(0x81) + CHR(m.Length) + m.Segment
CASE m.Length < 0x010000
m.Segment = CHR(m.Type) + CHR(0x82) + CHR(INT(m.Length / 0x0100)) + CHR(m.Length % 0x0100) + m.Segment
OTHERWISE
m.Segment = .NULL.
ENDCASE
RETURN m.Segment
ENDFUNC
FUNCTION PadISO10126 (Data AS String, BlockSize AS Integer) AS String
IF m.BlockSize > 256
ERROR "Block size greater than 256 not allowed."
ENDIF
LOCAL PadChr AS Integer
m.PadChr = m.BlockSize - (LEN(m.Data) % m.BlockSize)
RETURN m.Data + REPLICATE(CHR(m.PadChr), m.PadChr)
ENDFUNC
FUNCTION UnpadISO10126 (Data AS String) AS String
RETURN LEFT(m.Data, LEN(m.Data) - ASC(RIGHT(m.Data, 1)))
ENDFUNC
FUNCTION X509Export (Cert AS String) AS String
RETURN ""
ENDFUNC
FUNCTION X509Parse (Cert AS String) AS Collection
RETURN .NULL.
ENDFUNC
ENDDEFINE