code: function _signerFromAsn1(obj) {
    // validate EnvelopedData content block and capture data
    var capture = {};
    var errors = [];
    if(!asn1.validate(obj, p7.asn1.signerInfoValidator, capture, errors)) {
      var error = new Error('Cannot read PKCS#7 SignerInfo. ' +
        'ASN.1 object is not an PKCS#7 SignerInfo.');
      error.errors = errors;
      throw error;
    }
  
    var rval = {
      version: capture.version.charCodeAt(0),
      issuer: forge.pki.RDNAttributesAsArray(capture.issuer),
      serialNumber: forge.util.createBuffer(capture.serial).toHex(),
      digestAlgorithm: asn1.derToOid(capture.digestAlgorithm),
      signatureAlgorithm: asn1.derToOid(capture.signatureAlgorithm),
      signature: capture.signature,
      authenticatedAttributes: [],
      unauthenticatedAttributes: []
    };
  
    // TODO: convert attributes
    var authenticatedAttributes = capture.authenticatedAttributes || [];
    var unauthenticatedAttributes = capture.unauthenticatedAttributes || [];
  
    return rval;
  }
docs: Converts a single signer from an ASN.1 object.
  
  @param obj the ASN.1 representation of a SignerInfo.
  
  @return the signer object.