zeroc-ice 3.6b1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (675) hide show
  1. checksums.yaml +7 -0
  2. data/ICE_LICENSE +54 -0
  3. data/LICENSE +339 -0
  4. data/bin/slice2rb +17 -0
  5. data/ext/Communicator.cpp +596 -0
  6. data/ext/Communicator.h +25 -0
  7. data/ext/Config.h +111 -0
  8. data/ext/Connection.cpp +381 -0
  9. data/ext/Connection.h +26 -0
  10. data/ext/Endpoint.cpp +311 -0
  11. data/ext/Endpoint.h +27 -0
  12. data/ext/ImplicitContext.cpp +152 -0
  13. data/ext/ImplicitContext.h +25 -0
  14. data/ext/Init.cpp +52 -0
  15. data/ext/Logger.cpp +151 -0
  16. data/ext/Logger.h +28 -0
  17. data/ext/ObjectFactory.cpp +140 -0
  18. data/ext/ObjectFactory.h +50 -0
  19. data/ext/Operation.cpp +676 -0
  20. data/ext/Operation.h +36 -0
  21. data/ext/Properties.cpp +369 -0
  22. data/ext/Properties.h +25 -0
  23. data/ext/Proxy.cpp +1354 -0
  24. data/ext/Proxy.h +27 -0
  25. data/ext/Slice.cpp +223 -0
  26. data/ext/Slice.h +22 -0
  27. data/ext/Types.cpp +3160 -0
  28. data/ext/Types.h +545 -0
  29. data/ext/Util.cpp +792 -0
  30. data/ext/Util.h +511 -0
  31. data/ext/extconf.rb +118 -0
  32. data/ext/ice/BZIP_LICENSE +42 -0
  33. data/ext/ice/MCPP_LICENSE +36 -0
  34. data/ext/ice/bzip2/blocksort.c +1094 -0
  35. data/ext/ice/bzip2/bzlib.c +1572 -0
  36. data/ext/ice/bzip2/bzlib.h +282 -0
  37. data/ext/ice/bzip2/bzlib_private.h +509 -0
  38. data/ext/ice/bzip2/compress.c +672 -0
  39. data/ext/ice/bzip2/crctable.c +104 -0
  40. data/ext/ice/bzip2/decompress.c +646 -0
  41. data/ext/ice/bzip2/huffman.c +205 -0
  42. data/ext/ice/bzip2/randtable.c +84 -0
  43. data/ext/ice/cpp/include/Ice/ACMF.h +30 -0
  44. data/ext/ice/cpp/include/Ice/Application.h +156 -0
  45. data/ext/ice/cpp/include/Ice/AsyncResult.h +363 -0
  46. data/ext/ice/cpp/include/Ice/AsyncResultF.h +26 -0
  47. data/ext/ice/cpp/include/Ice/BasicStream.h +1315 -0
  48. data/ext/ice/cpp/include/Ice/Buffer.h +159 -0
  49. data/ext/ice/cpp/include/Ice/BuiltinSequences.h +74 -0
  50. data/ext/ice/cpp/include/Ice/Communicator.h +194 -0
  51. data/ext/ice/cpp/include/Ice/CommunicatorAsync.h +115 -0
  52. data/ext/ice/cpp/include/Ice/CommunicatorF.h +60 -0
  53. data/ext/ice/cpp/include/Ice/Config.h +97 -0
  54. data/ext/ice/cpp/include/Ice/Connection.h +495 -0
  55. data/ext/ice/cpp/include/Ice/ConnectionAsync.h +115 -0
  56. data/ext/ice/cpp/include/Ice/ConnectionF.h +72 -0
  57. data/ext/ice/cpp/include/Ice/ConnectionFactoryF.h +30 -0
  58. data/ext/ice/cpp/include/Ice/ConnectionIF.h +37 -0
  59. data/ext/ice/cpp/include/Ice/Current.h +94 -0
  60. data/ext/ice/cpp/include/Ice/DefaultObjectFactory.h +48 -0
  61. data/ext/ice/cpp/include/Ice/DeprecatedStringConverter.h +62 -0
  62. data/ext/ice/cpp/include/Ice/DispatchInterceptor.h +33 -0
  63. data/ext/ice/cpp/include/Ice/Dispatcher.h +51 -0
  64. data/ext/ice/cpp/include/Ice/DynamicLibrary.h +105 -0
  65. data/ext/ice/cpp/include/Ice/DynamicLibraryF.h +29 -0
  66. data/ext/ice/cpp/include/Ice/Endpoint.h +350 -0
  67. data/ext/ice/cpp/include/Ice/EndpointF.h +97 -0
  68. data/ext/ice/cpp/include/Ice/EndpointTypes.h +74 -0
  69. data/ext/ice/cpp/include/Ice/Exception.h +114 -0
  70. data/ext/ice/cpp/include/Ice/FacetMap.h +56 -0
  71. data/ext/ice/cpp/include/Ice/FactoryTable.h +69 -0
  72. data/ext/ice/cpp/include/Ice/FactoryTableInit.h +87 -0
  73. data/ext/ice/cpp/include/Ice/Format.h +39 -0
  74. data/ext/ice/cpp/include/Ice/Functional.h +138 -0
  75. data/ext/ice/cpp/include/Ice/GCObject.h +73 -0
  76. data/ext/ice/cpp/include/Ice/Handle.h +192 -0
  77. data/ext/ice/cpp/include/Ice/Ice.h +54 -0
  78. data/ext/ice/cpp/include/Ice/Identity.h +160 -0
  79. data/ext/ice/cpp/include/Ice/ImplicitContext.h +96 -0
  80. data/ext/ice/cpp/include/Ice/ImplicitContextF.h +60 -0
  81. data/ext/ice/cpp/include/Ice/Incoming.h +131 -0
  82. data/ext/ice/cpp/include/Ice/IncomingAsync.h +108 -0
  83. data/ext/ice/cpp/include/Ice/IncomingAsyncF.h +35 -0
  84. data/ext/ice/cpp/include/Ice/Initialize.h +141 -0
  85. data/ext/ice/cpp/include/Ice/InstanceF.h +26 -0
  86. data/ext/ice/cpp/include/Ice/Instrumentation.h +377 -0
  87. data/ext/ice/cpp/include/Ice/InstrumentationF.h +71 -0
  88. data/ext/ice/cpp/include/Ice/LocalException.h +1022 -0
  89. data/ext/ice/cpp/include/Ice/LocalObject.h +36 -0
  90. data/ext/ice/cpp/include/Ice/LocalObjectF.h +26 -0
  91. data/ext/ice/cpp/include/Ice/Locator.h +2191 -0
  92. data/ext/ice/cpp/include/Ice/LocatorF.h +89 -0
  93. data/ext/ice/cpp/include/Ice/Logger.h +94 -0
  94. data/ext/ice/cpp/include/Ice/LoggerF.h +60 -0
  95. data/ext/ice/cpp/include/Ice/LoggerUtil.h +153 -0
  96. data/ext/ice/cpp/include/Ice/Makefile +26 -0
  97. data/ext/ice/cpp/include/Ice/Metrics.h +2989 -0
  98. data/ext/ice/cpp/include/Ice/MetricsAdminI.h +662 -0
  99. data/ext/ice/cpp/include/Ice/MetricsFunctional.h +144 -0
  100. data/ext/ice/cpp/include/Ice/MetricsObserverI.h +576 -0
  101. data/ext/ice/cpp/include/Ice/NativePropertiesAdmin.h +55 -0
  102. data/ext/ice/cpp/include/Ice/Object.h +165 -0
  103. data/ext/ice/cpp/include/Ice/ObjectAdapter.h +162 -0
  104. data/ext/ice/cpp/include/Ice/ObjectAdapterF.h +60 -0
  105. data/ext/ice/cpp/include/Ice/ObjectAdapterFactoryF.h +26 -0
  106. data/ext/ice/cpp/include/Ice/ObjectF.h +26 -0
  107. data/ext/ice/cpp/include/Ice/ObjectFactory.h +86 -0
  108. data/ext/ice/cpp/include/Ice/ObjectFactoryF.h +60 -0
  109. data/ext/ice/cpp/include/Ice/ObjectFactoryManagerF.h +26 -0
  110. data/ext/ice/cpp/include/Ice/ObserverHelper.h +177 -0
  111. data/ext/ice/cpp/include/Ice/Outgoing.h +197 -0
  112. data/ext/ice/cpp/include/Ice/OutgoingAsync.h +264 -0
  113. data/ext/ice/cpp/include/Ice/OutgoingAsyncF.h +38 -0
  114. data/ext/ice/cpp/include/Ice/Plugin.h +121 -0
  115. data/ext/ice/cpp/include/Ice/PluginF.h +66 -0
  116. data/ext/ice/cpp/include/Ice/Process.h +568 -0
  117. data/ext/ice/cpp/include/Ice/ProcessF.h +77 -0
  118. data/ext/ice/cpp/include/Ice/Properties.h +130 -0
  119. data/ext/ice/cpp/include/Ice/PropertiesAdmin.h +824 -0
  120. data/ext/ice/cpp/include/Ice/PropertiesF.h +83 -0
  121. data/ext/ice/cpp/include/Ice/Protocol.h +242 -0
  122. data/ext/ice/cpp/include/Ice/Proxy.h +2448 -0
  123. data/ext/ice/cpp/include/Ice/ProxyF.h +78 -0
  124. data/ext/ice/cpp/include/Ice/ProxyFactoryF.h +26 -0
  125. data/ext/ice/cpp/include/Ice/ProxyHandle.h +330 -0
  126. data/ext/ice/cpp/include/Ice/ReferenceF.h +34 -0
  127. data/ext/ice/cpp/include/Ice/RemoteLogger.h +1496 -0
  128. data/ext/ice/cpp/include/Ice/RequestHandlerF.h +29 -0
  129. data/ext/ice/cpp/include/Ice/ResponseHandlerF.h +25 -0
  130. data/ext/ice/cpp/include/Ice/Router.h +1155 -0
  131. data/ext/ice/cpp/include/Ice/RouterF.h +77 -0
  132. data/ext/ice/cpp/include/Ice/ServantLocator.h +90 -0
  133. data/ext/ice/cpp/include/Ice/ServantLocatorF.h +60 -0
  134. data/ext/ice/cpp/include/Ice/ServantManagerF.h +26 -0
  135. data/ext/ice/cpp/include/Ice/Service.h +260 -0
  136. data/ext/ice/cpp/include/Ice/SliceChecksumDict.h +56 -0
  137. data/ext/ice/cpp/include/Ice/SliceChecksums.h +34 -0
  138. data/ext/ice/cpp/include/Ice/SlicedData.h +103 -0
  139. data/ext/ice/cpp/include/Ice/SlicedDataF.h +34 -0
  140. data/ext/ice/cpp/include/Ice/Stream.h +449 -0
  141. data/ext/ice/cpp/include/Ice/StreamF.h +30 -0
  142. data/ext/ice/cpp/include/Ice/StreamHelpers.h +877 -0
  143. data/ext/ice/cpp/include/Ice/ThreadPoolF.h +28 -0
  144. data/ext/ice/cpp/include/Ice/UserExceptionFactory.h +56 -0
  145. data/ext/ice/cpp/include/Ice/Version.h +254 -0
  146. data/ext/ice/cpp/include/IceSSL/Config.h +23 -0
  147. data/ext/ice/cpp/include/IceSSL/ConnectionInfo.h +119 -0
  148. data/ext/ice/cpp/include/IceSSL/EndpointInfo.h +101 -0
  149. data/ext/ice/cpp/include/IceSSL/IceSSL.h +22 -0
  150. data/ext/ice/cpp/include/IceSSL/Makefile +26 -0
  151. data/ext/ice/cpp/include/IceSSL/Plugin.h +558 -0
  152. data/ext/ice/cpp/include/IceUtil/AbstractMutex.h +119 -0
  153. data/ext/ice/cpp/include/IceUtil/Cache.h +362 -0
  154. data/ext/ice/cpp/include/IceUtil/Cond.h +323 -0
  155. data/ext/ice/cpp/include/IceUtil/Config.h +234 -0
  156. data/ext/ice/cpp/include/IceUtil/CountDownLatch.h +50 -0
  157. data/ext/ice/cpp/include/IceUtil/CtrlCHandler.h +70 -0
  158. data/ext/ice/cpp/include/IceUtil/DisableWarnings.h +45 -0
  159. data/ext/ice/cpp/include/IceUtil/Exception.h +184 -0
  160. data/ext/ice/cpp/include/IceUtil/Functional.h +389 -0
  161. data/ext/ice/cpp/include/IceUtil/Handle.h +266 -0
  162. data/ext/ice/cpp/include/IceUtil/IceUtil.h +51 -0
  163. data/ext/ice/cpp/include/IceUtil/IconvStringConverter.h +302 -0
  164. data/ext/ice/cpp/include/IceUtil/InputUtil.h +47 -0
  165. data/ext/ice/cpp/include/IceUtil/Iterator.h +36 -0
  166. data/ext/ice/cpp/include/IceUtil/Lock.h +135 -0
  167. data/ext/ice/cpp/include/IceUtil/Makefile +26 -0
  168. data/ext/ice/cpp/include/IceUtil/Monitor.h +249 -0
  169. data/ext/ice/cpp/include/IceUtil/Mutex.h +357 -0
  170. data/ext/ice/cpp/include/IceUtil/MutexProtocol.h +28 -0
  171. data/ext/ice/cpp/include/IceUtil/MutexPtrLock.h +83 -0
  172. data/ext/ice/cpp/include/IceUtil/MutexPtrTryLock.h +82 -0
  173. data/ext/ice/cpp/include/IceUtil/Optional.h +322 -0
  174. data/ext/ice/cpp/include/IceUtil/Options.h +141 -0
  175. data/ext/ice/cpp/include/IceUtil/OutputUtil.h +362 -0
  176. data/ext/ice/cpp/include/IceUtil/PopDisableWarnings.h +19 -0
  177. data/ext/ice/cpp/include/IceUtil/PushDisableWarnings.h +26 -0
  178. data/ext/ice/cpp/include/IceUtil/Random.h +24 -0
  179. data/ext/ice/cpp/include/IceUtil/RecMutex.h +113 -0
  180. data/ext/ice/cpp/include/IceUtil/SHA1.h +65 -0
  181. data/ext/ice/cpp/include/IceUtil/ScannerConfig.h +44 -0
  182. data/ext/ice/cpp/include/IceUtil/ScopedArray.h +97 -0
  183. data/ext/ice/cpp/include/IceUtil/Shared.h +168 -0
  184. data/ext/ice/cpp/include/IceUtil/StringConverter.h +175 -0
  185. data/ext/ice/cpp/include/IceUtil/StringUtil.h +91 -0
  186. data/ext/ice/cpp/include/IceUtil/Thread.h +181 -0
  187. data/ext/ice/cpp/include/IceUtil/ThreadException.h +108 -0
  188. data/ext/ice/cpp/include/IceUtil/Time.h +209 -0
  189. data/ext/ice/cpp/include/IceUtil/Timer.h +143 -0
  190. data/ext/ice/cpp/include/IceUtil/UUID.h +22 -0
  191. data/ext/ice/cpp/include/IceUtil/UndefSysMacros.h +42 -0
  192. data/ext/ice/cpp/include/IceUtil/UniquePtr.h +101 -0
  193. data/ext/ice/cpp/include/Slice/CPlusPlusUtil.h +64 -0
  194. data/ext/ice/cpp/include/Slice/Checksum.h +26 -0
  195. data/ext/ice/cpp/include/Slice/CsUtil.h +92 -0
  196. data/ext/ice/cpp/include/Slice/DotNetNames.h +34 -0
  197. data/ext/ice/cpp/include/Slice/FileTracker.h +71 -0
  198. data/ext/ice/cpp/include/Slice/JavaUtil.h +277 -0
  199. data/ext/ice/cpp/include/Slice/Makefile +26 -0
  200. data/ext/ice/cpp/include/Slice/PHPUtil.h +50 -0
  201. data/ext/ice/cpp/include/Slice/Parser.h +1116 -0
  202. data/ext/ice/cpp/include/Slice/Preprocessor.h +68 -0
  203. data/ext/ice/cpp/include/Slice/PythonUtil.h +64 -0
  204. data/ext/ice/cpp/include/Slice/RubyUtil.h +54 -0
  205. data/ext/ice/cpp/include/Slice/Util.h +33 -0
  206. data/ext/ice/cpp/src/Ice/ACM.cpp +343 -0
  207. data/ext/ice/cpp/src/Ice/ACM.h +117 -0
  208. data/ext/ice/cpp/src/Ice/Acceptor.cpp +16 -0
  209. data/ext/ice/cpp/src/Ice/Acceptor.h +41 -0
  210. data/ext/ice/cpp/src/Ice/AcceptorF.h +30 -0
  211. data/ext/ice/cpp/src/Ice/Application.cpp +760 -0
  212. data/ext/ice/cpp/src/Ice/AsyncResult.cpp +599 -0
  213. data/ext/ice/cpp/src/Ice/Base64.cpp +269 -0
  214. data/ext/ice/cpp/src/Ice/Base64.h +36 -0
  215. data/ext/ice/cpp/src/Ice/BasicStream.cpp +3393 -0
  216. data/ext/ice/cpp/src/Ice/Buffer.cpp +98 -0
  217. data/ext/ice/cpp/src/Ice/BuiltinSequences.cpp +34 -0
  218. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.cpp +718 -0
  219. data/ext/ice/cpp/src/Ice/CollocatedRequestHandler.h +106 -0
  220. data/ext/ice/cpp/src/Ice/Communicator.cpp +45 -0
  221. data/ext/ice/cpp/src/Ice/CommunicatorF.cpp +38 -0
  222. data/ext/ice/cpp/src/Ice/CommunicatorI.cpp +386 -0
  223. data/ext/ice/cpp/src/Ice/CommunicatorI.h +112 -0
  224. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.cpp +546 -0
  225. data/ext/ice/cpp/src/Ice/ConnectRequestHandler.h +97 -0
  226. data/ext/ice/cpp/src/Ice/Connection.cpp +58 -0
  227. data/ext/ice/cpp/src/Ice/ConnectionF.cpp +38 -0
  228. data/ext/ice/cpp/src/Ice/ConnectionFactory.cpp +1639 -0
  229. data/ext/ice/cpp/src/Ice/ConnectionFactory.h +236 -0
  230. data/ext/ice/cpp/src/Ice/ConnectionI.cpp +3876 -0
  231. data/ext/ice/cpp/src/Ice/ConnectionI.h +364 -0
  232. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.cpp +115 -0
  233. data/ext/ice/cpp/src/Ice/ConnectionRequestHandler.h +50 -0
  234. data/ext/ice/cpp/src/Ice/Connector.cpp +16 -0
  235. data/ext/ice/cpp/src/Ice/Connector.h +36 -0
  236. data/ext/ice/cpp/src/Ice/ConnectorF.h +26 -0
  237. data/ext/ice/cpp/src/Ice/Current.cpp +38 -0
  238. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.cpp +168 -0
  239. data/ext/ice/cpp/src/Ice/DefaultsAndOverrides.h +57 -0
  240. data/ext/ice/cpp/src/Ice/DefaultsAndOverridesF.h +26 -0
  241. data/ext/ice/cpp/src/Ice/DeprecatedStringConverter.cpp +60 -0
  242. data/ext/ice/cpp/src/Ice/DispatchInterceptor.cpp +49 -0
  243. data/ext/ice/cpp/src/Ice/DynamicLibrary.cpp +281 -0
  244. data/ext/ice/cpp/src/Ice/Endpoint.cpp +53 -0
  245. data/ext/ice/cpp/src/Ice/EndpointF.cpp +38 -0
  246. data/ext/ice/cpp/src/Ice/EndpointFactory.cpp +25 -0
  247. data/ext/ice/cpp/src/Ice/EndpointFactory.h +44 -0
  248. data/ext/ice/cpp/src/Ice/EndpointFactoryF.h +26 -0
  249. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.cpp +208 -0
  250. data/ext/ice/cpp/src/Ice/EndpointFactoryManager.h +46 -0
  251. data/ext/ice/cpp/src/Ice/EndpointFactoryManagerF.h +26 -0
  252. data/ext/ice/cpp/src/Ice/EndpointI.cpp +87 -0
  253. data/ext/ice/cpp/src/Ice/EndpointI.h +165 -0
  254. data/ext/ice/cpp/src/Ice/EndpointIF.h +41 -0
  255. data/ext/ice/cpp/src/Ice/EndpointTypes.cpp +38 -0
  256. data/ext/ice/cpp/src/Ice/EventHandler.cpp +35 -0
  257. data/ext/ice/cpp/src/Ice/EventHandler.h +78 -0
  258. data/ext/ice/cpp/src/Ice/EventHandlerF.h +26 -0
  259. data/ext/ice/cpp/src/Ice/EventLoggerMsg.h +53 -0
  260. data/ext/ice/cpp/src/Ice/Exception.cpp +832 -0
  261. data/ext/ice/cpp/src/Ice/FacetMap.cpp +34 -0
  262. data/ext/ice/cpp/src/Ice/FactoryTable.cpp +158 -0
  263. data/ext/ice/cpp/src/Ice/FactoryTableInit.cpp +95 -0
  264. data/ext/ice/cpp/src/Ice/GCObject.cpp +444 -0
  265. data/ext/ice/cpp/src/Ice/HashUtil.h +59 -0
  266. data/ext/ice/cpp/src/Ice/HttpParser.cpp +680 -0
  267. data/ext/ice/cpp/src/Ice/HttpParser.h +124 -0
  268. data/ext/ice/cpp/src/Ice/IPEndpointI.cpp +733 -0
  269. data/ext/ice/cpp/src/Ice/IPEndpointI.h +157 -0
  270. data/ext/ice/cpp/src/Ice/IPEndpointIF.h +29 -0
  271. data/ext/ice/cpp/src/Ice/Identity.cpp +42 -0
  272. data/ext/ice/cpp/src/Ice/ImplicitContext.cpp +41 -0
  273. data/ext/ice/cpp/src/Ice/ImplicitContextF.cpp +38 -0
  274. data/ext/ice/cpp/src/Ice/ImplicitContextI.cpp +639 -0
  275. data/ext/ice/cpp/src/Ice/ImplicitContextI.h +51 -0
  276. data/ext/ice/cpp/src/Ice/Incoming.cpp +757 -0
  277. data/ext/ice/cpp/src/Ice/IncomingAsync.cpp +340 -0
  278. data/ext/ice/cpp/src/Ice/IncomingRequest.h +37 -0
  279. data/ext/ice/cpp/src/Ice/Initialize.cpp +401 -0
  280. data/ext/ice/cpp/src/Ice/Instance.cpp +1928 -0
  281. data/ext/ice/cpp/src/Ice/Instance.h +198 -0
  282. data/ext/ice/cpp/src/Ice/Instrumentation.cpp +68 -0
  283. data/ext/ice/cpp/src/Ice/InstrumentationF.cpp +43 -0
  284. data/ext/ice/cpp/src/Ice/InstrumentationI.cpp +1083 -0
  285. data/ext/ice/cpp/src/Ice/InstrumentationI.h +262 -0
  286. data/ext/ice/cpp/src/Ice/LocalException.cpp +2091 -0
  287. data/ext/ice/cpp/src/Ice/LocalObject.cpp +29 -0
  288. data/ext/ice/cpp/src/Ice/Locator.cpp +1946 -0
  289. data/ext/ice/cpp/src/Ice/LocatorF.cpp +39 -0
  290. data/ext/ice/cpp/src/Ice/LocatorInfo.cpp +917 -0
  291. data/ext/ice/cpp/src/Ice/LocatorInfo.h +193 -0
  292. data/ext/ice/cpp/src/Ice/LocatorInfoF.h +34 -0
  293. data/ext/ice/cpp/src/Ice/Logger.cpp +40 -0
  294. data/ext/ice/cpp/src/Ice/LoggerAdminI.cpp +862 -0
  295. data/ext/ice/cpp/src/Ice/LoggerAdminI.h +46 -0
  296. data/ext/ice/cpp/src/Ice/LoggerF.cpp +38 -0
  297. data/ext/ice/cpp/src/Ice/LoggerI.cpp +199 -0
  298. data/ext/ice/cpp/src/Ice/LoggerI.h +57 -0
  299. data/ext/ice/cpp/src/Ice/LoggerUtil.cpp +107 -0
  300. data/ext/ice/cpp/src/Ice/Makefile +190 -0
  301. data/ext/ice/cpp/src/Ice/Metrics.cpp +2159 -0
  302. data/ext/ice/cpp/src/Ice/MetricsAdminI.cpp +669 -0
  303. data/ext/ice/cpp/src/Ice/MetricsObserverI.cpp +14 -0
  304. data/ext/ice/cpp/src/Ice/Network.cpp +2694 -0
  305. data/ext/ice/cpp/src/Ice/Network.h +291 -0
  306. data/ext/ice/cpp/src/Ice/NetworkF.h +28 -0
  307. data/ext/ice/cpp/src/Ice/NetworkProxy.cpp +325 -0
  308. data/ext/ice/cpp/src/Ice/NetworkProxy.h +74 -0
  309. data/ext/ice/cpp/src/Ice/NetworkProxyF.h +26 -0
  310. data/ext/ice/cpp/src/Ice/Object.cpp +440 -0
  311. data/ext/ice/cpp/src/Ice/ObjectAdapter.cpp +41 -0
  312. data/ext/ice/cpp/src/Ice/ObjectAdapterF.cpp +38 -0
  313. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.cpp +241 -0
  314. data/ext/ice/cpp/src/Ice/ObjectAdapterFactory.h +52 -0
  315. data/ext/ice/cpp/src/Ice/ObjectAdapterI.cpp +1498 -0
  316. data/ext/ice/cpp/src/Ice/ObjectAdapterI.h +155 -0
  317. data/ext/ice/cpp/src/Ice/ObjectFactory.cpp +41 -0
  318. data/ext/ice/cpp/src/Ice/ObjectFactoryF.cpp +38 -0
  319. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.cpp +140 -0
  320. data/ext/ice/cpp/src/Ice/ObjectFactoryManager.h +43 -0
  321. data/ext/ice/cpp/src/Ice/ObserverHelper.cpp +84 -0
  322. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.cpp +407 -0
  323. data/ext/ice/cpp/src/Ice/OpaqueEndpointI.h +70 -0
  324. data/ext/ice/cpp/src/Ice/Outgoing.cpp +737 -0
  325. data/ext/ice/cpp/src/Ice/OutgoingAsync.cpp +874 -0
  326. data/ext/ice/cpp/src/Ice/Plugin.cpp +43 -0
  327. data/ext/ice/cpp/src/Ice/PluginF.cpp +38 -0
  328. data/ext/ice/cpp/src/Ice/PluginManagerI.cpp +503 -0
  329. data/ext/ice/cpp/src/Ice/PluginManagerI.h +67 -0
  330. data/ext/ice/cpp/src/Ice/Process.cpp +299 -0
  331. data/ext/ice/cpp/src/Ice/ProcessF.cpp +39 -0
  332. data/ext/ice/cpp/src/Ice/Properties.cpp +45 -0
  333. data/ext/ice/cpp/src/Ice/PropertiesAdmin.cpp +555 -0
  334. data/ext/ice/cpp/src/Ice/PropertiesAdminI.cpp +207 -0
  335. data/ext/ice/cpp/src/Ice/PropertiesAdminI.h +45 -0
  336. data/ext/ice/cpp/src/Ice/PropertiesF.cpp +39 -0
  337. data/ext/ice/cpp/src/Ice/PropertiesI.cpp +759 -0
  338. data/ext/ice/cpp/src/Ice/PropertiesI.h +78 -0
  339. data/ext/ice/cpp/src/Ice/PropertyNames.cpp +1293 -0
  340. data/ext/ice/cpp/src/Ice/PropertyNames.h +81 -0
  341. data/ext/ice/cpp/src/Ice/Protocol.cpp +137 -0
  342. data/ext/ice/cpp/src/Ice/ProtocolInstance.cpp +98 -0
  343. data/ext/ice/cpp/src/Ice/ProtocolInstance.h +91 -0
  344. data/ext/ice/cpp/src/Ice/ProtocolInstanceF.h +26 -0
  345. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.cpp +51 -0
  346. data/ext/ice/cpp/src/Ice/ProtocolPluginFacade.h +67 -0
  347. data/ext/ice/cpp/src/Ice/ProtocolPluginFacadeF.h +26 -0
  348. data/ext/ice/cpp/src/Ice/Proxy.cpp +1810 -0
  349. data/ext/ice/cpp/src/Ice/ProxyFactory.cpp +305 -0
  350. data/ext/ice/cpp/src/Ice/ProxyFactory.h +57 -0
  351. data/ext/ice/cpp/src/Ice/Reference.cpp +1947 -0
  352. data/ext/ice/cpp/src/Ice/Reference.h +305 -0
  353. data/ext/ice/cpp/src/Ice/ReferenceFactory.cpp +937 -0
  354. data/ext/ice/cpp/src/Ice/ReferenceFactory.h +81 -0
  355. data/ext/ice/cpp/src/Ice/ReferenceFactoryF.h +24 -0
  356. data/ext/ice/cpp/src/Ice/RemoteLogger.cpp +958 -0
  357. data/ext/ice/cpp/src/Ice/ReplyStatus.h +29 -0
  358. data/ext/ice/cpp/src/Ice/RequestHandler.cpp +40 -0
  359. data/ext/ice/cpp/src/Ice/RequestHandler.h +90 -0
  360. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.cpp +70 -0
  361. data/ext/ice/cpp/src/Ice/RequestHandlerFactory.h +41 -0
  362. data/ext/ice/cpp/src/Ice/ResponseHandler.cpp +20 -0
  363. data/ext/ice/cpp/src/Ice/ResponseHandler.h +39 -0
  364. data/ext/ice/cpp/src/Ice/RetryQueue.cpp +154 -0
  365. data/ext/ice/cpp/src/Ice/RetryQueue.h +69 -0
  366. data/ext/ice/cpp/src/Ice/RetryQueueF.h +24 -0
  367. data/ext/ice/cpp/src/Ice/Router.cpp +849 -0
  368. data/ext/ice/cpp/src/Ice/RouterF.cpp +39 -0
  369. data/ext/ice/cpp/src/Ice/RouterInfo.cpp +381 -0
  370. data/ext/ice/cpp/src/Ice/RouterInfo.h +148 -0
  371. data/ext/ice/cpp/src/Ice/RouterInfoF.h +30 -0
  372. data/ext/ice/cpp/src/Ice/Selector.cpp +926 -0
  373. data/ext/ice/cpp/src/Ice/Selector.h +231 -0
  374. data/ext/ice/cpp/src/Ice/ServantLocator.cpp +41 -0
  375. data/ext/ice/cpp/src/Ice/ServantLocatorF.cpp +38 -0
  376. data/ext/ice/cpp/src/Ice/ServantManager.cpp +495 -0
  377. data/ext/ice/cpp/src/Ice/ServantManager.h +74 -0
  378. data/ext/ice/cpp/src/Ice/Service.cpp +1897 -0
  379. data/ext/ice/cpp/src/Ice/SharedContext.h +51 -0
  380. data/ext/ice/cpp/src/Ice/SliceChecksumDict.cpp +34 -0
  381. data/ext/ice/cpp/src/Ice/SliceChecksums.cpp +80 -0
  382. data/ext/ice/cpp/src/Ice/SlicedData.cpp +80 -0
  383. data/ext/ice/cpp/src/Ice/Stream.cpp +53 -0
  384. data/ext/ice/cpp/src/Ice/StreamI.cpp +832 -0
  385. data/ext/ice/cpp/src/Ice/StreamI.h +198 -0
  386. data/ext/ice/cpp/src/Ice/StreamSocket.cpp +521 -0
  387. data/ext/ice/cpp/src/Ice/StreamSocket.h +85 -0
  388. data/ext/ice/cpp/src/Ice/StringConverterPlugin.cpp +145 -0
  389. data/ext/ice/cpp/src/Ice/SysLoggerI.cpp +167 -0
  390. data/ext/ice/cpp/src/Ice/SysLoggerI.h +43 -0
  391. data/ext/ice/cpp/src/Ice/TcpAcceptor.cpp +235 -0
  392. data/ext/ice/cpp/src/Ice/TcpAcceptor.h +67 -0
  393. data/ext/ice/cpp/src/Ice/TcpConnector.cpp +133 -0
  394. data/ext/ice/cpp/src/Ice/TcpConnector.h +51 -0
  395. data/ext/ice/cpp/src/Ice/TcpEndpointI.cpp +397 -0
  396. data/ext/ice/cpp/src/Ice/TcpEndpointI.h +93 -0
  397. data/ext/ice/cpp/src/Ice/TcpTransceiver.cpp +127 -0
  398. data/ext/ice/cpp/src/Ice/TcpTransceiver.h +61 -0
  399. data/ext/ice/cpp/src/Ice/ThreadPool.cpp +1357 -0
  400. data/ext/ice/cpp/src/Ice/ThreadPool.h +399 -0
  401. data/ext/ice/cpp/src/Ice/TraceLevels.cpp +43 -0
  402. data/ext/ice/cpp/src/Ice/TraceLevels.h +50 -0
  403. data/ext/ice/cpp/src/Ice/TraceLevelsF.h +26 -0
  404. data/ext/ice/cpp/src/Ice/TraceUtil.cpp +452 -0
  405. data/ext/ice/cpp/src/Ice/TraceUtil.h +28 -0
  406. data/ext/ice/cpp/src/Ice/Transceiver.cpp +24 -0
  407. data/ext/ice/cpp/src/Ice/Transceiver.h +52 -0
  408. data/ext/ice/cpp/src/Ice/TransceiverF.h +38 -0
  409. data/ext/ice/cpp/src/Ice/UdpConnector.cpp +144 -0
  410. data/ext/ice/cpp/src/Ice/UdpConnector.h +51 -0
  411. data/ext/ice/cpp/src/Ice/UdpEndpointI.cpp +483 -0
  412. data/ext/ice/cpp/src/Ice/UdpEndpointI.h +95 -0
  413. data/ext/ice/cpp/src/Ice/UdpTransceiver.cpp +1156 -0
  414. data/ext/ice/cpp/src/Ice/UdpTransceiver.h +123 -0
  415. data/ext/ice/cpp/src/Ice/Version.cpp +46 -0
  416. data/ext/ice/cpp/src/Ice/WSAcceptor.cpp +103 -0
  417. data/ext/ice/cpp/src/Ice/WSAcceptor.h +61 -0
  418. data/ext/ice/cpp/src/Ice/WSConnector.cpp +113 -0
  419. data/ext/ice/cpp/src/Ice/WSConnector.h +51 -0
  420. data/ext/ice/cpp/src/Ice/WSEndpoint.cpp +441 -0
  421. data/ext/ice/cpp/src/Ice/WSEndpoint.h +97 -0
  422. data/ext/ice/cpp/src/Ice/WSTransceiver.cpp +1728 -0
  423. data/ext/ice/cpp/src/Ice/WSTransceiver.h +149 -0
  424. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.cpp +594 -0
  425. data/ext/ice/cpp/src/IceDiscovery/IceDiscovery.h +1035 -0
  426. data/ext/ice/cpp/src/IceDiscovery/LocatorI.cpp +208 -0
  427. data/ext/ice/cpp/src/IceDiscovery/LocatorI.h +78 -0
  428. data/ext/ice/cpp/src/IceDiscovery/LookupI.cpp +308 -0
  429. data/ext/ice/cpp/src/IceDiscovery/LookupI.h +183 -0
  430. data/ext/ice/cpp/src/IceDiscovery/Makefile +61 -0
  431. data/ext/ice/cpp/src/IceDiscovery/PluginI.cpp +148 -0
  432. data/ext/ice/cpp/src/IceDiscovery/PluginI.h +39 -0
  433. data/ext/ice/cpp/src/IceSSL/AcceptorI.cpp +258 -0
  434. data/ext/ice/cpp/src/IceSSL/AcceptorI.h +66 -0
  435. data/ext/ice/cpp/src/IceSSL/Certificate.cpp +1334 -0
  436. data/ext/ice/cpp/src/IceSSL/ConnectionInfo.cpp +42 -0
  437. data/ext/ice/cpp/src/IceSSL/ConnectorI.cpp +151 -0
  438. data/ext/ice/cpp/src/IceSSL/ConnectorI.h +56 -0
  439. data/ext/ice/cpp/src/IceSSL/EndpointI.cpp +397 -0
  440. data/ext/ice/cpp/src/IceSSL/EndpointI.h +96 -0
  441. data/ext/ice/cpp/src/IceSSL/EndpointInfo.cpp +41 -0
  442. data/ext/ice/cpp/src/IceSSL/Instance.cpp +38 -0
  443. data/ext/ice/cpp/src/IceSSL/Instance.h +42 -0
  444. data/ext/ice/cpp/src/IceSSL/InstanceF.h +34 -0
  445. data/ext/ice/cpp/src/IceSSL/Makefile +82 -0
  446. data/ext/ice/cpp/src/IceSSL/OpenSSLEngine.cpp +1001 -0
  447. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.cpp +607 -0
  448. data/ext/ice/cpp/src/IceSSL/OpenSSLTransceiverI.h +75 -0
  449. data/ext/ice/cpp/src/IceSSL/PluginI.cpp +102 -0
  450. data/ext/ice/cpp/src/IceSSL/PluginI.h +56 -0
  451. data/ext/ice/cpp/src/IceSSL/RFC2253.cpp +541 -0
  452. data/ext/ice/cpp/src/IceSSL/RFC2253.h +67 -0
  453. data/ext/ice/cpp/src/IceSSL/SChannelEngine.cpp +729 -0
  454. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.cpp +1062 -0
  455. data/ext/ice/cpp/src/IceSSL/SChannelTransceiverI.h +130 -0
  456. data/ext/ice/cpp/src/IceSSL/SSLEngine.cpp +291 -0
  457. data/ext/ice/cpp/src/IceSSL/SSLEngine.h +264 -0
  458. data/ext/ice/cpp/src/IceSSL/SSLEngineF.h +41 -0
  459. data/ext/ice/cpp/src/IceSSL/SecureTransportEngine.cpp +1514 -0
  460. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.cpp +609 -0
  461. data/ext/ice/cpp/src/IceSSL/SecureTransportTransceiverI.h +91 -0
  462. data/ext/ice/cpp/src/IceSSL/TrustManager.cpp +246 -0
  463. data/ext/ice/cpp/src/IceSSL/TrustManager.h +51 -0
  464. data/ext/ice/cpp/src/IceSSL/TrustManagerF.h +26 -0
  465. data/ext/ice/cpp/src/IceSSL/Util.cpp +1423 -0
  466. data/ext/ice/cpp/src/IceSSL/Util.h +136 -0
  467. data/ext/ice/cpp/src/IceUtil/ArgVector.cpp +65 -0
  468. data/ext/ice/cpp/src/IceUtil/ArgVector.h +41 -0
  469. data/ext/ice/cpp/src/IceUtil/Cond.cpp +386 -0
  470. data/ext/ice/cpp/src/IceUtil/ConvertUTF.cpp +477 -0
  471. data/ext/ice/cpp/src/IceUtil/ConvertUTF.h +144 -0
  472. data/ext/ice/cpp/src/IceUtil/CountDownLatch.cpp +184 -0
  473. data/ext/ice/cpp/src/IceUtil/CtrlCHandler.cpp +273 -0
  474. data/ext/ice/cpp/src/IceUtil/Exception.cpp +782 -0
  475. data/ext/ice/cpp/src/IceUtil/FileUtil.cpp +532 -0
  476. data/ext/ice/cpp/src/IceUtil/FileUtil.h +159 -0
  477. data/ext/ice/cpp/src/IceUtil/InputUtil.cpp +41 -0
  478. data/ext/ice/cpp/src/IceUtil/Makefile +68 -0
  479. data/ext/ice/cpp/src/IceUtil/MutexProtocol.cpp +24 -0
  480. data/ext/ice/cpp/src/IceUtil/Options.cpp +1049 -0
  481. data/ext/ice/cpp/src/IceUtil/OutputUtil.cpp +591 -0
  482. data/ext/ice/cpp/src/IceUtil/Random.cpp +185 -0
  483. data/ext/ice/cpp/src/IceUtil/RecMutex.cpp +257 -0
  484. data/ext/ice/cpp/src/IceUtil/SHA1.cpp +126 -0
  485. data/ext/ice/cpp/src/IceUtil/Shared.cpp +200 -0
  486. data/ext/ice/cpp/src/IceUtil/StopWatch.h +54 -0
  487. data/ext/ice/cpp/src/IceUtil/StringConverter.cpp +450 -0
  488. data/ext/ice/cpp/src/IceUtil/StringUtil.cpp +842 -0
  489. data/ext/ice/cpp/src/IceUtil/Thread.cpp +809 -0
  490. data/ext/ice/cpp/src/IceUtil/ThreadException.cpp +172 -0
  491. data/ext/ice/cpp/src/IceUtil/Time.cpp +306 -0
  492. data/ext/ice/cpp/src/IceUtil/Timer.cpp +251 -0
  493. data/ext/ice/cpp/src/IceUtil/UUID.cpp +174 -0
  494. data/ext/ice/cpp/src/IceUtil/Unicode.cpp +131 -0
  495. data/ext/ice/cpp/src/IceUtil/Unicode.h +49 -0
  496. data/ext/ice/cpp/src/Slice/CPlusPlusUtil.cpp +1139 -0
  497. data/ext/ice/cpp/src/Slice/Checksum.cpp +452 -0
  498. data/ext/ice/cpp/src/Slice/CsUtil.cpp +2650 -0
  499. data/ext/ice/cpp/src/Slice/DotNetNames.cpp +146 -0
  500. data/ext/ice/cpp/src/Slice/FileTracker.cpp +203 -0
  501. data/ext/ice/cpp/src/Slice/Grammar.cpp +4755 -0
  502. data/ext/ice/cpp/src/Slice/Grammar.h +98 -0
  503. data/ext/ice/cpp/src/Slice/GrammarUtil.h +234 -0
  504. data/ext/ice/cpp/src/Slice/JavaUtil.cpp +4376 -0
  505. data/ext/ice/cpp/src/Slice/MD5.cpp +57 -0
  506. data/ext/ice/cpp/src/Slice/MD5.h +44 -0
  507. data/ext/ice/cpp/src/Slice/MD5I.cpp +385 -0
  508. data/ext/ice/cpp/src/Slice/MD5I.h +91 -0
  509. data/ext/ice/cpp/src/Slice/Makefile +65 -0
  510. data/ext/ice/cpp/src/Slice/PHPUtil.cpp +156 -0
  511. data/ext/ice/cpp/src/Slice/Parser.cpp +6386 -0
  512. data/ext/ice/cpp/src/Slice/Preprocessor.cpp +686 -0
  513. data/ext/ice/cpp/src/Slice/Python.cpp +675 -0
  514. data/ext/ice/cpp/src/Slice/PythonUtil.cpp +2614 -0
  515. data/ext/ice/cpp/src/Slice/Ruby.cpp +317 -0
  516. data/ext/ice/cpp/src/Slice/RubyUtil.cpp +1774 -0
  517. data/ext/ice/cpp/src/Slice/Scanner.cpp +2426 -0
  518. data/ext/ice/cpp/src/Slice/Util.cpp +325 -0
  519. data/ext/ice/mcpp/config.h.Darwin +227 -0
  520. data/ext/ice/mcpp/config.h.Linux +227 -0
  521. data/ext/ice/mcpp/config.h.MINGW +7 -0
  522. data/ext/ice/mcpp/configed.H +382 -0
  523. data/ext/ice/mcpp/directive.c +1699 -0
  524. data/ext/ice/mcpp/eval.c +1673 -0
  525. data/ext/ice/mcpp/expand.c +2980 -0
  526. data/ext/ice/mcpp/internal.H +564 -0
  527. data/ext/ice/mcpp/main.c +1131 -0
  528. data/ext/ice/mcpp/mbchar.c +869 -0
  529. data/ext/ice/mcpp/mcpp_lib.h +31 -0
  530. data/ext/ice/mcpp/mcpp_out.h +13 -0
  531. data/ext/ice/mcpp/support.c +2811 -0
  532. data/ext/ice/mcpp/system.H +396 -0
  533. data/ext/ice/mcpp/system.c +4940 -0
  534. data/ice.gemspec +41 -0
  535. data/lib/Glacier2.rb +12 -0
  536. data/lib/Glacier2/Metrics.rb +99 -0
  537. data/lib/Glacier2/PermissionsVerifier.rb +168 -0
  538. data/lib/Glacier2/PermissionsVerifierF.rb +34 -0
  539. data/lib/Glacier2/Router.rb +141 -0
  540. data/lib/Glacier2/RouterF.rb +29 -0
  541. data/lib/Glacier2/SSLInfo.rb +79 -0
  542. data/lib/Glacier2/Session.rb +470 -0
  543. data/lib/Ice.rb +659 -0
  544. data/lib/Ice/BuiltinSequences.rb +64 -0
  545. data/lib/Ice/Communicator.rb +93 -0
  546. data/lib/Ice/CommunicatorF.rb +28 -0
  547. data/lib/Ice/Connection.rb +414 -0
  548. data/lib/Ice/ConnectionF.rb +36 -0
  549. data/lib/Ice/Current.rb +152 -0
  550. data/lib/Ice/Endpoint.rb +265 -0
  551. data/lib/Ice/EndpointF.rb +52 -0
  552. data/lib/Ice/EndpointTypes.rb +77 -0
  553. data/lib/Ice/FacetMap.rb +28 -0
  554. data/lib/Ice/Identity.rb +70 -0
  555. data/lib/Ice/ImplicitContext.rb +59 -0
  556. data/lib/Ice/ImplicitContextF.rb +28 -0
  557. data/lib/Ice/Instrumentation.rb +425 -0
  558. data/lib/Ice/InstrumentationF.rb +35 -0
  559. data/lib/Ice/LocalException.rb +1081 -0
  560. data/lib/Ice/Locator.rb +314 -0
  561. data/lib/Ice/LocatorF.rb +34 -0
  562. data/lib/Ice/Logger.rb +57 -0
  563. data/lib/Ice/LoggerF.rb +28 -0
  564. data/lib/Ice/Metrics.rb +696 -0
  565. data/lib/Ice/ObjectAdapterF.rb +28 -0
  566. data/lib/Ice/ObjectFactory.rb +53 -0
  567. data/lib/Ice/ObjectFactoryF.rb +28 -0
  568. data/lib/Ice/Plugin.rb +87 -0
  569. data/lib/Ice/PluginF.rb +32 -0
  570. data/lib/Ice/Process.rb +93 -0
  571. data/lib/Ice/ProcessF.rb +29 -0
  572. data/lib/Ice/Properties.rb +65 -0
  573. data/lib/Ice/PropertiesAdmin.rb +104 -0
  574. data/lib/Ice/PropertiesF.rb +33 -0
  575. data/lib/Ice/Router.rb +163 -0
  576. data/lib/Ice/RouterF.rb +29 -0
  577. data/lib/Ice/SliceChecksumDict.rb +28 -0
  578. data/lib/Ice/Version.rb +100 -0
  579. data/lib/IceBox.rb +10 -0
  580. data/lib/IceBox/IceBox.rb +272 -0
  581. data/lib/IceGrid.rb +17 -0
  582. data/lib/IceGrid/Admin.rb +1076 -0
  583. data/lib/IceGrid/Descriptor.rb +1505 -0
  584. data/lib/IceGrid/Exception.rb +401 -0
  585. data/lib/IceGrid/FileParser.rb +105 -0
  586. data/lib/IceGrid/Locator.rb +105 -0
  587. data/lib/IceGrid/Observer.rb +571 -0
  588. data/lib/IceGrid/Query.rb +168 -0
  589. data/lib/IceGrid/Registry.rb +120 -0
  590. data/lib/IceGrid/Session.rb +114 -0
  591. data/lib/IceGrid/UserAccountMapper.rb +101 -0
  592. data/lib/IcePatch2.rb +10 -0
  593. data/lib/IcePatch2/FileInfo.rb +75 -0
  594. data/lib/IcePatch2/FileServer.rb +141 -0
  595. data/lib/IceStorm.rb +11 -0
  596. data/lib/IceStorm/IceStorm.rb +463 -0
  597. data/lib/IceStorm/Metrics.rb +155 -0
  598. data/slice/Freeze/BackgroundSaveEvictor.ice +111 -0
  599. data/slice/Freeze/CatalogData.ice +49 -0
  600. data/slice/Freeze/Connection.ice +111 -0
  601. data/slice/Freeze/ConnectionF.ice +20 -0
  602. data/slice/Freeze/DB.ice +37 -0
  603. data/slice/Freeze/Evictor.ice +339 -0
  604. data/slice/Freeze/EvictorF.ice +22 -0
  605. data/slice/Freeze/EvictorStorage.ice +72 -0
  606. data/slice/Freeze/Exception.ice +100 -0
  607. data/slice/Freeze/Transaction.ice +57 -0
  608. data/slice/Freeze/TransactionalEvictor.ice +50 -0
  609. data/slice/Glacier2/Metrics.ice +77 -0
  610. data/slice/Glacier2/PermissionsVerifier.ice +105 -0
  611. data/slice/Glacier2/PermissionsVerifierF.ice +21 -0
  612. data/slice/Glacier2/Router.ice +178 -0
  613. data/slice/Glacier2/RouterF.ice +20 -0
  614. data/slice/Glacier2/SSLInfo.ice +50 -0
  615. data/slice/Glacier2/Session.ice +273 -0
  616. data/slice/Ice/BuiltinSequences.ice +48 -0
  617. data/slice/Ice/Communicator.ice +567 -0
  618. data/slice/Ice/CommunicatorF.ice +20 -0
  619. data/slice/Ice/Connection.ice +323 -0
  620. data/slice/Ice/ConnectionF.ice +22 -0
  621. data/slice/Ice/Current.ice +160 -0
  622. data/slice/Ice/Endpoint.ice +227 -0
  623. data/slice/Ice/EndpointF.ice +32 -0
  624. data/slice/Ice/EndpointTypes.ice +38 -0
  625. data/slice/Ice/FacetMap.ice +25 -0
  626. data/slice/Ice/Identity.ice +59 -0
  627. data/slice/Ice/ImplicitContext.ice +109 -0
  628. data/slice/Ice/ImplicitContextF.ice +20 -0
  629. data/slice/Ice/Instrumentation.ice +499 -0
  630. data/slice/Ice/InstrumentationF.ice +26 -0
  631. data/slice/Ice/LocalException.ice +1015 -0
  632. data/slice/Ice/Locator.ice +227 -0
  633. data/slice/Ice/LocatorF.ice +21 -0
  634. data/slice/Ice/Logger.ice +86 -0
  635. data/slice/Ice/LoggerF.ice +20 -0
  636. data/slice/Ice/Metrics.ice +422 -0
  637. data/slice/Ice/ObjectAdapter.ice +673 -0
  638. data/slice/Ice/ObjectAdapterF.ice +20 -0
  639. data/slice/Ice/ObjectFactory.ice +60 -0
  640. data/slice/Ice/ObjectFactoryF.ice +20 -0
  641. data/slice/Ice/Plugin.ice +117 -0
  642. data/slice/Ice/PluginF.ice +21 -0
  643. data/slice/Ice/Process.ice +54 -0
  644. data/slice/Ice/ProcessF.ice +20 -0
  645. data/slice/Ice/Properties.ice +228 -0
  646. data/slice/Ice/PropertiesAdmin.ice +75 -0
  647. data/slice/Ice/PropertiesF.ice +21 -0
  648. data/slice/Ice/RemoteLogger.ice +232 -0
  649. data/slice/Ice/Router.ice +83 -0
  650. data/slice/Ice/RouterF.ice +20 -0
  651. data/slice/Ice/ServantLocator.ice +117 -0
  652. data/slice/Ice/ServantLocatorF.ice +20 -0
  653. data/slice/Ice/SliceChecksumDict.ice +25 -0
  654. data/slice/Ice/Version.ice +39 -0
  655. data/slice/IceBox/IceBox.ice +194 -0
  656. data/slice/IceDiscovery/IceDiscovery.ice +32 -0
  657. data/slice/IceGrid/Admin.ice +1578 -0
  658. data/slice/IceGrid/Descriptor.ice +1079 -0
  659. data/slice/IceGrid/Discovery.ice +73 -0
  660. data/slice/IceGrid/Exception.ice +383 -0
  661. data/slice/IceGrid/FileParser.ice +61 -0
  662. data/slice/IceGrid/Locator.ice +56 -0
  663. data/slice/IceGrid/Observer.ice +394 -0
  664. data/slice/IceGrid/PluginFacade.ice +316 -0
  665. data/slice/IceGrid/Query.ice +130 -0
  666. data/slice/IceGrid/Registry.ice +138 -0
  667. data/slice/IceGrid/Session.ice +124 -0
  668. data/slice/IceGrid/UserAccountMapper.ice +58 -0
  669. data/slice/IcePatch2/FileInfo.ice +49 -0
  670. data/slice/IcePatch2/FileServer.ice +129 -0
  671. data/slice/IceSSL/ConnectionInfo.ice +34 -0
  672. data/slice/IceSSL/EndpointInfo.ice +41 -0
  673. data/slice/IceStorm/IceStorm.ice +405 -0
  674. data/slice/IceStorm/Metrics.ice +71 -0
  675. metadata +737 -0
@@ -0,0 +1,91 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #ifndef ICE_SSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
11
+ #define ICE_SSL_SECURE_TRANSPORT_TRANSCEIVER_I_H
12
+
13
+ #include <IceSSL/Config.h>
14
+ #include <IceSSL/InstanceF.h>
15
+ #include <IceSSL/SSLEngineF.h>
16
+ #include <IceSSL/Plugin.h>
17
+
18
+ #include <Ice/Transceiver.h>
19
+ #include <Ice/Network.h>
20
+ #include <Ice/StreamSocket.h>
21
+
22
+ #ifdef ICE_USE_SECURE_TRANSPORT
23
+
24
+ #include <Security/Security.h>
25
+ #include <CoreFoundation/CoreFoundation.h>
26
+
27
+ namespace IceSSL
28
+ {
29
+
30
+ class ConnectorI;
31
+ class AcceptorI;
32
+
33
+ class TransceiverI : public IceInternal::Transceiver
34
+ {
35
+ public:
36
+
37
+ virtual IceInternal::NativeInfoPtr getNativeInfo();
38
+
39
+ virtual IceInternal::SocketOperation initialize(IceInternal::Buffer&, IceInternal::Buffer&, bool&);
40
+ virtual IceInternal::SocketOperation closing(bool, const Ice::LocalException&);
41
+ virtual void close();
42
+ virtual IceInternal::SocketOperation write(IceInternal::Buffer&);
43
+ virtual IceInternal::SocketOperation read(IceInternal::Buffer&, bool&);
44
+
45
+ virtual std::string protocol() const;
46
+ virtual std::string toString() const;
47
+ virtual std::string toDetailedString() const;
48
+ virtual Ice::ConnectionInfoPtr getInfo() const;
49
+ virtual void checkSendSize(const IceInternal::Buffer&);
50
+
51
+ OSStatus writeRaw(const char*, size_t*) const;
52
+ OSStatus readRaw(char*, size_t*) const;
53
+
54
+ private:
55
+
56
+ TransceiverI(const InstancePtr&, const IceInternal::StreamSocketPtr&, const std::string&, bool);
57
+ virtual ~TransceiverI();
58
+
59
+ virtual NativeConnectionInfoPtr getNativeConnectionInfo() const;
60
+
61
+ friend class ConnectorI;
62
+ friend class AcceptorI;
63
+
64
+ const InstancePtr _instance;
65
+ const SecureTransportEnginePtr _engine;
66
+ const std::string _host;
67
+ const std::string _adapterName;
68
+ const bool _incoming;
69
+ const IceInternal::StreamSocketPtr _stream;
70
+
71
+ SSLContextRef _ssl;
72
+ SecTrustRef _trust;
73
+
74
+ size_t _buffered;
75
+ enum SSLWantFlags
76
+ {
77
+ SSLWantRead = 0x1,
78
+ SSLWantWrite = 0x2
79
+ };
80
+
81
+ mutable Ice::Byte _flags;
82
+ size_t _maxSendPacketSize;
83
+ size_t _maxRecvPacketSize;
84
+ };
85
+ typedef IceUtil::Handle<TransceiverI> TransceiverIPtr;
86
+
87
+ }
88
+
89
+ #endif
90
+
91
+ #endif
@@ -0,0 +1,246 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #include <IceSSL/TrustManager.h>
11
+ #include <IceSSL/RFC2253.h>
12
+
13
+ #include <Ice/Properties.h>
14
+ #include <Ice/Communicator.h>
15
+ #include <Ice/LocalException.h>
16
+ #include <Ice/Logger.h>
17
+ #include <Ice/LoggerUtil.h>
18
+ #include <Ice/Network.h>
19
+
20
+ using namespace std;
21
+ using namespace IceSSL;
22
+
23
+ IceUtil::Shared* IceSSL::upCast(IceSSL::TrustManager* p) { return p; }
24
+
25
+ TrustManager::TrustManager(const Ice::CommunicatorPtr& communicator) :
26
+ _communicator(communicator)
27
+ {
28
+ Ice::PropertiesPtr properties = communicator->getProperties();
29
+ _traceLevel = properties->getPropertyAsInt("IceSSL.Trace.Security");
30
+ string key;
31
+ try
32
+ {
33
+ key = "IceSSL.TrustOnly";
34
+ parse(properties->getProperty(key), _rejectAll, _acceptAll);
35
+ key = "IceSSL.TrustOnly.Client";
36
+ parse(properties->getProperty(key), _rejectClient, _acceptClient);
37
+ key = "IceSSL.TrustOnly.Server";
38
+ parse(properties->getProperty(key), _rejectAllServer, _acceptAllServer);
39
+ Ice::PropertyDict dict = properties->getPropertiesForPrefix("IceSSL.TrustOnly.Server.");
40
+ for(Ice::PropertyDict::const_iterator p = dict.begin(); p != dict.end(); ++p)
41
+ {
42
+ string name = p->first.substr(string("IceSSL.TrustOnly.Server.").size());
43
+ key = p->first;
44
+ list<DistinguishedName> reject, accept;
45
+ parse(p->second, reject, accept);
46
+ if(!reject.empty())
47
+ {
48
+ _rejectServer[name] = reject;
49
+ }
50
+ if(!accept.empty())
51
+ {
52
+ _acceptServer[name] = accept;
53
+ }
54
+ }
55
+ }
56
+ catch(const ParseException& e)
57
+ {
58
+ Ice::PluginInitializationException ex(__FILE__, __LINE__);
59
+ ex.reason = "IceSSL: invalid property " + key + ":\n" + e.reason;
60
+ throw ex;
61
+ }
62
+ }
63
+
64
+ bool
65
+ TrustManager::verify(const NativeConnectionInfoPtr& info)
66
+ {
67
+ list<list<DistinguishedName> > reject, accept;
68
+
69
+ if(_rejectAll.size() > 0)
70
+ {
71
+ reject.push_back(_rejectAll);
72
+ }
73
+ if(info->incoming)
74
+ {
75
+ if(_rejectAllServer.size() > 0)
76
+ {
77
+ reject.push_back(_rejectAllServer);
78
+ }
79
+ if(info->adapterName.size() > 0)
80
+ {
81
+ map<string, list<DistinguishedName> >::const_iterator p = _rejectServer.find(info->adapterName);
82
+ if(p != _rejectServer.end())
83
+ {
84
+ reject.push_back(p->second);
85
+ }
86
+ }
87
+ }
88
+ else
89
+ {
90
+ if(_rejectClient.size() > 0)
91
+ {
92
+ reject.push_back(_rejectClient);
93
+ }
94
+ }
95
+
96
+ if(_acceptAll.size() > 0)
97
+ {
98
+ accept.push_back(_acceptAll);
99
+ }
100
+ if(info->incoming)
101
+ {
102
+ if(_acceptAllServer.size() > 0)
103
+ {
104
+ accept.push_back(_acceptAllServer);
105
+ }
106
+ if(info->adapterName.size() > 0)
107
+ {
108
+ map<string, list<DistinguishedName> >::const_iterator p = _acceptServer.find(info->adapterName);
109
+ if(p != _acceptServer.end())
110
+ {
111
+ accept.push_back(p->second);
112
+ }
113
+ }
114
+ }
115
+ else
116
+ {
117
+ if(_acceptClient.size() > 0)
118
+ {
119
+ accept.push_back(_acceptClient);
120
+ }
121
+ }
122
+
123
+ //
124
+ // If there is nothing to match against, then we accept the cert.
125
+ //
126
+ if(reject.empty() && accept.empty())
127
+ {
128
+ return true;
129
+ }
130
+
131
+ //
132
+ // If there is no certificate then we match false.
133
+ //
134
+ if(info->nativeCerts.size() != 0)
135
+ {
136
+ DistinguishedName subject = info->nativeCerts[0]->getSubjectDN();
137
+ if(_traceLevel > 0)
138
+ {
139
+ Ice::Trace trace(_communicator->getLogger(), "Security");
140
+ if(info->incoming)
141
+ {
142
+ trace << "trust manager evaluating client:\n"
143
+ << "subject = " << string(subject) << '\n'
144
+ << "adapter = " << info->adapterName << '\n'
145
+ << "local addr = " << info->localAddress << ":" << info->localPort << '\n'
146
+ << "remote addr = " << info->remoteAddress << ":" << info->remotePort;
147
+ }
148
+ else
149
+ {
150
+ trace << "trust manager evaluating server:\n"
151
+ << "subject = " << string(subject) << '\n'
152
+ << "local addr = " << info->localAddress << ":" << info->localPort << '\n'
153
+ << "remote addr = " << info->remoteAddress << ":" << info->remotePort;
154
+ }
155
+ }
156
+
157
+ //
158
+ // Fail if we match anything in the reject set.
159
+ //
160
+ for(list<list<DistinguishedName> >::const_iterator p = reject.begin(); p != reject.end(); ++p)
161
+ {
162
+ if(_traceLevel > 1)
163
+ {
164
+ Ice::Trace trace(_communicator->getLogger(), "Security");
165
+ trace << "trust manager rejecting PDNs:\n";
166
+ for(list<DistinguishedName>::const_iterator r = p->begin(); r != p->end(); ++r)
167
+ {
168
+ if(r != p->begin())
169
+ {
170
+ trace << ';';
171
+ }
172
+ trace << string(*r);
173
+ }
174
+ }
175
+ if(match(*p, subject))
176
+ {
177
+ return false;
178
+ }
179
+ }
180
+
181
+ //
182
+ // Succeed if we match anything in the accept set.
183
+ //
184
+ for(list<list<DistinguishedName> >::const_iterator p = accept.begin(); p != accept.end(); ++p)
185
+ {
186
+ if(_traceLevel > 1)
187
+ {
188
+ Ice::Trace trace(_communicator->getLogger(), "Security");
189
+ trace << "trust manager accepting PDNs:\n";
190
+ for(list<DistinguishedName>::const_iterator r = p->begin(); r != p->end(); ++r)
191
+ {
192
+ if(r != p->begin())
193
+ {
194
+ trace << ';';
195
+ }
196
+ trace << string(*r);
197
+ }
198
+ }
199
+ if(match(*p, subject))
200
+ {
201
+ return true;
202
+ }
203
+ }
204
+
205
+ //
206
+ // At this point we accept the connection if there are no explicit accept rules.
207
+ //
208
+ return accept.empty();
209
+ }
210
+
211
+ return false;
212
+ }
213
+
214
+ bool
215
+ TrustManager::match(const list< DistinguishedName>& matchSet, const DistinguishedName& subject) const
216
+ {
217
+ for(list<DistinguishedName>::const_iterator r = matchSet.begin(); r != matchSet.end(); ++r)
218
+ {
219
+ if(subject.match(*r))
220
+ {
221
+ return true;
222
+ }
223
+ }
224
+ return false;
225
+ }
226
+
227
+ void
228
+ TrustManager::parse(const string& value, list<DistinguishedName>& reject, list<DistinguishedName>& accept) const
229
+ {
230
+ if(!value.empty())
231
+ {
232
+ RFC2253::RDNEntrySeq dns = RFC2253::parse(value);
233
+
234
+ for(RFC2253::RDNEntrySeq::const_iterator p = dns.begin(); p != dns.end(); ++p)
235
+ {
236
+ if(p->negate)
237
+ {
238
+ reject.push_back(DistinguishedName(p->rdn));
239
+ }
240
+ else
241
+ {
242
+ accept.push_back(DistinguishedName(p->rdn));
243
+ }
244
+ }
245
+ }
246
+ }
@@ -0,0 +1,51 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #ifndef ICE_SSL_TRUST_MANAGER_H
11
+ #define ICE_SSL_TRUST_MANAGER_H
12
+
13
+ #include <Ice/CommunicatorF.h>
14
+ #include <IceSSL/TrustManagerF.h>
15
+ #include <IceSSL/Plugin.h>
16
+ #include <IceSSL/RFC2253.h>
17
+ #include <list>
18
+
19
+ namespace IceSSL
20
+ {
21
+
22
+ class TrustManager : public IceUtil::Shared
23
+ {
24
+ public:
25
+
26
+ TrustManager(const Ice::CommunicatorPtr&);
27
+
28
+ bool verify(const NativeConnectionInfoPtr&);
29
+
30
+ private:
31
+
32
+ bool match(const std::list< DistinguishedName> &, const DistinguishedName&) const;
33
+ void parse(const std::string&, std::list<DistinguishedName>&, std::list<DistinguishedName>&) const;
34
+
35
+ const Ice::CommunicatorPtr _communicator;
36
+ int _traceLevel;
37
+
38
+ std::list<DistinguishedName> _rejectAll;
39
+ std::list<DistinguishedName> _rejectClient;
40
+ std::list<DistinguishedName> _rejectAllServer;
41
+ std::map<std::string, std::list<DistinguishedName> > _rejectServer;
42
+
43
+ std::list<DistinguishedName> _acceptAll;
44
+ std::list<DistinguishedName> _acceptClient;
45
+ std::list<DistinguishedName> _acceptAllServer;
46
+ std::map<std::string, std::list<DistinguishedName> > _acceptServer;
47
+ };
48
+
49
+ }
50
+
51
+ #endif
@@ -0,0 +1,26 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #ifndef ICE_SSL_TRUST_MANAGER_F_H
11
+ #define ICE_SSL_TRUST_MANAGER_F_H
12
+
13
+ #include <IceUtil/Shared.h>
14
+
15
+ #include <Ice/Handle.h>
16
+
17
+ namespace IceSSL
18
+ {
19
+
20
+ class TrustManager;
21
+ IceUtil::Shared* upCast(IceSSL::TrustManager*);
22
+ typedef IceInternal::Handle<TrustManager> TrustManagerPtr;
23
+
24
+ }
25
+
26
+ #endif
@@ -0,0 +1,1423 @@
1
+ // **********************************************************************
2
+ //
3
+ // Copyright (c) 2003-2014 ZeroC, Inc. All rights reserved.
4
+ //
5
+ // This copy of Ice is licensed to you under the terms described in the
6
+ // ICE_LICENSE file included in this distribution.
7
+ //
8
+ // **********************************************************************
9
+
10
+ #include <IceUtil/Config.h>
11
+ #ifdef _WIN32
12
+ # include <winsock2.h>
13
+ #endif
14
+
15
+ #include <IceSSL/Util.h>
16
+ #include <IceUtil/FileUtil.h>
17
+ #include <IceUtil/StringUtil.h>
18
+
19
+ #include <Ice/LocalException.h>
20
+ #include <Ice/Network.h>
21
+ #include <Ice/Object.h>
22
+
23
+ #ifdef ICE_USE_OPENSSL
24
+ # include <openssl/err.h>
25
+ //
26
+ // Avoid old style cast warnings from OpenSSL macros
27
+ //
28
+ # pragma GCC diagnostic ignored "-Wold-style-cast"
29
+ #endif
30
+
31
+ using namespace std;
32
+ using namespace Ice;
33
+ using namespace IceUtil;
34
+ using namespace IceSSL;
35
+
36
+ void
37
+ IceSSL::readFile(const string& file, vector<char>& buffer)
38
+ {
39
+ IceUtilInternal::ifstream is(file, ios::in | ios::binary);
40
+ if(!is.good())
41
+ {
42
+ throw CertificateReadException(__FILE__, __LINE__, "error opening file " + file);
43
+ }
44
+
45
+ is.seekg(0, is.end);
46
+ buffer.resize(static_cast<int>(is.tellg()));
47
+ is.seekg(0, is.beg);
48
+
49
+ is.read(&buffer[0], buffer.size());
50
+
51
+ if(!is.good())
52
+ {
53
+ throw CertificateReadException(__FILE__, __LINE__, "error reading file " + file);
54
+ }
55
+ }
56
+
57
+ #ifndef ICE_USE_OPENSSL
58
+ namespace
59
+ {
60
+ bool
61
+ parseBytes(const string& arg, vector<unsigned char>& buffer)
62
+ {
63
+ string v = IceUtilInternal::toUpper(arg);
64
+
65
+ //
66
+ // Check for any invalid characters.
67
+ //
68
+ size_t pos = v.find_first_not_of(" :0123456789ABCDEF");
69
+ if(pos != string::npos)
70
+ {
71
+ return false;
72
+ }
73
+
74
+ //
75
+ // Remove any separator characters.
76
+ //
77
+ ostringstream s;
78
+ for(string::const_iterator i = v.begin(); i != v.end(); ++i)
79
+ {
80
+ if(*i == ' ' || *i == ':')
81
+ {
82
+ continue;
83
+ }
84
+ s << *i;
85
+ }
86
+ v = s.str();
87
+
88
+ //
89
+ // Convert the bytes.
90
+ //
91
+ for(size_t i = 0, length = v.size(); i + 2 <= length;)
92
+ {
93
+ buffer.push_back(static_cast<unsigned char>(strtol(v.substr(i, 2).c_str(), 0, 16)));
94
+ i += 2;
95
+ }
96
+ return true;
97
+ }
98
+ }
99
+ #endif
100
+
101
+ #ifdef ICE_USE_OPENSSL
102
+ namespace
103
+ {
104
+
105
+ # ifndef OPENSSL_NO_DH
106
+
107
+ // The following arrays are predefined Diffie Hellman group parameters.
108
+ // These are known strong primes, distributed with the OpenSSL library
109
+ // in the files dh512.pem, dh1024.pem, dh2048.pem and dh4096.pem.
110
+ // They are not keys themselves, but the basis for generating DH keys
111
+ // on the fly.
112
+
113
+ unsigned char dh512_p[] =
114
+ {
115
+ 0xF5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C,
116
+ 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29,
117
+ 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B,
118
+ 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C,
119
+ 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55,
120
+ 0xE9,0x2A,0x05,0x5F,
121
+ };
122
+
123
+ unsigned char dh512_g[] = { 0x02 };
124
+
125
+ unsigned char dh1024_p[] =
126
+ {
127
+ 0xF4,0x88,0xFD,0x58,0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,
128
+ 0x91,0x07,0x36,0x6B,0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,
129
+ 0x88,0xB3,0x1C,0x7C,0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,
130
+ 0x43,0xF0,0xA5,0x5B,0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,
131
+ 0x38,0xD3,0x34,0xFD,0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,
132
+ 0xDE,0x33,0x21,0x2C,0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,
133
+ 0x18,0x11,0x8D,0x7C,0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,
134
+ 0x19,0xC8,0x07,0x29,0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,
135
+ 0xD0,0x0A,0x50,0x9B,0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,
136
+ 0x41,0x9F,0x9C,0x7C,0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,
137
+ 0xA2,0x5E,0xC3,0x55,0xE9,0x2F,0x78,0xC7,
138
+ };
139
+
140
+ unsigned char dh1024_g[] = { 0x02 };
141
+
142
+ unsigned char dh2048_p[] =
143
+ {
144
+ 0xF6,0x42,0x57,0xB7,0x08,0x7F,0x08,0x17,0x72,0xA2,0xBA,0xD6,
145
+ 0xA9,0x42,0xF3,0x05,0xE8,0xF9,0x53,0x11,0x39,0x4F,0xB6,0xF1,
146
+ 0x6E,0xB9,0x4B,0x38,0x20,0xDA,0x01,0xA7,0x56,0xA3,0x14,0xE9,
147
+ 0x8F,0x40,0x55,0xF3,0xD0,0x07,0xC6,0xCB,0x43,0xA9,0x94,0xAD,
148
+ 0xF7,0x4C,0x64,0x86,0x49,0xF8,0x0C,0x83,0xBD,0x65,0xE9,0x17,
149
+ 0xD4,0xA1,0xD3,0x50,0xF8,0xF5,0x59,0x5F,0xDC,0x76,0x52,0x4F,
150
+ 0x3D,0x3D,0x8D,0xDB,0xCE,0x99,0xE1,0x57,0x92,0x59,0xCD,0xFD,
151
+ 0xB8,0xAE,0x74,0x4F,0xC5,0xFC,0x76,0xBC,0x83,0xC5,0x47,0x30,
152
+ 0x61,0xCE,0x7C,0xC9,0x66,0xFF,0x15,0xF9,0xBB,0xFD,0x91,0x5E,
153
+ 0xC7,0x01,0xAA,0xD3,0x5B,0x9E,0x8D,0xA0,0xA5,0x72,0x3A,0xD4,
154
+ 0x1A,0xF0,0xBF,0x46,0x00,0x58,0x2B,0xE5,0xF4,0x88,0xFD,0x58,
155
+ 0x4E,0x49,0xDB,0xCD,0x20,0xB4,0x9D,0xE4,0x91,0x07,0x36,0x6B,
156
+ 0x33,0x6C,0x38,0x0D,0x45,0x1D,0x0F,0x7C,0x88,0xB3,0x1C,0x7C,
157
+ 0x5B,0x2D,0x8E,0xF6,0xF3,0xC9,0x23,0xC0,0x43,0xF0,0xA5,0x5B,
158
+ 0x18,0x8D,0x8E,0xBB,0x55,0x8C,0xB8,0x5D,0x38,0xD3,0x34,0xFD,
159
+ 0x7C,0x17,0x57,0x43,0xA3,0x1D,0x18,0x6C,0xDE,0x33,0x21,0x2C,
160
+ 0xB5,0x2A,0xFF,0x3C,0xE1,0xB1,0x29,0x40,0x18,0x11,0x8D,0x7C,
161
+ 0x84,0xA7,0x0A,0x72,0xD6,0x86,0xC4,0x03,0x19,0xC8,0x07,0x29,
162
+ 0x7A,0xCA,0x95,0x0C,0xD9,0x96,0x9F,0xAB,0xD0,0x0A,0x50,0x9B,
163
+ 0x02,0x46,0xD3,0x08,0x3D,0x66,0xA4,0x5D,0x41,0x9F,0x9C,0x7C,
164
+ 0xBD,0x89,0x4B,0x22,0x19,0x26,0xBA,0xAB,0xA2,0x5E,0xC3,0x55,
165
+ 0xE9,0x32,0x0B,0x3B,
166
+ };
167
+
168
+ unsigned char dh2048_g[] = { 0x02 };
169
+
170
+ unsigned char dh4096_p[] =
171
+ {
172
+ 0xFA,0x14,0x72,0x52,0xC1,0x4D,0xE1,0x5A,0x49,0xD4,0xEF,0x09,
173
+ 0x2D,0xC0,0xA8,0xFD,0x55,0xAB,0xD7,0xD9,0x37,0x04,0x28,0x09,
174
+ 0xE2,0xE9,0x3E,0x77,0xE2,0xA1,0x7A,0x18,0xDD,0x46,0xA3,0x43,
175
+ 0x37,0x23,0x90,0x97,0xF3,0x0E,0xC9,0x03,0x50,0x7D,0x65,0xCF,
176
+ 0x78,0x62,0xA6,0x3A,0x62,0x22,0x83,0xA1,0x2F,0xFE,0x79,0xBA,
177
+ 0x35,0xFF,0x59,0xD8,0x1D,0x61,0xDD,0x1E,0x21,0x13,0x17,0xFE,
178
+ 0xCD,0x38,0x87,0x9E,0xF5,0x4F,0x79,0x10,0x61,0x8D,0xD4,0x22,
179
+ 0xF3,0x5A,0xED,0x5D,0xEA,0x21,0xE9,0x33,0x6B,0x48,0x12,0x0A,
180
+ 0x20,0x77,0xD4,0x25,0x60,0x61,0xDE,0xF6,0xB4,0x4F,0x1C,0x63,
181
+ 0x40,0x8B,0x3A,0x21,0x93,0x8B,0x79,0x53,0x51,0x2C,0xCA,0xB3,
182
+ 0x7B,0x29,0x56,0xA8,0xC7,0xF8,0xF4,0x7B,0x08,0x5E,0xA6,0xDC,
183
+ 0xA2,0x45,0x12,0x56,0xDD,0x41,0x92,0xF2,0xDD,0x5B,0x8F,0x23,
184
+ 0xF0,0xF3,0xEF,0xE4,0x3B,0x0A,0x44,0xDD,0xED,0x96,0x84,0xF1,
185
+ 0xA8,0x32,0x46,0xA3,0xDB,0x4A,0xBE,0x3D,0x45,0xBA,0x4E,0xF8,
186
+ 0x03,0xE5,0xDD,0x6B,0x59,0x0D,0x84,0x1E,0xCA,0x16,0x5A,0x8C,
187
+ 0xC8,0xDF,0x7C,0x54,0x44,0xC4,0x27,0xA7,0x3B,0x2A,0x97,0xCE,
188
+ 0xA3,0x7D,0x26,0x9C,0xAD,0xF4,0xC2,0xAC,0x37,0x4B,0xC3,0xAD,
189
+ 0x68,0x84,0x7F,0x99,0xA6,0x17,0xEF,0x6B,0x46,0x3A,0x7A,0x36,
190
+ 0x7A,0x11,0x43,0x92,0xAD,0xE9,0x9C,0xFB,0x44,0x6C,0x3D,0x82,
191
+ 0x49,0xCC,0x5C,0x6A,0x52,0x42,0xF8,0x42,0xFB,0x44,0xF9,0x39,
192
+ 0x73,0xFB,0x60,0x79,0x3B,0xC2,0x9E,0x0B,0xDC,0xD4,0xA6,0x67,
193
+ 0xF7,0x66,0x3F,0xFC,0x42,0x3B,0x1B,0xDB,0x4F,0x66,0xDC,0xA5,
194
+ 0x8F,0x66,0xF9,0xEA,0xC1,0xED,0x31,0xFB,0x48,0xA1,0x82,0x7D,
195
+ 0xF8,0xE0,0xCC,0xB1,0xC7,0x03,0xE4,0xF8,0xB3,0xFE,0xB7,0xA3,
196
+ 0x13,0x73,0xA6,0x7B,0xC1,0x0E,0x39,0xC7,0x94,0x48,0x26,0x00,
197
+ 0x85,0x79,0xFC,0x6F,0x7A,0xAF,0xC5,0x52,0x35,0x75,0xD7,0x75,
198
+ 0xA4,0x40,0xFA,0x14,0x74,0x61,0x16,0xF2,0xEB,0x67,0x11,0x6F,
199
+ 0x04,0x43,0x3D,0x11,0x14,0x4C,0xA7,0x94,0x2A,0x39,0xA1,0xC9,
200
+ 0x90,0xCF,0x83,0xC6,0xFF,0x02,0x8F,0xA3,0x2A,0xAC,0x26,0xDF,
201
+ 0x0B,0x8B,0xBE,0x64,0x4A,0xF1,0xA1,0xDC,0xEE,0xBA,0xC8,0x03,
202
+ 0x82,0xF6,0x62,0x2C,0x5D,0xB6,0xBB,0x13,0x19,0x6E,0x86,0xC5,
203
+ 0x5B,0x2B,0x5E,0x3A,0xF3,0xB3,0x28,0x6B,0x70,0x71,0x3A,0x8E,
204
+ 0xFF,0x5C,0x15,0xE6,0x02,0xA4,0xCE,0xED,0x59,0x56,0xCC,0x15,
205
+ 0x51,0x07,0x79,0x1A,0x0F,0x25,0x26,0x27,0x30,0xA9,0x15,0xB2,
206
+ 0xC8,0xD4,0x5C,0xCC,0x30,0xE8,0x1B,0xD8,0xD5,0x0F,0x19,0xA8,
207
+ 0x80,0xA4,0xC7,0x01,0xAA,0x8B,0xBA,0x53,0xBB,0x47,0xC2,0x1F,
208
+ 0x6B,0x54,0xB0,0x17,0x60,0xED,0x79,0x21,0x95,0xB6,0x05,0x84,
209
+ 0x37,0xC8,0x03,0xA4,0xDD,0xD1,0x06,0x69,0x8F,0x4C,0x39,0xE0,
210
+ 0xC8,0x5D,0x83,0x1D,0xBE,0x6A,0x9A,0x99,0xF3,0x9F,0x0B,0x45,
211
+ 0x29,0xD4,0xCB,0x29,0x66,0xEE,0x1E,0x7E,0x3D,0xD7,0x13,0x4E,
212
+ 0xDB,0x90,0x90,0x58,0xCB,0x5E,0x9B,0xCD,0x2E,0x2B,0x0F,0xA9,
213
+ 0x4E,0x78,0xAC,0x05,0x11,0x7F,0xE3,0x9E,0x27,0xD4,0x99,0xE1,
214
+ 0xB9,0xBD,0x78,0xE1,0x84,0x41,0xA0,0xDF,
215
+ };
216
+
217
+ unsigned char dh4096_g[] = { 0x02 };
218
+
219
+ }
220
+
221
+ //
222
+ // Convert a predefined parameter set into a DH value.
223
+ //
224
+ static DH*
225
+ convertDH(unsigned char* p, int plen, unsigned char* g, int glen)
226
+ {
227
+ assert(p != 0);
228
+ assert(g != 0);
229
+
230
+ DH* dh = DH_new();
231
+
232
+ if(dh != 0)
233
+ {
234
+ dh->p = BN_bin2bn(p, plen, 0);
235
+ dh->g = BN_bin2bn(g, glen, 0);
236
+
237
+ if((dh->p == 0) || (dh->g == 0))
238
+ {
239
+ DH_free(dh);
240
+ dh = 0;
241
+ }
242
+ }
243
+
244
+ return dh;
245
+ }
246
+
247
+ IceSSL::DHParams::DHParams() :
248
+ _dh512(0), _dh1024(0), _dh2048(0), _dh4096(0)
249
+ {
250
+ }
251
+
252
+ IceSSL::DHParams::~DHParams()
253
+ {
254
+ for(ParamList::iterator p = _params.begin(); p != _params.end(); ++p)
255
+ {
256
+ DH_free(p->second);
257
+ }
258
+ DH_free(_dh512);
259
+ DH_free(_dh1024);
260
+ DH_free(_dh2048);
261
+ DH_free(_dh4096);
262
+ }
263
+
264
+ bool
265
+ IceSSL::DHParams::add(int keyLength, const string& file)
266
+ {
267
+ BIO* bio = BIO_new(BIO_s_file());
268
+ if(BIO_read_filename(bio, file.c_str()) <= 0)
269
+ {
270
+ BIO_free(bio);
271
+ return false;
272
+ }
273
+ DH* dh = PEM_read_bio_DHparams(bio, 0, 0, 0);
274
+ BIO_free(bio);
275
+ if(!dh)
276
+ {
277
+ return false;
278
+ }
279
+ ParamList::iterator p = _params.begin();
280
+ while(p != _params.end() && keyLength > p->first)
281
+ {
282
+ ++p;
283
+ }
284
+ _params.insert(p, KeyParamPair(keyLength, dh));
285
+ return true;
286
+ }
287
+
288
+ DH*
289
+ IceSSL::DHParams::get(int keyLength)
290
+ {
291
+ //
292
+ // First check the set of parameters specified by the user.
293
+ // Return the first set whose key length is at least keyLength.
294
+ //
295
+ for(ParamList::iterator p = _params.begin(); p != _params.end(); ++p)
296
+ {
297
+ if(p->first >= keyLength)
298
+ {
299
+ return p->second;
300
+ }
301
+ }
302
+
303
+ //
304
+ // No match found. Use one of the predefined parameter sets instead.
305
+ //
306
+ IceUtil::Mutex::Lock sync(*this);
307
+
308
+ if(keyLength >= 4096)
309
+ {
310
+ if(!_dh4096)
311
+ {
312
+ _dh4096 = convertDH(dh4096_p, (int) sizeof(dh4096_p), dh4096_g, (int) sizeof(dh4096_g));
313
+ }
314
+ return _dh4096;
315
+ }
316
+ else if(keyLength >= 2048)
317
+ {
318
+ if(!_dh2048)
319
+ {
320
+ _dh2048 = convertDH(dh2048_p, (int) sizeof(dh2048_p), dh2048_g, (int) sizeof(dh2048_g));
321
+ }
322
+ return _dh2048;
323
+ }
324
+ else if(keyLength >= 1024)
325
+ {
326
+ if(!_dh1024)
327
+ {
328
+ _dh1024 = convertDH(dh1024_p, (int) sizeof(dh1024_p), dh1024_g, (int) sizeof(dh1024_g));
329
+ }
330
+ return _dh1024;
331
+ }
332
+ else
333
+ {
334
+ if(!_dh512)
335
+ {
336
+ _dh512 = convertDH(dh512_p, (int) sizeof(dh512_p), dh512_g, (int) sizeof(dh512_g));
337
+ }
338
+ return _dh512;
339
+ }
340
+ }
341
+
342
+ # endif
343
+
344
+ string
345
+ IceSSL::getSslErrors(bool verbose)
346
+ {
347
+ ostringstream ostr;
348
+
349
+ const char* file;
350
+ const char* data;
351
+ int line;
352
+ int flags;
353
+ unsigned long err;
354
+ int count = 0;
355
+ while((err = ERR_get_error_line_data(&file, &line, &data, &flags)) != 0)
356
+ {
357
+ if(count > 0)
358
+ {
359
+ ostr << endl;
360
+ }
361
+
362
+ if(verbose)
363
+ {
364
+ if(count > 0)
365
+ {
366
+ ostr << endl;
367
+ }
368
+
369
+ char buf[200];
370
+ ERR_error_string_n(err, buf, sizeof(buf));
371
+
372
+ ostr << "error # = " << err << endl;
373
+ ostr << "message = " << buf << endl;
374
+ ostr << "location = " << file << ", " << line;
375
+ if(flags & ERR_TXT_STRING)
376
+ {
377
+ ostr << endl;
378
+ ostr << "data = " << data;
379
+ }
380
+ }
381
+ else
382
+ {
383
+ const char* reason = ERR_reason_error_string(err);
384
+ ostr << (reason == NULL ? "unknown reason" : reason);
385
+ if(flags & ERR_TXT_STRING)
386
+ {
387
+ ostr << ": " << data;
388
+ }
389
+ }
390
+
391
+ ++count;
392
+ }
393
+
394
+ ERR_clear_error();
395
+
396
+ return ostr.str();
397
+ }
398
+
399
+ #elif defined(ICE_USE_SECURE_TRANSPORT)
400
+
401
+ string
402
+ IceSSL::errorToString(CFErrorRef err)
403
+ {
404
+ ostringstream os;
405
+ if(err)
406
+ {
407
+ CFStringRef s = CFErrorCopyDescription(err);
408
+ os << "(error: " << CFErrorGetCode(err) << " description: " << fromCFString(s) << ")";
409
+ CFRelease(s);
410
+ }
411
+ return os.str();
412
+ }
413
+
414
+ string
415
+ IceSSL::errorToString(OSStatus status)
416
+ {
417
+ ostringstream os;
418
+ os << "(error: " << status;
419
+ CFStringRef s = SecCopyErrorMessageString(status, 0);
420
+ if(s)
421
+ {
422
+ os << " description: " << fromCFString(s);
423
+ CFRelease(s);
424
+ }
425
+ os << ")";
426
+ return os.str();
427
+ }
428
+
429
+ std::string
430
+ IceSSL::fromCFString(CFStringRef v)
431
+ {
432
+ string s;
433
+ if(v)
434
+ {
435
+ CFIndex size = CFStringGetMaximumSizeForEncoding(CFStringGetLength(v), kCFStringEncodingUTF8);
436
+ vector<char> buffer;
437
+ buffer.resize(size + 1);
438
+ CFStringGetCString(v, &buffer[0], buffer.size(), kCFStringEncodingUTF8);
439
+ s.assign(&buffer[0]);
440
+ }
441
+ return s;
442
+ }
443
+
444
+ CFDictionaryRef
445
+ IceSSL::getCertificateProperty(SecCertificateRef cert, CFTypeRef key)
446
+ {
447
+ CFArrayRef keys = CFArrayCreate(NULL, &key , 1, &kCFTypeArrayCallBacks);
448
+ CFErrorRef err = 0;
449
+ CFDictionaryRef values = SecCertificateCopyValues(cert, keys, &err);
450
+ CFRelease(keys);
451
+
452
+ if(err)
453
+ {
454
+ CertificateEncodingException ex(__FILE__, __LINE__, err);
455
+ throw ex;
456
+ }
457
+
458
+ assert(values);
459
+ CFDictionaryRef property = (CFDictionaryRef)CFDictionaryGetValue(values, key);
460
+ if(property)
461
+ {
462
+ CFRetain(property);
463
+ }
464
+ CFRelease(values);
465
+ return property;
466
+ }
467
+
468
+ namespace
469
+ {
470
+
471
+ //
472
+ // Retrive the certificate subject key identifier, the caller must release the returned CFData
473
+ // object.
474
+ //
475
+ CFDataRef
476
+ getSubjectKeyIdentifier(SecCertificateRef cert)
477
+ {
478
+ CFDataRef data = 0;
479
+ CFDictionaryRef property = getCertificateProperty(cert, kSecOIDSubjectKeyIdentifier);
480
+ if(property)
481
+ {
482
+ CFArrayRef propertyValues = (CFArrayRef)CFDictionaryGetValue(property, kSecPropertyKeyValue);
483
+ for(int i = 0, length = CFArrayGetCount(propertyValues); i < length; ++i)
484
+ {
485
+ CFDictionaryRef dict = (CFDictionaryRef)CFArrayGetValueAtIndex(propertyValues, i);
486
+ CFStringRef label = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyLabel);
487
+ if(CFEqual(label, CFSTR("Key Identifier")))
488
+ {
489
+ data = (CFDataRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue);
490
+ CFRetain(data);
491
+ break;
492
+ }
493
+ }
494
+ CFRelease(property);
495
+ }
496
+ return data;
497
+ }
498
+
499
+ //
500
+ // Check the certificate basic constraints to check if the certificate is marked as a CA.
501
+ //
502
+ bool
503
+ isCA(SecCertificateRef cert)
504
+ {
505
+ bool ca = false;
506
+ CFDictionaryRef property = getCertificateProperty(cert, kSecOIDBasicConstraints);
507
+ if(property)
508
+ {
509
+ CFArrayRef propertyValues = (CFArrayRef)CFDictionaryGetValue(property, kSecPropertyKeyValue);
510
+ for(int i = 0, size = CFArrayGetCount(propertyValues); i < size; ++i)
511
+ {
512
+ CFDictionaryRef dict = (CFDictionaryRef)CFArrayGetValueAtIndex(propertyValues, i);
513
+ CFStringRef label = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyLabel);
514
+ if(CFEqual(label, CFSTR("Certificate Authority")))
515
+ {
516
+ CFStringRef value = (CFStringRef)CFDictionaryGetValue(dict, kSecPropertyKeyValue);
517
+ if(CFEqual(value, CFSTR("Yes")))
518
+ {
519
+ ca = true;
520
+ }
521
+ break;
522
+ }
523
+ }
524
+ CFRelease(property);
525
+ }
526
+ return ca;
527
+ }
528
+
529
+ //
530
+ // Search the keychain for an existing item with the same hash and type,
531
+ // the hash is the certificate subject key identifier. For private key
532
+ // items the hash should match kSecAttrApplicationLabel attribute, for
533
+ // certificate items it should match the kSecAttrSubjectKeyID attribute.
534
+ //
535
+ SecKeychainItemRef
536
+ copyMatching(SecKeychainRef keychain, CFDataRef hash, CFTypeRef type)
537
+ {
538
+ assert(keychain);
539
+ assert(hash);
540
+ assert(type == kSecClassKey || type == kSecClassCertificate);
541
+
542
+ const void* values[] = {keychain};
543
+ CFArrayRef searchList = CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks);
544
+
545
+ CFMutableDictionaryRef query =
546
+ CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
547
+
548
+ CFDictionarySetValue(query, kSecClass, type);
549
+ CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitOne);
550
+ CFDictionarySetValue(query, kSecMatchSearchList, searchList);
551
+ CFDictionarySetValue(query, type == kSecClassKey ? kSecAttrApplicationLabel : kSecAttrSubjectKeyID, hash);
552
+ CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
553
+
554
+ SecKeychainItemRef item = 0;
555
+ OSStatus err = SecItemCopyMatching(query, (CFTypeRef*)&item);
556
+
557
+ CFRelease(searchList);
558
+ CFRelease(query);
559
+
560
+ if(err != noErr && err != errSecItemNotFound)
561
+ {
562
+ throw CertificateReadException(__FILE__, __LINE__,
563
+ "Error searching for keychain items\n" + errorToString(err));
564
+ }
565
+
566
+ return item;
567
+ }
568
+
569
+ //
570
+ // Add an item to the keychain, if the keychain already has this item return the existing item,
571
+ // otherwise return the new added item.
572
+ //
573
+ SecKeychainItemRef
574
+ addToKeychain(SecKeychainRef keychain, SecKeychainItemRef item, CFDataRef hash, CFTypeRef type)
575
+ {
576
+ assert(keychain);
577
+ assert(item);
578
+ assert(hash);
579
+
580
+ SecKeychainItemRef newItem = copyMatching(keychain, hash, type);
581
+ if(!newItem)
582
+ {
583
+ CFMutableDictionaryRef query = CFDictionaryCreateMutable(kCFAllocatorDefault,
584
+ 0,
585
+ &kCFTypeDictionaryKeyCallBacks,
586
+ &kCFTypeDictionaryValueCallBacks);
587
+
588
+ CFDictionarySetValue(query, kSecUseKeychain, keychain);
589
+ CFDictionarySetValue(query, kSecClass, type);
590
+ CFDictionarySetValue(query, kSecValueRef, item);
591
+ CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
592
+
593
+ CFArrayRef added = 0;
594
+ OSStatus err = SecItemAdd(query, (CFTypeRef*)&added);
595
+ CFRelease(query);
596
+
597
+ if(err != noErr)
598
+ {
599
+ ostringstream os;
600
+ os << "Failure adding " << (type == kSecClassKey ? "key" : "certificate")
601
+ << " to keychain\n" << errorToString(err);
602
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
603
+ }
604
+ newItem = (SecKeychainItemRef)CFArrayGetValueAtIndex(added, 0);
605
+ CFRetain(newItem);
606
+ CFRelease(added);
607
+ }
608
+
609
+ assert(newItem);
610
+
611
+ return newItem;
612
+ }
613
+
614
+ //
615
+ // Load keychain items (Certificates or Private Keys) from a file. On return items param contain
616
+ // the list of items, the caller must release it.
617
+ //
618
+ void
619
+ loadKeychainItems(CFArrayRef* items, CFTypeRef type, const string& file, SecExternalFormat* format,
620
+ SecKeychainRef keychain, const string& passphrase, const PasswordPromptPtr& prompt,
621
+ int passwordRetryMax)
622
+ {
623
+ assert(type == kSecClassCertificate || type == kSecClassKey);
624
+ vector<char> buffer;
625
+ readFile(file, buffer);
626
+
627
+ CFDataRef data = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault,
628
+ reinterpret_cast<const UInt8*>(&buffer[0]),
629
+ buffer.size(),
630
+ kCFAllocatorNull);
631
+
632
+ SecExternalItemType itemType = kSecItemTypeUnknown;
633
+
634
+ SecItemImportExportKeyParameters params;
635
+ memset(&params, 0, sizeof(params));
636
+ params.version = SEC_KEY_IMPORT_EXPORT_PARAMS_VERSION;
637
+
638
+ {
639
+ const void* values[] = {kSecACLAuthorizationAny};
640
+ params.keyUsage = CFArrayCreate(0, values, 1, 0);
641
+ }
642
+
643
+ params.flags |= kSecKeyNoAccessControl;
644
+
645
+ OSStatus err = noErr;
646
+ int count = 0;
647
+
648
+ while(true)
649
+ {
650
+ if(!passphrase.empty())
651
+ {
652
+ assert(!params.passphrase);
653
+ params.passphrase = toCFString(passphrase);
654
+ }
655
+ err = SecItemImport(data, 0, format, &itemType, 0, &params, *format == kSecFormatPKCS12 ? keychain : 0,
656
+ items);
657
+ if(params.passphrase)
658
+ {
659
+ CFRelease(params.passphrase);
660
+ params.passphrase = 0;
661
+ }
662
+
663
+ if(err == noErr)
664
+ {
665
+ break;
666
+ }
667
+
668
+ //
669
+ // Try PKCS12 format.
670
+ //
671
+ if(err == errSecUnknownFormat && *format != kSecFormatPKCS12)
672
+ {
673
+ *format = kSecFormatPKCS12;
674
+ itemType = kSecItemTypeAggregate;
675
+ continue;
676
+ }
677
+
678
+ //
679
+ // Error
680
+ //
681
+ if(!passphrase.empty() || (err != errSecPassphraseRequired &&
682
+ err != errSecInvalidData &&
683
+ err != errSecPkcs12VerifyFailure))
684
+ {
685
+ break;
686
+ }
687
+
688
+ if(prompt && count < passwordRetryMax)
689
+ {
690
+ params.passphrase = toCFString(prompt->getPassword());
691
+ }
692
+ //
693
+ // Configure the default OS X password prompt if passphrase is required
694
+ // and the user doesn't provide a passphrase or password prompt.
695
+ //
696
+ else if(!prompt && !(params.flags & kSecKeySecurePassphrase))
697
+ {
698
+ params.flags |= kSecKeySecurePassphrase;
699
+ ostringstream os;
700
+ os << "Enter the password for\n" << file;
701
+ params.alertPrompt = toCFString(os.str());
702
+ continue;
703
+ }
704
+ //
705
+ // Password retry.
706
+ //
707
+ if(++count >= passwordRetryMax)
708
+ {
709
+ break;
710
+ }
711
+ }
712
+
713
+ if(params.alertPrompt)
714
+ {
715
+ CFRelease(params.alertPrompt);
716
+ }
717
+
718
+ CFRelease(data);
719
+
720
+ if(err != noErr)
721
+ {
722
+ ostringstream os;
723
+ os << "Error reading " << (type == kSecClassCertificate ? "certificate " : "private key ")
724
+ << "from file: `" << file << "'\n" << errorToString(err);
725
+ throw CertificateReadException(__FILE__, __LINE__, os.str());
726
+ }
727
+ }
728
+
729
+ }
730
+
731
+ //
732
+ // Helper function to generate the private key label (display name) used
733
+ // in the keychain.
734
+ //
735
+ string
736
+ IceSSL::keyLabel(SecCertificateRef cert)
737
+ {
738
+ CFStringRef commonName;
739
+ OSStatus err = SecCertificateCopyCommonName(cert, &commonName);
740
+ if(err != noErr)
741
+ {
742
+ throw CertificateReadException(__FILE__, __LINE__, "certificate error:\n" + errorToString(err));
743
+ }
744
+ string label = fromCFString(commonName);
745
+ CFRelease(commonName);
746
+ return label.empty() ? "Imported Private Key" : (label + " - Private Key");
747
+ }
748
+
749
+ //
750
+ // Imports a certificate private key and optionally add it to a keychain.
751
+ //
752
+ void
753
+ IceSSL::loadPrivateKey(SecKeyRef* key, const string& label, CFDataRef hash, SecKeychainRef keychain,
754
+ const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
755
+ int passwordRetryMax)
756
+ {
757
+ assert(key);
758
+ CFArrayRef items = 0;
759
+ try
760
+ {
761
+ SecExternalFormat format = kSecFormatUnknown;
762
+ loadKeychainItems(&items, kSecClassKey, file, &format, keychain, passphrase, prompt, passwordRetryMax);
763
+ if(items)
764
+ {
765
+ int count = CFArrayGetCount(items);
766
+ for(int i = 0; i < count; ++i)
767
+ {
768
+ SecKeychainItemRef item = (SecKeychainItemRef)CFArrayGetValueAtIndex(items, 0);
769
+ if(SecKeyGetTypeID() == CFGetTypeID(item))
770
+ {
771
+ CFRetain(item);
772
+ *key = (SecKeyRef)item;
773
+
774
+ CFRelease(items);
775
+ items = 0;
776
+
777
+ if(keychain)
778
+ {
779
+ SecKeychainItemRef newItem = addToKeychain(keychain, item, hash, kSecClassKey);
780
+ assert(newItem);
781
+ CFRelease(*key);
782
+ *key = (SecKeyRef)newItem;
783
+ if(hash)
784
+ {
785
+ //
786
+ // Create the association between the private key and the certificate,
787
+ // kSecKeyLabel attribute should match the subject key identifier.
788
+ //
789
+ SecKeychainAttribute attr;
790
+ attr.tag = kSecKeyLabel;
791
+ attr.data = (void*)CFDataGetBytePtr(hash);
792
+ attr.length = CFDataGetLength(hash);
793
+
794
+ SecKeychainAttributeList attrs;
795
+ attrs.attr = &attr;
796
+ attrs.count = 1;
797
+
798
+ SecKeychainItemModifyAttributesAndData(newItem, &attrs, 0, 0);
799
+ }
800
+
801
+ if(!label.empty())
802
+ {
803
+ //
804
+ // kSecKeyPrintName attribute correspond to the keychain display
805
+ // name.
806
+ //
807
+ SecKeychainAttribute att;
808
+ att.tag = kSecKeyPrintName;
809
+ att.data = (void*)label.c_str();
810
+ att.length = label.size();
811
+
812
+ SecKeychainAttributeList attrs;
813
+ attrs.attr = &att;
814
+ attrs.count = 1;
815
+
816
+ SecKeychainItemModifyAttributesAndData(newItem, &attrs, 0, 0);
817
+ }
818
+ }
819
+ break;
820
+ }
821
+ }
822
+ }
823
+
824
+ if(!*key)
825
+ {
826
+ throw CertificateReadException(__FILE__, __LINE__,
827
+ "Certificate error:\n error importing certificate from " + file);
828
+ }
829
+ }
830
+ catch(...)
831
+ {
832
+ if(items)
833
+ {
834
+ CFRelease(items);
835
+ }
836
+
837
+ if(*key)
838
+ {
839
+ CFRelease(*key);
840
+ *key = 0;
841
+ }
842
+
843
+ throw;
844
+ }
845
+ }
846
+
847
+ //
848
+ // Imports a certificate and private key and optionally add then to a keychain.
849
+ //
850
+ void
851
+ IceSSL::loadCertificate(SecCertificateRef* cert, CFDataRef* hash, SecKeyRef* key, SecKeychainRef keychain,
852
+ const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
853
+ int passwordRetryMax)
854
+ {
855
+ assert(cert);
856
+ CFArrayRef items = 0;
857
+ SecIdentityRef identity = 0;
858
+
859
+ try
860
+ {
861
+ SecExternalFormat format = kSecFormatUnknown;
862
+ loadKeychainItems(&items, kSecClassCertificate, file, &format, keychain, passphrase, prompt, passwordRetryMax);
863
+
864
+ if(items)
865
+ {
866
+ int count = CFArrayGetCount(items);
867
+
868
+ for(int i = 0; i < count; ++i)
869
+ {
870
+ SecKeychainItemRef item = (SecKeychainItemRef)CFArrayGetValueAtIndex(items, i);
871
+ if(format == kSecFormatPKCS12)
872
+ {
873
+ OSStatus err = noErr;
874
+ if(SecIdentityGetTypeID() == CFGetTypeID(item))
875
+ {
876
+ if((err = SecIdentityCopyCertificate((SecIdentityRef)item, cert)) != noErr)
877
+ {
878
+ throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
879
+ errorToString(err));
880
+ }
881
+
882
+ if((err = SecIdentityCopyPrivateKey((SecIdentityRef)item, key)) != noErr)
883
+ {
884
+ throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
885
+ errorToString(err));
886
+ }
887
+ break;
888
+ }
889
+ else if(SecCertificateGetTypeID() == CFGetTypeID(item))
890
+ {
891
+ CFRetain(item);
892
+ *cert = (SecCertificateRef)item;
893
+
894
+ if((err = SecIdentityCreateWithCertificate(keychain, *cert, &identity)) != noErr)
895
+ {
896
+ throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
897
+ errorToString(err));
898
+ }
899
+ if((err = SecIdentityCopyPrivateKey(identity, key)) != noErr)
900
+ {
901
+ throw CertificateReadException(__FILE__, __LINE__, "Certificate error:\n" +
902
+ errorToString(err));
903
+ }
904
+
905
+ CFRelease(identity);
906
+ identity = 0;
907
+ break;
908
+ }
909
+ }
910
+ else if(SecCertificateGetTypeID() == CFGetTypeID(item))
911
+ {
912
+ CFRetain(item);
913
+ *cert = (SecCertificateRef)item;
914
+
915
+ //
916
+ // Copy the public key hash, that is used when added the private key
917
+ // to create an association between the certificate and the corresponding
918
+ // private key.
919
+ //
920
+ if(hash)
921
+ {
922
+ *hash = getSubjectKeyIdentifier(*cert);
923
+
924
+ if(keychain)
925
+ {
926
+ SecKeychainItemRef newItem = addToKeychain(keychain, item, *hash, kSecClassCertificate);
927
+ assert(newItem);
928
+ CFRelease(*cert);
929
+ *cert = (SecCertificateRef)newItem;
930
+ }
931
+ }
932
+ break;
933
+ }
934
+ }
935
+
936
+ CFRelease(items);
937
+ items = 0;
938
+ }
939
+
940
+ if(!*cert)
941
+ {
942
+ throw CertificateReadException(__FILE__, __LINE__,
943
+ "Certificate error:\n error importing certificate from " + file);
944
+ }
945
+ }
946
+ catch(...)
947
+ {
948
+ if(*cert)
949
+ {
950
+ CFRelease(*cert);
951
+ *cert = 0;
952
+ }
953
+
954
+ if(hash && *hash)
955
+ {
956
+ CFRelease(*hash);
957
+ *hash = 0;
958
+ }
959
+
960
+ if(items)
961
+ {
962
+ CFRelease(items);
963
+ }
964
+
965
+ if(identity)
966
+ {
967
+ CFRelease(identity);
968
+ }
969
+
970
+ if(key && *key)
971
+ {
972
+ CFRelease(*key);
973
+ *key = 0;
974
+ }
975
+
976
+ throw;
977
+ }
978
+ }
979
+
980
+ CFArrayRef
981
+ IceSSL::loadCACertificates(const string& file, const string& passphrase, const PasswordPromptPtr& prompt,
982
+ int passwordRetryMax)
983
+ {
984
+ CFArrayRef items = 0;
985
+ SecExternalFormat format = kSecFormatUnknown;
986
+ loadKeychainItems(&items, kSecClassCertificate, file, &format, 0, passphrase, prompt, passwordRetryMax);
987
+ CFMutableArrayRef certificateAuthorities = CFArrayCreateMutable(kCFAllocatorDefault, 0, &kCFTypeArrayCallBacks);
988
+ if(items)
989
+ {
990
+ for(CFIndex i = 0, size = CFArrayGetCount(items); i < size; ++i)
991
+ {
992
+ SecCertificateRef cert = (SecCertificateRef)CFArrayGetValueAtIndex(items, i);
993
+ if(isCA(cert))
994
+ {
995
+ CFArrayAppendValue(certificateAuthorities, cert);
996
+ }
997
+ }
998
+ CFRelease(items);
999
+ }
1000
+ return certificateAuthorities;
1001
+ }
1002
+
1003
+ SecCertificateRef
1004
+ IceSSL::findCertificates(SecKeychainRef keychain, const string& prop, const string& value)
1005
+ {
1006
+ //
1007
+ // Search the keychain using key:value pairs. The following keys are supported:
1008
+ //
1009
+ // Label
1010
+ // Serial
1011
+ // Subject
1012
+ // SubjectKeyId
1013
+ //
1014
+ // A value must be enclosed in single or double quotes if it contains whitespace.
1015
+ //
1016
+ CFMutableDictionaryRef query =
1017
+ CFDictionaryCreateMutable(0, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
1018
+
1019
+ const void* values[] = { keychain };
1020
+ CFArrayRef searchList = CFArrayCreate(kCFAllocatorDefault, values, 1, &kCFTypeArrayCallBacks);
1021
+
1022
+ CFDictionarySetValue(query, kSecMatchLimit, kSecMatchLimitOne);
1023
+ CFDictionarySetValue(query, kSecMatchSearchList, searchList);
1024
+ CFDictionarySetValue(query, kSecClass, kSecClassCertificate);
1025
+ CFDictionarySetValue(query, kSecReturnRef, kCFBooleanTrue);
1026
+ CFDictionarySetValue(query, kSecMatchCaseInsensitive, kCFBooleanTrue);
1027
+
1028
+ size_t start = 0;
1029
+ size_t pos;
1030
+ while((pos = value.find(':', start)) != string::npos)
1031
+ {
1032
+ string field = IceUtilInternal::toUpper(IceUtilInternal::trim(value.substr(start, pos - start)));
1033
+ string arg;
1034
+ try
1035
+ {
1036
+ if(field != "LABEL" && field != "SERIAL" && field != "SUBJECT" && field != "SUBJECTKEYID")
1037
+ {
1038
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
1039
+ }
1040
+
1041
+ start = pos + 1;
1042
+ while(start < value.size() && (value[start] == ' ' || value[start] == '\t'))
1043
+ {
1044
+ ++start;
1045
+ }
1046
+
1047
+ if(start == value.size())
1048
+ {
1049
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
1050
+ }
1051
+
1052
+ if(value[start] == '"' || value[start] == '\'')
1053
+ {
1054
+ size_t end = start;
1055
+ ++end;
1056
+ while(end < value.size())
1057
+ {
1058
+ if(value[end] == value[start] && value[end - 1] != '\\')
1059
+ {
1060
+ break;
1061
+ }
1062
+ ++end;
1063
+ }
1064
+ if(end == value.size() || value[end] != value[start])
1065
+ {
1066
+ throw PluginInitializationException(__FILE__, __LINE__,
1067
+ "IceSSL: unmatched quote in `" + value + "'");
1068
+ }
1069
+ ++start;
1070
+ arg = value.substr(start, end - start);
1071
+ start = end + 1;
1072
+ }
1073
+ else
1074
+ {
1075
+ size_t end = value.find_first_of(" \t", start);
1076
+ if(end == string::npos)
1077
+ {
1078
+ arg = value.substr(start);
1079
+ start = value.size();
1080
+ }
1081
+ else
1082
+ {
1083
+ arg = value.substr(start, end - start);
1084
+ start = end + 1;
1085
+ }
1086
+ }
1087
+ }
1088
+ catch(...)
1089
+ {
1090
+ CFRelease(searchList);
1091
+ CFRelease(query);
1092
+ throw;
1093
+ }
1094
+
1095
+ if(field == "SUBJECT" || field == "LABEL")
1096
+ {
1097
+ CFDictionarySetValue(query, field == "LABEL" ? kSecAttrLabel : kSecMatchSubjectContains, toCFString(arg));
1098
+ }
1099
+ else if(field == "SUBJECTKEYID" || field == "SERIAL")
1100
+ {
1101
+ vector<unsigned char> buffer;
1102
+ if(!parseBytes(arg, buffer))
1103
+ {
1104
+ throw PluginInitializationException(__FILE__, __LINE__,
1105
+ "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
1106
+ }
1107
+ CFDataRef data = CFDataCreate(kCFAllocatorDefault, &buffer[0], buffer.size());
1108
+ CFDictionarySetValue(query, field == "SUBJECTKEYID" ? kSecAttrSubjectKeyID : kSecAttrSerialNumber, data);
1109
+ }
1110
+ }
1111
+
1112
+ SecKeychainItemRef item = 0;
1113
+ OSStatus err = SecItemCopyMatching(query, (CFTypeRef*)&item);
1114
+ CFRelease(searchList);
1115
+ CFRelease(query);
1116
+ if(err != noErr && err != errSecItemNotFound)
1117
+ {
1118
+ throw PluginInitializationException(__FILE__, __LINE__,
1119
+ "Error searching for keychain items\n" + errorToString(err));
1120
+ }
1121
+ return (SecCertificateRef)item;
1122
+ }
1123
+ #elif defined(ICE_USE_SCHANNEL)
1124
+
1125
+ namespace
1126
+ {
1127
+ //
1128
+ // Parse a string of the form "location.name" into two parts.
1129
+ //
1130
+ void
1131
+ parseStore(const string& prop, const string& store, DWORD& loc, string& sname)
1132
+ {
1133
+ size_t pos = store.find('.');
1134
+ if(pos == string::npos)
1135
+ {
1136
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: property `" + prop + "' has invalid format");
1137
+ }
1138
+
1139
+ const string sloc = IceUtilInternal::toUpper(store.substr(0, pos));
1140
+ if(sloc == "CURRENTUSER")
1141
+ {
1142
+ loc = CERT_SYSTEM_STORE_CURRENT_USER;
1143
+ }
1144
+ else if(sloc == "LOCALMACHINE")
1145
+ {
1146
+ loc = CERT_SYSTEM_STORE_LOCAL_MACHINE;
1147
+ }
1148
+ else
1149
+ {
1150
+ throw PluginInitializationException(__FILE__, __LINE__,
1151
+ "IceSSL: unknown store location `" + sloc + "' in " + prop);
1152
+ }
1153
+
1154
+ sname = store.substr(pos + 1);
1155
+ if(sname.empty())
1156
+ {
1157
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: invalid store name in " + prop);
1158
+ }
1159
+ }
1160
+
1161
+ void
1162
+ addMatchingCertificates(HCERTSTORE source, HCERTSTORE target, DWORD findType, const void* findParam)
1163
+ {
1164
+ PCCERT_CONTEXT next = 0;
1165
+ do
1166
+ {
1167
+ if((next = CertFindCertificateInStore(source, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
1168
+ findType, findParam, next)))
1169
+ {
1170
+ if(!CertAddCertificateContextToStore(target, next, CERT_STORE_ADD_ALWAYS, 0))
1171
+ {
1172
+ throw PluginInitializationException(__FILE__, __LINE__,
1173
+ "IceSSL: error adding certificate to store:\n" + IceUtilInternal::lastErrorToString());
1174
+ }
1175
+ }
1176
+ }
1177
+ while(next);
1178
+ }
1179
+
1180
+ }
1181
+
1182
+ vector<PCCERT_CONTEXT>
1183
+ IceSSL::findCertificates(const string& prop, const string& storeSpec, const string& value, vector<HCERTSTORE>& stores)
1184
+ {
1185
+ DWORD storeLoc = 0;
1186
+ string storeName;
1187
+ parseStore(prop, storeSpec, storeLoc, storeName);
1188
+
1189
+ HCERTSTORE store = CertOpenStore(CERT_STORE_PROV_SYSTEM, 0, 0, storeLoc, stringToWstring(storeName).c_str());
1190
+ if(!store)
1191
+ {
1192
+ throw PluginInitializationException(__FILE__, __LINE__,
1193
+ "IceSSL: failure while opening store specified by " + prop + ":\n" + IceUtilInternal::lastErrorToString());
1194
+ }
1195
+
1196
+ //
1197
+ // Start with all of the certificates in the collection and filter as necessary.
1198
+ //
1199
+ // - If the value is "*", return all certificates.
1200
+ // - Otherwise, search using key:value pairs. The following keys are supported:
1201
+ //
1202
+ // Issuer
1203
+ // IssuerDN
1204
+ // Serial
1205
+ // Subject
1206
+ // SubjectDN
1207
+ // SubjectKeyId
1208
+ // Thumbprint
1209
+ //
1210
+ // A value must be enclosed in single or double quotes if it contains whitespace.
1211
+ //
1212
+ HCERTSTORE tmpStore = 0;
1213
+ try
1214
+ {
1215
+ if(value != "*")
1216
+ {
1217
+ size_t start = 0;
1218
+ size_t pos;
1219
+ while((pos = value.find(':', start)) != string::npos)
1220
+ {
1221
+ string field = IceUtilInternal::toUpper(IceUtilInternal::trim(value.substr(start, pos - start)));
1222
+ if(field != "SUBJECT" && field != "SUBJECTDN" && field != "ISSUER" && field != "ISSUERDN" &&
1223
+ field != "THUMBPRINT" && field != "SUBJECTKEYID" && field != "SERIAL")
1224
+ {
1225
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: unknown key in `" + value + "'");
1226
+ }
1227
+
1228
+ start = pos + 1;
1229
+ while(start < value.size() && (value[start] == ' ' || value[start] == '\t'))
1230
+ {
1231
+ ++start;
1232
+ }
1233
+
1234
+ if(start == value.size())
1235
+ {
1236
+ throw PluginInitializationException(__FILE__, __LINE__, "IceSSL: missing argument in `" + value + "'");
1237
+ }
1238
+
1239
+ string arg;
1240
+ if(value[start] == '"' || value[start] == '\'')
1241
+ {
1242
+ size_t end = start;
1243
+ ++end;
1244
+ while(end < value.size())
1245
+ {
1246
+ if(value[end] == value[start] && value[end - 1] != '\\')
1247
+ {
1248
+ break;
1249
+ }
1250
+ ++end;
1251
+ }
1252
+ if(end == value.size() || value[end] != value[start])
1253
+ {
1254
+ throw PluginInitializationException(__FILE__, __LINE__,
1255
+ "IceSSL: unmatched quote in `" + value + "'");
1256
+ }
1257
+ ++start;
1258
+ arg = value.substr(start, end - start);
1259
+ start = end + 1;
1260
+ }
1261
+ else
1262
+ {
1263
+ size_t end = value.find_first_of(" \t", start);
1264
+ if(end == string::npos)
1265
+ {
1266
+ arg = value.substr(start);
1267
+ start = value.size();
1268
+ }
1269
+ else
1270
+ {
1271
+ arg = value.substr(start, end - start);
1272
+ start = end + 1;
1273
+ }
1274
+ }
1275
+
1276
+ tmpStore = CertOpenStore(CERT_STORE_PROV_MEMORY, 0, 0, 0, 0);
1277
+ if(!tmpStore)
1278
+ {
1279
+ throw PluginInitializationException(__FILE__, __LINE__,
1280
+ "IceSSL: error adding certificate to store:\n" + IceUtilInternal::lastErrorToString());
1281
+ }
1282
+
1283
+ if(field == "SUBJECT" || field == "ISSUER")
1284
+ {
1285
+ const wstring argW = stringToWstring(arg);
1286
+ DWORD findType = field == "SUBJECT" ? CERT_FIND_SUBJECT_STR : CERT_FIND_ISSUER_STR;
1287
+ addMatchingCertificates(store, tmpStore, findType, argW.c_str());
1288
+ }
1289
+ else if(field == "SUBJECTDN" || field == "ISSUERDN")
1290
+ {
1291
+ const wstring argW = stringToWstring(arg);
1292
+ DWORD length = 0;
1293
+ if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), CERT_OID_NAME_STR | CERT_NAME_STR_REVERSE_FLAG,
1294
+ 0, 0, &length, 0))
1295
+ {
1296
+ throw PluginInitializationException(__FILE__, __LINE__,
1297
+ "IceSSL: invalid value `" + value + "' for property `" + prop + "'\n" +
1298
+ IceUtilInternal::lastErrorToString());
1299
+ }
1300
+
1301
+ vector<BYTE> buffer(length);
1302
+ if(!CertStrToNameW(X509_ASN_ENCODING, argW.c_str(), CERT_OID_NAME_STR | CERT_NAME_STR_REVERSE_FLAG,
1303
+ 0, &buffer[0], &length, 0))
1304
+ {
1305
+ throw PluginInitializationException(__FILE__, __LINE__,
1306
+ "IceSSL: invalid value `" + value + "' for property `" + prop + "'\n" +
1307
+ IceUtilInternal::lastErrorToString());
1308
+ }
1309
+
1310
+ CERT_NAME_BLOB name = { length, &buffer[0] };
1311
+ DWORD findType = field == "SUBJECTDN" ? CERT_FIND_SUBJECT_NAME : CERT_FIND_ISSUER_NAME;
1312
+ addMatchingCertificates(store, tmpStore, findType, &name);
1313
+ }
1314
+ else if(field == "THUMBPRINT" || field == "SUBJECTKEYID")
1315
+ {
1316
+ vector<BYTE> buffer;
1317
+ if(!parseBytes(arg, buffer))
1318
+ {
1319
+ throw PluginInitializationException(__FILE__, __LINE__,
1320
+ "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
1321
+ }
1322
+
1323
+ CRYPT_HASH_BLOB hash = { static_cast<DWORD>(buffer.size()), &buffer[0] };
1324
+ DWORD findType = field == "THUMBPRINT" ? CERT_FIND_HASH : CERT_FIND_KEY_IDENTIFIER;
1325
+ addMatchingCertificates(store, tmpStore, findType, &hash);
1326
+ }
1327
+ else if(field == "SERIAL")
1328
+ {
1329
+ vector<BYTE> buffer;
1330
+ if(!parseBytes(arg, buffer))
1331
+ {
1332
+ throw PluginInitializationException(__FILE__, __LINE__,
1333
+ "IceSSL: invalid value `" + value + "' for property `" + prop + "'");
1334
+ }
1335
+
1336
+ CRYPT_INTEGER_BLOB serial = { static_cast<DWORD>(buffer.size()), &buffer[0] };
1337
+ PCCERT_CONTEXT next = 0;
1338
+ do
1339
+ {
1340
+ if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0,
1341
+ CERT_FIND_ANY, 0, next)))
1342
+ {
1343
+ if(CertCompareIntegerBlob(&serial, &next->pCertInfo->SerialNumber))
1344
+ {
1345
+ if(!CertAddCertificateContextToStore(tmpStore, next, CERT_STORE_ADD_ALWAYS, 0))
1346
+ {
1347
+ throw PluginInitializationException(__FILE__, __LINE__,
1348
+ "IceSSL: error adding certificate to store:\n" +
1349
+ IceUtilInternal::lastErrorToString());
1350
+ }
1351
+ }
1352
+ }
1353
+ }
1354
+ while(next);
1355
+ }
1356
+ CertCloseStore(store, 0);
1357
+ store = tmpStore;
1358
+ }
1359
+ }
1360
+ }
1361
+ catch(...)
1362
+ {
1363
+ if(store && store != tmpStore)
1364
+ {
1365
+ CertCloseStore(store, 0);
1366
+ }
1367
+
1368
+ if(tmpStore)
1369
+ {
1370
+ CertCloseStore(tmpStore, 0);
1371
+ tmpStore = 0;
1372
+ }
1373
+ throw;
1374
+ }
1375
+
1376
+ vector<PCCERT_CONTEXT> certs;
1377
+ if(store)
1378
+ {
1379
+ PCCERT_CONTEXT next = 0;
1380
+ do
1381
+ {
1382
+ if((next = CertFindCertificateInStore(store, X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, 0, CERT_FIND_ANY, 0,
1383
+ next)))
1384
+ {
1385
+ certs.push_back(next);
1386
+ }
1387
+ }
1388
+ while(next);
1389
+ stores.push_back(store);
1390
+ }
1391
+ return certs;
1392
+ }
1393
+ #endif
1394
+
1395
+ bool
1396
+ IceSSL::checkPath(string& path, const string& defaultDir, bool dir)
1397
+ {
1398
+ //
1399
+ // Check if file exists. If not, try prepending the default
1400
+ // directory and check again. If the path exists, the string
1401
+ // argument is modified and true is returned. Otherwise
1402
+ // false is returned.
1403
+ //
1404
+ IceUtilInternal::structstat st;
1405
+ int err = IceUtilInternal::stat(path, &st);
1406
+ if(err == 0)
1407
+ {
1408
+ return dir ? S_ISDIR(st.st_mode) != 0 : S_ISREG(st.st_mode) != 0;
1409
+ }
1410
+
1411
+ if(!defaultDir.empty())
1412
+ {
1413
+ string s = defaultDir + IceUtilInternal::separator + path;
1414
+ err = ::IceUtilInternal::stat(s.c_str(), &st);
1415
+ if(err == 0 && ((!dir && S_ISREG(st.st_mode)) || (dir && S_ISDIR(st.st_mode))))
1416
+ {
1417
+ path = s;
1418
+ return true;
1419
+ }
1420
+ }
1421
+
1422
+ return false;
1423
+ }