def sign_envelope(envelope, key_file): """Sign the given soap request with the given key""" doc = etree.fromstring(envelope) body = get_body(doc) queue = SignQueue() queue.push_and_mark(body) security_node = ensure_security_header(doc, queue) security_token_node = create_binary_security_token(key_file) queue.push_and_mark(security_token_node) signature_node = Signature(xmlsec.TransformExclC14N, xmlsec.TransformRsaSha1) security_node.append(security_token_node) security_node.append(signature_node) queue.insert_references(signature_node) key_info = create_key_info_node(security_token_node) signature_node.append(key_info) # Sign the generated xml xmlsec.addIDs(doc, ['Id']) dsigCtx = xmlsec.DSigCtx() dsigCtx.signKey = xmlsec.Key.load(key_file, xmlsec.KeyDataFormatPem, None) dsigCtx.sign(signature_node) return etree.tostring(doc)
def sign_envelope(envelope, key_file, password=None): """Sign the given soap request with the given key""" doc = etree.fromstring(envelope) body = get_body(doc) queue = SignQueue() queue.push_and_mark(body) security_node = ensure_security_header(doc, queue) security_token_node = create_binary_security_token(key_file) signature_node = Signature( xmlsec.TransformExclC14N, xmlsec.TransformRsaSha1) security_node.append(security_token_node) security_node.append(signature_node) queue.insert_references(signature_node) key_info = create_key_info_node(security_token_node) signature_node.append(key_info) # Sign the generated xml xmlsec.addIDs(doc, ['Id']) dsigCtx = xmlsec.DSigCtx() dsigCtx.signKey = xmlsec.Key.load( key_file, xmlsec.KeyDataFormatPem, password, ) dsigCtx.sign(signature_node) return etree.tostring(doc)
def sign_envelope(envelope, key_file, add_to_queue=None): """Sign the given soap request body with the given key. An optional add_to_queue callable can be passed to add additional elements to the signing queue. This function gets passed the document tree and should return a collection of Elements.""" doc = etree.fromstring(envelope) body = get_body(doc) queue = SignQueue() queue.push_and_mark(body) if add_to_queue: if not hasattr(add_to_queue, '__call__'): raise ValueError('`zadd_to_queue` kwarg must be a callable') extra_sign_queue = add_to_queue(doc) if not hasattr(extra_sign_queue, '__iter__'): raise ValueError('`add_to_queue` must return an iterable value') for el in extra_sign_queue: queue.push_and_mark(el) security_node = ensure_security_header(doc, queue) security_token_node = create_binary_security_token(key_file) signature_node = Signature(xmlsec.TransformExclC14N, xmlsec.TransformRsaSha1) security_node.append(security_token_node) security_node.append(signature_node) queue.insert_references(signature_node) key_info = create_key_info_node(security_token_node) signature_node.append(key_info) # Sign the generated xml xmlsec.addIDs(doc, ['Id']) dsigCtx = xmlsec.DSigCtx() dsigCtx.signKey = xmlsec.Key.load(key_file, xmlsec.KeyDataFormatPem, None) dsigCtx.sign(signature_node) return etree.tostring(doc)