cbor.go 19 KB

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