<!--{{{-->
<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>>
The module implements the {{{ASN1}}} namespace that contains all constants and classes defined by the module.
!Classes
* [[ASN1Object]]: abstract base class for all ASN.1 data types, also contains a static method for parsing
* [[ASN1Sequence]]: an ASN.1 Sequence data type class
* [[ASN1Boolean]]: an ASN.1 boolean data type class
* [[ASN1Integer]]: an ASN.1 integer data type class
* [[ASN1OctetString]]: an ASN.1 {{{OctetString}}} (binary) data type class
* [[ASN1UTF8String]]: an ASN.1 {{{UTF-8}}} character string data type class
* [[ASN1ObjectIdentifier]]: an ASN.1 {{{ObjectIdentifier}}} data type class
* [[ASN1BitString]]: an ASN.1 {{{BitString}}} data type class
!Constants
A single generic constant is defined in the module:
: {{{ASN1::ModuleVersion}}}: the version string for this module ("0.1")
The following constant group is provided to define type identifiers for the classes listed above:
* [[ASN1Tag Constants]]
{{{ASN1BitString}}} is a subclass of [[ASN1Object]] representing an ASN.1 {{{BitString}}} value; that is, a string of binary digits.

''Methods''
|!Method Name|!Description|h
|[[ASN1BitString::constructor()]]|creates an {{{ASN1BitString}}} object from a Qore list or binary object.|
|[[ASN1BitString::copy()]]|returns a copy of the object|
|[[ASN1BitString::getBinary()]]|returns a Qore binary object corresponding to the bits in the ASN.1 {{{BitString}}}|
|[[ASN1BitString::getBitString()]]|returns a Qore string where each character corresponds to a bits in the ASN.1 {{{BitString}}}|
|[[ASN1BitString::getQoreData()]]|returns a Qore list of boolean elements corresponding to the bits in the ASN.1 {{{BitString}}}|
!Synopsis
Creates an ASN1BitString object from the list or binary object passed.  A list will be processed in such a way that each element in the list will be converted to a boolean value, if the value is {{{True}}}, then the corresponding bit in the {{{BitString}}} will be true, if the element is {{{False}}}, then the corresponding bit in the {{{BitString}}} will be false.  If the argument to the constructor is a binary object, then the bytes of the object will be used to set the bits of the {{{BitString}}} directly.
!Usage
!!!{{{new ASN1BitString(value)}}}
* example: {{{ my $bit_string = new ASN1BitString((True, False, True, True)); }}}
!Exceptions
* {{{ASN1OBJECTIDENTIFIER-CONSTUCTOR-ERROR}}}: error in method arguments, internal error in openssl library creating the object data
!Synopsis
Copies the ASN1BitString object.
!Usage
!!!{{{ASN1BitString::copy()}}}
** example: {{{ my $new_bit_string = $old_bit_string.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore binary object corresponding to value of the ASN.1 {{{BitString}}}.
!Usage
!!!{{{ASN1BitString::getBinary()}}}
** example: {{{ my $bin = $bit_string.getBinary();}}}
!Return Value
Qore binary object.
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns a Qore string where each character is either an ASCII "0" or "1" corresponding to a bit in the ASN.1 {{{BitString}}}.
!Usage
!!!{{{ASN1BitString::getBitString()}}}
** example: {{{ my $str = $bit_string.getBitString();}}}
!Return Value
Qore string.
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns a Qore list where each element is a {{{boolean}}} value corresponding to value of the ASN.1 {{{BitString}}} bit at that position.
!Usage
!!!{{{ASN1BitString::getQoreData()}}}
** example: {{{ my $list = $bit_string.getQoreData();}}}
!Return Value
Qore list.
!Exceptions
This method does not throw any exceptions
{{{ASN1Boolean}}} is a subclass of [[ASN1Object]] representing an ASN.1 boolean value.

''Methods''
|!Method Name|!Description|h
|[[ASN1Boolean::constructor()]]|creates an {{{ASN1Boolean}}} object.|
|[[ASN1Boolean::copy()]]|returns a copy of the object|
|[[ASN1Boolean::getQoreData()]]|returns a Qore boolean value corresponding to the ASN.1 boolean value|
!Synopsis
Creates an ASN1Boolean object; if the first argument evaluates to {{{True}}}, then the value of the object is true, otherwise it is false.
!Usage
!!!{{{new ASN1Boolean(bool_value)}}}
** example: {{{ my $bool = new ASN1Boolean(False); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a deep copy of the ASN1Boolean object.
!Usage
!!!{{{ASN1Boolean::copy()}}}
** example: {{{ my $new_bool = $old_bool.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore boolean value corresponding to the ASN.1 boolean value.
!Usage
!!!{{{ASN1Boolean::getQoreData()}}}
** example: {{{ my $b = $bool.getQoreData();}}}
!Return Value
Qore boolean value.
!Exceptions
This method does not throw any exceptions
{{{ASN1Integer}}} is a subclass of [[ASN1Object]] representing an ASN.1 integer value.

''Methods''
|!Method Name|!Description|h
|[[ASN1Integer::constructor()]]|creates an {{{ASN1Integer}}} object.|
|[[ASN1Integer::copy()]]|returns a copy of the object|
|[[ASN1Integer::getQoreData()]]|returns a Qore string corresponding to the ASN.1 integer|
!Synopsis
Creates an ASN1Integer object from the integer or string argument passed.
!Usage
!!!{{{new ASN1Integer(value)}}}
** example: {{{ my $i = new ASN1Integer(250); }}}
!Exceptions
:{{{ASN1INTEGER-CONSTRUCTOR-ERROR}}}: the openssl library encountered an error creating the internal object
!Synopsis
Copies the ASN1Integer object.
!Usage
!!!{{{ASN1Integer::copy()}}}
** example: {{{ my $new_int = $old_int.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore string corresponding to the ASN.1 integer value.  A string is returned instead of a Qore integer because an ASN.1 integer can be arbitrarily long, while Qore integers are limited to 64 bits.
!Usage
!!!{{{ASN1Integer::getQoreData()}}}
** example: {{{ my $i = $int.getQoreData();}}}
!Return Value
Qore string value.
!Exceptions
This method does not throw any exceptions
The {{{ASN1Object}}} class is the abstract base class for all Qore ASN.1 data type classes and provides a static method for parsing {{{DER}}}-encoded ASN.1 data.  As this is an abstract class, it cannot be instantiated directly; a subclass must be instantiated instead.

''Methods''
|!Method Name|!Description|h
|[[ASN1Object::getDer()]]|returns a binary object containing the {{{DER}}}-encoded representation of the ASN.1 data|
|[[ASN1Object::getQoreData()]]|returns Qore data corresponding (approximately) to the ASN.1 data contained by the type|

''Static Methods''
|!Method Name|!Description|h
|[[ASN1Object::parse()]]|static method for parsing {{{DER}}}-encoded ASN.1 data|
!Synopsis
Returns a binary object containing the {{{DER}}}-encoded representation of the ASN.1 data represented by the current object.
!Usage
!!!{{{ASN1Object::getDer()}}}
Returns a binary object containing the {{{DER}}}-encoded representation of the ASN.1 data represented by the current object.
** example: {{{ my $der_data = $object.getDer(); }}}
!Return Value
A binary object.
!Exceptions
This function does not throw any exceptions.
!Synopsis
Returns Qore data corresponding approximately to the ASN.1 data represented by the current object (ex: a Sequence is returned as a list, etc).
!Usage
!!!{{{ASN1Object::getQoreData()}}}
Returns Qore data corresponing approximately to the ASN.1 data represented by the current object (ex: a Sequence is returned as a list, etc).
** example: {{{ printf("%N\n", $object.getQoreData()); }}}
!Return Value
Qore data corresponding roughly to the ASN.1 data represented by the current object..
!Exceptions
This function does not throw any exceptions.
!Synopsis
Static method of the [[ASN1Object]] class.  Parses {{{DER}}}-encoded data and returns a subclass of [[ASN1Object]].  Note that if this method encounters an unsupported ASN.1 type, it will throw an {{{ASN1OBJECT-PARSE-ERROR}}} exception.
!Usage
!!!{{{ASN1Object::parse(der_binary_data)}}}
Parses the {{{DER}}}-encoded data and returns a subclass of [[ASN1Object]].
** example: {{{ ASN1Object::parse($der_data); }}}
!Return Value
Returns a subclass of [[ASN1Object]].
!Exceptions
:{{{ASN1OBJECT-PARSE-ERROR}}}: error decoding DER data, unsupported ASN.1 type encountered
{{{ASN1ObjectIdentifier}}} is a subclass of [[ASN1Object]] representing an ASN.1 {{{ObjectIdentifier}}} value.

''Methods''
|!Method Name|!Description|h
|[[ASN1ObjectIdentifier::constructor()]]|creates an {{{ASN1ObjectIdentifier}}} object.|
|[[ASN1ObjectIdentifier::copy()]]|returns a copy of the object|
|[[ASN1ObjectIdentifier::getName()]]|returns a Qore string corresponding to the ASN.1 {{{ObjectIdentifier}}}|
|[[ASN1ObjectIdentifier::getNumericalForm()]]|returns a Qore string giving the dotted numerical form corresponding to the ASN.1 {{{ObjectIdentifier}}}|
|[[ASN1ObjectIdentifier::getQoreData()]]|equivalent to ASN1ObjectIdentifier::getName()|
!Synopsis
Creates an ASN1ObjectIdentifier object from the string or integer passed.
!Usage
!!!{{{new ASN1ObjectIdentifier(value)}}}
The following examples are all equivalent:
* example: {{{ my $oid = new ASN1ObjectIdentifier("1.3.14.3.2.26"); }}}
* example: {{{ my $oid = new ASN1ObjectIdentifier("sha1"); }}}
* example: {{{ my $oid = new ASN1ObjectIdentifier(64); }}}
!Exceptions
* {{{ASN1OBJECTIDENTIFIER-CONSTUCTOR-ERROR}}}: internal error in openssl library creating the object data
!Synopsis
Copies the ASN1ObjectIdentifier object.
!Usage
!!!{{{ASN1ObjectIdentifier::copy()}}}
** example: {{{ my $new_oid = $old_oid.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore string corresponding to the ASN.1 {{{ObjectIdentifier}}} value.
!Usage
!!!{{{ASN1ObjectIdentifier::getName()}}}
** example: {{{ my $name = $oid.getName();}}}
!Return Value
Qore string value.
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns a Qore string corresponding to the ASN.1 {{{ObjectIdentifier}}} dotted numerical form (ex: "1.3.14.3.2.26" for "sha1").
!Usage
!!!{{{ASN1ObjectIdentifier::getNumericalForm()}}}
** example: {{{ my $id = $oid.getNumericalForm();}}}
!Return Value
Qore string value.
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns a Qore string corresponding to the ASN.1 {{{ObjectIdentifier}}} value; this method is equivalent to [[ASN1ObjectIdentifier::getName()]].
!Usage
!!!{{{ASN1ObjectIdentifier::getQoreData()}}}
** example: {{{ my $name = $oid.getQoreData();}}}
!Return Value
Qore string value.
!Exceptions
This method does not throw any exceptions
{{{ASN1OctetString}}} is a subclass of [[ASN1Object]] representing an ASN.1 {{{OctetString}}} value; that is, a sequence of bytes.

''Methods''
|!Method Name|!Description|h
|[[ASN1OctetString::constructor()]]|creates an {{{ASN1OctetString}}} object from a Qore binary object.|
|[[ASN1OctetString::copy()]]|returns a copy of the object|
|[[ASN1OctetString::getQoreData()]]|returns a Qore binary object corresponding to the ASN.1 {{{OctetString}}}|
!Synopsis
Creates an ASN1OctetString object from the binary object or string passed.
!Usage
!!!{{{new ASN1OctetString(value)}}}
** example: {{{ my $octet_string = new ASN1OctetString($binary); }}}
!Exceptions
:{{{ASN1OCTETSTRING-CONSTUCTOR-ERROR}}}: incorrect arguments to method, internal error in openssl library creating the object data
!Synopsis
Copies the ASN1OctetString object.
!Usage
!!!{{{ASN1OctetString::copy()}}}
** example: {{{ my $new_octet_string = $old_octet_string.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore binary object corresponding to the ASN.1 {{{OctetString}}} value.
!Usage
!!!{{{ASN1OctetString::getQoreData()}}}
** example: {{{ my $bin = $octet_string.getQoreData();}}}
!Return Value
Qore binary value.
!Exceptions
This method does not throw any exceptions
{{{ASN1Sequence}}} is a subclass of [[ASN1Object]] representing an ASN.1 Sequence.

''Methods''
|!Method Name|!Description|h
|[[ASN1Sequence::constructor()]]|creates an empty object, does not take any arguments|
|[[ASN1Sequence::copy()]]|returns a copy of the object|
|[[ASN1Sequence::add()]]|adds an ASN1Object (subclass) to the end of the Sequence|
|[[ASN1Sequence::get()]]|retrieves the ASN1Object (subclass) at the element location passed as an argument|
|[[ASN1Sequence::size()]]|returns the number of elements in the Sequence|
|[[ASN1Sequence::getQoreData()]]|returns a Qore list corresponding to contents of the ASN.1 Sequence|
!Synopsis
Adds a subclass of ASN1Object to the Sequence; the argument is copied, and the copy is added to the sequence.  If the argument passed is not a subclass of ASN1Object, an exception is raised.
!Usage
!!!{{{ASN1Sequence::add(ASN1Object)}}}
** example: {{{ $seq.add(new ASN1Integer(1)); }}}
!Return Value
This function does not return any value.
!Exceptions
:{{{ASN1SEQUENCE-ADD-ERROR}}}: incorrect argument passed to method.
!Synopsis
Creates an empty ASN1Sequence object; does not take any arguments.
!Usage
!!!{{{new ASN1Sequence()}}}
** example: {{{ my $seq = new ASN1Sequence(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a deep copy of the ASN1Sequence object.
!Usage
!!!{{{ASN1Sequence::copy()}}}
** example: {{{ my $new_seq = $old_seq.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Retrieves the ASN1Object subclass at the location given as the sole argument to the method.  If the element location is not valid (negative or greater than the number of elements in the Sequence) then {{{NOTHING}}} is returned.  Note that the first element in the sequence is element 0.
!Usage
!!!{{{ASN1Sequence::get(integer)}}}
** example: {{{ my $object = $seq.get(1); # gets the second element in the sequence }}}
!Return Value
Returns an ASN1Object subclass or NOTHING
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns a Qore list where each element is the result of calling ASN1Object::getQoreData() on the elements of the Sequence.
!Usage
!!!{{{ASN1Sequence::getQoreData()}}}
** example: {{{ my $list = $seq.getQoreData();}}}
!Return Value
Returns a list of Qore values corresponding to the ASN1Object elements in the Sequence.
!Exceptions
This method does not throw any exceptions
!Synopsis
Returns the number of elements in the sequence.
!Usage
!!!{{{ASN1Sequence::size()}}}
** example: {{{ my $num = $seq.size(); }}}
!Return Value
An {{{integer}}} value representing the number of elements in the Sequence.
!Exceptions
This method does not throw any exceptions.
Note that these constants are all of the Qore type {{{integer}}}.

''ASN1Tag Constants''
* {{{ASN1::V_ASN1_BIT_STRING}}}
* {{{ASN1::V_ASN1_OCTET_STRING}}}
* {{{ASN1::V_ASN1_UTF8STRING}}}
* {{{ASN1::V_ASN1_NUMERICSTRING}}}
* {{{ASN1::V_ASN1_PRINTABLESTRING}}}
* {{{ASN1::V_ASN1_T61STRING}}}
* {{{ASN1::V_ASN1_TELETEXSTRING}}}
* {{{ASN1::V_ASN1_IA5STRING}}}
* {{{ASN1::V_ASN1_GRAPHICSTRING}}}
* {{{ASN1::V_ASN1_ISO64STRING}}}
* {{{ASN1::V_ASN1_VISIBLESTRING}}}
* {{{ASN1::V_ASN1_GENERALSTRING}}}
* {{{ASN1::V_ASN1_UNIVERSALSTRING}}}
* {{{ASN1::V_ASN1_BMPSTRING}}}
* {{{ASN1::V_ASN1_BOOLEAN}}}
* {{{ASN1::V_ASN1_INTEGER}}}
* {{{ASN1::V_ASN1_NULL}}}
* {{{ASN1::V_ASN1_OBJECT_DESCRIPTOR}}}
* {{{ASN1::V_ASN1_EXTERNAL}}}
* {{{ASN1::V_ASN1_REAL}}}
* {{{ASN1::V_ASN1_ENUMERATED}}}
* {{{ASN1::V_ASN1_SET}}}
* {{{ASN1::V_ASN1_UTCTIME}}}
* {{{ASN1::V_ASN1_GENERALIZEDTIME}}}
{{{ASN1UTF8String}}} is a subclass of [[ASN1Object]] representing an ASN.1 {{{UTF8String}}} value; that is, a string in {{{UTF-8}}} encoding.

''Methods''
|!Method Name|!Description|h
|[[ASN1UTF8String::constructor()]]|creates an {{{ASN1UTF8String}}} object from a Qore string object.|
|[[ASN1UTF8String::copy()]]|returns a copy of the object|
|[[ASN1UTF8String::getQoreData()]]|returns a Qore string corresponding to the ASN.1 {{{UTF8String}}}|
!Synopsis
Creates an ASN1UTF8String object from the string passed.
!Usage
!!!{{{new ASN1UTF8String(string)}}}
** example: {{{ my $str = new ASN1UTF8String("hi there"); }}}
!Exceptions
* {{{ASN1UTF8STRING-CONSTUCTOR-ERROR}}}: incorrect arguments to method, internal error in openssl library creating the object data
* {{{ENCODING-CONVERSION-ERROR}}}: this exception is thrown if the string argument to the constructor must be converted to {{{UTF-8}}} encoding, but an error occurs in the encoding translation.
!Synopsis
Copies the ASN1UTF8String object.
!Usage
!!!{{{ASN1UTF8String::copy()}}}
** example: {{{ my $new_str = $old_str.copy(); }}}
!Exceptions
This method does not throw any exceptions.
!Synopsis
Returns a Qore string corresponding to the ASN.1 {{{UTF8String}}} value.
!Usage
!!!{{{ASN1UTF8String::getQoreData()}}}
** example: {{{ my $str = $str.getQoreData();}}}
!Return Value
Qore string value with {{{UTF-8}}} encoding.
!Exceptions
This method does not throw any exceptions
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 ans1 module.
You can reach me at: mailto:david_nichols@users.sourceforge.net
[[Introduction]]
[[ASN1 Namespace]]
The Qore {{{asn1}}} module is based on the [[ASN.1|http://en.wikipedia.org/wiki/ASN.1]] functionality provided by the [[openssl library|http://www.openssl.org]].  The module allows for ASN.1 data structures to be dynamically created, parsed, and converted to concrete output formats (like DER).

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.
[[Introduction]]
[[ASN1 Namespace]]
[[ASN1Object]]
[[ASN1Sequence]]
[[ASN1Boolean]]
[[ASN1Integer]]
[[ASN1OctetString]]
[[ASN1UTF8String]]
[[ASN1ObjectIdentifier]]
[[ASN1BitString]]

Qore asn1 Module Documentation