indutny / asn1.js

ASN.1 Decoder/Encoder/DSL
MIT License
181 stars 64 forks source link

issue with contains() #110

Open panva opened 5 years ago

panva commented 5 years ago

Assume the following

const asn = require('asn1.js')

const Bar = asn.define('Bar', function () {
  this.octstr().contains().obj(
    this.key('bar').octstr()
  )
})

const Foo = asn.define('Foo', function () {
  this.seq().obj(
    this.key('foo').use(Bar)
  )
})

Foo.encode({
  foo: { bar: Buffer.from('bar') }
}, 'der').toString('base64')

The output i'm expecting is

<Buffer 30 07 04 05 04 03 62 61 72>
              ^^ ✅

But i'm instead getting

<Buffer 30 07 24 05 04 03 62 61 72>
              ^^ ❌

I went back and forth with the definitions and couldn't get this to be what i need. I can see very little examples around this.

@felix / @indutny, this was added in #59, i could very much use your hand in figuring out if this is a problem with the feature or my definition.

felix commented 5 years ago

I have not worked with ASN.1 for a while now but off the top of my head is that the difference between BER and DER, DER should prefer constructed definite-length encoding. So perhaps your expectation is actually BER and it is producing DER. I may well be wrong!

mattcollier commented 5 years ago

@panva encountering the exact same issue here: https://github.com/digitalbazaar/crypto-ld/compare/node-12#diff-19ce09a32f875322daf2628d6aceb210R31

Any luck finding a solution?

panva commented 5 years ago

@mattcollier nope, i work around it for my needs.

https://github.com/panva/jose/blob/v1.4.0/lib/help/key_utils.js#L272

felix commented 5 years ago

I suppose the first step would be to create the simplest test using contains that generates the incorrect sequence.

panva commented 5 years ago

@felix is the one in the description not simple enough?

felix commented 5 years ago

It is, my apologies.