cbor.go 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952
  1. // Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a MIT license found in the LICENSE file.
  3. package codec
  4. import (
  5. "math"
  6. "reflect"
  7. "time"
  8. )
  9. // major
  10. const (
  11. cborMajorUint byte = iota
  12. cborMajorNegInt
  13. cborMajorBytes
  14. cborMajorString
  15. cborMajorArray
  16. cborMajorMap
  17. cborMajorTag
  18. cborMajorSimpleOrFloat
  19. )
  20. // simple
  21. const (
  22. cborBdFalse byte = 0xf4 + iota
  23. cborBdTrue
  24. cborBdNil
  25. cborBdUndefined
  26. cborBdExt
  27. cborBdFloat16
  28. cborBdFloat32
  29. cborBdFloat64
  30. )
  31. // indefinite
  32. const (
  33. cborBdIndefiniteBytes byte = 0x5f
  34. cborBdIndefiniteString byte = 0x7f
  35. cborBdIndefiniteArray byte = 0x9f
  36. cborBdIndefiniteMap byte = 0xbf
  37. cborBdBreak byte = 0xff
  38. )
  39. // These define some in-stream descriptors for
  40. // manual encoding e.g. when doing explicit indefinite-length
  41. const (
  42. CborStreamBytes byte = 0x5f
  43. CborStreamString byte = 0x7f
  44. CborStreamArray byte = 0x9f
  45. CborStreamMap byte = 0xbf
  46. CborStreamBreak byte = 0xff
  47. )
  48. // base values
  49. const (
  50. cborBaseUint byte = 0x00
  51. cborBaseNegInt byte = 0x20
  52. cborBaseBytes byte = 0x40
  53. cborBaseString byte = 0x60
  54. cborBaseArray byte = 0x80
  55. cborBaseMap byte = 0xa0
  56. cborBaseTag byte = 0xc0
  57. cborBaseSimple byte = 0xe0
  58. )
  59. // const (
  60. // cborSelfDesrTag byte = 0xd9
  61. // cborSelfDesrTag2 byte = 0xd9
  62. // cborSelfDesrTag3 byte = 0xf7
  63. // )
  64. var (
  65. cbordescSimpleNames = map[byte]string{
  66. cborBdNil: "nil",
  67. cborBdFalse: "false",
  68. cborBdTrue: "true",
  69. cborBdFloat16: "float",
  70. cborBdFloat32: "float",
  71. cborBdFloat64: "float",
  72. cborBdBreak: "break",
  73. }
  74. cbordescIndefNames = map[byte]string{
  75. cborBdIndefiniteBytes: "bytes*",
  76. cborBdIndefiniteString: "string*",
  77. cborBdIndefiniteArray: "array*",
  78. cborBdIndefiniteMap: "map*",
  79. }
  80. cbordescMajorNames = map[byte]string{
  81. cborMajorUint: "(u)int",
  82. cborMajorNegInt: "int",
  83. cborMajorBytes: "bytes",
  84. cborMajorString: "string",
  85. cborMajorArray: "array",
  86. cborMajorMap: "map",
  87. cborMajorTag: "tag",
  88. cborMajorSimpleOrFloat: "simple",
  89. }
  90. )
  91. func cbordesc(bd byte) (s string) {
  92. bm := bd >> 5
  93. if bm == cborMajorSimpleOrFloat {
  94. s = cbordescSimpleNames[bd]
  95. } else {
  96. s = cbordescMajorNames[bm]
  97. if s == "" {
  98. s = cbordescIndefNames[bd]
  99. }
  100. }
  101. if s == "" {
  102. s = "unknown"
  103. }
  104. return
  105. }
  106. // -------------------
  107. type cborEncDriver struct {
  108. noBuiltInTypes
  109. encDriverNoState
  110. encDriverNoopContainerWriter
  111. h *CborHandle
  112. e Encoder
  113. }
  114. func (e *cborEncDriver) encoder() *Encoder {
  115. return &e.e
  116. }
  117. func (e *cborEncDriver) EncodeNil() {
  118. e.e.encWr.writen1(cborBdNil)
  119. }
  120. func (e *cborEncDriver) EncodeBool(b bool) {
  121. if b {
  122. e.e.encWr.writen1(cborBdTrue)
  123. } else {
  124. e.e.encWr.writen1(cborBdFalse)
  125. }
  126. }
  127. func (e *cborEncDriver) EncodeFloat32(f float32) {
  128. b := math.Float32bits(f)
  129. if e.h.OptimumSize {
  130. if h := floatToHalfFloatBits(b); halfFloatToFloatBits(h) == b {
  131. e.e.encWr.writen1(cborBdFloat16)
  132. bigen.writeUint16(e.e.w(), h)
  133. return
  134. }
  135. }
  136. e.e.encWr.writen1(cborBdFloat32)
  137. bigen.writeUint32(e.e.w(), b)
  138. }
  139. func (e *cborEncDriver) EncodeFloat64(f float64) {
  140. if e.h.OptimumSize {
  141. if f32 := float32(f); float64(f32) == f {
  142. e.EncodeFloat32(f32)
  143. return
  144. }
  145. }
  146. e.e.encWr.writen1(cborBdFloat64)
  147. bigen.writeUint64(e.e.w(), math.Float64bits(f))
  148. }
  149. func (e *cborEncDriver) encUint(v uint64, bd byte) {
  150. if v <= 0x17 {
  151. e.e.encWr.writen1(byte(v) + bd)
  152. } else if v <= math.MaxUint8 {
  153. e.e.encWr.writen2(bd+0x18, uint8(v))
  154. } else if v <= math.MaxUint16 {
  155. e.e.encWr.writen1(bd + 0x19)
  156. bigen.writeUint16(e.e.w(), uint16(v))
  157. } else if v <= math.MaxUint32 {
  158. e.e.encWr.writen1(bd + 0x1a)
  159. bigen.writeUint32(e.e.w(), uint32(v))
  160. } else { // if v <= math.MaxUint64 {
  161. e.e.encWr.writen1(bd + 0x1b)
  162. bigen.writeUint64(e.e.w(), v)
  163. }
  164. }
  165. func (e *cborEncDriver) EncodeInt(v int64) {
  166. if v < 0 {
  167. e.encUint(uint64(-1-v), cborBaseNegInt)
  168. } else {
  169. e.encUint(uint64(v), cborBaseUint)
  170. }
  171. }
  172. func (e *cborEncDriver) EncodeUint(v uint64) {
  173. e.encUint(v, cborBaseUint)
  174. }
  175. func (e *cborEncDriver) encLen(bd byte, length int) {
  176. e.encUint(uint64(length), bd)
  177. }
  178. func (e *cborEncDriver) EncodeTime(t time.Time) {
  179. if t.IsZero() {
  180. e.EncodeNil()
  181. } else if e.h.TimeRFC3339 {
  182. e.encUint(0, cborBaseTag)
  183. e.encStringBytesS(cborBaseString, t.Format(time.RFC3339Nano))
  184. } else {
  185. e.encUint(1, cborBaseTag)
  186. t = t.UTC().Round(time.Microsecond)
  187. sec, nsec := t.Unix(), uint64(t.Nanosecond())
  188. if nsec == 0 {
  189. e.EncodeInt(sec)
  190. } else {
  191. e.EncodeFloat64(float64(sec) + float64(nsec)/1e9)
  192. }
  193. }
  194. }
  195. func (e *cborEncDriver) EncodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
  196. e.encUint(uint64(xtag), cborBaseTag)
  197. if ext == SelfExt {
  198. e.e.encodeValue(baseRV(rv), e.h.fnNoExt(basetype))
  199. } else if v := ext.ConvertExt(rv); v == nil {
  200. e.EncodeNil()
  201. } else {
  202. e.e.encode(v)
  203. }
  204. }
  205. func (e *cborEncDriver) EncodeRawExt(re *RawExt) {
  206. e.encUint(uint64(re.Tag), cborBaseTag)
  207. // only encodes re.Value (never re.Data)
  208. if re.Value != nil {
  209. e.e.encode(re.Value)
  210. } else {
  211. e.EncodeNil()
  212. }
  213. }
  214. func (e *cborEncDriver) WriteArrayStart(length int) {
  215. if e.h.IndefiniteLength {
  216. e.e.encWr.writen1(cborBdIndefiniteArray)
  217. } else {
  218. e.encLen(cborBaseArray, length)
  219. }
  220. }
  221. func (e *cborEncDriver) WriteMapStart(length int) {
  222. if e.h.IndefiniteLength {
  223. e.e.encWr.writen1(cborBdIndefiniteMap)
  224. } else {
  225. e.encLen(cborBaseMap, length)
  226. }
  227. }
  228. func (e *cborEncDriver) WriteMapEnd() {
  229. if e.h.IndefiniteLength {
  230. e.e.encWr.writen1(cborBdBreak)
  231. }
  232. }
  233. func (e *cborEncDriver) WriteArrayEnd() {
  234. if e.h.IndefiniteLength {
  235. e.e.encWr.writen1(cborBdBreak)
  236. }
  237. }
  238. func (e *cborEncDriver) EncodeString(v string) {
  239. bb := cborBaseString
  240. if e.h.StringToRaw {
  241. bb = cborBaseBytes
  242. }
  243. e.encStringBytesS(bb, v)
  244. }
  245. func (e *cborEncDriver) EncodeStringBytesRaw(v []byte) {
  246. if v == nil {
  247. e.EncodeNil()
  248. } else {
  249. e.encStringBytesS(cborBaseBytes, stringView(v))
  250. }
  251. }
  252. func (e *cborEncDriver) encStringBytesS(bb byte, v string) {
  253. if e.h.IndefiniteLength {
  254. if bb == cborBaseBytes {
  255. e.e.encWr.writen1(cborBdIndefiniteBytes)
  256. } else {
  257. e.e.encWr.writen1(cborBdIndefiniteString)
  258. }
  259. var vlen uint = uint(len(v))
  260. blen := vlen / 4
  261. if blen == 0 {
  262. blen = 64
  263. } else if blen > 1024 {
  264. blen = 1024
  265. }
  266. for i := uint(0); i < vlen; {
  267. var v2 string
  268. i2 := i + blen
  269. if i2 >= i && i2 < vlen {
  270. v2 = v[i:i2]
  271. } else {
  272. v2 = v[i:]
  273. }
  274. e.encLen(bb, len(v2))
  275. e.e.encWr.writestr(v2)
  276. i = i2
  277. }
  278. e.e.encWr.writen1(cborBdBreak)
  279. } else {
  280. e.encLen(bb, len(v))
  281. e.e.encWr.writestr(v)
  282. }
  283. }
  284. // ----------------------
  285. type cborDecDriver struct {
  286. decDriverNoopContainerReader
  287. decDriverNoopNumberHelper
  288. h *CborHandle
  289. bdAndBdread
  290. st bool // skip tags
  291. _ bool // found nil
  292. noBuiltInTypes
  293. d Decoder
  294. }
  295. func (d *cborDecDriver) decoder() *Decoder {
  296. return &d.d
  297. }
  298. func (d *cborDecDriver) descBd() string {
  299. return sprintf("%v (%s)", d.bd, cbordesc(d.bd))
  300. }
  301. func (d *cborDecDriver) readNextBd() {
  302. d.bd = d.d.decRd.readn1()
  303. d.bdRead = true
  304. }
  305. func (d *cborDecDriver) advanceNil() (null bool) {
  306. if !d.bdRead {
  307. d.readNextBd()
  308. }
  309. if d.bd == cborBdNil || d.bd == cborBdUndefined {
  310. d.bdRead = false
  311. return true // null = true
  312. }
  313. return
  314. }
  315. func (d *cborDecDriver) TryNil() bool {
  316. return d.advanceNil()
  317. }
  318. // skipTags is called to skip any tags in the stream.
  319. //
  320. // Since any value can be tagged, then we should call skipTags
  321. // before any value is decoded.
  322. //
  323. // By definition, skipTags should not be called before
  324. // checking for break, or nil or undefined.
  325. func (d *cborDecDriver) skipTags() {
  326. for d.bd>>5 == cborMajorTag {
  327. d.decUint()
  328. d.bd = d.d.decRd.readn1()
  329. }
  330. }
  331. func (d *cborDecDriver) ContainerType() (vt valueType) {
  332. if !d.bdRead {
  333. d.readNextBd()
  334. }
  335. if d.st {
  336. d.skipTags()
  337. }
  338. if d.bd == cborBdNil {
  339. d.bdRead = false // always consume nil after seeing it in container type
  340. return valueTypeNil
  341. }
  342. major := d.bd >> 5
  343. if major == cborMajorBytes {
  344. return valueTypeBytes
  345. } else if major == cborMajorString {
  346. return valueTypeString
  347. } else if major == cborMajorArray {
  348. return valueTypeArray
  349. } else if major == cborMajorMap {
  350. return valueTypeMap
  351. }
  352. return valueTypeUnset
  353. }
  354. func (d *cborDecDriver) CheckBreak() (v bool) {
  355. if !d.bdRead {
  356. d.readNextBd()
  357. }
  358. if d.bd == cborBdBreak {
  359. d.bdRead = false
  360. v = true
  361. }
  362. return
  363. }
  364. func (d *cborDecDriver) decUint() (ui uint64) {
  365. v := d.bd & 0x1f
  366. if v <= 0x17 {
  367. ui = uint64(v)
  368. } else if v == 0x18 {
  369. ui = uint64(d.d.decRd.readn1())
  370. } else if v == 0x19 {
  371. ui = uint64(bigen.Uint16(d.d.decRd.readn2()))
  372. } else if v == 0x1a {
  373. ui = uint64(bigen.Uint32(d.d.decRd.readn4()))
  374. } else if v == 0x1b {
  375. ui = uint64(bigen.Uint64(d.d.decRd.readn8()))
  376. } else {
  377. d.d.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd))
  378. }
  379. return
  380. }
  381. func (d *cborDecDriver) decLen() int {
  382. return int(d.decUint())
  383. }
  384. func (d *cborDecDriver) decAppendIndefiniteBytes(bs []byte) []byte {
  385. d.bdRead = false
  386. for !d.CheckBreak() {
  387. if major := d.bd >> 5; major != cborMajorBytes && major != cborMajorString {
  388. d.d.errorf("invalid indefinite string/bytes %x (%s); got major %v, expected %v or %v",
  389. d.bd, cbordesc(d.bd), major, cborMajorBytes, cborMajorString)
  390. }
  391. n := uint(d.decLen())
  392. oldLen := uint(len(bs))
  393. newLen := oldLen + n
  394. if newLen > uint(cap(bs)) {
  395. bs2 := make([]byte, newLen, 2*uint(cap(bs))+n)
  396. copy(bs2, bs)
  397. bs = bs2
  398. } else {
  399. bs = bs[:newLen]
  400. }
  401. d.d.decRd.readb(bs[oldLen:newLen])
  402. d.bdRead = false
  403. }
  404. d.bdRead = false
  405. return bs
  406. }
  407. func (d *cborDecDriver) decFloat() (f float64, ok bool) {
  408. ok = true
  409. switch d.bd {
  410. case cborBdFloat16:
  411. f = float64(math.Float32frombits(halfFloatToFloatBits(bigen.Uint16(d.d.decRd.readn2()))))
  412. case cborBdFloat32:
  413. f = float64(math.Float32frombits(bigen.Uint32(d.d.decRd.readn4())))
  414. case cborBdFloat64:
  415. f = math.Float64frombits(bigen.Uint64(d.d.decRd.readn8()))
  416. default:
  417. ok = false
  418. }
  419. return
  420. }
  421. func (d *cborDecDriver) decInteger() (ui uint64, neg, ok bool) {
  422. ok = true
  423. switch d.bd >> 5 {
  424. case cborMajorUint:
  425. ui = d.decUint()
  426. case cborMajorNegInt:
  427. ui = d.decUint()
  428. neg = true
  429. default:
  430. ok = false
  431. }
  432. return
  433. }
  434. func (d *cborDecDriver) DecodeInt64() (i int64) {
  435. if d.advanceNil() {
  436. return
  437. }
  438. if d.st {
  439. d.skipTags()
  440. }
  441. i = decNegintPosintFloatNumberHelper{&d.d}.int64(d.decInteger())
  442. d.bdRead = false
  443. return
  444. }
  445. func (d *cborDecDriver) DecodeUint64() (ui uint64) {
  446. if d.advanceNil() {
  447. return
  448. }
  449. if d.st {
  450. d.skipTags()
  451. }
  452. ui = decNegintPosintFloatNumberHelper{&d.d}.uint64(d.decInteger())
  453. d.bdRead = false
  454. return
  455. }
  456. func (d *cborDecDriver) DecodeFloat64() (f float64) {
  457. if d.advanceNil() {
  458. return
  459. }
  460. if d.st {
  461. d.skipTags()
  462. }
  463. f = decNegintPosintFloatNumberHelper{&d.d}.float64(d.decFloat())
  464. d.bdRead = false
  465. return
  466. }
  467. // bool can be decoded from bool only (single byte).
  468. func (d *cborDecDriver) DecodeBool() (b bool) {
  469. if d.advanceNil() {
  470. return
  471. }
  472. if d.st {
  473. d.skipTags()
  474. }
  475. if d.bd == cborBdTrue {
  476. b = true
  477. } else if d.bd == cborBdFalse {
  478. } else {
  479. d.d.errorf("not bool - %s %x/%s", msgBadDesc, d.bd, cbordesc(d.bd))
  480. }
  481. d.bdRead = false
  482. return
  483. }
  484. func (d *cborDecDriver) ReadMapStart() (length int) {
  485. if d.advanceNil() {
  486. return containerLenNil
  487. }
  488. if d.st {
  489. d.skipTags()
  490. }
  491. d.bdRead = false
  492. if d.bd == cborBdIndefiniteMap {
  493. return containerLenUnknown
  494. }
  495. if d.bd>>5 != cborMajorMap {
  496. d.d.errorf("error reading map; got major type: %x, expected %x/%s", d.bd>>5, cborMajorMap, cbordesc(d.bd))
  497. }
  498. return d.decLen()
  499. }
  500. func (d *cborDecDriver) ReadArrayStart() (length int) {
  501. if d.advanceNil() {
  502. return containerLenNil
  503. }
  504. if d.st {
  505. d.skipTags()
  506. }
  507. d.bdRead = false
  508. if d.bd == cborBdIndefiniteArray {
  509. return containerLenUnknown
  510. }
  511. if d.bd>>5 != cborMajorArray {
  512. d.d.errorf("invalid array; got major type: %x, expect: %x/%s", d.bd>>5, cborMajorArray, cbordesc(d.bd))
  513. }
  514. return d.decLen()
  515. }
  516. func (d *cborDecDriver) DecodeBytes(bs []byte) (bsOut []byte) {
  517. d.d.decByteState = decByteStateNone
  518. if d.advanceNil() {
  519. return
  520. }
  521. if d.st {
  522. d.skipTags()
  523. }
  524. if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
  525. d.bdRead = false
  526. if bs == nil {
  527. d.d.decByteState = decByteStateReuseBuf
  528. return d.decAppendIndefiniteBytes(d.d.b[:0])
  529. }
  530. return d.decAppendIndefiniteBytes(bs[:0])
  531. }
  532. if d.bd == cborBdIndefiniteArray {
  533. d.bdRead = false
  534. if bs == nil {
  535. d.d.decByteState = decByteStateReuseBuf
  536. bs = d.d.b[:0]
  537. } else {
  538. bs = bs[:0]
  539. }
  540. for !d.CheckBreak() {
  541. bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
  542. }
  543. return bs
  544. }
  545. if d.bd>>5 == cborMajorArray {
  546. d.bdRead = false
  547. if bs == nil {
  548. d.d.decByteState = decByteStateReuseBuf
  549. bs = d.d.b[:]
  550. }
  551. slen := d.decLen()
  552. var changed bool
  553. if bs, changed = usableByteSlice(bs, slen); changed {
  554. d.d.decByteState = decByteStateNone
  555. }
  556. for i := 0; i < len(bs); i++ {
  557. bs[i] = uint8(chkOvf.UintV(d.DecodeUint64(), 8))
  558. }
  559. for i := len(bs); i < slen; i++ {
  560. bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
  561. }
  562. return bs
  563. }
  564. clen := d.decLen()
  565. d.bdRead = false
  566. if d.d.zerocopy() {
  567. d.d.decByteState = decByteStateZerocopy
  568. return d.d.decRd.rb.readx(uint(clen))
  569. }
  570. if bs == nil {
  571. d.d.decByteState = decByteStateReuseBuf
  572. bs = d.d.b[:]
  573. }
  574. return decByteSlice(d.d.r(), clen, d.h.MaxInitLen, bs)
  575. }
  576. func (d *cborDecDriver) DecodeStringAsBytes() (s []byte) {
  577. return d.DecodeBytes(nil)
  578. }
  579. func (d *cborDecDriver) DecodeTime() (t time.Time) {
  580. if d.advanceNil() {
  581. return
  582. }
  583. if d.bd>>5 != cborMajorTag {
  584. d.d.errorf("error reading tag; expected major type: %x, got: %x", cborMajorTag, d.bd>>5)
  585. }
  586. xtag := d.decUint()
  587. d.bdRead = false
  588. return d.decodeTime(xtag)
  589. }
  590. func (d *cborDecDriver) decodeTime(xtag uint64) (t time.Time) {
  591. switch xtag {
  592. case 0:
  593. var err error
  594. t, err = time.Parse(time.RFC3339, stringView(d.DecodeStringAsBytes()))
  595. d.d.onerror(err)
  596. case 1:
  597. f1, f2 := math.Modf(d.DecodeFloat64())
  598. t = time.Unix(int64(f1), int64(f2*1e9))
  599. default:
  600. d.d.errorf("invalid tag for time.Time - expecting 0 or 1, got 0x%x", xtag)
  601. }
  602. t = t.UTC().Round(time.Microsecond)
  603. return
  604. }
  605. func (d *cborDecDriver) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
  606. if d.advanceNil() {
  607. return
  608. }
  609. if d.bd>>5 != cborMajorTag {
  610. d.d.errorf("error reading tag; expected major type: %x, got: %x", cborMajorTag, d.bd>>5)
  611. }
  612. realxtag := d.decUint()
  613. d.bdRead = false
  614. if ext == nil {
  615. re := rv.(*RawExt)
  616. re.Tag = realxtag
  617. d.d.decode(&re.Value)
  618. } else if xtag != realxtag {
  619. d.d.errorf("Wrong extension tag. Got %b. Expecting: %v", realxtag, xtag)
  620. } else if ext == SelfExt {
  621. d.d.decodeValue(baseRV(rv), d.h.fnNoExt(basetype))
  622. } else {
  623. d.d.interfaceExtConvertAndDecode(rv, ext)
  624. }
  625. d.bdRead = false
  626. }
  627. func (d *cborDecDriver) DecodeNaked() {
  628. if !d.bdRead {
  629. d.readNextBd()
  630. }
  631. n := d.d.naked()
  632. var decodeFurther bool
  633. switch d.bd >> 5 {
  634. case cborMajorUint:
  635. if d.h.SignedInteger {
  636. n.v = valueTypeInt
  637. n.i = d.DecodeInt64()
  638. } else {
  639. n.v = valueTypeUint
  640. n.u = d.DecodeUint64()
  641. }
  642. case cborMajorNegInt:
  643. n.v = valueTypeInt
  644. n.i = d.DecodeInt64()
  645. case cborMajorBytes:
  646. d.d.fauxUnionReadRawBytes(false)
  647. case cborMajorString:
  648. n.v = valueTypeString
  649. n.s = d.d.stringZC(d.DecodeStringAsBytes())
  650. case cborMajorArray:
  651. n.v = valueTypeArray
  652. decodeFurther = true
  653. case cborMajorMap:
  654. n.v = valueTypeMap
  655. decodeFurther = true
  656. case cborMajorTag:
  657. n.v = valueTypeExt
  658. n.u = d.decUint()
  659. n.l = nil
  660. if n.u == 0 || n.u == 1 {
  661. d.bdRead = false
  662. n.v = valueTypeTime
  663. n.t = d.decodeTime(n.u)
  664. } else if d.st && d.h.getExtForTag(n.u) == nil {
  665. // d.skipTags() // no need to call this - tags already skipped
  666. d.bdRead = false
  667. d.DecodeNaked()
  668. return // return when done (as true recursive function)
  669. }
  670. case cborMajorSimpleOrFloat:
  671. switch d.bd {
  672. case cborBdNil, cborBdUndefined:
  673. n.v = valueTypeNil
  674. case cborBdFalse:
  675. n.v = valueTypeBool
  676. n.b = false
  677. case cborBdTrue:
  678. n.v = valueTypeBool
  679. n.b = true
  680. case cborBdFloat16, cborBdFloat32, cborBdFloat64:
  681. n.v = valueTypeFloat
  682. n.f = d.DecodeFloat64()
  683. default:
  684. d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
  685. }
  686. default: // should never happen
  687. d.d.errorf("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
  688. }
  689. if !decodeFurther {
  690. d.bdRead = false
  691. }
  692. }
  693. func (d *cborDecDriver) uintBytes() (v []byte, ui uint64) {
  694. // this is only used by nextValueBytes, so it's ok to
  695. // use readx and bigenstd here.
  696. switch vv := d.bd & 0x1f; vv {
  697. case 0x18:
  698. v = d.d.decRd.readx(1)
  699. ui = uint64(v[0])
  700. case 0x19:
  701. v = d.d.decRd.readx(2)
  702. ui = uint64(bigenstd.Uint16(v))
  703. case 0x1a:
  704. v = d.d.decRd.readx(4)
  705. ui = uint64(bigenstd.Uint32(v))
  706. case 0x1b:
  707. v = d.d.decRd.readx(8)
  708. ui = uint64(bigenstd.Uint64(v))
  709. default:
  710. if vv > 0x1b {
  711. d.d.errorf("invalid descriptor decoding uint: %x/%s", d.bd, cbordesc(d.bd))
  712. }
  713. ui = uint64(vv)
  714. }
  715. return
  716. }
  717. func (d *cborDecDriver) nextValueBytes(v0 []byte) (v []byte) {
  718. if !d.bdRead {
  719. d.readNextBd()
  720. }
  721. v = v0
  722. var h = decNextValueBytesHelper{d: &d.d}
  723. var cursor = d.d.rb.c - 1
  724. h.append1(&v, d.bd)
  725. v = d.nextValueBytesBdReadR(v)
  726. d.bdRead = false
  727. h.bytesRdV(&v, cursor)
  728. return
  729. }
  730. func (d *cborDecDriver) nextValueBytesR(v0 []byte) (v []byte) {
  731. d.readNextBd()
  732. v = v0
  733. var h = decNextValueBytesHelper{d: &d.d}
  734. h.append1(&v, d.bd)
  735. return d.nextValueBytesBdReadR(v)
  736. }
  737. func (d *cborDecDriver) nextValueBytesBdReadR(v0 []byte) (v []byte) {
  738. v = v0
  739. var h = decNextValueBytesHelper{d: &d.d}
  740. var bs []byte
  741. var ui uint64
  742. switch d.bd >> 5 {
  743. case cborMajorUint, cborMajorNegInt:
  744. bs, _ = d.uintBytes()
  745. h.appendN(&v, bs...)
  746. case cborMajorString, cborMajorBytes:
  747. if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
  748. for {
  749. d.readNextBd()
  750. h.append1(&v, d.bd)
  751. if d.bd == cborBdBreak {
  752. break
  753. }
  754. bs, ui = d.uintBytes()
  755. h.appendN(&v, bs...)
  756. h.appendN(&v, d.d.decRd.readx(uint(ui))...)
  757. }
  758. } else {
  759. bs, ui = d.uintBytes()
  760. h.appendN(&v, bs...)
  761. h.appendN(&v, d.d.decRd.readx(uint(ui))...)
  762. }
  763. case cborMajorArray:
  764. if d.bd == cborBdIndefiniteArray {
  765. for {
  766. d.readNextBd()
  767. h.append1(&v, d.bd)
  768. if d.bd == cborBdBreak {
  769. break
  770. }
  771. v = d.nextValueBytesBdReadR(v)
  772. }
  773. } else {
  774. bs, ui = d.uintBytes()
  775. h.appendN(&v, bs...)
  776. for i := uint64(0); i < ui; i++ {
  777. v = d.nextValueBytesR(v)
  778. }
  779. }
  780. case cborMajorMap:
  781. if d.bd == cborBdIndefiniteMap {
  782. for {
  783. d.readNextBd()
  784. h.append1(&v, d.bd)
  785. if d.bd == cborBdBreak {
  786. break
  787. }
  788. v = d.nextValueBytesBdReadR(v)
  789. v = d.nextValueBytesR(v)
  790. }
  791. } else {
  792. bs, ui = d.uintBytes()
  793. h.appendN(&v, bs...)
  794. for i := uint64(0); i < ui; i++ {
  795. v = d.nextValueBytesR(v)
  796. v = d.nextValueBytesR(v)
  797. }
  798. }
  799. case cborMajorTag:
  800. bs, _ = d.uintBytes()
  801. h.appendN(&v, bs...)
  802. v = d.nextValueBytesR(v)
  803. case cborMajorSimpleOrFloat:
  804. switch d.bd {
  805. case cborBdNil, cborBdUndefined, cborBdFalse, cborBdTrue: // pass
  806. case cborBdFloat16:
  807. h.appendN(&v, d.d.decRd.readx(2)...)
  808. case cborBdFloat32:
  809. h.appendN(&v, d.d.decRd.readx(4)...)
  810. case cborBdFloat64:
  811. h.appendN(&v, d.d.decRd.readx(8)...)
  812. default:
  813. d.d.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd)
  814. }
  815. default: // should never happen
  816. d.d.errorf("nextValueBytes: Unrecognized d.bd: 0x%x", d.bd)
  817. }
  818. return
  819. }
  820. // -------------------------
  821. // CborHandle is a Handle for the CBOR encoding format,
  822. // defined at http://tools.ietf.org/html/rfc7049 and documented further at http://cbor.io .
  823. //
  824. // CBOR is comprehensively supported, including support for:
  825. // - indefinite-length arrays/maps/bytes/strings
  826. // - (extension) tags in range 0..0xffff (0 .. 65535)
  827. // - half, single and double-precision floats
  828. // - all numbers (1, 2, 4 and 8-byte signed and unsigned integers)
  829. // - nil, true, false, ...
  830. // - arrays and maps, bytes and text strings
  831. //
  832. // None of the optional extensions (with tags) defined in the spec are supported out-of-the-box.
  833. // Users can implement them as needed (using SetExt), including spec-documented ones:
  834. // - timestamp, BigNum, BigFloat, Decimals,
  835. // - Encoded Text (e.g. URL, regexp, base64, MIME Message), etc.
  836. type CborHandle struct {
  837. binaryEncodingType
  838. // noElemSeparators
  839. BasicHandle
  840. // IndefiniteLength=true, means that we encode using indefinitelength
  841. IndefiniteLength bool
  842. // TimeRFC3339 says to encode time.Time using RFC3339 format.
  843. // If unset, we encode time.Time using seconds past epoch.
  844. TimeRFC3339 bool
  845. // SkipUnexpectedTags says to skip over any tags for which extensions are
  846. // not defined. This is in keeping with the cbor spec on "Optional Tagging of Items".
  847. //
  848. // Furthermore, this allows the skipping over of the Self Describing Tag 0xd9d9f7.
  849. SkipUnexpectedTags bool
  850. }
  851. // Name returns the name of the handle: cbor
  852. func (h *CborHandle) Name() string { return "cbor" }
  853. func (h *CborHandle) desc(bd byte) string { return cbordesc(bd) }
  854. func (h *CborHandle) newEncDriver() encDriver {
  855. var e = &cborEncDriver{h: h}
  856. e.e.e = e
  857. e.e.init(h)
  858. e.reset()
  859. return e
  860. }
  861. func (h *CborHandle) newDecDriver() decDriver {
  862. d := &cborDecDriver{h: h, st: h.SkipUnexpectedTags}
  863. d.d.d = d
  864. d.d.cbor = true
  865. d.d.init(h)
  866. d.reset()
  867. return d
  868. }
  869. func (d *cborDecDriver) reset() {
  870. d.bdAndBdread.reset()
  871. d.st = d.h.SkipUnexpectedTags
  872. }
  873. var _ decDriver = (*cborDecDriver)(nil)
  874. var _ encDriver = (*cborEncDriver)(nil)