File: vbs.py

package info (click to toggle)
pyca 20031118-2
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 644 kB
  • ctags: 933
  • sloc: python: 4,998; sh: 646; makefile: 43
file content (202 lines) | stat: -rw-r--r-- 5,466 bytes parent folder | download | duplicates (5)
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
"""
vbs.py - generate VBScript for cert enrollment with M$ Internet Explorer
c) by Michael Stroeder, michael@stroeder.com

Special thanks to:
- inspired code contributed by Jordi Floriach <jfloriach@afina.net>,
- VBScript function PrintVBSCryptoProvider() appears by courtesy of
  Michael Konietzka <ca-project@konietzka.de>
"""

__version__='0.6.6'

import sys, string

def PrintVBSXenrollObject(codebase='xenroll.dll'):
  """
  <OBJECT> for xenroll.dll
  """
  print """
<OBJECT
  classid="clsid:127698e4-e730-4e5c-a2b1-21490a70c8a1"
  sXEnrollVersion="5,131,3659,0"
  CODEBASE="%s"
  id="certHelper"
>
</OBJECT>
""" % (codebase)

def PrintVBSKeyGenCode(form):
  """
  Generate code for key generation in Internet Explorer
  """

  # Mapping von SPKAC- zu DN-Attributnamen
  spkac2DNname = {
    'countryName':'C',
    'stateOrProvinceName':'S',
    'localityName':'L',
    'organizationName':'O',
    'organizationalUnitName':'OU',
    'commonName':'CN',
    'emailAddress':'1.2.840.113549.1.9.1',
    'initials':'2.5.4.43',
    'uid':'0.9.2342.19200300.100.1.1',
    'userID':'0.9.2342.19200300.100.1.1',
  }

  formKeys = form.inputkeys[:]
  for unwantedkey in ['userpassword','challenge','browsertype','PKCS10']:
    try:
      formKeys.remove(unwantedkey)
    except ValueError:
      pass
  CertDN_list = []
  for i in formKeys:
    if (i in form.inputkeys) and form.field[i][0].content:
      CertDN_list.append('%s=%s' % (spkac2DNname.get(i,i),form.field[i][0].content))

  print """
Function GenTheKeyPair()

  Dim certHelper

  Set certHelper = CreateObject("CEnroll.CEnroll.2")
  if ( (Err.Number = 438) OR (Err.Number = 429) ) Then
    Err.Clear
    Set certHelper = CreateObject("CEnroll.CEnroll.1")
  End If

  Dim keyprov, key, prov, pkcs10data
  keyprov = document.KeyGenForm.KeySize.value
  key     = Mid(keyprov,1,1)
  prov    = Mid(keyprov,2)

  certHelper.providerType = 1
  certHelper.providerName = prov

  If key = "4" Then
    certHelper.GenKeyFlags = &h04000003
  Else
    certHelper.GenKeyFlags = &h02000003
  End If
  certHelper.HashAlgorithm = "MD5"
  certHelper.KeySpec = 1

  certHelper.EnableT61DNEncoding = True

  pkcs10data = certHelper.createPKCS10("%s", "")
  If (pkcs10data = Empty) Then
    Alert "Error " & Hex(Err) & ": Your credentials could not be generated."
  Else
    Alert "The following certificate request was generated:"&chr(13)&chr(10)&"%s"
    Document.KeyGenForm.PKCS10.value = pkcs10data
    Document.KeyGenForm.submit()
  End If
End Function

""" % (string.join(CertDN_list,';'),string.join(CertDN_list,'"&chr(13)&chr(10)&"'))

###########################################################################
# Generate code for installing certificate in Internet Explorers cert DB
###########################################################################

def PrintVBSCertInstallCode(subject,serial,notafterstr,cert):

  certlines = string.split(cert,'\n')[1:-2]
  certcode = string.join(certlines,'" & chr(10) & _\n              "')

  msgstr = """"The following certificate will be installed:" & chr(13) & chr(10) & _
    "Serial: %s" & chr(13) & chr(10) & _
    "Subject: %s" & chr(13) & chr(10) & _
    "Valid until: %s" & chr(13) & chr(10)
    """ % (serial,subject,notafterstr)

  print """
Function InstallPKCS7Cert()

  Dim certHelper

  Set certHelper = CreateObject("CEnroll.CEnroll.2")
  if ( (Err.Number = 438) OR (Err.Number = 429) ) Then
    Err.Clear
    Set certHelper = CreateObject("CEnroll.CEnroll.1")
  End If

  Dim PKCS7Cert
  PKCS7Cert = "%s"
  On Error Resume Next
  MsgBox %s

  err.clear
  certHelper.AcceptPKCS7(PKCS7Cert)
  If Err.Number <> 0 Then
    Alert "Error " & Hex(Err) & ": The certificate could not be installed."
  Else
    MsgBox "The certificate was successfully installed."
  End If

End Function

Call InstallPKCS7Cert()
""" % (certcode,msgstr)

###########################################################################
# Generate code for choosing cryptographic provider
# Derived from example code by Michael Konietzka <ca-project@konietzka.de>
###########################################################################

def PrintVBSCryptoProvider():
  print """
Sub KeySizeSelectList

  Dim certHelper

  Set certHelper = CreateObject("CEnroll.CEnroll.2")
  if ( (Err.Number = 438) OR (Err.Number = 429) ) Then
    Err.Clear
    Set certHelper = CreateObject("CEnroll.CEnroll.1")
  End If

  Dim i
  Dim providers()
  Dim KeySizeOption
  Dim cryptoprovider
  Dim DefaultKeySize
  Dim enhanced
  On Error Resume Next

  i = 0
  DefaultKeySize = 0
  certHelper.providerType = 1

  Do
    cryptoprovider = ""
    cryptoprovider = certHelper.enumProviders(i,0)
    If Len(cryptoprovider) = 0 Then
      Exit Do
    Else
      enhanced = InStr(1,cryptoprovider,"Enhanced",1)
      set KeySizeOption = document.createElement("OPTION")
      If enhanced = 0 Then
	KeySizeOption.text = "512 bit, " & cryptoprovider
	KeySizeOption.value = "2"&cryptoprovider
      Else
	KeySizeOption.text = "1024 bit, " & cryptoprovider
	KeySizeOption.value = "4" & cryptoprovider
	document.KeyGenForm.KeySize.add(KeySizeOption)
	DefaultKeySize = i
	i = i+1
	set KeySizeOption = document.createElement("OPTION")
	KeySizeOption.text = "512 bit, " & cryptoprovider
	KeySizeOption.value = "2" & cryptoprovider
      End If
      document.KeyGenForm.KeySize.add(KeySizeOption)
    End If
      i = i+1
  Loop

  document.KeyGenForm.KeySize.DefaultKeySizeIndex = DefaultKeySize

  End Sub
"""