Const CERT_PROFILE_WINDOWS_STORE = "100"
Const CERT_PROFILE_USB_TOKEN = "200"
Const CSP_NAME_100 = "Microsoft Enhanced Cryptographic Provider v1.0"
Const CSP_NAME_200 = "eToken Base Cryptographic Provider"

'================================================================
' ■ DoKeyGen
'================================================================
Function DoKeyGen(intExportFlag, isRunningOnVista)
   On Error Resume Next


   Dim options
   Dim keyflags
   Dim cryptoProvName
   Dim cryptoProvType
   Dim forceProviderName
   Dim forceProviderType
   Dim publicKey
   Dim buttonId

   keyflags=0
   forceProviderName = ""
   forceProviderType = 0

   Dim certProfileValue
   set certProfiles = document.getElementsByName("rbsMS01Info.certProfile")
   If certProfiles.length = 1 Then
       certProfileValue = certProfiles(0).value
   Else
      For i = 0 To certProfiles.length -1
         if certProfiles(i).checked then
            certProfileValue = certProfiles(i).value
         end if
      Next
   End if


   If CERT_PROFILE_WINDOWS_STORE = certProfileValue Then
      cryptoProvName = CSP_NAME_100
   Elseif CERT_PROFILE_USB_TOKEN = certProfileValue Then
      cryptoProvName = CSP_NAME_200
   End if

   If IsEmpty(cryptoProvName) Then
      document.getElementById("scriptErrCode").value = "-2"
      exit function
   End if

   cryptoProvType = 1

   'Running on a 2000/XP
   if isRunningOnVista = 0 Then
      On Error resume next
      cenroll.providerType = cryptoProvType
      cenroll.providerName = cryptoProvName
      cenroll.HashAlgorithm = "SHA1"
      cenroll.KeySpec = 1
   'Running on a Vista
   Else
      forceProviderName = cryptoProvName
      forceProviderType = cryptoProvType
   End if

   If intExportFlag = 1 Then
      keyflags = keyflags OR 1
   End If

   If Err.Number <> 0 Then
      document.getElementById("scriptErrCode").value = Err.Number
      exit function
   End If

   publicKey = CreateP10VB(keyflags, forceProviderName,isRunningOnVista)

   If Err.Number <> 0 Then
      document.getElementById("scriptErrCode").value = Err.Number
      exit function
   End If

   document.getElementsByName("bsMS002Info.publicKey")(0).value = publicKey
   document.getElementById("scriptErrCode").value = Err.Number

End Function

'================================================================
' ■ CreateP10VB
'================================================================
Function CreateP10VB( keyflags, forceProviderName, isRunningOnVista)
   On Error Resume Next
   CreateP10VB = ""

   ' Create PublicKey for 2000/XP
   If isRunningOnVista = 0 Then
      cenroll.GenKeyFlags = &h08000000 OR keyflags
      CreateP10VB = cenroll.CreatePKCS10("CN=vsc1enroll", "1.3.6.1.5.5.7.3.2")

   ' Create PublicKey for Vista
   Else
      On Error Resume Next

      Dim pkcs10
      Dim objPrivateKey
      Dim objRequest
      Dim extensionTemplate1
      Dim objKeyUsageExt
      Dim objDn
      Dim objEnroll
      Const CRYPT_STRING_BASE64 = 1
      Const contextUser = 1
      spnCertEnroll.innerHTML="<object id='g_objClassFactory' classid='clsid:884e2049-217d-11da-b2a4-000e7bbb2b09'></object>"

      set objPrivateKey = g_objClassFactory.CreateObject("X509Enrollment.CX509PrivateKey")
      objPrivateKey.ProviderName=forceProviderName

      if (keyflags AND 2) = 2 Then
         objPrivateKey.KeyProtection = 1
      Else
         objPrivateKey.KeyProtection = 0
      End if

      if (keyflags AND 1) = 1 Then
         objPrivateKey.ExportPolicy = 1
      Else
         objPrivateKey.ExportPolicy = 0
      End if

      objPrivateKey.Length = 2048
      objPrivateKey.keySpec = 2

      '-- Initialize P10 based on private key
      set objRequest = g_objClassFactory.CreateObject("X509Enrollment.CX509CertificateRequestPkcs10")
      if ( err.number <> 0 ) then
         Exit Function
      End if

      call objRequest.InitializeFromPrivateKey(contextUser, objPrivateKey, "")

      ''-- KeyUsage Extension
      set objKeyUsageExt = g_objClassFactory.CreateObject("X509Enrollment.CX509ExtensionKeyUsage")
      objKeyUsageExt.InitializeEncode(&ha0)
      objRequest.X509Extensions.Add(objKeyUsageExt)

      '-- DN related stuff
      set objDn = g_objClassFactory.CreateObject("X509Enrollment.CX500DistinguishedName")
      call objDn.Encode(strDN, XCN_CERT_NAME_STR_NONE)
      objRequest.subject = objDn

      set objEnroll = g_objClassFactory.CreateObject("X509Enrollment.CX509Enrollment")
      objEnroll.InitializeFromRequest(objRequest)

      pkcs10 = objEnroll.CreateRequest(CRYPT_STRING_BASE64)
      if ( err.number <> 0 ) then
         Exit Function
      End if

      CreateP10VB = pkcs10

  End if
End Function



