Help
RSS
API
Feed
Maltego
Contact
Domain > blog.808inorganic.com
×
More information on this domain is in
AlienVault OTX
Is this malicious?
Yes
No
DNS Resolutions
Date
IP Address
2015-08-31
74.125.198.121
(
ClassC
)
2024-07-13
142.250.69.211
(
ClassC
)
Port 80
HTTP/1.1 200 OKContent-Type: text/html; charsetUTF-8Expires: Sat, 13 Jul 2024 11:31:13 GMTDate: Sat, 13 Jul 2024 11:31:13 GMTCache-Control: private, max-age0Last-Modified: Wed, 13 Mar 2024 17:38:22 GMTX-Content-Type-Options: nosniffX-XSS-Protection: 1; modeblockServer: GSEAccept-Ranges: noneVary: Accept-EncodingTransfer-Encoding: chunked !DOCTYPE html>html classv2 dirltr xmlnshttp://www.w3.org/1999/xhtml xmlns:bhttp://www.google.com/2005/gml/b xmlns:datahttp://www.google.com/2005/gml/data xmlns:exprhttp://www.google.com/2005/gml/expr>head>link hrefhttps://www.blogger.com/static/v1/widgets/3566091532-css_bundle_v2.css relstylesheet typetext/css/>meta contentIEEmulateIE7 http-equivX-UA-Compatible/>meta contentwidth1100 nameviewport/>meta contenttext/html; charsetUTF-8 http-equivContent-Type/>meta contentblogger namegenerator/>link hrefhttp://blog.808inorganic.com/favicon.ico relicon typeimage/x-icon/>link hrefhttp://blog.808inorganic.com/ relcanonical/>link relalternate typeapplication/atom+xml titlexemdetia - Atom hrefhttp://blog.808inorganic.com/feeds/posts/default />link relalternate typeapplication/rss+xml titlexemdetia - RSS hrefhttp://blog.808inorganic.com/feeds/posts/default?altrss />link relservice.post typeapplication/atom+xml titlexemdetia - Atom hrefhttps://www.blogger.com/feeds/376423286598101560/posts/default />link relme hrefhttps://www.blogger.com/profile/14806502164720090302 />!--Cant find substitution for tag blog.ieCssRetrofitLinks-->meta contenthttp://blog.808inorganic.com/ propertyog:url/>meta contentxemdetia propertyog:title/>meta content propertyog:description/>title>xemdetia/title>link hrefhttp://alexgorbatchev.com/pub/sh/current/styles/shCore.css relstylesheet typetext/css/>link hrefhttp://alexgorbatchev.com/pub/sh/current/styles/shThemeDefault.css relstylesheet typetext/css/>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shCore.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushCpp.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushCSharp.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushCss.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushJava.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushJScript.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushPython.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushRuby.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushSql.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushVb.js typetext/javascript>/script>script srchttp://alexgorbatchev.com/pub/sh/current/scripts/shBrushPerl.js typetext/javascript>/script>script languagejavascript> SyntaxHighlighter.config.bloggerMode true;SyntaxHighlighter.config.clipboardSwf http://alexgorbatchev.com/pub/sh/current/scripts/clipboard.swf;SyntaxHighlighter.all();/script>style idpage-skin-1 typetext/css>!--/*-----------------------------------------------Blogger Template StyleName: Awesome Inc.Designer: Tina ChenURL: tinachen.org----------------------------------------------- *//* Content----------------------------------------------- */body {font: normal normal 13px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;background: #000000 url(http://www.blogblog.com/1kt/awesomeinc/body_background_dark.png) repeat scroll top left;}html body .content-outer {min-width: 0;max-width: 100%;width: 100%;}a:link {text-decoration: none;color: #888888;}a:visited {text-decoration: none;color: #444444;}a:hover {text-decoration: underline;color: #cccccc;}.body-fauxcolumn-outer .cap-top {position: absolute;z-index: 1;height: 276px;width: 100%;background: transparent url(http://www.blogblog.com/1kt/awesomeinc/body_gradient_dark.png) repeat-x scroll top left;_background-image: none;}/* Columns----------------------------------------------- */.content-inner {padding: 0;}.header-inner .section {margin: 0 16px;}.tabs-inner .section {margin: 0 16px;}.main-inner {padding-top: 30px;}.main-inner .column-center-inner,.main-inner .column-left-inner,.main-inner .column-right-inner {padding: 0 5px;}*+html body .main-inner .column-center-inner {margin-top: -30px;}#layout .main-inner .column-center-inner {margin-top: 0;}/* Header----------------------------------------------- */.header-outer {margin: 0 0 0 0;background: transparent none repeat scroll 0 0;}.Header h1 {font: normal bold 40px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;text-shadow: 0 0 -1px #000000;}.Header h1 a {color: #ffffff;}.Header .description {font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;}.header-inner .Header .titlewrapper,.header-inner .Header .descriptionwrapper {padding-left: 0;padding-right: 0;margin-bottom: 0;}.header-inner .Header .titlewrapper {padding-top: 22px;}/* Tabs----------------------------------------------- */.tabs-outer {overflow: hidden;position: relative;background: #141414 none repeat scroll 0 0;}#layout .tabs-outer {overflow: visible;}.tabs-cap-top, .tabs-cap-bottom {position: absolute;width: 100%;border-top: 1px solid #222222;}.tabs-cap-bottom {bottom: 0;}.tabs-inner .widget li a {display: inline-block;margin: 0;padding: .6em 1.5em;font: normal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;border-top: 1px solid #222222;border-bottom: 1px solid #222222;border-left: 1px solid #222222;height: 16px;line-height: 16px;}.tabs-inner .widget li:last-child a {border-right: 1px solid #222222;}.tabs-inner .widget li.selected a, .tabs-inner .widget li a:hover {background: #444444 none repeat-x scroll 0 -100px;color: #ffffff;}/* Headings----------------------------------------------- */h2 {font: normal bold 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;}/* Widgets----------------------------------------------- */.main-inner .section {margin: 0 27px;padding: 0;}.main-inner .column-left-outer,.main-inner .column-right-outer {margin-top: 0;}#layout .main-inner .column-left-outer,#layout .main-inner .column-right-outer {margin-top: 0;}.main-inner .column-left-inner,.main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 0;-webkit-border-radius: 0;-goog-ms-border-radius: 0;border-radius: 0;}#layout .main-inner .column-left-inner,#layout .main-inner .column-right-inner {margin-top: 0;}.sidebar .widget {font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;}.sidebar .widget a:link {color: #888888;}.sidebar .widget a:visited {color: #444444;}.sidebar .widget a:hover {color: #cccccc;}.sidebar .widget h2 {text-shadow: 0 0 -1px #000000;}.main-inner .widget {background-color: #141414;border: 1px solid #222222;padding: 0 15px 15px;margin: 20px -16px;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 0;-webkit-border-radius: 0;-goog-ms-border-radius: 0;border-radius: 0;}.main-inner .widget h2 {margin: 0 -15px;padding: .6em 15px .5em;border-bottom: 1px solid #000000;}.footer-inner .widget h2 {padding: 0 0 .4em;border-bottom: 1px solid #000000;}.main-inner .widget h2 + div, .footer-inner .widget h2 + div {border-top: 1px solid #222222;padding-top: 8px;}.main-inner .widget .widget-content {margin: 0 -15px;padding: 7px 15px 0;}.main-inner .widget ul, .main-inner .widget #ArchiveList ul.flat {margin: -8px -15px 0;padding: 0;list-style: none;}.main-inner .widget #ArchiveList {margin: -8px 0 0;}.main-inner .widget ul li, .main-inner .widget #ArchiveList ul.flat li {padding: .5em 15px;text-indent: 0;color: #666666;border-top: 1px solid #222222;border-bottom: 1px solid #000000;}.main-inner .widget #ArchiveList ul li {padding-top: .25em;padding-bottom: .25em;}.main-inner .widget ul li:first-child, .main-inner .widget #ArchiveList ul.flat li:first-child {border-top: none;}.main-inner .widget ul li:last-child, .main-inner .widget #ArchiveList ul.flat li:last-child {border-bottom: none;}.post-body {position: relative;}.main-inner .widget .post-body ul {padding: 0 2.5em;margin: .5em 0;list-style: disc;}.main-inner .widget .post-body ul li {padding: 0.25em 0;margin-bottom: .25em;color: #ffffff;border: none;}.footer-inner .widget ul {padding: 0;list-style: none;}.widget .zippy {color: #666666;}/* Posts----------------------------------------------- */body .main-inner .Blog {padding: 0;margin-bottom: 1em;background-color: transparent;border: none;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, 0);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, 0);box-shadow: 0 0 0 rgba(0, 0, 0, 0);}.main-inner .section:last-child .Blog:last-child {padding: 0;margin-bottom: 1em;}.main-inner .widget h2.date-header {margin: 0 -15px 1px;padding: 0 0 0 0;font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #666666;background: transparent none no-repeat scroll top left;border-top: 0 solid #222222;border-bottom: 1px solid #000000;-moz-border-radius-topleft: 0;-moz-border-radius-topright: 0;-webkit-border-top-left-radius: 0;-webkit-border-top-right-radius: 0;border-top-left-radius: 0;border-top-right-radius: 0;position: static;bottom: 100%;right: 15px;text-shadow: 0 0 -1px #000000;}.main-inner .widget h2.date-header span {font: normal normal 14px Arial, Tahoma, Helvetica, FreeSans, sans-serif;display: block;padding: .5em 15px;border-left: 0 solid #222222;border-right: 0 solid #222222;}.date-outer {position: relative;margin: 30px 0 20px;padding: 0 15px;background-color: #141414;border: 1px solid #222222;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 0;-webkit-border-radius: 0;-goog-ms-border-radius: 0;border-radius: 0;}.date-outer:first-child {margin-top: 0;}.date-outer:last-child {margin-bottom: 20px;-moz-border-radius-bottomleft: 0;-moz-border-radius-bottomright: 0;-webkit-border-bottom-left-radius: 0;-webkit-border-bottom-right-radius: 0;-goog-ms-border-bottom-left-radius: 0;-goog-ms-border-bottom-right-radius: 0;border-bottom-left-radius: 0;border-bottom-right-radius: 0;}.date-posts {margin: 0 -15px;padding: 0 15px;clear: both;}.post-outer, .inline-ad {border-top: 1px solid #222222;margin: 0 -15px;padding: 15px 15px;}.post-outer {padding-bottom: 10px;}.post-outer:first-child {padding-top: 0;border-top: none;}.post-outer:last-child, .inline-ad:last-child {border-bottom: none;}.post-body {position: relative;}.post-body img {padding: 8px;background: #222222;border: 1px solid transparent;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 0;-webkit-border-radius: 0;border-radius: 0;}h3.post-title, h4 {font: normal bold 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;}h3.post-title a {font: normal bold 22px Arial, Tahoma, Helvetica, FreeSans, sans-serif;color: #ffffff;}h3.post-title a:hover {color: #cccccc;text-decoration: underline;}.post-header {margin: 0 0 1em;}.post-body {line-height: 1.4;}.post-outer h2 {color: #ffffff;}.post-footer {margin: 1.5em 0 0;}#blog-pager {padding: 15px;font-size: 120%;background-color: #141414;border: 1px solid #222222;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);-moz-border-radius: 0;-webkit-border-radius: 0;-goog-ms-border-radius: 0;border-radius: 0;-moz-border-radius-topleft: 0;-moz-border-radius-topright: 0;-webkit-border-top-left-radius: 0;-webkit-border-top-right-radius: 0;-goog-ms-border-top-left-radius: 0;-goog-ms-border-top-right-radius: 0;border-top-left-radius: 0;border-top-right-radius-topright: 0;margin-top: 1em;}.blog-feeds, .post-feeds {margin: 1em 0;text-align: center;color: #ffffff;}.blog-feeds a, .post-feeds a {color: #888888;}.blog-feeds a:visited, .post-feeds a:visited {color: #444444;}.blog-feeds a:hover, .post-feeds a:hover {color: #cccccc;}.post-outer .comments {margin-top: 2em;}/* Comments----------------------------------------------- */.comments .comments-content .icon.blog-author {background-repeat: no-repeat;background-image: url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABIAAAASCAYAAABWzo5XAAAAAXNSR0IArs4c6QAAAAZiS0dEAP8A/wD/oL2nkwAAAAlwSFlzAAALEgAACxIB0t1+/AAAAAd0SU1FB9sLFwMeCjjhcOMAAAD+SURBVDjLtZSvTgNBEIe/WRRnm3U8RC1neQdsm1zSBIU9VVF1FkUguQQsD9ITmD7ECZIJSE4OZo9stoVjC/zc7ky+zH9hXwVwDpTAWWLrgS3QAe8AZgaAJI5zYAmc8r0G4AHYHQKVwII8PZrZFsBFkeRCABYiMh9BRUhnSkPTNCtVXYXURi1FpBDgArj8QU1eVXUzfnjv7yP7kwu1mYrkWlU33vs1QNu2qU8pwN0UpKoqokjWwCztrMuBhEhmh8bD5UDqur75asbcX0BGUB9/HAMB+r32hznJgXy2v0sGLBcyAJ1EK3LFcbo1s91JeLwAbwGYu7TP/3ZGfnXYPgAVNngtqatUNgAAAABJRU5ErkJggg);}.comments .comments-content .loadmore a {border-top: 1px solid #222222;border-bottom: 1px solid #222222;}.comments .continue {border-top: 2px solid #222222;}/* Footer----------------------------------------------- */.footer-outer {margin: -0 0 -1px;padding: 0 0 0;color: #ffffff;overflow: hidden;}.footer-fauxborder-left {border-top: 1px solid #222222;background: #141414 none repeat scroll 0 0;-moz-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-webkit-box-shadow: 0 0 0 rgba(0, 0, 0, .2);-goog-ms-box-shadow: 0 0 0 rgba(0, 0, 0, .2);box-shadow: 0 0 0 rgba(0, 0, 0, .2);margin: 0 -0;}/* Mobile----------------------------------------------- */body.mobile {background-size: auto;}.mobile .body-fauxcolumn-outer {background: transparent none repeat scroll top left;}*+html body.mobile .main-inner .column-center-inner {margin-top: 0;}.mobile .main-inner .widget {padding: 0 0 15px;}.mobile .main-inner .widget h2 + div,.mobile .footer-inner .widget h2 + div {border-top: none;padding-top: 0;}.mobile .footer-inner .widget h2 {padding: 0.5em 0;border-bottom: none;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile .main-inner .widget ul,.mobile .main-inner .widget #ArchiveList ul.flat {margin: 0 -15px 0;}.mobile .main-inner .widget h2.date-header {right: 0;}.mobile .date-header span {padding: 0.4em 0;}.mobile .date-outer:first-child {margin-bottom: 0;border: 1px solid #222222;-moz-border-radius-topleft: 0;-moz-border-radius-topright: 0;-webkit-border-top-left-radius: 0;-webkit-border-top-right-radius: 0;-goog-ms-border-top-left-radius: 0;-goog-ms-border-top-right-radius: 0;border-top-left-radius: 0;border-top-right-radius: 0;}.mobile .date-outer {border-color: #222222;border-width: 0 1px 1px;}.mobile .date-outer:last-child {margin-bottom: 0;}.mobile .main-inner {padding: 0;}.mobile .header-inner .section {margin: 0;}.mobile .post-outer, .mobile .inline-ad {padding: 5px 0;}.mobile .tabs-inner .section {margin: 0 10px;}.mobile .main-inner .widget h2 {margin: 0;padding: 0;}.mobile .main-inner .widget h2.date-header span {padding: 0;}.mobile .main-inner .widget .widget-content {margin: 0;padding: 7px 0 0;}.mobile #blog-pager {border: 1px solid transparent;background: #141414 none repeat scroll 0 0;}.mobile .main-inner .column-left-inner,.mobile .main-inner .column-right-inner {background: transparent none repeat 0 0;-moz-box-shadow: none;-webkit-box-shadow: none;-goog-ms-box-shadow: none;box-shadow: none;}.mobile .date-posts {margin: 0;padding: 0;}.mobile .footer-fauxborder-left {margin: 0;border-top: inherit;}.mobile .main-inner .section:last-child .Blog:last-child {margin-bottom: 0;}.mobile-index-contents {color: #ffffff;}.mobile .mobile-link-button {background: #888888 none repeat scroll 0 0;}.mobile-link-button a:link, .mobile-link-button a:visited {color: #ffffff;}.mobile .tabs-inner .PageList .widget-content {background: transparent;border-top: 1px solid;border-color: #222222;color: #ffffff;}.mobile .tabs-inner .PageList .widget-content .pagelist-arrow {border-left: 1px solid #222222;}-->/style>style idtemplate-skin-1 typetext/css>!--body {min-width: 960px;}.content-outer, .content-fauxcolumn-outer, .region-inner {min-width: 960px;max-width: 960px;_width: 960px;}.main-inner .columns {padding-left: 0px;padding-right: 310px;}.main-inner .fauxcolumn-center-outer {left: 0px;right: 310px;/* IE6 does not respect left and right together */_width: expression(this.parentNode.offsetWidth -parseInt(0px) -parseInt(310px) + px);}.main-inner .fauxcolumn-left-outer {width: 0px;}.main-inner .fauxcolumn-right-outer {width: 310px;}.main-inner .column-left-outer {width: 0px;right: 100%;margin-left: -0px;}.main-inner .column-right-outer {width: 310px;margin-right: -310px;}#layout {min-width: 0;}#layout .content-outer {min-width: 0;width: 800px;}#layout .region-inner {min-width: 0;width: auto;}-->/style>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID376423286598101560&zx1f959a32-c244-4258-af83-2ddd4a544847 medianone onloadif(media!'all')media'all' relstylesheet/>noscript>link hrefhttps://www.blogger.com/dyn-css/authorization.css?targetBlogID376423286598101560&zx1f959a32-c244-4258-af83-2ddd4a544847 relstylesheet/>/noscript>meta namegoogle-adsense-platform-account contentca-host-pub-1556223355139109/>meta namegoogle-adsense-platform-domain contentblogspot.com/>/head>body classloading variant-dark>div classnavbar section idnavbar>div classwidget Navbar data-version1 idNavbar1>script typetext/javascript> function setAttributeOnload(object, attribute, val) { if(window.addEventListener) { window.addEventListener(load, function(){ objectattribute val; }, false); } else { window.attachEvent(onload, function(){ objectattribute val; }); } } /script>div idnavbar-iframe-container>/div>script typetext/javascript srchttps://apis.google.com/js/platform.js>/script>script typetext/javascript> gapi.load(gapi.iframes:gapi.iframes.style.bubble, function() { if (gapi.iframes && gapi.iframes.getContext) { gapi.iframes.getContext().openChild({ url: https://www.blogger.com/navbar.g?targetBlogID\x3d376423286598101560\x26blogName\x3dxemdetia\x26publishMode\x3dPUBLISH_MODE_HOSTED\x26navbarType\x3dLIGHT\x26layoutType\x3dLAYOUTS\x26searchRoot\x3dhttp://blog.808inorganic.com/search\x26blogLocale\x3den\x26v\x3d2\x26homepageUrl\x3dhttp://blog.808inorganic.com/\x26vt\x3d8204869309770415009, where: document.getElementById(navbar-iframe-container), id: navbar-iframe }); } }); /script>script typetext/javascript>(function() {var script document.createElement(script);script.type text/javascript;script.src //pagead2.googlesyndication.com/pagead/js/google_top_exp.js;var head document.getElementsByTagName(head)0;if (head) {head.appendChild(script);}})();/script>/div>/div>div itemscopeitemscope itemtypehttp://schema.org/Blog styledisplay: none;>meta contentxemdetia itempropname/>/div>div classbody-fauxcolumns>div classfauxcolumn-outer body-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent>div classcontent-fauxcolumns>div classfauxcolumn-outer content-fauxcolumn-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>div classcontent-outer>div classcontent-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left content-fauxborder-left>div classfauxborder-right content-fauxborder-right>/div>div classcontent-inner>header>div classheader-outer>div classheader-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left header-fauxborder-left>div classfauxborder-right header-fauxborder-right>/div>div classregion-inner header-inner>div classheader section idheader>div classwidget Header data-version1 idHeader1>div idheader-inner>div classtitlewrapper>h1 classtitle>xemdetia/h1>/div>div classdescriptionwrapper>p classdescription>span>/span>/p>/div>/div>/div>/div>/div>/div>div classheader-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/header>div classtabs-outer>div classtabs-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left tabs-fauxborder-left>div classfauxborder-right tabs-fauxborder-right>/div>div classregion-inner tabs-inner>div classtabs no-items section idcrosscol>/div>div classtabs no-items section idcrosscol-overflow>/div>/div>/div>div classtabs-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classmain-outer>div classmain-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left main-fauxborder-left>div classfauxborder-right main-fauxborder-right>/div>div classregion-inner main-inner>div classcolumns fauxcolumns>div classfauxcolumn-outer fauxcolumn-center-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-left-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>div classfauxcolumn-outer fauxcolumn-right-outer>div classcap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left>div classfauxborder-right>/div>div classfauxcolumn-inner>/div>/div>div classcap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>!-- corrects IE6 width calculation -->div classcolumns-inner>div classcolumn-center-outer>div classcolumn-center-inner>div classmain section idmain>div classwidget Blog data-version1 idBlog1>div classblog-posts hfeed> div classdate-outer> h2 classdate-header>span>Friday, March 10, 2017/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name5136011463054693879>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2017/03/check-certificate-key-identifier.html>Check a Certificate Key Identifier/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-5136011463054693879 itemproparticleBody>On certificates as part of the signing process you submit a CSR (certificate signing request) to a CA (certificate authority) to be signed, but because of certificate expiration being a core concept in PKI those CAs will too expire. Or in the case of the a hrefhttps://security.googleblog.com/2014/09/gradually-sunsetting-sha-1.html>SHA-1 deprecation/a> you might be in a situation where you have a private key with a refreshed certificate associated with it, or in the case of a secure token or smart card you may have a single key but multiple certificates associated with it. This leads to the concept of Key Identifiers, which are encoded in certificates:br />br />Heres an example of what a certificate would look like:br />pre>echo Q | openssl s_client -connect google.com:443 2>1 | openssl x509 -text -noout | grep -A1 Key Identifier X509v3 Subject Key Identifier: EB:27:08:F6:93:E5:92:F2:DE:06:FD:1F:9A:89:9F:F6:E4:97:51:30-- X509v3 Authority Key Identifier: keyid:4A:DD:06:16:1B:BC:F6:68:B5:76:F5:81:B6:BB:62:1A:BA:5A:81:2F/pre>Breaking down this command:br />ol>li>code>echo Q/code> - send the Q command to close down the connection as described in a hrefhttps://www.openssl.org/docs/man1.0.1/apps/s_client.html#CONNECTED-COMMANDS>code>man s_client/code>/a>./li>li>code>openssl s_client -connect google.com:443 2>1/code> - connect to host and port combination google.com via port 443, additionally pipe stderr to stdout so it gets filtered out of the final output./li>li>code>openssl x509 -text -noout/code> - The code>openssl s_client/code> command emits the certificate information to stdout, and we can use a pipe to forward that to code>openssl x509/code> to read from stdin. We then ask to interpret the certificate and then provide the decoded output with code>-text/code> and not emit the actual certificate again with code>-noout/code>./li>li>code>grep -A1 Key Identifier/code> - just grab the x509v3 section and the line after which is where the value is displayed./li>/ol>br />In a hrefhttps://tools.ietf.org/html/rfc5280#section-4.2.1.1>RFC 5280 § 4.2.1.1/a> it is indicated that this provides a signature of the private key used to sign the certificate. And in a hrefhttps://tools.ietf.org/html/rfc5280#section-4.2.1.2>RFC 5280 § 4.2.1.2/a> it describes the strategy on how theses keys could be generated. The caveat here is that like the last section mentions you can do anything you want here to generate that value.br />br />To then check what the signature of a key would be if you only have the private key and you are working with certificates signed by openssl, the fastest way is to self sign a certificate. You can do that as follows:br />pre>openssl req -new -x509 -key CA.key -sha256 -subj /CNtest| openssl x509 -text -noout | grep -A2 Key Identifier X509v3 Subject Key Identifier: B3:1B:00:4C:10:55:73:D9:91:66:36:1C:4B:4F:07:98:74:68:DE:09 X509v3 Authority Key Identifier: keyid:B3:1B:00:4C:10:55:73:D9:91:66:36:1C:4B:4F:07:98:74:68:DE:09/pre>By using this you now can do a direct comparison, and then look at an code>openssl x509/code> output to investigate who signed this certificate based on what you now know.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2017/03/check-certificate-key-identifier.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2017-03-10T10:12:00-08:00>10:12 AM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2017/03/check-certificate-key-identifier.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID5136011463054693879&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5136011463054693879&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5136011463054693879&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5136011463054693879&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5136011463054693879&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5136011463054693879&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>Monday, January 30, 2017/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name3297348199050077716>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2017/01/openssl-parameterized-configuration.html>OpenSSL Parameterized Configuration/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-3297348199050077716 itemproparticleBody>This is a common question that comes up in code>##openssl/code> with regards to handling code>openssl req/code>, and here is a strategy to make values in the configuration parameters:br/>pre>openssl genrsa -out ca.key 2048config_filesome_filecnexample.comecho req prompt nodistinguished_name req_distinguished_namex509_extensions v3_ca req_distinguished_name C ABST CDL EFO GOU HICN $cn v3_ca subjectKeyIdentifier hashauthorityKeyIdentifier keyid:always,issuer:alwaysbasicConstraints CA:true > $config_fileopenssl req -new -x509 -days 3650 -key ca.key -out ca.crt -config $config_file/pre>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2017/01/openssl-parameterized-configuration.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2017-01-30T09:21:00-08:00>9:21 AM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2017/01/openssl-parameterized-configuration.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID3297348199050077716&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3297348199050077716&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3297348199050077716&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3297348199050077716&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3297348199050077716&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3297348199050077716&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div>div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name8227497956524903067>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2017/01/matching-ca-with-different-signature-algorithm.html>How to generate a matching CA with a different signing algorithm/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-8227497956524903067 itemproparticleBody>This is a bit past its time ever since Google decided to deprecate SHA-1, but there is still a possibility for a site to need a CA with a different signing algorithm to resolve compatibility with some cryptography in an environment. This in general is not something that should be taken as a recommendation, it is something that needs to be determined is an unfortunate circumstance to support some piece of software or hardware in environment.br/>br/>The first thing to remember is that a certificate can be simplified to code>(certificate_info, public_key, signature)/code>. The first step of verification is to look through the CA data to match strings of issuer and subject, and then start doing the cryptographic validation. This lookup is the piece you are trying to take advantage of to have differing CAs. This can be seen as part of the following steps:br/>br/>pre>openssl genrsa -out CA.key 2048openssl req -new -x509 -key CA.key -out CA.sha256.crt -sha256 -subj /CAB/STCD/LEF/OG/OUHI/CNJKopenssl req -new -x509 -key CA.key -out CA.sha512.crt -sha512 -subj /CAB/STCD/LEF/OG/OUHI/CNJKopenssl req -new -x509 -key CA.key -out CA.sha512b.crt -sha512 -subj /CED/STRFR/LGHH/OURU/OUDS/CNOL/pre>br/>These code>openssl req/code> can be done how a CA is normally signed or some other CA signing infrastructure. The particular invocation above was only done for illustration. In the end we have certificates that look like this:pre>$ find -name CA.*.crt -print -exec openssl x509 -in {} -subject -noout \;./CA.sha256.crtsubject /CAB/STCD/LEF/OG/OUHI/CNJK./CA.sha512.crtsubject /CAB/STCD/LEF/OG/OUHI/CNJK./CA.sha512b.crtsubject /CED/STRFR/LGHH/OURU/OUDS/CNOL/pre>Then lets sign a new host key with just one certificate from the CA, but using the unique private key for the CA.pre>openssl genrsa -out host.keyopenssl req -new -key host.key -out host.csropenssl x509 -req -days 3650 -in host.csr -out host.crt -CAkey CA.key -CA CA.sha256.crt -sha256 -set_serial 2/pre>This is how a normal signing works, and now lets see how it verifies:pre>$ find -name CA.*.crt -print -exec openssl verify -CAfile {} host.crt \;./CA.sha256.crthost.crt: OK./CA.sha512.crthost.crt: OK./CA.sha512b.crthost.crt: C QA, ST WSD, L ED, O RGFG, OU YHJ, CN UJerror 20 at 0 depth lookup:unable to get local issuer certificate/pre>As you can see from the steps above we are using the same private key material in code>CA.key/code> with several certificates, but at the moment of verification we are only using one of the CA certificates to verify the signature of the host certificate. In practice you should be making sure only one is available in an environment as the verification process will generally take the first match- even if it cant process it. There have been instances in the past where a MD5 based certificate and a SHA-1 certificate were in a CA trust store but because of natural ordering the MD5 certificate was selected first and was rejected on policy grounds since MD5 is deprecated.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2017/01/matching-ca-with-different-signature-algorithm.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2017-01-30T09:14:00-08:00>9:14 AM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2017/01/matching-ca-with-different-signature-algorithm.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID8227497956524903067&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8227497956524903067&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8227497956524903067&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8227497956524903067&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8227497956524903067&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8227497956524903067&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>Wednesday, January 25, 2017/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name3750258502690333940>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2017/01/using-openssl-sserver-and-openssl.html>Using openssl s_server and openssl s_client to test client certificates/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-3750258502690333940 itemproparticleBody>In openssls man pages understanding how to invoke code>openssl s_server/code> to experiment with client certificates can be challenging as there is not enough examples on that man page compared to others. A good understanding of how to setup a CAfile that validates with code>openssl s_client/code> is helpful here, with the general logic being PEM-format certificates joined in a single file. On Unix this is easy with code>cat rootCA.crt intermediateCA.crt > caFile.crt/code>, and we will be using this code>caFile.crt/code> throughout this example. It is expected that this file has enough information to validate both the client and the server.br/>br/>This is easiest to do with two separate terminals with one terminal running the following command:br/>code>openssl s_server -accept 10000 -cert server.crt -key server.key -verify 10 -CAfile caFile.crt/code>br/>br/>And the other terminal running this command:br/>code>openssl s_client -connect localhost:10000 -cert client.crt -key client.key -CAfile caFile.crt/code>br/>br/>For both commands we are using certificates, and so we need the certificate piece with code>-cert/code> and the key piece with code>-key/code>. We had already described that we needed a file containing the CA information to verify certificates (code>caFile.crt/code>) and this is a required piece for verification on the server side, and on the client side since code>s_client/code> proceeds whether or not the certificate validates.br/>br/>code>-accept/code> indicates what port to listen on, which is reflected in the code>-connect/code> parameter to code>s_client/code> but is otherwise uninteresting.br/>br/>The last and most critical piece is code>-verify/code> which comes in two versions of code>-verify/code> and code>-Verify/code>. Without this parameter code>s_server/code> does not request a certificate. With code>-verify/code> it requests a certificate but proceeds if one is not sent (something that I describe as want), and with code>-Verify/code> it requests a certificate and does not proceed if one is not sent (something that I describe as need). The parameters value is just the depth of the certificate chain, and this is knowledge you would know from working with the CA where you are generating the certificates. If you arent worrying about verification chain depth for this testing just pick a big number.br/>br/>After you have a mutual connection or otherwise, you can type into code>s_client/code> or code>s_server/code> and then hit return to send a command as if you had connected with netcat or telnet to a non-TLS port. This is something you can use for other situations, such as sending code>GET //code> then hitting return twice to send a HTTP code>GET/code> request to a remote server.div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2017/01/using-openssl-sserver-and-openssl.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2017-01-25T09:46:00-08:00>9:46 AM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2017/01/using-openssl-sserver-and-openssl.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID3750258502690333940&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3750258502690333940&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3750258502690333940&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3750258502690333940&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3750258502690333940&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID3750258502690333940&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>Thursday, December 15, 2016/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name1164613820840967995>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2016/12/conversion-to-microsoft-compatible-p12.html>Conversion to Microsoft Compatible .p12 from a PEM certificate and key/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-1164613820840967995 itemproparticleBody>The openssl shell commands work great on PEM certificates, but both Java (via code>keytool/code>) and Windows (via code>certmgr.msc/code>) work better with PKCS#12 certificates. This is the command you have to construct to join the entire keypair, which isnt obvious in the EXAMPLES section in openssls code>man pkcs12/code>:br />br />code>openssl pkcs12 -export -out user.p12 -in user.crt -inkey user.key/code>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2016/12/conversion-to-microsoft-compatible-p12.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2016-12-15T09:15:00-08:00>9:15 AM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2016/12/conversion-to-microsoft-compatible-p12.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID1164613820840967995&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID1164613820840967995&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID1164613820840967995&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID1164613820840967995&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID1164613820840967995&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID1164613820840967995&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>Wednesday, August 26, 2015/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name8314666704835991197>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2015/08/self-signed-ca.html>Straightforward Generation of Self-Signed CA for Testing/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-8314666704835991197 itemproparticleBody>A common and straightforward question on code>##openssl/code> is that someone needs to invent some certificates for testing. For a single host a self-signed certificate is acceptable, which can quickly be made in two steps:br />br />code>openssl genrsa -out selfsign.key 2048/code>br />code>openssl req -new -x509 -key selfsign.key -out selfsign.crt -sha256/code>br />code># ... then follow the interactive prompts /code>br />code> /code>br />When you are doing things like TLS Client Authentication or generally need a certificate that will verify the fastest way is to invent your own CA (certificate authority):br />br />This takes five steps (and filling out the interactive prompts after each req):br />br />code>openssl genrsa -out ca.key 2048/code>br />code>openssl req -new -x509 -key ca.key -days 3650 -out ca.crt -sha256/code>br />br />code>openssl genrsa -out host.key 2048/code>br />code>openssl req -new -key host.key -sha256 -out host.csr/code>br />br />code>openssl x509 -req -days 3650 -in host.csr -out host.crt -CAkey ca.key -CA ca.crt -sha256 -set_serial 2 /code>br />code> /code>br />The first two generate the self-signed certificate that will be the CA. A root CA by definition is self-signed, you just choose as a user that this particular certificate is a trusted root CA.br />br />The second two generate a CSR (certificate signing request) that we want the CA to sign.br />br />The last step takes the CSR and signs it with the root CA, which sets the issuer attribute in the certificate to reflect the CA.br />br />To sign more certificates, change the code>-set_serial/code> to be the next number, and change from code>host.key/code>, code>host.csr/code> and code>host.crt/code> to the new files.br />br />To inspect any certificate use:code>openssl x509 -in certificate-file.crt -text -noout/code>if it is in PEM format, which is the default for the above commands. i>b>Certificate file extensions are for people, not for the cryptographic libraries./b>/i> You may name these files whatever you want, but it is up to you to understand the application and usage to make sure they are in the proper format. If they are not in the right format seek out how to convert them to the correct format.br />br />After you understand this a little better you will want to revise how each certificate is generated and probably introduce an intermediate CA for signing. This will allow you to set the root CA to have a much longer lifespan but still be able to manage. A great way to see what options you might want to set is to look in the wild with code>openssl s_client -connect google.com:443 | openssl x509 -text -noout/code> and research attributes you think are important.br />br />Notes: br />ul>li>-sha256 is added because of the a hrefhttp://googleonlinesecurity.blogspot.com/2014/09/gradually-sunsetting-sha-1.html>Google/a> (among other companies and groups) pushing to sunset sha1 signed certificates./li>li>These commands work as-is on openssl 0.9.8, 1.0.0 and 1.0.1/li>li>##openssl on irc.freenode.net /li>/ul>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2015/08/self-signed-ca.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2015-08-26T16:12:00-07:00>4:12 PM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2015/08/self-signed-ca.html#comment-form onclick>No comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID8314666704835991197&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8314666704835991197&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8314666704835991197&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8314666704835991197&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8314666704835991197&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID8314666704835991197&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/%23postgres reltag>#postgres/a>,a hrefhttp://blog.808inorganic.com/search/label/openssl reltag>openssl/a>,a hrefhttp://blog.808inorganic.com/search/label/postgres reltag>postgres/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> div classdate-outer> h2 classdate-header>span>Monday, July 2, 2012/span>/h2> div classdate-posts> div classpost-outer>div classpost hentry itemscopeitemscope itemtypehttp://schema.org/BlogPosting>a name5884393599763753435>/a>h3 classpost-title entry-title itempropname>a hrefhttp://blog.808inorganic.com/2012/07/bad-coders-doing-bad-things-1-of-2.html>Bad Coders Doing Bad Things, 1 of 2/a>/h3>div classpost-header>div classpost-header-line-1>/div>/div>div classpost-body entry-content idpost-body-5884393599763753435 itemproparticleBody>script typetext/javascript>!--/*-->!CDATA/*>!--*/ function CodeHighlightOn(elem, id) { var target document.getElementById(id); if(null ! target) { elem.cacheClassElem elem.className; elem.cacheClassTarget target.className; target.className code-highlighted; elem.className code-highlighted; } } function CodeHighlightOff(elem, id) { var target document.getElementById(id); if(elem.cacheClassElem) elem.className elem.cacheClassElem; if(elem.cacheClassTarget) target.className elem.cacheClassTarget; }/*>*///-->/script>style>pre { font-size:11pt; }/style>div idcontent>p>This particular post will focus on the namespace technique that Imade mention of in a a hrefhttp://blog.808inorganic.com/2012/06/how-do-i-get-c-namespaces-how-do-i-get.html>prior post/a> I received a lot of negativefeedback in both the comments on that post and a hrefhttp://www.reddit.com/r/programming/comments/vtdv6/regarding_c_misconceptions/>on reddit/a>. There is aseparate post that I would like to go into on its own merits, and Iwill focus on that on the next post in this pair. If any newconcerns are raised I will have to respond to them in futureposts. Now after re-reading the post and the influx of comments Ivereceived I feel it would be reasonable for me to sit down andexpress in more detail why this solves a problem for me along withsome more detailed examples and some new analysis of the costs ofwhat Ive been doing/done./p>p>b>afterthoughts/b>/p>p>I highly recommend skipping to the a href#Conclusions>Conclusions/a> section at theend. If the results interest you then feel free to examine myreasoning and how I got there. I write these posts as a learningexperience so what I know at the beginning may be different thanwhat I know at the end so if you only care about the answer skipahead./p>div idtable-of-contents>h2>Table of Contents/h2>div idtext-table-of-contents>ul>li>a href#sec-1>1 Environments /a>/li>li>a href#sec-2>2 Preconceptions and Reasoning /a>ul>li>a href#sec-2.1>2.1 English Parser /a>/li>/ul>/li>li>a href#sec-3>3 New Information /a>/li>li>a href#sec-4>4 Experimentation /a>/li>li>a href#sec-5>5 Conclusions /a>/li>li>a href#sec-6>6 Future Work /a>/li>/ul>/div>/div>div idoutline-container-1 classoutline-2>h2 idsec-1>span classsection-number-2>1/span> Environments /h2>div classoutline-text-2 idtext-1>p>There are a lot of code samples and assembly samples that I am goingto be providing in this post. If I mention code>cl/code> I am referringspecifically to Microsofts compiler version 15.00.30729.01 forx64 with code>setenv /Vista /x64 /Release/code> set. I use the Microsoft SDKand not Visual Studio out of personal preference as it lets me usemy ASUS Eee 1005HA as a coding workstation when I am killing a bitof time or wanting to test out a new idea. Visual Studio worksfairly well on it but Ive started to become accustomed to usinga hrefhttp://orgmode.org/>org-mode/a> with Emacs to write in a literate-esque coding style byembedding and discussing the merits of snippets (to myself) forfuture reference and just because it helps me learn better./p>p>The other compiler I am using is code>gcc/code> of version 4.4.5 with thetarget of x86sub>64/sub>-linux-gnu. Depending on how much information Iget back from these two compilers I might explore clang, but I runDebian stable on my laptop so I would have to compile it fromscratch to make sure I gave it a fair analysis. I also would like tospend some time exploring other platforms and the costs I amincurring with my namespace technique. Some future work might beanalyzing the AVR C compiler and maybe some ARM output, but I donthave a good test environment for either of those outputs. /p>/div>/div>div idoutline-container-2 classoutline-2>h2 idsec-2>span classsection-number-2>2/span> Preconceptions and Reasoning /h2>div classoutline-text-2 idtext-2>p>The fundamental question I feel that wasnt explained was why Ieven conceived of such a wacky technique in the first place. Awhile ago I was considering how to make C a more interactive codingenvironment like you would find in a lot of other languages likeHaskell, Lisp, Scheme and Python. By interactive I am referringto the idea presented fairly well a hrefhttp://en.wikipedia.org/wiki/Interactive_programming>on Wikipedia/a>, but my most directexperience with the idea was spawned by a hrefhttp://www.amazon.com/Writing-Interactive-Compilers-Interpreters-Computing/dp/0471100722>Writing Interactve Compilers and Interpreters by P. J. Brown/a>. I admit Iinherited(stole) this book from my father but it is published at avery interesting time in programming (1979). SmallTalk (1972) and C(1979) had only been out for a few years. GNU (1983) hadnt evenstarted yet and it was still kind of a wild time. All of these werebefore my time so its very interesting to look back inretrospective and realize that some things I grew up with justb>didnt exist/b>. Another interesting fact is that this particularbook is very much out of print and it is just a fascinatingrealization that there are probably hundreds of books like thisthat didnt carry on. Computer Science as a field has progressed tothe point that we have separated classics like Knuths works andK&R from pieces of the day like the book I just referenced. Justbecause a book is out of print doesnt mean there isnt informationcontained within the text that doesnt exist anywhere else./p>p>Anyway, back to the point at hand- I was trying to conceive of aproper interactive programming environment in C with the same kindof workflow I had with Haskell or Python. Id write a bit of codethen C-c C-l and hop over to a REPL that just had loaded the codeto try it out. I never progressed particularly far on this projectbecause I got distracted by other things going on and never gotback to it but some of the techniques I explored to accomplish theproject stayed with me. The first problem I had was how to create amapping between function name to function which is a reasonableproblem. In C though there really isnt a good way to abstract awayfrom function lists so in my tests I started building some ratherstatic function lists like:/p>pre classexample>/* Assume foo, bar and foobar are functions defined elsewhere with matching function signatures. The functions arent really important for this demonstration. */struct fp_map { void (*foo) (void); int (*bar) (int, int); char* (*foobar) (void); };static struct fp_map FP { &foo, &bar, &foobar };/pre>p>The idea here is now that I had a set of function pointers, so Icould write a test program that mapped to the function pointers ina fashion like the following code:/p>pre classexample>int main( int argc, char **argv ){ FP.foo(); printf( bar() called with result %d\n, FP.bar( 1, 2 ) ); printf( %s\n, FP.foobar() ); return 0;}/pre>p>So this allowed me to do some dynamic swapping of functions. Letslist the output of the existing code first:/p>pre classexample>foo() called.bar() called with result 3foobar() called./pre>p>Lets then define a new code snippet that replaces the call tofoobar():/p>pre classexample>char* new_foobar ( void ){ return new_foobar() called.\n;}/pre>p>Then we change our code>main()/code> to swap in code>new_foobar()/code>:/p>pre classexample>int main( int argc, char **argv ){ FP.foobar &new_foobar; FP.foo(); printf( bar() called with result %d\n, FP.bar( 1, 2 ) ); printf( %s\n, FP.foobar() ); return 0;} /pre>p>After running the program our output is as expected:/p>pre classexample>foo() called.bar() called with result 3new_foobar() called./pre>p>So now I had a technique to hotswap in functions. The next stepwould be to flesh out the fully interactive programming environmentand do some magic with a hrefhttp://en.wikipedia.org/wiki/Position-independent_code>Position-Independent Code/a>(PIC) toessentially make a a hrefhttp://en.wikipedia.org/wiki/Just-in-time_compilation>Just-in-Time Compiler/a>(JIT) and hotload infunctions. I never fully explored this concept because I needed tolearn a lot more things that would allowed me to pull this off in areasonable way (mostly just finding a JIT, or stealing LLVMscodebase to allow me to pull this off). I also needed to learnelisp a bit better because half of the project was UI. So all inall an interesting idea, but I just needed to learn a lot morebefore I dived in headfirst./p>p>So what did I take away from this? I found that it was actuallypretty handy to have the functionality in one place, especially ifI didnt make it code>const/code> and allowed me to swap in functions. Iexplored this concept a bit more in other small programs I madewhere I was trying to create a cross-platform implementation ofsome system specific calls. I created a code>struct/code> containing thefunctions I wanted to use and then a make function that returnedthat code>struct/code> filled out with the system-specific functions. How Iwould do this would be to have two separate files:/p>pre classexample># On Windowscl main.c somelib_win32.c /Femain.exe# On Linuxgcc main.c somelib_linux.c -o main/pre>p>So the header would define the external make function for thislibrary and then define the structs format. In the main programyoud call the make function to provide the main functionality andthen you could have cross-platform code without using a ton ofpreprocessor tricks to get it to work the same way. When I am justexperimenting on small code ideas its a lot easier for mepersonally to write a simple makefile that works both with code>nmake/code>and code>make/code> that has a setup like this:/p>pre classexample>all: echo use nmake win32 or make linuxwin32: cl main.c somelib_win32.c /Femain.exelinux: gcc main.c somelib_linux.c -o main/pre>p>Yes this makefile is not good because I dont compile separately toobject files, but I have used the more abbreviated versions to tryand not just be too verbose with the code listings. I am assumingmost people reading this have compiled software on the command lineand have used sensible makefiles. What this results in is having amakefile that works on Windows and Linux without having to defineplatform specific options, use CMake, scons or some other tool./p>p>Since Id abstracted away from pointing directly to function namesthis namespace technique allowed me to write the main logic onceand worry about the actual implementation separately and also allowmyself to test the platform specific stuff in a containedenvironment. I find reading code with a lot of code>#ifdef/code>preprocessor action to be a bit awkward since you end up having tointerpret two different code execution trees that might intersectand also become a lot less modular since trying to rip out theLinux-only code or the Windows-only code for another project is achallenging and error prone proposition. The technique I presentedlets me avoid that a little better./p>p>What about duplicating work? Wont I be writing the same functionstwice? These are very reasonable questions, but you can solve thesein a rather clean and preprocessor free manner./p>p>insert image#1/p>p>By putting the platform independent code in a separate fileentirely you really pare down to the platform dependent code. Tothis end I feel there is a very limited duplication of effort sincein most platform dependent code I want to use normally has wildlydifferent interfaces or requirements to set things up and tearthings down in a responsible and correct manner. By using thistechnique I can prevent this from being even an issue. Here is ana hrefhttps://github.com/xemdetia/c-namespace-example/tree/master/platform-specific>example project/a> demonstrating the method up until this point./p>p>Now at this point Id already started to use this pattern regularlyin my code, but I realized there was a benefit to this particulartechnique that went beyond just giving a replaceable interface: youcould actually form different entry points to a complex library andyou could create an implicit tree of what a library provided. Imgoing to create a theoretical code example for a while regardingparts of speech that I am not going to provide a code sample for,just to demonstrate what I mean./p>/div>div idoutline-container-2.1 classoutline-3>h3 idsec-2.1>span classsection-number-3>2.1/span> English Parser /h3>div classoutline-text-3 idtext-2.1>p>Lets say you wrote a library to parse the English language. Thisis a hard task in general just because English is very complex,meaning there are probably a lot of functions that belong togetherbut have wildly different results. Im going to present a subsetof those theoretical functions and pretend this project is calledepar for English parser which is something you would normallyhave in C for a function prefix. These functions wont becommented either because in most cases thats what you actuallyget in libraries./p>pre classexample>/* Text Processing */extern int engl_next_word ( char *src, char *buff, size_t buffsz );extern int engl_next_sentence ( char *src, char *buff, size_t buffsz );extern char** engl_break_words ( char *src );extern char** engl_break_sentences ( char *src );/* Sentence Operators */extern int engl_sentence_tense_cons ( char *src );extern struct engl_sentence_diagram* engl_get_sentence_diagram( char *src );extern struct engl_partial_diagram* engl_get_subject_diagram( char *src );extern char* engl_get_subject ( char *src );extern struct engl_partial_diagram* engl_get_predicate_diagram( char *src);extern char* engl_get_predicate ( char *src );/* Word Analysis */extern int engl_word_is_verb ( char *src );extern int engl_word_is_noun ( char *src );extern int engl_word_is_adjective ( char *src );/* Word Tense Checker */extern int engl_word_past_tense ( char *src );extern int engl_word_present_tense ( char *src );extern int engl_word_future_tense ( char *src );/* Spellcheck */extern char** engl_spellcheck_word ( char *src );extern struct spellcheck_list* engl_spellcheck_sentence ( char *src );/* Bad Words */extern int engl_is_badword ( char *src );extern int engl_contains_badword ( char *src );extern char* engl_replace_badwords ( char *src );/pre>p>I dont feel this is an unreasonable representation of actualheader files you would see in the field. Some examples of this area hrefhttp://ecls.cvs.sourceforge.net/viewvc/ecls/ecl/src/h/external.h?viewmarkup>ECLs external.h/a>, a hrefhttp://www.lua.org/source/5.1/lua.h.html>Luas lua.h/a> and a hrefhttp://git.kernel.org/?plinux/kernel/git/stable/linux-stable.git;ablob;finclude/linux/console.h;h7201ce4280caceb594e4cd11cf6ca4e7a072efee;hbff74ae50f01ee67764564815c023c362c87ce18b>Linuxs include/linux/console.h/a>.In fact now in hindsight I think it was browsing the Linux kernelor watching an old talk based for new Linux kernel developers thatclued me into this idea, since they use a similar technique that Idescribed above in that console.h file. I vaguely remembered thetalk describing why not bother with C++ in the kernel and thereverse argument was You can still overload functions and doobject oriented programming techniques, and the kernel has it sowhy bother with C++? I cant remember the video and thatquotation is from memory. Anyway, the demonstration I wanted tomake by linking to those real-world source files is that they area listing of functions loosely categorized with a single-linecomment and whitespace. Its a common thing to see./p>p>Now lets categorize the functions in that english code sampleinto some simple classifications:/p>pre classexample>/* Linear Retrieval */extern int engl_next_word ( char *src, char *buff, size_t buffsz );extern int engl_next_sentence ( char *src, char *buff, size_t buffsz );/* Full String Processing */extern char** engl_break_words ( char *src );extern char** engl_break_sentences ( char *src );/* Value Retrieval */extern char* engl_get_subject ( char *src );extern char* engl_get_predicate ( char *src );/* Predicates (Functions that return a true or false value) */extern int engl_sentence_tense_cons ( char *src );extern int engl_word_is_verb ( char *src );extern int engl_word_is_noun ( char *src );extern int engl_word_is_adjective ( char *src );extern int engl_is_badword ( char *src );extern int engl_contains_badword ( char *src );extern int engl_word_past_tense ( char *src );extern int engl_word_present_tense ( char *src );extern int engl_word_future_tense ( char *src );/* Full String Replacement */extern char* engl_replace_badwords ( char *src );/* List of Unrelated Values */extern char** engl_spellcheck_word ( char *src );/* Returns Custom Struct with new Data */extern struct engl_sentence_diagram* engl_get_sentence_diagram( char *src );extern struct engl_partial_diagram* engl_get_subject_diagram( char *src );extern struct engl_partial_diagram* engl_get_predicate_diagram( char *src);extern struct spellcheck_list* engl_spellcheck_sentence ( char *src );/pre>p>Now looking at the second listing compared to the first it isobvious that the categorization among some of the things isdifficult to interpret properly. In fact someone trying to usethis header might miss that code>engl_sentence_tense_cons/code> is apredicate because of an artifical shortening of the name. In thisexample I am defining this hypothetical function as a functionthat returns a true or false value based on whether the passedsentence has a consistent tense. I didnt even mean to make thisan example of a terrible name for a function, I did itautomatically just as a C programmer because it makes sense toshorten the name after a certain number of characters. Assuredlythough the next one who looks at this code a month from nowcouldnt figure it out without assistance./p>p>Also some of these functions could be used in a standalonecontext. What if I just wanted a library that would analyze asentence and remove all the bad words for a blog filter? Are yousure that you could extract code>engl_replace_badwords/code> from thelisting above and apply it properly? Would you have to go read thesource or pray that there was some documentation elsewhere? I findmyself having to exercise the other options to figure out whatreturn values I should expect and what would be reasonable./p>p>We could even list these same functions in a third way:/p>pre classexample>/* String Operations */extern int engl_next_sentence ( char *src, char *buff, size_t buffsz );extern char** engl_break_sentences ( char *src );/* Sentence Operations */extern int engl_next_word ( char *src, char *buff, size_t buffsz );extern char** engl_break_words ( char *src );extern char* engl_get_predicate ( char *src );extern int engl_sentence_tense_cons ( char *src );extern char* engl_get_subject ( char *src );extern int engl_contains_badword ( char *src );/* Word Operations */extern int engl_word_future_tense ( char *src );extern int engl_word_past_tense ( char *src );extern int engl_word_present_tense ( char *src );extern int engl_word_is_adjective ( char *src );extern int engl_word_is_verb ( char *src );extern int engl_word_is_noun ( char *src );extern int engl_is_badword ( char *src );/* Language Detail Functions */extern struct engl_sentence_diagram* engl_get_sentence_diagram ( char *src );extern struct engl_partial_diagram* engl_get_subject_diagram ( char *src );extern struct engl_partial_diagram* engl_get_predicate_diagram( char *src);/* Language Filter Operations */extern char** engl_spellcheck_word ( char *src );extern char* engl_replace_badwords ( char *src );extern struct spellcheck_list* engl_spellcheck_sentence ( char *src ); /pre>p>This is a completely valid way to list the same functions butdepending on what you are trying to do, the order presented couldmake it really easy to find what you want or nearly impossiblewithout help. So back to what I presented last time, Ill cut andpaste what I presented as an alternative:/p>pre classexample>#ifndef __NS_H__#define __NS_H__#include <stdio.h>void func1 ( void );int func2( char *word );struct NS_namespace{ void (*func1) ( void ); int (*func2) ( char* );};static const struct NS_namespace NS { &func1, &func2 };#endif /* __NS_H__ *//pre>p>This structure allows you to call code>func1()/code> with code>NS.func1()/code> aswas discussed earlier. Now what I am trying to express is that ifyou use my terrible technique you can create a structured tree ofyour code which gives one true place to use as reference but alsocan divide up the code into things with the same returntypes. While you can kind of create this with a naming scheme youcan easily have a situation where the nomenclature just doesntline up just out of organic creation of the code. Im going tofocus just on the word predicates and propose a namespace usingthe technique I have described above:/p>pre classexample>struct Word_namespace{ struct { /* Returns 0 if true, 1 if false */ int (*verb) ( char* ); int (*noun) ( char* ); int (*adjective) ( char* ); int (*future_tense) ( char* ); int (*past_tense) ( char* ); int (*present_tense) ( char* ); } is; };const struct Word_namespace Word { { &engl_word_is_verb, &engl_word_is_noun, &engl_word_is_adjective, &engl_word_future_tense, &engl_word_past_tense, &engl_word_present_tense }};/pre>p>Now I think would be a good time to express my normal workflowwhich is:/p>ul>li>Get an idea/li>li>Write code, Test for Correctness/li>li>Build a namespace/li>li>Map the functions/li>/ul>p>As was mentioned on the comments it is something that could easilybe error prone, but it is something I usually do at the end to tieeverything up in a nice bow for the next time I need it. Somethingto note is that in the initial function list I made the tensesfollow a logically different tree, but in reality they were thesame sort of predicate as the types of words. They inspected the wordpassed in and returned true if they were in the set of verbs,nouns, adjectives or in the set of words with a future tense, pasttense or present tense./p>p>I was able to do this after the fact at a very high level whilestill keeping the internal source consistent. Maybe I usedcode>engl_word_past_tense/code> all over the place in my tests, in mysource files and in my internal documentation. Replacing thefunctions name everywhere it appears just cant be assumed to besafe, because its possible that you miss one file and breakeverything. Additionally at one point it b>made sense to me/b> tocall it that at one point in time. Part of coding is expressingthe ideas you have the best way you can in a language a compilerunderstands, so maybe in the context of what you wrote it makessense and changing the name after the fact makes the codeconfusing to read or less insightful of your original intent./p>/div>/div>/div>div idoutline-container-3 classoutline-2>h2 idsec-3>span classsection-number-2>3/span> New Information /h2>div classoutline-text-2 idtext-3>p>*The information in this New Information section is problematicand should i>not/i> be followed. It is left in because it was a thingI wanted to try. Move on to the Conclusions for more details.*/p>p>Now in both the reddit comment thread, the original post and even acontribution on github it was revealed to me that the functiondefinitions didnt need to linger in the header files and that bydefining the struct and informing the compiler that the namespacestruct was defined elsewhere was actually a superior option. Inever thought of this personally because it never really hurt me orbothered me, but in fact this gives some additional benefits./p>p>I will bring back the original NS.h header file to demonstrate:/p>pre classexample>#ifndef __NS_H__#define __NS_H__#include <stdio.h>void func1 ( void );int func2( char *word );struct NS_namespace{ void (*func1) ( void ); int (*func2) ( char* );};static const struct NS_namespace NS { &func1, &func2 };#endif /* __NS_H__ *//pre>p>Now with this new information it becomes clear that defining code>NS/code>and both code>func1/code> and code>func2/code> in the header file is not onlyredundant but it hurts the modularity gain that I saw when I wasusing function pointers in the code>fp_map/code> example. It is much morereasonable and sane to write the following:/p>p>i>In NS.h/i>/p>pre classexample>#ifndef __NS_H__#define __NS_H__#include <stdio.h>struct NS_namespace{ void (*func1) ( void ); int (*func2) ( char* );};extern const struct NS_namespace NS;#endif /* __NS_H__ *//pre>p>i>In NS.c/i>/p>pre classexample>#include NS.hvoid func1 ( void ){ printf( I am function 1.\n );}int func2( char *word ){ /* Check Parameters */ if ( word NULL ) { printf ( NULL word passed to func2.\n ); return -1; } printf( The word of the day is %s.\n, word ); return 0;}/* Define NS here */static const struct NS_namespace NS { &func1, &func2 };/pre>p>Now after all of what Ive learned this is the superior option ofboth the const technique and the variant that allowed you to doreplacement of source files for cross-platform antics. Anyway, mybad idea just got a little bit better./p>/div>/div>div idoutline-container-4 classoutline-2>h2 idsec-4>span classsection-number-2>4/span> Experimentation /h2>div classoutline-text-2 idtext-4>p>Some honest feedback I received were criticisms about optimizationproblems. To this end I am going to analyze this technique againstboth code>gcc/code> and code>cl/code>. First I need to segment the possible compileroptimizations that could effect functions./p>p>Im not an expert on compiler optimizations at this time so I amgoing to have to defer to the a hrefhttp://en.wikipedia.org/wiki/Category:Compiler_optimizations>Wikipedia listings/a>. I went throughthe 61 listed optimizations and tried to target what optimizationsmight have trouble and have to do with function manipulation ratherthan instruction/variable/precomputed value manipulation. The finallist I came up with was as follows:/p>table border2 cellspacing0 cellpadding6 rulesgroups framehsides>caption>/caption>colgroup>col alignleft />/colgroup>tbody>tr>td>a hrefhttp://en.wikipedia.org/wiki/Enabling_transformation>Enabling Transformation/a>/td>/tr>tr>td>a hrefhttp://en.wikipedia.org/wiki/Inline_caching>Inline Caching/a>/td>/tr>tr>td>a hrefhttp://en.wikipedia.org/wiki/Inline_expansion>Inline Expansion/a>/td>/tr>tr>td>a hrefhttp://en.wikipedia.org/wiki/Interprocedural_optimization>Interprocedural Optimization/a>/td>/tr>tr>td>a hrefhttp://en.wikipedia.org/wiki/Return_value_optimization>Return Value Optimization/a>/td>/tr>/tbody>/table>p>The remainder of optimizations listed on that page have to do withthe deduplication of work, loop optimization or some otherrearrangement of basic blocks of code. The five listed articlesabove had to do with effectively inlining of either theinstructions or the result of a function. If the namespace iscode>const/code> then by definition then the compiler is free to do directvalue replacement in the resulting function./p>p>I was going to make an example but the previous exposition took metoo long to write and someone beat me to the punch (in my owncomments no less)! So in the a hrefhttp://blog.808inorganic.com/2012/06/how-do-i-get-c-namespaces-how-do-i-get.html#comment-form>comments of the post that started all this/a> Hraban writes:/p>pre classexample>...Not unless by vastly you mean not at all. Compile with -O3, look at the assembly:https://gist.github.com/3033687#file_test_o3.sLine 11 and 12 are equal. Thus is the power of const and -O3.Hraban/pre>p>The relevant link to the gist is a hrefhttps://gist.github.com/3033687#file_test_o3.s>here/a> and it matches my owntests. Even now in realizing how little I know about compileroptimization tricks the answer is pretty clear: once you canguarantee a value to be constant you are free to replace it as isanywhere. This code>const/code> modifier applied to the namespace gives Cthe greenlight to drop the address to the appropriate function inas if you had called it directly without the namespace./p>p>The only thing left to check is if the common theme of the fiveremaining articles applies: if a function could normally be inlinedwould it still be inlined using this namespace technique on bothcode>gcc/code> and code>cl/code>? The first thing to do is to identify a code samplethat with the appropriate options is inlined as a normal functioncall. While its definitely possible for the function to be inlinedit also possible for the inline optimization pass to happen AFTERthe constant replacement/injection manipulation./p>p>The act of inlining functions became official as part of the a hrefhttp://en.wikipedia.org/wiki/C99>C99 standard/a> and so while some compilers might do the expected thingC89 effectively doesnt inline. So if we were compiling based onthe C89 spec we already won. Still we are interested in what thecompiler would do./p>p>Im starting with code>gcc/code> first just because I happen to be workingon Linux at the time of writing this post, I will do code>cl/code>after. Here is the very simple and short code sample build with thecommand line code>gcc -S inlinetest.c/code>:/p>pre classexample>#include <stdio.h>int inline_value(){ return 5;}int main( int argc, char **argv ){ printf( %d, inline_value() ); return 0;}/pre>p>Since an optimization setting wasnt picked I did not get code>gcc/code> toinline by default. The resulting assembly from code>main()/code> is asfollows:/p>pre classexample>.globl main .type main, @functionmain:.LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movq %rsi, -16(%rbp) movl $0, %eax call inline_value movl %eax, %edx movl $.LC0, %eax movl %edx, %esi movq %rax, %rdi movl $0, %eax call printf movl $0, %eax leave ret .cfi_endproc/pre>p>Now even if you arent familiar with assembler at all you should beable to recognize call inlinesub>value/sub> being an instruction thatoccurs. Next lets ask code>gcc/code> to optimize our code with code>gcc -S -O2 inlinetest.c/code>:/p>pre classexample>.globl main .type main, @functionmain:.LFB12: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $5, %esi movl $.LC0, %edi xorl %eax, %eax call printf xorl %eax, %eax addq $8, %rsp ret .cfi_endproc/pre>p>Now from this example it is clear the inline occured as one wouldexpect, as you can see no call to code>inline_value()/code>. Now, letsrevise the code to use namespacing. I am going to keep it in thesame file for no particularly good reason other than to make itshort to post:/p>pre classexample>#include <stdio.h>int inline_value(){ return 5;}struct A_namespace{ int (*_ivalue) ( void );};const struct A_namespace A { &inline_value };int main( int argc, char **argv ){ printf( %d, inline_value() ); printf( %d, A.value() ); return 0;}/pre>p>First lets analyze the unoptimized output for code>main()/code>:/p>pre classexample>.globl main .type main, @functionmain:.LFB1: .cfi_startproc pushq %rbp .cfi_def_cfa_offset 16 movq %rsp, %rbp .cfi_offset 6, -16 .cfi_def_cfa_register 6 subq $16, %rsp movl %edi, -4(%rbp) movq %rsi, -16(%rbp) movl $0, %eax call inline_value movl %eax, %edx movl $.LC0, %eax movl %edx, %esi movq %rax, %rdi movl $0, %eax call printf movq A(%rip), %rax call *%rax movl %eax, %edx movl $.LC0, %eax movl %edx, %esi movq %rax, %rdi movl $0, %eax call printf movl $0, %eax leave ret .cfi_endproc/pre>p>Now for simplicitys sake I am going to pare it down to the actualnamespace call:/p>pre classexample>movq A(%rip), %raxcall *%rax/pre>p>This sort of code example is actually one of the main drawbacksthat I expected right away. There is an excess call to load thefunction pointer into a register and then call the function. Thisis just an extra line of code but there is a lot that could goon. For instance if there was a page fault not only would youeffectively have to fetch the namespace struct and load a valueyou would also have a fetch to make sure the function is loadedand then call that function. This double pagefault could really addup, especially if a lot of functions used this technique. Now letstry an optimized version from code>gcc -S -O2 inlinetest.c/code>:/p>pre classexample>.globl main .type main, @functionmain:.LFB12: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 movl $5, %esi movl $.LC0, %edi xorl %eax, %eax call printf call *A(%rip) movl $.LC0, %edi movl %eax, %esi xorl %eax, %eax call printf xorl %eax, %eax addq $8, %rsp ret .cfi_endproc/pre>p>Now the two lines was reduced to a single line: code>call *A(%rip)/code>. This is actually still a bad result since the trueright result is to eschew the function call entirely and just load/p>ol>li>I did try code>gcc/code> with code>-O3/code> but I got the same result as code>-O2/code>. This is a rather heartbreaking result for me personally/li>/ol>p>because it proves me wrong./p>p>I do have a few long shot ideas though:/p>ul>li>I did not set the code to be static in the original/li>/ul>p>source. Nope. Still the same./p>ul>li>Now to provide an inline hint to code>inline_value()/code>? Nope!/li>li>With -stdc99? Nope!/li>/ul>p>To be fair I did expect this as a result, since it seemedreasonable to me that this sort of technique would not beinline-friendly./p>p>There still is one final phase to this technique. While inliningdoes not happen within the same file what if I use it in the methodI described above where the functions are effective external?/p>p>/in inlinetest2.h//p>pre classexample> #ifndef __INLINETEST2_H__#define __INLINETEST2_H__struct A_namespace{ int (*value) ( void );};extern const struct A_namespace A;#endif /* __INLINETEST2_H__ */pre>p>/in inlinetest2.c//p>pre classexample>#include inlinetest2.hinline int inline_value(){ return 5;}const struct A_namespace A { &inline_value };/pre>p>/in test2.c//p>pre classexample>#include <stdio.h>#include inlinetest2.hint main( int argc, char **argv ){ printf( %d, A.value() ); return 0;}/pre>p>The first thing we want to do is compile by parts. First letscompile inlinetest2.c with code>gcc -c -O2 inlinetest2.c/code>. Next we needto compile test2.c and examine its source after code>gcc -S -O2 test2.c/code> (We have to use -c or it attempts to link in both thesecases). Unfortunately we have the function still being called:/p>pre classexample>.globl main .type main, @functionmain:.LFB11: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 call *A(%rip) movl $.LC0, %edi movl %eax, %esi xorl %eax, %eax call printf xorl %eax, %eax addq $8, %rsp ret .cfi_endproc /pre>p>Now let me try -O3.. still the same. In this example inlining willnot occur under any circumstance with code>gcc/code> I was going to try thiswith code>cl/code> as well but if it doesnt work in one place its notreliable anywhere else./p>p>I think the last thing we need to do is replicate the test caseand the resulting example. In my testing using the a hrefhttps://github.com/xemdetia/c-namespace-example>namespace example project/a> I was not getting the pointer to function callstatement, I was getting a literal call statement as much as Hrabanwas getting. Let me use that project again. I suspect that in NS.hdefining both the functions and the namespace in the header fileallowed the compiler to optimize in a direct function call. Here isthe NS.h file for reference:/p>pre classexample>#ifndef __NS_H__#define __NS_H__#include <stdio.h> void func1 ( void ); int func2( char *word ); struct NS_namespace { void (*func1) ( void ); int (*func2) ( char* ); }; static const struct NS_namespace NS { &func1, &func2 };#endif /* __NS_H__ *//pre>p>After running this through code>gcc -S -O2 main.c/code> I got the sameresult Hraban got:/p>pre classexample>.globl main .type main, @functionmain:.LFB11: .cfi_startproc subq $8, %rsp .cfi_def_cfa_offset 16 call func1 xorl %edi, %edi call func2 testl %eax, %eax js .L6/pre>p>Notice now both calls to func1 and func2 are not pointers? This isa very odd response. Let me investigate trying to make thempointer-to-functions like the other tests. /p>p>The first thing I think would be to annotate both code>func1()/code> andcode>func2()/code> as code>extern/code>. No change./p>p>Now I am going to use the technique where I define the struct andmake the actual namespace struct code>extern/code>. This changes our twoNS.h and NS.c files to be:/p>pre classexample>#ifndef __NS_H__#define __NS_H__#include <stdio.h>struct NS_namespace{ void (*func1) ( void ); int (*func2) ( char* );};extern static const struct NS_namespace NS;#endif /* __NS_H__ *//pre>pre classexample>#include NS.hvoid func1 ( void ){ printf( I am function 1.\n );}int func2( char *word ){ /* Check Parameters */ if ( word NULL ) { printf ( NULL word passed to func2.\n ); return -1; } printf( The word of the day is %s.\n, word ); return 0;}const struct NS_namespace NS { &func1, &func2 }; /pre>p>Note I had to drop the code>static/code> specifier from the function sinceas soon as it was no longer in a shared header the declarationbecame non-static. I know this is an awful thing to say but atthis point I am getting a little frustrated and just want to finishthis blog post, so I just made em const. Now lets see theassembly:/p>pre classexample>.globl main .type main, @functionmain:.LFB11: .cfi_startproc pushq %rbx .cfi_def_cfa_offset 16 .cfi_offset 3, -16 call *NS(%rip) xorl %edi, %edi movq NS+8(%rip), %rbx call *%rbx testl %eax, %eax js .L6 /pre>p>Aha! Well at least I know where it comes from. It seems as soon asyou lose the static context code>gcc/code> at least is unable to do a 1:1replacement which makes sense. By my interpretation code>static/code>represents that there is one canonical value and code>const/code> impliesthat a value doesnt change. As soon as code>static/code> is removed fromthe equation this replacement cant occur. Im going to take asecond to look around quick to make sure I am interpreting the bitsright. Now straight from the horses mouth in a hrefhttp://www.open-std.org/jtc1/sc22/wg14/www/docs/n1124.pdf>the C99 specification, page 140:/a>/p>blockquote>pre classexample>4 The storage-class specifier, if any, in the declaration specifiers shall be either extern or static./pre>/blockquote>p>So what this means is that you cant have code>extern/code> and code>static/code> onthe same storage class specifier (like a struct), its got to beone or the other. Since code>extern/code> causes the regression and staticdoes not I will have to say the naive approach I started with isironically the most correct (even though inlining doesnt work)./p>/div>/div>div idoutline-container-5 classoutline-2>h2 idsec-5>span classsection-number-2>5/span> Conclusions /h2>div classoutline-text-2 idtext-5>p>This turned out to be a much more monumental process than I thoughtit would be. I intended on reaching out to multiple compilers andtrying to explore some of the options but at this point I need tojust put a stake in this and call it done. In the end this is oneof those posts where you start off in a direction and you walkreally far to the point of your own uncertainty in existence itselfto find that you were right all along. This feeling though at thepeak of enlightment is often a humbling and almost depressingexperience. In seeking the truth in this case I felt like a trueantagonist to myself to the point that I was disappointed I wasright./p>p>My a hrefhttp://www.reddit.com/r/programming/comments/vtdv6/regarding_c_misconceptions/c57i1qx>naive response/a> to earnest criticism based on just a gut feelingwas actually the right result, suggestions made a hrefhttp://www.reddit.com/r/programming/comments/vtdv6/regarding_c_misconceptions/c57h3kt>like this one/a> wherethere was implications on how to do it better were in fact thewrong path even though it seemed better to both parties at thetime. I kind of also wanted this to be an example of why not to becrazy and stay within the painted lines that I could quote myselfto others to try and stave off their mistakes but that is a blogpost for another time./p>p>In the end though the way to get this to work correctly and rightat the cost of not having some functions inline is the same as itwas before as seen in the first revision of my a hrefhttps://github.com/xemdetia/c-namespace-example/commit/5c8279da16b28221180015a591e56652ffa2fed7>namespace example/a>. /p>p>In the end though I hope I gave this idea a fair shake and passablycrude analysis. If people think otherwise please let me know whereI went wrong either in the comments here, the eventual redditcomment threads or just harrass me on twitter. I plan on writinganother post expressing the right way to do this technique separatefrom all this fumbling around./p>/div>/div>div idoutline-container-6 classoutline-2>h2 idsec-6>span classsection-number-2>6/span> Future Work /h2>div classoutline-text-2 idtext-6>p>I do have one more serious grievance posed by a reddit comment totake a look at and thoroughly analyze, and that has to do with thePython array slicer I threw together in a couple of hours. I wantto really give that as much thought as I did this to really makesure I am approaching the language correctly and not spready falsetruths around in my wake. I do teach other people so I feel its myresponsibility to make sure I know it 110% right./p>p>I did this sort of analysis for code>gcc/code> only. I intended to use code>cl/code>but the time got away from me./p>p>Next there was a particular piece of information in the middle ofthis post about using my namespace technique to offload/sort and toclassify the complexity of code. Now that I have proven at leastwith code>gcc/code> that this technique is effectively free compared tocalling a function itself I want to quantify this idea ofcomplexity coming from misnaming stuff. I planned to insert thissomewhere in this post but oops./p>p>Also I mentioned Hraban in this post a few times near the end andhe actually submitted a really great idea on how to extend my ideaand make it work a little differently/intelligently. You can seethat change in a hrefhttps://github.com/xemdetia/c-namespace-example/pull/1>this github pull request/a>. Im not going to merge itright away until I take a look at it and really try to examine theside effects but it definitely seems like a way to usepreprocessors for good and not for evil. I had a similar idea I wascontemplating but his seems like a hundred times more sensible./p>/div>/div>/div>div styleclear: both;>/div>/div>div classpost-footer>div classpost-footer-line post-footer-line-1>span classpost-author vcard>Posted byspan classfn>a hrefhttps://www.blogger.com/profile/14806502164720090302 itempropauthor relauthor titleauthor profile>xemdetia/a>/span>/span>span classpost-timestamp>ata classtimestamp-link hrefhttp://blog.808inorganic.com/2012/07/bad-coders-doing-bad-things-1-of-2.html itempropurl relbookmark titlepermanent link>abbr classpublished itempropdatePublished title2012-07-02T23:41:00-07:00>11:41 PM/abbr>/a>/span>span classpost-comment-link>a classcomment-link hrefhttp://blog.808inorganic.com/2012/07/bad-coders-doing-bad-things-1-of-2.html#comment-form onclick>4 comments: /a>/span>span classpost-icons>span classitem-control blog-admin pid-2142483785>a hrefhttps://www.blogger.com/post-edit.g?blogID376423286598101560&postID5884393599763753435&frompencil titleEdit Post>img alt classicon-action height18 srchttps://resources.blogblog.com/img/icon18_edit_allbkg.gif width18/>/a>/span>/span>div classpost-share-buttons goog-inline-block>a classgoog-inline-block share-button sb-email hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5884393599763753435&targetemail target_blank titleEmail This>span classshare-button-link-text>Email This/span>/a>a classgoog-inline-block share-button sb-blog hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5884393599763753435&targetblog onclickwindow.open(this.href, _blank, height270,width475); return false; target_blank titleBlogThis!>span classshare-button-link-text>BlogThis!/span>/a>a classgoog-inline-block share-button sb-twitter hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5884393599763753435&targettwitter target_blank titleShare to Twitter>span classshare-button-link-text>Share to Twitter/span>/a>a classgoog-inline-block share-button sb-facebook hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5884393599763753435&targetfacebook onclickwindow.open(this.href, _blank, height430,width640); return false; target_blank titleShare to Facebook>span classshare-button-link-text>Share to Facebook/span>/a>a classgoog-inline-block share-button sb-pinterest hrefhttps://www.blogger.com/share-post.g?blogID376423286598101560&postID5884393599763753435&targetpinterest target_blank titleShare to Pinterest>span classshare-button-link-text>Share to Pinterest/span>/a>/div>/div>div classpost-footer-line post-footer-line-2>span classpost-labels>Labels:a hrefhttp://blog.808inorganic.com/search/label/c reltag>c/a>,a hrefhttp://blog.808inorganic.com/search/label/reddit reltag>reddit/a>/span>/div>div classpost-footer-line post-footer-line-3>span classpost-location>/span>/div>/div>/div>/div> /div>/div> /div>div classblog-pager idblog-pager>span idblog-pager-older-link>a classblog-pager-older-link hrefhttp://blog.808inorganic.com/search?updated-max2012-07-02T23:41:00-07:00&max-results7 idBlog1_blog-pager-older-link titleOlder Posts>Older Posts/a>/span>a classhome-link hrefhttp://blog.808inorganic.com/>Home/a>/div>div classclear>/div>div classblog-feeds>div classfeed-links>Subscribe to:a classfeed-link hrefhttp://blog.808inorganic.com/feeds/posts/default target_blank typeapplication/atom+xml>Posts (Atom)/a>/div>/div>/div>/div>/div>/div>div classcolumn-left-outer>div classcolumn-left-inner>aside>/aside>/div>/div>div classcolumn-right-outer>div classcolumn-right-inner>aside>div classsidebar section idsidebar-right-1>div classwidget LinkList data-version1 idLinkList1>h2>Links/h2>div classwidget-content>ul>li>a hrefhttp://twitter.com/#!/xemdetia>My Twitter/a>/li>li>a hrefhttps://github.com/xemdetia>My github/a>/li>/ul>div classclear>/div>/div>/div>div classwidget BlogArchive data-version1 idBlogArchive1>h2>Blog Archive/h2>div classwidget-content>div idArchiveList>div idBlogArchive1_ArchiveList>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2017/>2017/a>span classpost-count dirltr>(4)/span>ul classhierarchy>li classarchivedate expanded>a classtoggle hrefjavascript:void(0)>span classzippy toggle-open> ▼ /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2017/03/>March/a>span classpost-count dirltr>(1)/span>ul classposts>li>a hrefhttp://blog.808inorganic.com/2017/03/check-certificate-key-identifier.html>Check a Certificate Key Identifier/a>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2017/01/>January/a>span classpost-count dirltr>(3)/span>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2016/>2016/a>span classpost-count dirltr>(1)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2016/12/>December/a>span classpost-count dirltr>(1)/span>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2015/>2015/a>span classpost-count dirltr>(1)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2015/08/>August/a>span classpost-count dirltr>(1)/span>/li>/ul>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2012/>2012/a>span classpost-count dirltr>(4)/span>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2012/07/>July/a>span classpost-count dirltr>(3)/span>/li>/ul>ul classhierarchy>li classarchivedate collapsed>a classtoggle hrefjavascript:void(0)>span classzippy> ► /span>/a>a classpost-count-link hrefhttp://blog.808inorganic.com/2012/06/>June/a>span classpost-count dirltr>(1)/span>/li>/ul>/li>/ul>/div>/div>div classclear>/div>/div>/div>div classwidget Profile data-version1 idProfile1>h2>About Me/h2>div classwidget-content>dl classprofile-datablock>dt classprofile-data>a classprofile-name-link g-profile hrefhttps://www.blogger.com/profile/14806502164720090302 relauthor stylebackground-image: url(//www.blogger.com/img/logo-16.png);>xemdetia/a>/dt>dd classprofile-textblock>All opinions not representative of my employer and are my own personal opinions.Code samples and other components are at your own risk./dd>/dl>a classprofile-link hrefhttps://www.blogger.com/profile/14806502164720090302 relauthor>View my complete profile/a>div classclear>/div>/div>/div>/div>/aside>/div>/div>/div>div styleclear: both>/div>!-- columns -->/div>!-- main -->/div>/div>div classmain-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>footer>div classfooter-outer>div classfooter-cap-top cap-top>div classcap-left>/div>div classcap-right>/div>/div>div classfauxborder-left footer-fauxborder-left>div classfauxborder-right footer-fauxborder-right>/div>div classregion-inner footer-inner>div classfoot no-items section idfooter-1>/div>table border0 cellpadding0 cellspacing0 classsection-columns columns-2>tbody>tr>td classfirst columns-cell>div classfoot no-items section idfooter-2-1>/div>/td>td classcolumns-cell>div classfoot no-items section idfooter-2-2>/div>/td>/tr>/tbody>/table>!-- outside of the include in order to lock Attribution widget -->div classfoot section idfooter-3>div classwidget Attribution data-version1 idAttribution1>div classwidget-content styletext-align: center;>Awesome Inc. theme. Powered by a hrefhttps://www.blogger.com target_blank>Blogger/a>./div>div classclear>/div>/div>/div>/div>/div>div classfooter-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/footer>!-- content -->/div>/div>div classcontent-cap-bottom cap-bottom>div classcap-left>/div>div classcap-right>/div>/div>/div>/div>script typetext/javascript> window.setTimeout(function() { document.body.className document.body.className.replace(loading, ); }, 10); /script>script typetext/javascript srchttps://www.blogger.com/static/v1/widgets/3298326339-widgets.js>/script>script typetext/javascript>window__wavt AOuZoY6ONZggTaVYcgV1KNlhdYvKta1oBw:1720870273945;_WidgetManager._Init(//www.blogger.com/rearrange?blogID\x3d376423286598101560,//blog.808inorganic.com/,376423286598101560);_WidgetManager._SetDataContext({name: blog, data: {blogId: 376423286598101560, title: xemdetia, url: http://blog.808inorganic.com/, canonicalUrl: http://blog.808inorganic.com/, homepageUrl: http://blog.808inorganic.com/, searchUrl: http://blog.808inorganic.com/search, canonicalHomepageUrl: http://blog.808inorganic.com/, blogspotFaviconUrl: http://blog.808inorganic.com/favicon.ico, bloggerUrl: https://www.blogger.com, hasCustomDomain: true, httpsEnabled: false, enabledCommentProfileImages: true, gPlusViewType: FILTERED_POSTMOD, adultContent: false, analyticsAccountNumber: , encoding: UTF-8, locale: en, localeUnderscoreDelimited: en, languageDirection: ltr, isPrivate: false, isMobile: false, isMobileRequest: false, mobileClass: , isPrivateBlog: false, isDynamicViewsAvailable: true, feedLinks: \x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22xemdetia - Atom\x22 href\x3d\x22http://blog.808inorganic.com/feeds/posts/default\x22 /\x3e\n\x3clink rel\x3d\x22alternate\x22 type\x3d\x22application/rss+xml\x22 title\x3d\x22xemdetia - RSS\x22 href\x3d\x22http://blog.808inorganic.com/feeds/posts/default?alt\x3drss\x22 /\x3e\n\x3clink rel\x3d\x22service.post\x22 type\x3d\x22application/atom+xml\x22 title\x3d\x22xemdetia - Atom\x22 href\x3d\x22https://www.blogger.com/feeds/376423286598101560/posts/default\x22 /\x3e\n, meTag: \x3clink rel\x3d\x22me\x22 href\x3d\x22https://www.blogger.com/profile/14806502164720090302\x22 /\x3e\n, adsenseHostId: ca-host-pub-1556223355139109, adsenseHasAds: false, adsenseAutoAds: false, boqCommentIframeForm: true, loginRedirectParam: , view: , dynamicViewsCommentsSrc: //www.blogblog.com/dynamicviews/4224c15c4e7c9321/js/comments.js, dynamicViewsScriptSrc: //www.blogblog.com/dynamicviews/a6ed991e7ca0d194, plusOneApiSrc: https://apis.google.com/js/platform.js, disableGComments: true, interstitialAccepted: false, sharing: {platforms: {name: Get link, key: link, shareMessage: Get link, target: }, {name: Facebook, key: facebook, shareMessage: Share to Facebook, target: facebook}, {name: BlogThis!, key: blogThis, shareMessage: BlogThis!, target: blog}, {name: Twitter, key: twitter, shareMessage: Share to Twitter, target: twitter}, {name: Pinterest, key: pinterest, shareMessage: Share to Pinterest, target: pinterest}, {name: Email, key: email, shareMessage: Email, target: email}, disableGooglePlus: true, googlePlusShareButtonWidth: 0, googlePlusBootstrap: \x3cscript type\x3d\x22text/javascript\x22\x3ewindow.___gcfg \x3d {\x27lang\x27: \x27en\x27};\x3c/script\x3e}, hasCustomJumpLinkMessage: false, jumpLinkMessage: Read more, pageType: index, pageName: , pageTitle: xemdetia}}, {name: features, data: {}}, {name: messages, data: {edit: Edit, linkCopiedToClipboard: Link copied to clipboard!, ok: Ok, postLink: Post Link}}, {name: template, data: {name: custom, localizedName: Custom, isResponsive: false, isAlternateRendering: false, isCustom: true, variant: dark, variantId: dark}}, {name: view, data: {classic: {name: classic, url: ?view\x3dclassic}, flipcard: {name: flipcard, url: ?view\x3dflipcard}, magazine: {name: magazine, url: ?view\x3dmagazine}, mosaic: {name: mosaic, url: ?view\x3dmosaic}, sidebar: {name: sidebar, url: ?view\x3dsidebar}, snapshot: {name: snapshot, url: ?view\x3dsnapshot}, timeslide: {name: timeslide, url: ?view\x3dtimeslide}, isMobile: false, title: xemdetia, description: , url: http://blog.808inorganic.com/, type: feed, isSingleItem: false, isMultipleItems: true, isError: false, isPage: false, isPost: false, isHomepage: true, isArchive: false, isLabelSearch: false}});_WidgetManager._RegisterWidget(_NavbarView, new _WidgetInfo(Navbar1, navbar, document.getElementById(Navbar1), {}, displayModeFull));_WidgetManager._RegisterWidget(_HeaderView, new _WidgetInfo(Header1, header, document.getElementById(Header1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogView, new _WidgetInfo(Blog1, main, document.getElementById(Blog1), {cmtInteractionsEnabled: false, lightboxEnabled: true, lightboxModuleUrl: https://www.blogger.com/static/v1/jsbin/2877410179-lbx.js, lightboxCssUrl: https://www.blogger.com/static/v1/v-css/13464135-lightbox_bundle.css}, displayModeFull));_WidgetManager._RegisterWidget(_LinkListView, new _WidgetInfo(LinkList1, sidebar-right-1, document.getElementById(LinkList1), {}, displayModeFull));_WidgetManager._RegisterWidget(_BlogArchiveView, new _WidgetInfo(BlogArchive1, sidebar-right-1, document.getElementById(BlogArchive1), {languageDirection: ltr, loadingMessage: Loading\x26hellip;}, displayModeFull));_WidgetManager._RegisterWidget(_ProfileView, new _WidgetInfo(Profile1, sidebar-right-1, document.getElementById(Profile1), {}, displayModeFull));_WidgetManager._RegisterWidget(_AttributionView, new _WidgetInfo(Attribution1, footer-3, document.getElementById(Attribution1), {}, displayModeFull));/script>/body>/html>
View on OTX
|
View on ThreatMiner
Please enable JavaScript to view the
comments powered by Disqus.
Data with thanks to
AlienVault OTX
,
VirusTotal
,
Malwr
and
others
. [
Sitemap
]