コード例 #1
0
        public static CieStudentData Decode(byte[] encodedAttribute)
        {
            try {
                // decodifica o atributo como string
                var content = Asn1Util.DecodePrintableString(encodedAttribute);
                var cieData = new CieStudentData();

                // nas primeiras 40(quarenta) posições, o nome da instituição de ensino;
                cieData.InstituicaoEnsino = content.Substring(0, 40).Trim();

                // nas 15 (quinze) posições subsequentes, o grau de escolaridade;
                cieData.GrauEscolaridade = content.Substring(40, 15).Trim();

                // nas 30 (trinta) posições subsequentes, o nome do curso
                cieData.Curso = content.Substring(55, 30).Trim();

                // nas 20 (vinte) posições subsequentes, o município da instituição
                cieData.InstituicaoEnsinoCidade = content.Substring(85, content.Length - 85 - 2).Trim();

                // nas 2 (duas) posições subsequentes, a UF domunicípio.
                cieData.InstituicaoEnsinoUF = content.Substring(content.Length - 2, 2).Trim();

                return(cieData);
            } catch (Exception ex) {
                throw new FormatException("Error while decoding CIE student data fields. Invalid format.", ex);
            }
        }
コード例 #2
0
        private byte[] issue(string name)
        {
            /**
             * HolderName
             *
             * http://www.une.org.br/site/wp-content/uploads/2017/01/Padra%CC%83o-Nacional-2017.pdf
             *
             * Pag 9
             *
             * O nome do titular do certificado de atributo, pessoa física, constante no campo Holder,
             * deverá adotar o Distinguished Name (DN) do padrão ITU X.500/ISO 9594, da seguinte forma:
             *
             *   C = BR
             *   O = ICP-Brasil
             *   OU = nome fantasia ou sigla da Entidade Emissora de Atributo (EEA)
             *   CN = nome do titular do atributo
             *
             * Na composição dos nomes, aplicam-se as restrições de nome conforme definido no
             * item Restrição de nomes.
             */
            var normalizedName = name.Trim().RemoveDiacritics().RemovePunctuation();
            var holderName     = string.Format("C=BR, O=ICP-Brasil, OU={0}, CN={1}", IssuerName, normalizedName);

            // Expiration (we're using midnight from March 31st to April 1st of next year)
            var expiration = Util.GetMidnightOf(DateTime.Today.Year + 1, 3, 31, TimeZoneInfo.FindSystemTimeZoneById("E. South America Standard Time") /* Brasília */);

            var certGen = new AttributeCertificateGenerator();

            certGen.SetIssuer(SelectedCertificate.CertificateWithKey);
            certGen.SetHolderName(NameGenerator.GenerateFromDNString(holderName, NameGeneratorTypePolicies.PrintableStringsOnly));
            certGen.SetValidity(DateTimeOffset.Now, expiration);
            certGen.GenerateUniqueSerialNumber();
            certGen.SetSignatureAlgorithm(SignatureAlgorithm.SHA256WithRSA);
            certGen.SetExtensionNoRevocationAvailable();

            // Authority Information Access extension (optional)
            //certGen.SetCAIssuersUri(new Uri("http://ca.yourcompany.com/issuer.cer"));

            // Attribute #1
            var cieStudentIdentity = new CieStudentIdentity()
            {
                Cpf            = "374.353.901-27",
                DataNascimento = new DateTime(2001, 9, 11),
                Matricula      = "555.555",
                RG             = "12.345.678",
                RGEmissor      = "SSP",
                RGEmissorUF    = "SP",
            };

            certGen.AddRawAttribute(CieStudentIdentity.Oid, cieStudentIdentity.Encode());

            // Attribute #2
            var cieStudentData = new CieStudentData()
            {
                Curso                   = "Engenharia da Computação",
                GrauEscolaridade        = "Superior",
                InstituicaoEnsino       = "Universidade de São Paulo",
                InstituicaoEnsinoCidade = "São Paulo",
                InstituicaoEnsinoUF     = "SP",
            };

            certGen.AddRawAttribute(CieStudentData.Oid, cieStudentData.Encode());

            // Photo attribute (optional)
            var holderPhotoAttribute = new LacunaHolderPhotoAttribute()
            {
                MimeType = "image/jpeg",
                Content  = Convert.FromBase64String("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"),
            };

            certGen.AddAttribute(LacunaHolderPhotoAttribute.Oid, holderPhotoAttribute);

            // Issue
            var cert = certGen.Generate();


            // CIE Attributes decode example
            //var cieStudentIdentityDecoded = CieStudentIdentity.Decode(cert.Attributes);
            //var cieStudentDataDecoded = CieStudentData.Decode(cert.Attributes);

            // Return encoded cert
            return(cert.EncodedValue);
        }
コード例 #3
0
        public void ValidateAttributeCert()
        {
            if (!checkLicenseLoaded())
            {
                return;
            }

            try {
                var certFileDialog = new OpenFileDialog()
                {
                    DefaultExt = ".ac",
                    Filter     = "X.509 attribute certificate (.ac)|*.ac"
                };
                if (certFileDialog.ShowDialog() != true)
                {
                    return;
                }

                // Read and decode the attribute certificate
                var certContent = File.ReadAllBytes(certFileDialog.FileName);
                var cert        = AttributeCertificate.Decode(certContent);

                // If the certificate is issued without a link to its issuer (AIA extension), the validation will fail because the issuer will not be found. In this
                // case, have to provide the issuer certificate when decoding the attribute certificate.
                if (cert.IssuerNotFound)
                {
                    MessageBox.Show("Could not find the issuer of the certificate. This usually happens with certificates that do not have a valid Authority Information Access (AIA) extension.\n\nTo continue, you will need to provide the .cer file of the issuer.", "Issuer not found");
                    var issuerFileDialog = new OpenFileDialog()
                    {
                        DefaultExt = ".cer",
                        Filter     = "X.509 certificate|*.cer;*.crt"
                    };
                    if (issuerFileDialog.ShowDialog() != true)
                    {
                        return;
                    }

                    // Read and decode the issuer certificate
                    var issuerContent = File.ReadAllBytes(issuerFileDialog.FileName);
                    var issuerCert    = PKCertificate.Decode(issuerContent);

                    // Re-open the attribute certificate providing the issuer certificate
                    cert = AttributeCertificate.Decode(certContent, new MemoryCertificateStore(new[] { issuerCert }));
                }

                CieStudentIdentity cieStudentIdentity = null;
                if (cert.Attributes.GetOids().Contains(CieStudentIdentity.Oid))
                {
                    cieStudentIdentity = CieStudentIdentity.Decode(cert.Attributes);
                }

                CieStudentData cieStudentData = null;
                if (cert.Attributes.GetOids().Contains(CieStudentData.Oid))
                {
                    cieStudentData = CieStudentData.Decode(cert.Attributes);
                }

                // Validate the certificate
                var vr = cert.Validate(App.GetTrustArbitrator());

                // Show the validation results
                new ValidationResultsDialog("Attribute certificate validation results", vr).ShowDialog();
            } catch (Exception ex) {
                MessageBox.Show(ex.ToString(), "An error has occurred");
            }
        }