﻿/*
<object id="oCAPICOM" codebase="http://download.microsoft.com/download/E/1/8/E18ED994-8005-4377-A7D7-0A8E13025B94/capicom.cab#version=2,0,0,3" classid="clsid:A996E48C-D3DC-4244-89F7-AFA33EC60679" VIEWASTEXT="true">
</object>
<script src="/javascripts/Signer.js" type="text/javascript" language="javascript"></script>

Login as bidder: no change

Login as publisher
1. login.thumbprint == null
Y: SelectCertificateDlg, GetCertificateThumbprint, login.thumbprint=@thumbprint
N: hidden.thumbprint, SelectCertificateThumbprint(hidden.thumbprint)
2. hidden.thumbprint = login.thumbprint

Sign:
1. SelectCertificateThumbprint
2. SetData(data)
3. DoSign()
4. sign = GetSign()
5. notice.data = data, notice.sign = sign

Verify:
1. SetSign(sign)
2. DoVerify()
3. d = GetData()
4. hidden.data == d

Encrypt:
1. SelectCertificateEncryption(str)
2. SetData(data)
3. DoEncrypt()
4. e = GetEncrypt()

Decrypt:
1. SetEncrypt(e)
2. DoDecrypt()
3. d = GetData()


// mapping certificate
var oSigner = new Signer();
oSigner.SelectCertificateDlg();
thumbprint = oSigner.GetCertificateThumbprint()
    
// signing
var oSigner = new Signer();
oSigner.SelectCertifiateThumbprint("111");
oSigner.SetData("test123");
alert(oSigner.GetData());
oSigner.DoSign();
var sign = oSigner.GetSign();
alert(sign);
    
// verify
var oSigner = new Signer();
sign = "SIGNdummytest1234";
oSigner.SetSign(sign);
oSigner.DoVerify();
data = oSigner.GetData();
alert(data);
    
// encryption
var oSigner = new Signer();
oSigner.SelectCertificateEncryption("public key");
oSigner.SetData("price bid");
oSigner.DoEncrypt();
encrypt = oSigner.GetEncrypt();
alert(encrypt);
    
// decryption
var oSigner = new Signer();
data = "ENCRYPTpricebid10000";
oSigner.SetEncrypt(data);
oSigner.DoDecrypt();
data = oSigner.GetData();
alert(data);


*/

var CAPICOM_CURRENT_USER_STORE = 2;
var CAPICOM_MY_STORE = "My";
var CAPICOM_STORE_OPEN_READ_ONLY = 0;
var CAPICOM_ENCODE_BASE64 = 0;
var CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN = 1;
var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;
var CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE = 1;

/// inserted by kinjal -01-04 {
var CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME	=	0;
var CAPICOM_CERT_INFO_ISSUER_SIMPLE_NAME=	1;
var CAPICOM_CERT_INFO_SUBJECT_EMAIL_NAME=		2;
var CAPICOM_CERT_INFO_ISSUER_EMAIL_NAME	=	3;
var CAPICOM_CERT_INFO_SUBJECT_UPN=	4;
var CAPICOM_CERT_INFO_ISSUER_UPN	=5;
var CAPICOM_CERT_INFO_SUBJECT_DNS_NAME	=6;
var CAPICOM_CERT_INFO_ISSUER_DNS_NAME = 7;
var CAPICOM_ENCRYPTION_ALGORITHM_3DES = 3;
var CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM = 0;
var CAPICOM_ENCODE_BASE64 = 0;
/// }end



var ERR_NO_SIGN_CERT = "No Signer Certificate Selected";
var ERR_STORE_NOT_OPEN = "Certificate Store not open";
var ERR_CERTIFICATE_SELECTION = "Certificate Selection Error";
var ERR_CERTIFICATE_SELECTION_CANCELLED = "Certificate Selection Cancelled";
var ERR_NO_SIGNED_DATA = "No signed Data";

function StoreOpen() {
    store = new ActiveXObject("CAPICOM.Store");
    store.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE, CAPICOM_STORE_OPEN_READ_ONLY);
    return (store);
}

function SelectCertificateDlg() {
   
    if (this.Store == null) 
    {
        this.Store = StoreOpen();
    }
    var tCerts = this.Store.Certificates.Select("Select Certificate", "Select certificate for signing", false);
    if (tCerts.Count == 1) {
        this.SignCert = tCerts.Item(1);
    }
}

function SelectCertificateThumbprint(thumbprint) {
    if (this.Store == null) {
        this.Store = StoreOpen();
    }
    var tCerts = this.Store.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint, true);
    if (tCerts.Count == 1) {
        this.SignCert = tCerts.Item(1);
    }
}
///  ankur
function GetCertificatePublicKey() {
    return this.SignCert.PublicKey().EncodedKey.Format(true);
}
///  ankur
function GetCertificateIssueTo()
{       
     /// changed by kinjal 01-04
	return this.SignCert.GetInfo(CAPICOM_CERT_INFO_SUBJECT_SIMPLE_NAME);

}
///  ankur
function GetCertificateIssueBy()
{
    return this.SignCert.IssuerName;
}
///  ankur
function GetCertificateSerialNo()
{
    return this.SignCert.SerialNumber;
}
///  ankur
function GetCertificateSubject()
{
    return this.SignCert.SubjectName;
}
///  ankur
function GetCertificateValidFrom()
{   
    return this.SignCert.ValidFromDate;    
}
///  ankur
function GetCertificateValidTo()
{
    return this.SignCert.ValidToDate;
}





function SelectCertificateEncryption(publickey) {
    this.EncryptCert = "3";
}

function GetCertificateThumbprint() {
    if (this.SignCert != null) {
        return this.SignCert.Thumbprint;
    } else {
        alert("no certificate selected");
        return "aaaabbbbccccdddd";
    }
}

function SetData(data) {
    this.Data = data;
}

function GetSign() {
    return this.Sign;
}

function DoSign() {
    if (this.SignCert != null) {        
       
        var signer = new ActiveXObject("CAPICOM.Signer");       
        signer.Certificate = this.SignCert;       
        signer.Options = CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
      
        var signedData = new ActiveXObject("CAPICOM.SignedData");
      
        signedData.Content = this.Data;
        this.Sign = signedData.Sign(signer, false, CAPICOM_ENCODE_BASE64);
    }
}

function SetSign(sign) {
    this.Sign = sign;
}

function DoVerify() {
    
    var signedData = new ActiveXObject("CAPICOM.SignedData");
        signedData.Verify(this.Sign, false, CAPICOM_VERIFY_SIGNATURE_AND_CERTIFICATE);
        this.Data = signedData.Content;
        this.VerifyCert = signedData.Certificates.Item(1);
   
}

function GetData() {
    return this.Data;
}

function DoEncrypt() {
    var encryptor = new ActiveXObject("CAPICOM.EnvelopedData");
    encryptor.Algorithm.Name = CAPICOM_ENCRYPTION_ALGORITHM_3DES;
    encryptor.Algorithm.KeyLength = CAPICOM_ENCRYPTION_KEY_LENGTH_MAXIMUM;
    encryptor.Recipients.Add(this.SignCert);
    encryptor.Content = this.Data;
    this.Encrypt = encryptor.Encrypt(CAPICOM_ENCODE_BASE64);
    //this.Encrypt = "[[[" + this.Data + "]]]";
}

function DoDecrypt() {
    var decryptor = new ActiveXObject("CAPICOM.EnvelopedData");
    decryptor.Decrypt(this.Encrypt);
    this.Data = decryptor.Content;
}

function GetEncrypt() {
    return this.Encrypt;
}

function SetEncrypt(encrypt) {
    this.Encrypt = encrypt;
}

function ShowUserCertificate() {
    if(this.SignCert != null) {
        this.SignCert.Display();
    }
}

function ShowVerifyCertificate()
{
    if(this.VerifyCert != null) {
        this.VerifyCert.Display();
    }
}

function Signer() {
    this.VerifyCert = null;
    this.SignCert = null;
    this.EncryptCert = null;
    this.Data = null;
    this.Sign = null;
    this.Encrypt = null;
    this.Store = null;

    this.SelectCertificateDlg = SelectCertificateDlg;
    this.SelectCertificateThumbprint = SelectCertificateThumbprint;
    this.GetCertificatePublicKey = GetCertificatePublicKey;
    this.SelectCertificateEncryption = SelectCertificateEncryption;
    this.GetCertificateThumbprint = GetCertificateThumbprint;
    this.SetData = SetData;
    this.GetSign = GetSign;
    this.DoSign = DoSign;
    this.SetSign = SetSign;
    this.DoVerify = DoVerify;
    this.GetData = GetData;
    this.DoEncrypt = DoEncrypt;
    this.DoDecrypt = DoDecrypt;
    this.GetEncrypt = GetEncrypt;
    this.SetEncrypt = SetEncrypt;
    this.ShowUserCertificate = ShowUserCertificate;
    this.ShowVerifyCertificate = ShowVerifyCertificate;
    this.GetCertificateIssueTo=GetCertificateIssueTo;
    this.GetCertificateIssueBy=GetCertificateIssueBy;
    this.GetCertificateSerialNo=GetCertificateSerialNo;
    this.GetCertificateSubject=GetCertificateSubject;
    this.GetCertificateValidFrom=GetCertificateValidFrom;
    this.GetCertificateValidTo=GetCertificateValidTo;
    
    
}
