/// <summary> /// Создание распределенного секрета по HANDLE ключа в CSP /// </summary> /// <param name="key">HANDLE секретного ключа в CSP.</param> /// <param name="prov">HANDLE провайдера (CSP), внутри которого /// существует ключ.</param> /// <param name="publicObject">Открытый ключ.</param> /// <param name="algType"></param> /// /// <argnull name="key" /> /// <argnull name="prov" /> /// <argnull name="publicObject" /> /// <exception cref="CryptographicException">При ошибках на native /// уровне.</exception> /// /// <unmanagedperm action="LinkDemand" /> internal GostSharedSecretCryptoServiceProvider(SafeKeyHandle key, SafeProvHandle prov, Gost3410CspObject publicObject, CspAlgorithmType algType) { if (key == null) { throw new ArgumentNullException("key"); } if (prov == null) { throw new ArgumentNullException("prov"); } if (publicObject == null) { throw new ArgumentNullException("publicObject"); } // В связи с отсутствием DuplicateKey, используем грязный хак _safeKeyHandle = key; bool isinc = false; _safeKeyHandle.DangerousAddRef(ref isinc); _safeProvHandle = prov; _safeProvHandle.DangerousAddRef(ref isinc); _publicObject = publicObject; _algType = algType; }
/// <summary> /// Создание ключа согласования. /// </summary> /// /// <param name="alg">Параметры открытого ключа.</param> /// /// <returns>Распределенный секрет.</returns> /// /// <intdoc>Не проверяем возможность SharedSecret, /// мы используем из контейнера только открытый ключ.</intdoc> public override GostSharedSecretAlgorithm CreateAgree( Gost3410Parameters alg) { // Превращаем его в объект для экспорта. Gost3410CspObject obj1 = new Gost3410CspObject(alg); return(new GostSharedSecretCryptoServiceProvider(_safeKeyHandle, _safeProvHandle, obj1, CspAlgorithmType.Gost2001)); }
/// <summary> /// Экспорт параметров алгоритма. /// </summary> /// /// <param name="includePrivateParameters"><see langword="true"/>, /// для экспорта секретного ключа.</param> /// /// <returns>Параметры алгоритма.</returns> /// /// <exception cref="CryptographicException">При экспорте /// секретного ключа.</exception> /// /// <remarks> /// <if notdefined="userexp"><para>По соображениям безопасности /// в данной сборке при экспорте /// секретного ключа всегда возбуждает исключение /// <see cref="CryptographicException"/>.</para></if> /// </remarks> public override Gost3410Parameters ExportParameters( bool includePrivateParameters) { if (includePrivateParameters) { throw new CryptographicException(SR.Argument_InvalidValue, "includePrivateParameters equal true "); } Gost3410CspObject obj1 = new Gost3410CspObject(); CapiHelper.ExportPublicKey(_safeKeyHandle, obj1, CspAlgorithmType.Gost2001); return(obj1.Parameters); }
/// <summary> /// Экспорт параметров <see cref="Gost3410Parameters"/> /// алгоритма ГОСТ Р 34.10-2012 256 в CSP. /// </summary> /// /// <param name="includePrivateParameters"><see langword="true"/>, /// чтобы включить секретный ключ, <see langword="false"/> - для /// экспорта только открытого ключа и его параметров.</param> /// /// <returns>Параметры в виде структуры /// <see cref="Gost3410Parameters"/></returns> /// /// <remarks> /// <if notdefined="userexp"><para>По соображениям безопасности /// в данной сборке при экспорте /// секретного ключа всегда возбуждает исключение /// <see cref="CryptographicException"/>.</para></if> /// </remarks> /// /// <doc-sample path="Simple\DocBlock" name="ExportParameters" /// region="ExportParameters" /> /// /// <containerperm flag="Open">Для открытия существующего /// контейнера.</containerperm> /// <containerperm flag="Create">Для создания контейнера с заданным /// (не случаыным именем).</containerperm> /// <containerperm flag="Export">Для экспорта секретного ключа. /// </containerperm> public override Gost3410Parameters ExportParameters(bool includePrivateParameters) { GetKeyPair(); Gost3410CspObject obj1 = new Gost3410CspObject(); if (includePrivateParameters) { throw new CryptographicException(SR.Argument_InvalidValue, "includePrivateParameters equal true "); } byte[] data = ExportCspBlob(false); AsnHelper.DecodePublicBlob(obj1, data, CspAlgorithmType.Gost2012_256); return(obj1.Parameters); //byte[] cspBlob = ExportCspBlob(includePrivateParameters); //return cspBlob.ToGost3410Parameters(includePrivateParameters); }
/// <summary> /// Импорт параметров <see cref="Gost3410Parameters"/> /// алгоритма ГОСТ Р 34.10-2012 256. /// </summary> /// /// <param name="parameters">Параметры алгоритма /// ГОСТ Р 34.10-2012 256</param> /// /// <doc-sample path="Simple\DocBlock" name="ImportParameters" /// region="ImportParameters" /> /// /// <exception cref="CryptographicException">При импорте секретного /// ключа.</exception> /// /// <remarks> /// <if notdefined="userimp"><para>В данной сборке при импорте /// секретного ключа всегда возбуждает исключение /// <see cref="CryptographicException"/>.</para></if> /// </remarks> /// /// <containerperm flag="Open">Для открытия существующего /// контейнера.</containerperm> /// <containerperm flag="Create">Для создания контейнера с заданным /// (не случайным именем).</containerperm> /// <containerperm flag="Import">Для импорта секретного ключа. /// </containerperm> public override void ImportParameters(Gost3410Parameters parameters) { Gost3410CspObject pubKey = new Gost3410CspObject(parameters); if ((_safeKeyHandle != null) && !_safeKeyHandle.IsClosed) { _safeKeyHandle.Dispose(); } _safeKeyHandle = SafeKeyHandle.InvalidHandle; if (Gost3410_2012_256CryptoServiceProvider.IsPublic(parameters)) { SafeKeyHandle safeKeyHandle; // Это открытый ключ, поэтому можно его export // в verify context. // Нет обращения к секретному ключу, поэтому // не создаем контейнер без надобности. var safeProvHandleTemp = AcquireSafeProviderHandle(); if (pubKey == null) { throw new ArgumentNullException(nameof(pubKey)); } byte[] keyBlob = AsnHelper.EncodePublicBlob(pubKey, CspAlgorithmType.Gost2012_256); CapiHelper.ImportKeyBlob( safeProvHandleTemp, CspProviderFlags.NoFlags, false, keyBlob, out safeKeyHandle); _safeKeyHandle = safeKeyHandle; _publicOnly = true; return; } throw new CryptographicException(SR.CspParameter_invalid, "Cryptography_UserExportBulkBlob"); //throw new PlatformNotSupportedException(SR.Format(SR.Cryptography_CAPI_Required, nameof(CspKeyContainerInfo))); }