Ejemplo n.º 1
0
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)
Ejemplo n.º 2
0
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)
Ejemplo n.º 3
0
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)