import json,re,base64,urllib.parse,collections
from lxml import etree
D=json.load(open('work/scratch/saml-all.json'))
for x in D:
 req=next((b['message'] for b in x['blobs'] if b['kind']=='request'),'')
 body=req.split('\r\n\r\n',1)[-1]; q=urllib.parse.parse_qs(body,keep_blank_values=True); sr=q.get('SAMLResponse',[''])[0]
 try: xml=base64.b64decode(sr+'===')
 except: continue
 if b'EncryptedAssertion' not in xml: continue
 try:r=etree.fromstring(xml)
 except:continue
 sigs=r.xpath('//*[local-name()="Signature"]'); outsig=bool(r.xpath('./*[local-name()="Signature"]')); assertions=len(r.xpath('//*[local-name()="Assertion"]')); enc=len(r.xpath('//*[local-name()="EncryptedAssertion"]'))
 algs=[e.get('Algorithm') for e in r.xpath('//*[local-name()="EncryptionMethod" or local-name()="SignatureMethod"]')]
 certs=r.xpath('//*[local-name()="X509Certificate"]/text()')
 certtag='none'
 if certs:
  c=''.join(certs[0].split())
  import subprocess,tempfile,os
  try:
   der=base64.b64decode(c); p='/tmp/c.der'; open(p,'wb').write(der); z=subprocess.check_output(['openssl','x509','-inform','DER','-in',p,'-noout','-subject'],stderr=subprocess.DEVNULL,text=True).strip(); certtag=z
  except:certtag='bad'
 print(x['exchange_id'],x['agent'],x['response_status'],x['duration_ms'],'ctx='+q.get('context',[''])[0],f'outsig={outsig}',f'sigs={len(sigs)}',f'plainassert={assertions}',f'enc={enc}','algs='+','.join(str(a) for a in algs),'cert='+certtag[:120])
