zeroc-ice 3.6b1

Sign up to get free protection for your applications and to get access to all the features.
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
+ }