code: def sign_digest(sock, keygrip, digest, sp=subprocess, environ=None):
      
      hash_algo = 8  # SHA256
      assert len(digest) == 32
  
      assert communicate(sock, 'RESET').startswith(b'OK')
  
      ttyname = check_output(args=['tty'], sp=sp).strip()
      options = ['ttyname={}'.format(ttyname)]  # set TTY for passphrase entry
  
      display = (environ or os.environ).get('DISPLAY')
      if display is not None:
          options.append('display={}'.format(display))
  
      for opt in options:
          assert communicate(sock, 'OPTION {}'.format(opt)) == b'OK'
  
      assert communicate(sock, 'SIGKEY {}'.format(keygrip)) == b'OK'
      hex_digest = binascii.hexlify(digest).upper().decode('ascii')
      assert communicate(sock, 'SETHASH {} {}'.format(hash_algo,
                                                      hex_digest)) == b'OK'
  
      assert communicate(sock, 'SETKEYDESC '
                         'Sign+a+new+TREZOR-based+subkey') == b'OK'
      assert communicate(sock, 'PKSIGN') == b'OK'
      while True:
          line = recvline(sock).strip()
          if line.startswith(b'S PROGRESS'):
              continue
          else:
              break
      line = unescape(line)
      log.debug('unescaped: %r', line)
      prefix, sig = line.split(b' ', 1)
      if prefix != b'D':
          raise ValueError(prefix)
  
      sig, leftover = parse(sig)
      assert not leftover, leftover
      return parse_sig(sig)
docs: Sign a digest using specified key using GPG agent.