<!--{{{-->
<link rel='alternate' type='application/rss+xml' title='RSS' href='index.xml' />
<!--}}}-->
Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

.wizard .notChanged {background:transparent;}
.wizard .changedLocally {background:#80ff80;}
.wizard .changedServer {background:#8080ff;}
.wizard .changedBoth {background:#ff8080;}
.wizard .notFound {background:#ffff80;}
.wizard .putToServer {background:#ff80ff;}
.wizard .gotFromServer {background:#80ffff;}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}
.readOnly {background:[[ColorPalette::TertiaryPale]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity=60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 0.3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0; margin:0.4em 0 0.2em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0 0; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0;}
.wizardFooter .status {padding:0 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0 0 0.5em;}
.tab {margin:0 0 0 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0 0.25em; padding:0 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0; right:0;}
#backstageButton a {padding:0.1em 0.4em; margin:0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; width:90%; margin-left:3em; padding:1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which need larger font sizes.
***/
/*{{{*/
body {font-size:0.8em;}
#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}
.subtitle {font-size:0.8em;}
.viewer table.listView {font-size:0.95em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none !important;}
#displayArea {margin: 1em 1em 0em;}
noscript {display:none;} /* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::ViewToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar [[ToolbarCommands::EditToolbar]]'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser excludeLists'></span></div>
<!--}}}-->
To get started with this blank [[TiddlyWiki]], you'll need to modify the following tiddlers:
* [[SiteTitle]] & [[SiteSubtitle]]: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* [[MainMenu]]: The menu (usually on the left)
* [[DefaultTiddlers]]: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These [[InterfaceOptions]] for customising [[TiddlyWiki]] are saved in your browser

Your username for signing your edits. Write it as a [[WikiWord]] (eg [[JoeBloggs]])

<<option txtUserName>>
<<option chkSaveBackups>> [[SaveBackups]]
<<option chkAutoSave>> [[AutoSave]]
<<option chkRegExpSearch>> [[RegExpSearch]]
<<option chkCaseSensitiveSearch>> [[CaseSensitiveSearch]]
<<option chkAnimate>> [[EnableAnimations]]

----
Also see [[AdvancedOptions]]
<<importTiddlers>>
Background: #fff
Foreground: #000
PrimaryPale: #5a0
PrimaryLight: #4a0
PrimaryMid: #020
PrimaryDark: #390
SecondaryPale: #ffc
SecondaryLight: #af0
SecondaryMid: #340
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
David Nichols is the author of the [[Qore programming language|http://qoretechnologies.com/qore]] and of this xmlsec module.
You can reach me at: mailto:[email protected]
[[Introduction]]
[[XmlSec Namespace]]
The Qore {{{xmlsec}}} module is based on the [[xmlsec library|http://www.aleksey.com/xmlsec]], and supports [[XML signatures|http://www.w3.org/TR/xmldsig-core]] and [[XML encryption|http://www.w3.org/TR/xmlenc-core/]] according to the standards defined in the previous links.

This module is released under the [[LGPL 2.1|http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html]] and is tagged as such in the module's header (meaning it can be loaded unconditionally regardless of how the Qore library was initialized).

Note that this documentation is based on [[TittldyWiki|http://www.tiddlywiki.com/]], a wiki entirely contained in a single web page.

This module is stable and tested, but currently only provides limited functionality; future versions of this module should provide more functionality.

Currently this module supports signing messages and verifying message signatures with keys and X509 certificates, as well as encrypting and decrypting messages with keys, X509 certificates, and session keys.

Encryption, decryption, signing, and verification is performed through the static methods of the [[XmlSec|XmlSec Class]] class, while access to keys and key managers is provided through the [[XmlSecKey|XmlSecKey Class]] and [[XmlSecKeyManager|XmlSecKeyManager Class]] classes.
[[Introduction]]
[[XmlSec Namespace]]
[[XmlSec Class]]
[[XmlSecKey Class]]
[[XmlSecKeyManager Class]]


Qore xmlsec Module Documentation
The {{{XmlSec}}} class implements the following four static methods

''Methods''
|!Method Name|!Description|h
|[[XmlSec::sign()]]|signs an XML message based on an XML template|
|[[XmlSec::verify()]]|verified the signature of a signed XML message|
|[[XmlSec::encrypt()]]|encrypts a binary object or XML message based on an XML template|
|[[XmlSec::decrypt()]]|decrypts a binary object or XML message|

This class cannot be instantiated as it only implements static methods.
The module implements the {{{XmlSec}}} namespace that contains all constants and classes defined by the module.
!Classes
* [[XmlSec|XmlSec Class]]: for signing, verifying, encryption and decryption
* [[XmlSecKey|XmlSecKey Class]]: provides access to xmlsec keys
* [[XmlSecKeyManager|XmlSecKeyManager Class]]: provides an xmlsec key manager
!Constants
A single generic constant is defined in the module:
: {{{XmlSec::ModuleVersion}}}: the version string for this module ("0.0.1")

The following three groups of constants are provided to serve as options to methods in the module:
* [[xmlSecKeyDataId Constants]]
* [[xmlSecKeyDataFormat Constants]]
* [[xmlSecKeyDataType Constants]]
!Synopsis
Static method of the [[XmlSec Class]].  Decrypts data using an [[XmlSecKey|XmlSecKey Class]] or [[XmlSecKeyManager|XmlSecKeyManager Class]] object.  If any errors occur an appropriate exception is thrown.
!Usage
!!!{{{XmlSec::decrypt(encrypted_xml_string, }}}[[xmlSecKey|xmlSecKey Class]]{{{)}}}
Decrypts the encrypted XML data in the XML string using the [[XmlSecKey|XmlSecKey Class]] passed as the second argument.
** example: {{{ $str = XmlSec::decrypt($encrypted_str, $key); }}}
!!!{{{XmlSec::decrypt(binary|xml_string, }}}[[xmlSecKeyManager|xmlSecKeyManager Class]]{{{)}}}
Decryps the encrypted XML data that was encrypted with a session key using the [[XmlSecKeyManager|XmlSecKeyManager Class]] object passed as the second argument to decrypt the session key and then decrypt the message using the decrypted session key.
** example: {{{ $str = XmlSec::decrypt($encrypted_str, $mgr); }}}
!Return Value
:{{{string}}}: returns the XML string with the decrypted data
!Exceptions
:{{{XMLSEC-DECRYPT-ERROR}}}: error in arguments to the methods; decryption failed, libxmlsec error
!Synopsis
Static method of the [[XmlSec Class]].  Encrypts data using an XML template and an [[XmlSecKey|XmlSecKey Class]] object and optionally an [[XmlSecKeyManager|XmlSecKeyManager Class]] object.  Make sure the key type corresponds to the {{{Algorithm}}} attribute of the {{{EncryptionMethod}}} tag in the XML template or the method call will fail.  If any errors occur an appropriate exception is thrown.
!Usage
!!!{{{XmlSec::encrypt(binary|xml_string, xml_template_string, }}}[[xmlSecKey|xmlSecKey Class]]{{{)}}}
Encryps the binary or XML data passed as the first argument according to the template passed as the second argument using the [[XmlSecKey|XmlSecKey Class]] passed as the third argument.
** example: {{{ $str = XmlSec::encrypt($str, $encryption_template, $key); }}}
!!!{{{XmlSec::encrypt(binary|xml_string, xml_template_string, }}}[[xmlSecKey|xmlSecKey Class]]{{{, }}}[[xmlSecKeyManager|xmlSecKeyManager Class]]{{{)}}}
Encryps the binary or XML data passed as the first argument according to the template passed as the second argument using the [[XmlSecKey|XmlSecKey Class]] passed as the third argument as a session key, and the [[XmlSecKeyManager|XmlSecKeyManager Class]] object passed as the fourth argument to give the key to encrypt the session key with.
** example: {{{ $str = XmlSec::encrypt($str, $encryption_template, $session_key, $mgr); }}}
!Return Value
:{{{string}}}: returns the XML string with the encrypted data
!Exceptions
:{{{XMLSEC-ENCRYPT-ERROR}}}: error in arguments to the methods; encryption failed, libxmlsec error
!Synopsis
Static method of the [[XmlSec Class]].  Creates a signed XML string based on an XML template string and an [[XmlSecKey|XmlSecKey Class]] object.  If errors occur an appropriate exception is raised.  Transformations are given in the XML template.
!Usage
!!!{{{XmlSec::sign(xml_template_string, }}}[[xmlSecKey|xmlSecKey Class]]{{{)}}}
Creates a signed XML string based on the XML template passed as the first argument and the [[]XmlSecKey|XmlSecKey Class]] passed as the second argument.
** example: {{{ my $str = XmlSec::sign($template, $key); }}}
!Return Value
:{{{string}}}: the signed XML string
!Exceptions
:{{{XMLSEC-SIGN-ERROR}}}: error in arguments to the methods; libxmlsec error
:{{{XMLSEC-DSIGCTX-ERROR}}}: error producing the signed XML string
!Synopsis
Static method of the [[XmlSec Class]].  Verifies a signed XML string with an [[XmlSecKey|XmlSecKey Class]] object.  If errors occur an appropriate exception is raised.
!Usage
!!!{{{XmlSec::verify(signed_xml_string, }}}[[xmlSecKey|xmlSecKey Class]]{{{)}}}
Verifies the signature of the signed XML string passed as the first argument with the the [[]XmlSecKey|XmlSecKey Class]] passed as the second argument.
** example: {{{ XmlSec::verify($str, $key); }}}
!Return Value
This method returns no value; if an error occurs an exception is raised.
!Exceptions
:{{{XMLSEC-SIGN-ERROR}}}: error in arguments to the methods; signature verification failed
:{{{XMLSEC-DSIGCTX-ERROR}}}: signature verification could not be processed by libxmlsec
The {{{XmlSecKey}}} class implements an xmlsec key (wrapper for an {{{xmlSecKey}}} structure).

''Methods''
|!Method Name|!Description|h
|[[XmlSecKey::constructor()]]|creates the object|
|[[XmlSecKey::destructor()]]|destroys the object|
|[[XmlSecKey::setCertificate()]]|adds an X509 certificate to the key|
|[[XmlSecKey::setName()]]|sets the name of the key|
|[[XmlSecKey::getName()]]|returns the name of the key|
|[[XmlSecKey::getType()]]|returns the type of the key|
!Synopsis
Creates a new {{{XmlSecKey}}} based on the arguments passed.
!Usage
!!!{{{new XmlSecKey(binary|string, }}}[[xmlSecKeyDataFormat|xmlSecKeyDataFormat Constants]]{{{, [password])}}}
Creates a new key based on key data (for example, in PEM or DER format), the second argument will normally be {{{xmlSecKeyDataFormatPem}}} or {{{xmlSecKeyDataFormatDer}}}.  The password argument is required for private keys with a password.
** example: {{{ my $key = new XmlSecKey($key_pem, xmlSecKeyDataFormatPem, $password); }}}

!!!{{{new XmlSecKey(}}}[[xmlSecKeyDataId|xmlSecKeyDataId Constants]]{{{|string, num_bits, }}}[[xmlSecKeyDataType|xmlSecKeyDataType Constants]]{{{)}}}
Creates a new random key (for example, for a session key) of the type given by the first argument and of the number of bits given in the second argument.  For a session key, the third argument should be {{{xmlSecKeyDataTypeSession}}}.
** example: {{{ my $session_key = new XmlSecKey(xmlSecKeyDataAesId, 256, xmlSecKeyDataTypeSession); }}}
!Exceptions
:{{{XMLSECKEY-CONSTRUCTOR-ERROR}}}: invalid arguments to the constructor
:{{{XMLSECKEY-ERROR}}}: error reported by libxmlsec creating the key
!Synopsis
Destroys the {{{XmlSecKey}}} object.
!Exceptions
none
!Synopsis
Returns the key name (if any) for the {{{XmlSecKey}}} object.
!Usage
!!!{{{XmlSecKey::getName()}}}
Returns the key name; if no key name is set, returns {{{NOTHING}}}.
** example: {{{ my $name = $key.getName(); }}}
!Return Value
:string: the key name for the object if set
:{{{NOTHING}}}: if no name is set, no value is returned
!Exceptions
:{{{XMLSECKEY-SETNAME-ERROR}}}: invalid arguments to the method
:{{{XMLSECKEY-ERROR}}}: error reported by libxmlsec setting the name
!Synopsis
Returns the [[xmlSecKeyDataType|xmlSecKeyDataType Constants]] value for the {{{XmlSecKey}}} object.
!Usage
!!!{{{XmlSecKey::getType()}}}
Returns the key's type as a [[xmlSecKeyDataType|xmlSecKeyDataType Constants]] value.
** example: {{{ my $type = $key.getType(); }}}
!Return Value
:[[xmlSecKeyDataType|xmlSecKeyDataType Constants]]: the key type
!Exceptions
:{{{XMLSECKEY-ERROR}}}: returned if the key is not valid
!Synopsis
Assigns an X509 certificate to the {{{XmlSecKey}}} object.
!Usage
!!!{{{XmlSecKey::setCertificate(binary|string, }}}[[xmlSecKeyDataFormat|xmlSecKeyDataFormat Constants]]{{{)}}}
Assigns an X509 certificate to the {{{XmlSecKey}}} object as defined by the first string or binary argument (for example, in PEM or DER format); the second argument will normally be {{{xmlSecKeyDataFormatCertPem}}} or {{{xmlSecKeyDataFormatCertDer}}}.
** example: {{{ $key.setCertificate($cert_pem, xmlSecKeyDataFormatCertPem); }}}

!!!{{{XmlSecKey::setCertificate(SSLCertificate);}}}
Assigns the SSLCertifcate object to the {{{XmlSecKey}}} as the X509 certificate for the key.
** example: {{{ $key.setCertificate($cert); }}}
!Return Value
This method does not return any value.
!Exceptions
:{{{XMLSECKEY-SETCERTIFICATE-ERROR}}}: invalid arguments to the method
:{{{XMLSECKEY-ERROR}}}: error reported by libxmlsec assigning the certificate to the key
!Synopsis
Sets the key name in the {{{XmlSecKey}}} object.
!Usage
!!!{{{XmlSecKey::setName(string)}}}
Sets the key name.
** example: {{{ $key.setName($file_name); }}}
!Return Value
This method does not return any value.
!Exceptions
:{{{XMLSECKEY-SETNAME-ERROR}}}: invalid arguments to the method
:{{{XMLSECKEY-ERROR}}}: error reported by libxmlsec setting the name
The {{{XmlSecKeyManager}}} class implements an xmlsec key manager (wrapper for an {{{xmlSecKeysManager}}} structure).

''Methods''
|!Method Name|!Description|h
|[[XmlSecKeyManager::constructor()]]|creates the object|
|[[XmlSecKeyManager::destructor()]]|destroys the object|
|[[XmlSecKeyManager::addKey()]]|adds a key to the object|
!Synopsis
Adds a [[XmlSecKey|XmlSecKey Class]] object to the {{{XmlSecKeyManager}}} object.
!Usage
!!!{{{XmlSecKeyManager::addKeyCertificate(}}}[[XmlSecKey|XmlSecKey Class]]{{{);}}}
Makes a copy of the [[XmlSecKey|XmlSecKey Class]] object passed as an argument and adds the copy of the key to the {{{XmlSecKeyManager}}} object.
** example: {{{ $mgr.addKey($key); }}}
!Return Value
This method does not return any value.
!Exceptions
:{{{XMLSECKEYMANAGER-ADDKEY-ERROR}}}: invalid arguments to the method
:{{{XMLSECKEYMANAGER-ERROR}}}: error reported by libxmlsec assigning the key to the key manager
!Synopsis
Creates a new, empty {{{XmlSecKeyManager}}} object.  Call [[XmlSecKeyManager::addKey()]] to add keys.
!Usage
!!!{{{new XmlSecKeyManager()}}}
Creates a new key manager.
** example: {{{ my $mgr = new XmlSecKeyManager(); }}}
!Exceptions
:{{{XMLSECKEYMANAGER-ERROR}}}: error reported by libxmlsec creating or initializing the key manager
!Synopsis
Destroys the {{{XmlSecKeyManager}}} object.
!Exceptions
none
Note that these constants are all of the Qore type {{{xmlSecKeyDataFormat}}}, provided by this module.

''xmlSecKeyDataFormat Constants''
* {{{XmlSec::xmlSecKeyDataFormatUnknown}}}
* {{{XmlSec::xmlSecKeyDataFormatBinary}}}
* {{{XmlSec::xmlSecKeyDataFormatPem}}}
* {{{XmlSec::xmlSecKeyDataFormatDer}}}
* {{{XmlSec::xmlSecKeyDataFormatPkcs8Pem}}}
* {{{XmlSec::xmlSecKeyDataFormatPkcs8Der}}}
* {{{XmlSec::xmlSecKeyDataFormatPkcs12}}}
* {{{XmlSec::xmlSecKeyDataFormatCertPem}}}
* {{{XmlSec::xmlSecKeyDataFormatCertDer}}}
Note that these constants are all of the Qore type {{{xmlSecKeyDataId}}}, provided by this module.

''xmlSecKeyDataId Constants''
* {{{XmlSec::xmlSecKeyDataAesId}}}
* {{{XmlSec::xmlSecKeyDataDesId}}}
* {{{XmlSec::xmlSecKeyDataDsaId}}}
* {{{XmlSec::xmlSecKeyDataHmacId}}}
* {{{XmlSec::xmlSecKeyDataRsaId}}}
* {{{XmlSec::xmlSecKeyDataX509Id}}}
* {{{XmlSec::xmlSecKeyDataRawX509CertId}}}
Note that these constants are all of the Qore type {{{integer}}}.

''xmlSecKeyDataType Constants''
* {{{XmlSec::xmlSecKeyDataTypeUnknown}}}
* {{{XmlSec::xmlSecKeyDataTypeNone}}}
* {{{XmlSec::xmlSecKeyDataTypePublic}}}
* {{{XmlSec::xmlSecKeyDataTypePrivate}}}
* {{{XmlSec::xmlSecKeyDataTypeSymmetric}}}
* {{{XmlSec::xmlSecKeyDataTypeSession}}}
* {{{XmlSec::xmlSecKeyDataTypePermanent}}}
* {{{XmlSec::xmlSecKeyDataTypeTrusted}}}
* {{{XmlSec::xmlSecKeyDataTypeAny}}}