Как декодировать составные пользовательские расширения в сертификате x509 в golang? С текущим кодом Ошибка: asn1: ошибка структуры: несоответствие тега последовательности - PullRequest
0 голосов
/ 15 марта 2020

Я пишу golang код для анализа сертификата X509 с пользовательскими расширениями: enter image description here

Код следующий:

func (e *PckCert) ParseValue() error {
var ext pkix.Extension
var err error
for i := 0; i < len(e.PckCertObj.Extensions); i++ {
    ext = e.PckCertObj.Extensions[i]
    if ExtxOid.Equal(ext.Id) == true { ///ExtOid is a constant OId is known
        var asn1Extensions []asn1.RawValue
        _, err := asn1.Unmarshal(ext.Value, &asn1Extensions)
        if err != nil {
            log.Info("err: ", err)
            return errors.Wrap(err, "Asn1 Extension Unmarshal failed")
        }

        var sExtension pkix.Extension ///For normal OIDs
        var sExtensions1 []pkix.Extension /// For TC1 SVN OID extensions under extension
        for j := 0; j < len(asn1Extensions); j++ {
            _, err = asn1.Unmarshal(asn1Extensions[j].FullBytes, &sExtension)
            if err != nil {
                log.Info("err came: ", err)
                log.Info("Warning: Asn1 Extension Unmarshal failed - 2 for index:", j)
                _, err = asn1.Unmarshal(asn1Extensions[j].FullBytes, &sExtensions1)
                if err != nil {
                    log.Info("err came 2: ", err) ///**for extensions within extensions here code is failing with error: sequence tag mismatch**
                }
            }
        }
    }
}

}

Приведенный выше код не работает только для составной последовательности расширений T C OID . Для составной последовательности расширений я получаю "asn1: структурная ошибка: несоответствие тега последовательности". Пожалуйста, помогите в этом. . Я могу разархивировать все остальное, кроме составного расширения T C OID

1 Ответ

0 голосов
/ 01 апреля 2020

По сути, вам нужно различать guish между обычным расширением и коллекцией. Если OID является коллекцией, вам нужно передать фрагмент типа [] asn1.RawValue, как вы анализируете e.PckCertObj.Extensions [i] в ​​приведенном выше коде.

Итак, как вы узнаете если есть расширение со значением или коллекцией. Вам нужно извлечь объектный идентификатор (OID) из байтового потока asn следующим образом

var oid asn1.ObjectIdentifier
rest, _ := asn1.Ummarshal(bytes, &oid)

Затем вы можете сравнить его с конкретным OID

if oid.Equal(knownCollectionOID) {
    var collExts []asn1.RawValue
    asn1.Unmarshal(rest, &collExts)
    for _, ext := range collExts {
        fmt.Println("Do something with the extension")
    }
}
...