Added support for ECDH in enveloped data with ECDSA certificates.

- fixed parsing of choice(was compatible with Apple mail.app which tagged kari explicitly)
- minor fixes
This commit is contained in:
InfiniteLoopSpace
2018-12-10 17:18:29 +01:00
parent 58514b0041
commit 5f34d82562
15 changed files with 702 additions and 168 deletions

View File

@ -760,7 +760,7 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
if err != nil {
return
}
if params.explicit {
if params.explicit && !params.choice {
expectedClass := ClassContextSpecific
if params.application {
expectedClass = ClassApplication
@ -968,19 +968,13 @@ func parseField(v reflect.Value, bytes []byte, initOffset int, params fieldParam
}
innerOffset := 0
if params.choice {
if !params.explicit {
innerBytes = bytes[initOffset:]
}
}
for i := 0; i < structType.NumField(); i++ {
field := structType.Field(i)
if params.choice {
tag := parseFieldParameters(field.Tag.Get("asn1")).tag
if tag != nil && t.tag == *tag || t.class != ClassContextSpecific && tag == nil {
if tag == nil || params.set {
innerBytes = bytes[initOffset:offset]
}
innerOffset, err = parseField(val.Field(i), innerBytes, innerOffset, fieldParameters{})
return
}
continue
}
if i == 0 && field.Type == rawContentsType {
continue
}

View File

@ -482,9 +482,6 @@ func makeBody(value reflect.Value, params fieldParameters) (e encoder, err error
m := make([]encoder, n1)
for i := 0; i < n1; i++ {
fp := parseFieldParameters(t.Field(i + startingField).Tag.Get("asn1"))
if params.explicit && params.choice {
fp.explicit = true
}
m[i], err = makeField(v.Field(i+startingField), fp)
if err != nil {
return nil, err
@ -501,9 +498,6 @@ func makeBody(value reflect.Value, params fieldParameters) (e encoder, err error
var fp fieldParameters
fp.choice = params.choice
if params.choice && params.set {
fp.explicit = true
}
switch l := v.Len(); l {
case 0: