| 'use strict'; | 
|   | 
| var BN = require('bn.js'); | 
| var utils = require('../utils'); | 
| var assert = utils.assert; | 
| var cachedProperty = utils.cachedProperty; | 
| var parseBytes = utils.parseBytes; | 
|   | 
| /** | 
| * @param {EDDSA} eddsa - eddsa instance | 
| * @param {Array<Bytes>|Object} sig - | 
| * @param {Array<Bytes>|Point} [sig.R] - R point as Point or bytes | 
| * @param {Array<Bytes>|bn} [sig.S] - S scalar as bn or bytes | 
| * @param {Array<Bytes>} [sig.Rencoded] - R point encoded | 
| * @param {Array<Bytes>} [sig.Sencoded] - S scalar encoded | 
| */ | 
| function Signature(eddsa, sig) { | 
|   this.eddsa = eddsa; | 
|   | 
|   if (typeof sig !== 'object') | 
|     sig = parseBytes(sig); | 
|   | 
|   if (Array.isArray(sig)) { | 
|     sig = { | 
|       R: sig.slice(0, eddsa.encodingLength), | 
|       S: sig.slice(eddsa.encodingLength), | 
|     }; | 
|   } | 
|   | 
|   assert(sig.R && sig.S, 'Signature without R or S'); | 
|   | 
|   if (eddsa.isPoint(sig.R)) | 
|     this._R = sig.R; | 
|   if (sig.S instanceof BN) | 
|     this._S = sig.S; | 
|   | 
|   this._Rencoded = Array.isArray(sig.R) ? sig.R : sig.Rencoded; | 
|   this._Sencoded = Array.isArray(sig.S) ? sig.S : sig.Sencoded; | 
| } | 
|   | 
| cachedProperty(Signature, 'S', function S() { | 
|   return this.eddsa.decodeInt(this.Sencoded()); | 
| }); | 
|   | 
| cachedProperty(Signature, 'R', function R() { | 
|   return this.eddsa.decodePoint(this.Rencoded()); | 
| }); | 
|   | 
| cachedProperty(Signature, 'Rencoded', function Rencoded() { | 
|   return this.eddsa.encodePoint(this.R()); | 
| }); | 
|   | 
| cachedProperty(Signature, 'Sencoded', function Sencoded() { | 
|   return this.eddsa.encodeInt(this.S()); | 
| }); | 
|   | 
| Signature.prototype.toBytes = function toBytes() { | 
|   return this.Rencoded().concat(this.Sencoded()); | 
| }; | 
|   | 
| Signature.prototype.toHex = function toHex() { | 
|   return utils.encode(this.toBytes(), 'hex').toUpperCase(); | 
| }; | 
|   | 
| module.exports = Signature; |