Почему демаршаллинг большого целого числа DER ASN.1 ограничен последовательностью на Голанге? - PullRequest
0 голосов
/ 04 ноября 2018

Я хотел бы иметь возможность демонтировать большое целое число из файла DER с помощью пакета encoding / asn1, но, похоже, он работает только для ПОСЛЕДОВАТЕЛЬНОСТИ целых чисел.

Например, это не работает, что странно, потому что маршалинг Big Int работает хорошо (https://play.golang.org/p/Wkj0jAA6bpq):

package main

import (
    "encoding/asn1"
    "fmt"
    "math/big"
)


func main() {
        r, _ := new(big.Int).SetString("481B6A0913BD8024CA5D22F014F3", 16);
        encoding, _  := asn1.Marshal(r) 
        fmt.Printf("% X\n", encoding)               // Displayed as an integer: 02 0E 48 1B 6A 09 13 BD 80 24 CA 5D 22 F0 14 F3
        var t big.Int
        _, err := asn1.Unmarshal(encoding, &t)
        if err != nil {
            fmt.Println("Erreur unmarshalling -", err)  // asn1: structure error: tags don't match
        }   
        fmt.Println(t.String())
} 

Похоже, что я могу разобрать большое целое число, только если оно является частью SEQUENCE, как в этом примере: https://play.golang.org/p/J93afvbk41L

package main

import (
    "encoding/asn1"
    "fmt"
    "math/big"
)

type TestBigInt struct {                    // From encoding/asn1/asn1_test.go
    X *big.Int
}

func main() {
        r, _ := new(big.Int).SetString("481B6A0913BD8024CA5D22F014F3", 16);
        encoding, _  := asn1.Marshal(TestBigInt{r}) 
        fmt.Printf("% X\n", encoding)               // Displayed as a sequence of an integer: 30 10 02 0E 48 1B 6A 09 13 BD 80 24 CA 5D 22 F0 14 F3
        var t TestBigInt
        _, err := asn1.Unmarshal(encoding, &t)
        if err != nil {
            fmt.Println("Erreur unmarshalling -", err)  
        }   
        fmt.Println(t.X.String())
} 

Тем не менее, он работает хорошо для 32-битного 64-битного целого, как в этом примере: https://play.golang.org/p/vcIgWrI-sk-

package main

import (
    "encoding/asn1"
    "fmt"
)

func main() {
        r := 12234
        encoding, _ := asn1.Marshal(r)
        fmt.Printf("% X\n", encoding)
        var t int
        _, err := asn1.Unmarshal(encoding, &t)
        if err != nil {
            fmt.Println("Erreur unmarshalling -", err)
        }   
        fmt.Println(t)
}

Это известное ограничение пакета encoding / asn1? Известно ли какое-либо известное решение для удаления большого целого числа вне ПОСЛЕДОВАТЕЛЬНОСТИ?

1 Ответ

0 голосов
/ 04 ноября 2018

В документации указано, что:

INTEGER ASN.1 может быть записан в int, int32, int64 или * big.Int (из математики / большой пакет).

Обратите внимание, что четвертый вариант - *big.Int, а не big.Int. Вы не можете видеть это из-за автоматического вывода типа, но первый тип на самом деле тот же тип, что и r в вашем первом примере, и, более ясно, тип X во втором примере.

Если вы измените свою переменную на указатель, то она должна работать. Например, изменив ваш первый пример:

package main

import (
    "encoding/asn1"
    "fmt"
    "math/big"
)


func main() {
        r, _ := new(big.Int).SetString("481B6A0913BD8024CA5D22F014F3", 16);
        encoding, _  := asn1.Marshal(r) 
        fmt.Printf("% X\n", encoding)

        var t *big.Int  // <---- changed type
        _, err := asn1.Unmarshal(encoding, &t)
        if err != nil {
            fmt.Println("Erreur unmarshalling -", err)
        }   

        fmt.Println(t.String())
} 

дает:

paul@horus:asn1int$ ./asn1int
02 0E 48 1B 6A 09 13 BD 80 24 CA 5D 22 F0 14 F3
1462505468235399478280266926003443
paul@horus:asn1int$
...