cbor.go 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535
  1. // Copyright (c) 2012-2015 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. import (
  5. "math"
  6. "reflect"
  7. )
  8. const (
  9. cborMajorUint byte = iota
  10. cborMajorNegInt
  11. cborMajorBytes
  12. cborMajorText
  13. cborMajorArray
  14. cborMajorMap
  15. cborMajorTag
  16. cborMajorOther
  17. )
  18. const (
  19. cborBdFalse byte = 0xf4 + iota
  20. cborBdTrue
  21. cborBdNil
  22. cborBdUndefined
  23. cborBdExt
  24. cborBdFloat16
  25. cborBdFloat32
  26. cborBdFloat64
  27. )
  28. const (
  29. cborBdIndefiniteBytes byte = 0x5f
  30. cborBdIndefiniteString = 0x7f
  31. cborBdIndefiniteArray = 0x9f
  32. cborBdIndefiniteMap = 0xbf
  33. cborBdBreak = 0xff
  34. )
  35. const (
  36. CborStreamBytes byte = 0x5f
  37. CborStreamString = 0x7f
  38. CborStreamArray = 0x9f
  39. CborStreamMap = 0xbf
  40. cborStreamBreak = 0xff
  41. )
  42. const (
  43. cborBaseUint byte = 0x00
  44. cborBaseNegInt = 0x20
  45. cborBaseBytes = 0x40
  46. cborBaseString = 0x60
  47. cborBaseArray = 0x80
  48. cborBaseMap = 0xa0
  49. cborBaseTag = 0xc0
  50. cborBaseSimple = 0xe0
  51. )
  52. // -------------------
  53. type cborEncDriver struct {
  54. w encWriter
  55. h *CborHandle
  56. noBuiltInTypes
  57. encNoMapArrayEnd
  58. encNoMapArraySeparator
  59. }
  60. func (e *cborEncDriver) encodeNil() {
  61. e.w.writen1(cborBdNil)
  62. }
  63. func (e *cborEncDriver) encodeBool(b bool) {
  64. if b {
  65. e.w.writen1(cborBdTrue)
  66. } else {
  67. e.w.writen1(cborBdFalse)
  68. }
  69. }
  70. func (e *cborEncDriver) encodeFloat32(f float32) {
  71. e.w.writen1(cborBdFloat32)
  72. e.w.writeUint32(math.Float32bits(f))
  73. }
  74. func (e *cborEncDriver) encodeFloat64(f float64) {
  75. e.w.writen1(cborBdFloat64)
  76. e.w.writeUint64(math.Float64bits(f))
  77. }
  78. func (e *cborEncDriver) encUint(v uint64, bd byte) {
  79. switch {
  80. case v <= 0x17:
  81. e.w.writen1(byte(v) + bd)
  82. case v <= math.MaxUint8:
  83. e.w.writen2(bd+0x18, uint8(v))
  84. case v <= math.MaxUint16:
  85. e.w.writen1(bd + 0x19)
  86. e.w.writeUint16(uint16(v))
  87. case v <= math.MaxUint32:
  88. e.w.writen1(bd + 0x1a)
  89. e.w.writeUint32(uint32(v))
  90. case v <= math.MaxUint64:
  91. e.w.writen1(bd + 0x1b)
  92. e.w.writeUint64(v)
  93. }
  94. }
  95. func (e *cborEncDriver) encodeInt(v int64) {
  96. if v < 0 {
  97. e.encUint(uint64(-1-v), cborBaseNegInt)
  98. } else {
  99. e.encUint(uint64(v), cborBaseUint)
  100. }
  101. }
  102. func (e *cborEncDriver) encodeUint(v uint64) {
  103. e.encUint(v, cborBaseUint)
  104. }
  105. func (e *cborEncDriver) encLen(bd byte, length int) {
  106. e.encUint(uint64(length), bd)
  107. }
  108. func (e *cborEncDriver) encodeExt(rv reflect.Value, xtag uint64, ext Ext, en *Encoder) {
  109. e.encUint(uint64(xtag), cborBaseTag)
  110. if v := ext.ConvertExt(rv); v == nil {
  111. e.encodeNil()
  112. } else {
  113. en.encode(v)
  114. }
  115. }
  116. func (e *cborEncDriver) encodeRawExt(re *RawExt, en *Encoder) {
  117. e.encUint(uint64(re.Tag), cborBaseTag)
  118. if re.Data != nil {
  119. en.encode(re.Data)
  120. } else if re.Value == nil {
  121. e.encodeNil()
  122. } else {
  123. en.encode(re.Value)
  124. }
  125. }
  126. func (e *cborEncDriver) encodeArrayStart(length int) {
  127. e.encLen(cborBaseArray, length)
  128. }
  129. func (e *cborEncDriver) encodeMapStart(length int) {
  130. e.encLen(cborBaseMap, length)
  131. }
  132. func (e *cborEncDriver) encodeString(c charEncoding, v string) {
  133. e.encLen(cborBaseString, len(v))
  134. e.w.writestr(v)
  135. }
  136. func (e *cborEncDriver) encodeSymbol(v string) {
  137. e.encodeString(c_UTF8, v)
  138. }
  139. func (e *cborEncDriver) encodeStringBytes(c charEncoding, v []byte) {
  140. e.encLen(cborBaseBytes, len(v))
  141. e.w.writeb(v)
  142. }
  143. // ----------------------
  144. type cborDecDriver struct {
  145. h *CborHandle
  146. r decReader
  147. bdRead bool
  148. bdType valueType
  149. bd byte
  150. noBuiltInTypes
  151. decNoMapArrayEnd
  152. decNoMapArraySeparator
  153. }
  154. func (d *cborDecDriver) initReadNext() {
  155. if d.bdRead {
  156. return
  157. }
  158. d.bd = d.r.readn1()
  159. d.bdRead = true
  160. d.bdType = valueTypeUnset
  161. }
  162. func (d *cborDecDriver) isContainerType(vt valueType) bool {
  163. switch vt {
  164. case valueTypeNil:
  165. return d.bd == cborBdNil
  166. case valueTypeBytes:
  167. return d.bd == cborBdIndefiniteBytes || (d.bd >= cborBaseBytes && d.bd < cborBaseString)
  168. case valueTypeString:
  169. return d.bd == cborBdIndefiniteString || (d.bd >= cborBaseString && d.bd < cborBaseArray)
  170. case valueTypeArray:
  171. return d.bd == cborBdIndefiniteArray || (d.bd >= cborBaseArray && d.bd < cborBaseMap)
  172. case valueTypeMap:
  173. return d.bd == cborBdIndefiniteMap || (d.bd >= cborBaseMap && d.bd < cborBaseTag)
  174. }
  175. decErr("isContainerType: unsupported parameter: %v", vt)
  176. panic("unreachable")
  177. }
  178. func (d *cborDecDriver) tryDecodeAsNil() bool {
  179. // treat Nil and Undefined as nil values
  180. if d.bd == cborBdNil || d.bd == cborBdUndefined {
  181. d.bdRead = false
  182. return true
  183. }
  184. return false
  185. }
  186. func (d *cborDecDriver) checkBreak() bool {
  187. d.initReadNext()
  188. if d.bd == cborBdBreak {
  189. d.bdRead = false
  190. return true
  191. }
  192. return false
  193. }
  194. func (d *cborDecDriver) decUint() (ui uint64) {
  195. v := d.bd & 0x1f
  196. if v <= 0x17 {
  197. ui = uint64(v)
  198. } else {
  199. switch v {
  200. case 0x18:
  201. ui = uint64(d.r.readn1())
  202. case 0x19:
  203. ui = uint64(d.r.readUint16())
  204. case 0x1a:
  205. ui = uint64(d.r.readUint32())
  206. case 0x1b:
  207. ui = uint64(d.r.readUint64())
  208. default:
  209. decErr("decUint: Invalid descriptor: %v", d.bd)
  210. }
  211. }
  212. return
  213. }
  214. func (d *cborDecDriver) decCheckInteger() (neg bool) {
  215. switch major := d.bd >> 5; major {
  216. case cborMajorUint:
  217. case cborMajorNegInt:
  218. neg = true
  219. default:
  220. decErr("invalid major: %v (bd: %v)", major, d.bd)
  221. }
  222. return
  223. }
  224. func (d *cborDecDriver) decodeInt(bitsize uint8) (i int64) {
  225. neg := d.decCheckInteger()
  226. ui := d.decUint()
  227. // check if this number can be converted to an int without overflow
  228. if neg {
  229. i = -checkOverflowUint64ToInt64(ui + 1)
  230. } else {
  231. i = checkOverflowUint64ToInt64(ui)
  232. }
  233. checkOverflow(0, i, bitsize)
  234. d.bdRead = false
  235. return
  236. }
  237. func (d *cborDecDriver) decodeUint(bitsize uint8) (ui uint64) {
  238. if d.decCheckInteger() {
  239. decErr("Assigning negative signed value to unsigned type")
  240. }
  241. ui = d.decUint()
  242. checkOverflow(ui, 0, bitsize)
  243. d.bdRead = false
  244. return
  245. }
  246. func (d *cborDecDriver) decodeFloat(chkOverflow32 bool) (f float64) {
  247. switch d.bd {
  248. case cborBdFloat16:
  249. f = float64(math.Float32frombits(halfFloatToFloatBits(d.r.readUint16())))
  250. case cborBdFloat32:
  251. f = float64(math.Float32frombits(d.r.readUint32()))
  252. case cborBdFloat64:
  253. f = math.Float64frombits(d.r.readUint64())
  254. default:
  255. if d.bd >= cborBaseUint && d.bd < cborBaseBytes {
  256. f = float64(d.decodeInt(64))
  257. } else {
  258. decErr("Float only valid from float16/32/64: Invalid descriptor: %v", d.bd)
  259. }
  260. }
  261. checkOverflowFloat32(f, chkOverflow32)
  262. d.bdRead = false
  263. return
  264. }
  265. // bool can be decoded from bool only (single byte).
  266. func (d *cborDecDriver) decodeBool() (b bool) {
  267. switch d.bd {
  268. case cborBdTrue:
  269. b = true
  270. case cborBdFalse:
  271. default:
  272. decErr("Invalid single-byte value for bool: %s: %x", msgBadDesc, d.bd)
  273. }
  274. d.bdRead = false
  275. return
  276. }
  277. func (d *cborDecDriver) readMapStart() (length int) {
  278. d.bdRead = false
  279. if d.bd == cborBdIndefiniteMap {
  280. return -1
  281. }
  282. return d.decLen()
  283. }
  284. func (d *cborDecDriver) readArrayStart() (length int) {
  285. d.bdRead = false
  286. if d.bd == cborBdIndefiniteArray {
  287. return -1
  288. }
  289. return d.decLen()
  290. }
  291. func (d *cborDecDriver) decLen() int {
  292. return int(d.decUint())
  293. }
  294. func (d *cborDecDriver) decIndefiniteBytes(bs []byte) []byte {
  295. d.bdRead = false
  296. for {
  297. if d.checkBreak() {
  298. break
  299. }
  300. if major := d.bd >> 5; major != cborMajorBytes && major != cborMajorText {
  301. decErr("cbor: expect bytes or string major type in indefinite string/bytes; got: %v, byte: %v", major, d.bd)
  302. }
  303. bs = append(bs, d.r.readn(d.decLen())...)
  304. d.bdRead = false
  305. }
  306. d.bdRead = false
  307. return bs
  308. }
  309. func (d *cborDecDriver) decodeString() (s string) {
  310. if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
  311. s = string(d.decIndefiniteBytes(nil))
  312. return
  313. }
  314. s = string(d.r.readn(d.decLen()))
  315. d.bdRead = false
  316. return
  317. }
  318. func (d *cborDecDriver) decodeBytes(bs []byte) (bsOut []byte, changed bool) {
  319. if d.bd == cborBdIndefiniteBytes || d.bd == cborBdIndefiniteString {
  320. if bs == nil {
  321. bs = []byte{}
  322. changed = true
  323. }
  324. bsOut = d.decIndefiniteBytes(bs[:0])
  325. if len(bsOut) != len(bs) {
  326. changed = true
  327. }
  328. return
  329. }
  330. clen := d.decLen()
  331. if clen >= 0 {
  332. if bs == nil {
  333. bs = []byte{}
  334. bsOut = bs
  335. changed = true
  336. }
  337. if len(bs) != clen {
  338. if len(bs) > clen {
  339. bs = bs[:clen]
  340. } else {
  341. bs = make([]byte, clen)
  342. }
  343. bsOut = bs
  344. changed = true
  345. }
  346. if len(bs) > 0 {
  347. d.r.readb(bs)
  348. }
  349. }
  350. d.bdRead = false
  351. return
  352. }
  353. func (d *cborDecDriver) decodeExt(rv reflect.Value, xtag uint64, ext Ext, de *Decoder) (realxtag uint64) {
  354. u := d.decUint()
  355. d.bdRead = false
  356. realxtag = u
  357. if ext == nil {
  358. re := rv.Interface().(*RawExt)
  359. re.Tag = realxtag
  360. de.decode(&re.Value)
  361. } else if xtag != realxtag {
  362. decErr("Wrong extension tag. Got %b. Expecting: %v", realxtag, xtag)
  363. } else {
  364. var v interface{}
  365. de.decode(&v)
  366. ext.UpdateExt(rv, v)
  367. }
  368. d.bdRead = false
  369. return
  370. }
  371. func (d *cborDecDriver) decodeNaked(de *Decoder) (v interface{}, vt valueType, decodeFurther bool) {
  372. d.initReadNext()
  373. switch d.bd {
  374. case cborBdNil:
  375. vt = valueTypeNil
  376. case cborBdFalse:
  377. vt = valueTypeBool
  378. v = false
  379. case cborBdTrue:
  380. vt = valueTypeBool
  381. v = true
  382. case cborBdFloat16, cborBdFloat32:
  383. vt = valueTypeFloat
  384. v = d.decodeFloat(true)
  385. case cborBdFloat64:
  386. vt = valueTypeFloat
  387. v = d.decodeFloat(false)
  388. case cborBdIndefiniteBytes:
  389. vt = valueTypeBytes
  390. v, _ = d.decodeBytes(nil)
  391. case cborBdIndefiniteString:
  392. vt = valueTypeString
  393. v = d.decodeString()
  394. case cborBdIndefiniteArray:
  395. vt = valueTypeArray
  396. decodeFurther = true
  397. case cborBdIndefiniteMap:
  398. vt = valueTypeMap
  399. decodeFurther = true
  400. default:
  401. switch {
  402. case d.bd >= cborBaseUint && d.bd < cborBaseNegInt:
  403. if d.h.SignedInteger {
  404. vt = valueTypeInt
  405. v = d.decodeInt(64)
  406. } else {
  407. vt = valueTypeUint
  408. v = d.decodeUint(64)
  409. }
  410. case d.bd >= cborBaseNegInt && d.bd < cborBaseBytes:
  411. vt = valueTypeInt
  412. v = d.decodeInt(64)
  413. case d.bd >= cborBaseBytes && d.bd < cborBaseString:
  414. vt = valueTypeBytes
  415. v, _ = d.decodeBytes(nil)
  416. case d.bd >= cborBaseString && d.bd < cborBaseArray:
  417. vt = valueTypeString
  418. v = d.decodeString()
  419. case d.bd >= cborBaseArray && d.bd < cborBaseMap:
  420. vt = valueTypeArray
  421. decodeFurther = true
  422. case d.bd >= cborBaseMap && d.bd < cborBaseTag:
  423. vt = valueTypeMap
  424. decodeFurther = true
  425. case d.bd >= cborBaseTag && d.bd < cborBaseSimple:
  426. vt = valueTypeExt
  427. var re RawExt
  428. ui := d.decUint()
  429. d.bdRead = false
  430. re.Tag = ui
  431. de.decode(&re.Value)
  432. v = &re
  433. // decodeFurther = true
  434. default:
  435. decErr("decodeNaked: Unrecognized d.bd: 0x%x", d.bd)
  436. }
  437. }
  438. if !decodeFurther {
  439. d.bdRead = false
  440. }
  441. return
  442. }
  443. // -------------------------
  444. // CborHandle is a Handle for the CBOR encoding format,
  445. // defined at http://tools.ietf.org/html/rfc7049 and documented further at http://cbor.io .
  446. //
  447. // CBOR is comprehensively supported, including support for:
  448. // - indefinite-length arrays/maps/bytes/strings
  449. // - (extension) tags in range 0..0xffff (0 .. 65535)
  450. // - half, single and double-precision floats
  451. // - all numbers (1, 2, 4 and 8-byte signed and unsigned integers)
  452. // - nil, true, false, ...
  453. // - arrays and maps, bytes and text strings
  454. //
  455. // None of the optional extensions (with tags) defined in the spec are supported out-of-the-box.
  456. // Users can implement them as needed (using SetExt), including spec-documented ones:
  457. // - timestamp, BigNum, BigFloat, Decimals, Encoded Text (e.g. URL, regexp, base64, MIME Message), etc.
  458. //
  459. // To encode with indefinite lengths (streaming), users will use
  460. // (Must)Write and (Must)Encode methods of *Encoder, along with CborStreamXXX constants.
  461. //
  462. // For example, to encode "one-byte" as an indefinite length string:
  463. // var buf bytes.Buffer
  464. // e := NewEncoder(&buf, new(CborHandle))
  465. // e.MustWrite([]byte{CborStreamString})
  466. // e.MustEncode("one-")
  467. // e.MustEncode("byte")
  468. // e.MustWrite([]byte{CborStreamBreak})
  469. // encodedBytes := buf.Bytes()
  470. // var vv interface{}
  471. // NewDecoderBytes(buf.Bytes(), new(CborHandle)).MustDecode(&vv)
  472. // // Now, vv contains the same string "one-byte"
  473. //
  474. type CborHandle struct {
  475. BasicHandle
  476. }
  477. func (h *CborHandle) newEncDriver(w encWriter) encDriver {
  478. return &cborEncDriver{w: w, h: h}
  479. }
  480. func (h *CborHandle) newDecDriver(r decReader) decDriver {
  481. return &cborDecDriver{r: r, h: h}
  482. }
  483. var _ decDriver = (*cborDecDriver)(nil)
  484. var _ encDriver = (*cborEncDriver)(nil)