private IICType GetIICandIICSignature(RegisterInvoiceRequest invoiceRequest, X509Certificate2 certificate, string issuerTIN)
        {
            IICType iicType = null;

            if (invoiceRequest.Signature != null)
            {
                throw new Exception("Invoice already signed");
            }

            if (invoiceRequest != null && invoiceRequest.Invoice.IIC == null &&
                invoiceRequest.Invoice.IICSignature == null)
            {
                InvoiceType  invoice          = invoiceRequest.Invoice;
                IICGenerator iicTypeGenerator = new IICGenerator(certificate);

                IICConfig iicConfig = new IICConfig()
                {
                    IssuerTIN       = issuerTIN,
                    DateTimeCreated = invoice.IssueDateTime.ToString(Fiscalization.DATE_FORMAT_LONG),
                    InvoiceNumber   = invoice.InvNum,
                    BusinUnitCode   = invoice.BusinUnitCode,
                    TCRCode         = invoice.TCRCode,
                    SoftCode        = invoice.SoftCode,
                    TotalPrice      = invoice.TotPrice.ToString()
                };

                iicType = iicTypeGenerator.Generate(iicConfig);
            }

            return(iicType);
        }
        public IICType Generate(IICConfig iicConfig)
        {
            IICValidator.ThrowExceptionIfNotValid(iicConfig);
            var inputParameter = GetInputParameterForIIC(iicConfig);

            // Load a private from a key store
            RSA privateKey = _certificate.GetRSAPrivateKey();

            IICType iicType = new IICType();

            // Create IIC signature according to RSASSA-PKCS-v1_5
            byte[] iicSignature = privateKey.SignData(Encoding.ASCII.GetBytes(inputParameter),
                                                      HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1);
            iicType.IICSignature = BitConverter.ToString(iicSignature).Replace("-", string.Empty);

            // Hash IIC signature with MD5 to create IIC
            byte[] iic = ((HashAlgorithm)CryptoConfig.CreateFromName("MD5")).ComputeHash(iicSignature);
            iicType.IIC = BitConverter.ToString(iic).Replace("-", string.Empty);

            return(iicType);
        }