Wine-Devel
By thread
wine-devel@list.winehq.org
By month
Messages by month
- ----- 2026 -----
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2025 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2024 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2023 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2022 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2021 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2020 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2019 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2018 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2017 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2016 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2015 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2014 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2013 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2012 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2011 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2010 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2009 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2008 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2007 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2006 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2005 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2004 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2003 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2002 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
- January
- ----- 2001 -----
- December
- November
- October
- September
- August
- July
- June
- May
- April
- March
- February
March 2022
- 80 participants
- 2903 messages
[PATCH] win32u: Use GDI_ROUND() in a few more places.
by Zebediah Figura
From: Matteo Bruni <mbruni(a)codeweavers.com>
Signed-off-by: Zebediah Figura <zfigura(a)codeweavers.com>
---
dlls/win32u/mapping.c | 52 +++++++++++++++++++++----------------------
dlls/win32u/region.c | 4 ++--
2 files changed, 28 insertions(+), 28 deletions(-)
diff --git a/dlls/win32u/mapping.c b/dlls/win32u/mapping.c
index 6e7c42fe7cc..ecdbf457202 100644
--- a/dlls/win32u/mapping.c
+++ b/dlls/win32u/mapping.c
@@ -98,13 +98,13 @@ static void MAPPING_FixIsotropic( DC * dc )
if (xdim > ydim)
{
INT mincx = (dc->attr->vport_ext.cx >= 0) ? 1 : -1;
- dc->attr->vport_ext.cx = floor(dc->attr->vport_ext.cx * ydim / xdim + 0.5);
+ dc->attr->vport_ext.cx = GDI_ROUND( dc->attr->vport_ext.cx * ydim / xdim );
if (!dc->attr->vport_ext.cx) dc->attr->vport_ext.cx = mincx;
}
else
{
INT mincy = (dc->attr->vport_ext.cy >= 0) ? 1 : -1;
- dc->attr->vport_ext.cy = floor(dc->attr->vport_ext.cy * xdim / ydim + 0.5);
+ dc->attr->vport_ext.cy = GDI_ROUND( dc->attr->vport_ext.cy * xdim / ydim );
if (!dc->attr->vport_ext.cy) dc->attr->vport_ext.cy = mincy;
}
}
@@ -190,12 +190,12 @@ BOOL dp_to_lp( DC *dc, POINT *points, INT count )
{
double x = points->x;
double y = points->y;
- points->x = floor( x * dc->xformVport2World.eM11 +
- y * dc->xformVport2World.eM21 +
- dc->xformVport2World.eDx + 0.5 );
- points->y = floor( x * dc->xformVport2World.eM12 +
- y * dc->xformVport2World.eM22 +
- dc->xformVport2World.eDy + 0.5 );
+ points->x = GDI_ROUND( x * dc->xformVport2World.eM11 +
+ y * dc->xformVport2World.eM21 +
+ dc->xformVport2World.eDx );
+ points->y = GDI_ROUND( x * dc->xformVport2World.eM12 +
+ y * dc->xformVport2World.eM22 +
+ dc->xformVport2World.eDy );
points++;
}
}
@@ -221,12 +221,12 @@ BOOL WINAPI NtGdiTransformPoints( HDC hdc, const POINT *points_in, POINT *points
{
double x = points_in[i].x;
double y = points_in[i].y;
- points_out[i].x = floor( x * dc->xformWorld2Vport.eM11 +
- y * dc->xformWorld2Vport.eM21 +
- dc->xformWorld2Vport.eDx + 0.5 );
- points_out[i].y = floor( x * dc->xformWorld2Vport.eM12 +
- y * dc->xformWorld2Vport.eM22 +
- dc->xformWorld2Vport.eDy + 0.5 );
+ points_out[i].x = GDI_ROUND( x * dc->xformWorld2Vport.eM11 +
+ y * dc->xformWorld2Vport.eM21 +
+ dc->xformWorld2Vport.eDx );
+ points_out[i].y = GDI_ROUND( x * dc->xformWorld2Vport.eM12 +
+ y * dc->xformWorld2Vport.eM22 +
+ dc->xformWorld2Vport.eDy );
}
ret = TRUE;
break;
@@ -237,12 +237,12 @@ BOOL WINAPI NtGdiTransformPoints( HDC hdc, const POINT *points_in, POINT *points
{
double x = points_in[i].x;
double y = points_in[i].y;
- points_out[i].x = floor( x * dc->xformVport2World.eM11 +
- y * dc->xformVport2World.eM21 +
- dc->xformVport2World.eDx + 0.5 );
- points_out[i].y = floor( x * dc->xformVport2World.eM12 +
- y * dc->xformVport2World.eM22 +
- dc->xformVport2World.eDy + 0.5 );
+ points_out[i].x = GDI_ROUND( x * dc->xformVport2World.eM11 +
+ y * dc->xformVport2World.eM21 +
+ dc->xformVport2World.eDx );
+ points_out[i].y = GDI_ROUND( x * dc->xformVport2World.eM12 +
+ y * dc->xformVport2World.eM22 +
+ dc->xformVport2World.eDy );
}
ret = TRUE;
break;
@@ -268,12 +268,12 @@ void lp_to_dp( DC *dc, POINT *points, INT count )
{
double x = points->x;
double y = points->y;
- points->x = floor( x * dc->xformWorld2Vport.eM11 +
- y * dc->xformWorld2Vport.eM21 +
- dc->xformWorld2Vport.eDx + 0.5 );
- points->y = floor( x * dc->xformWorld2Vport.eM12 +
- y * dc->xformWorld2Vport.eM22 +
- dc->xformWorld2Vport.eDy + 0.5 );
+ points->x = GDI_ROUND( x * dc->xformWorld2Vport.eM11 +
+ y * dc->xformWorld2Vport.eM21 +
+ dc->xformWorld2Vport.eDx );
+ points->y = GDI_ROUND( x * dc->xformWorld2Vport.eM12 +
+ y * dc->xformWorld2Vport.eM22 +
+ dc->xformWorld2Vport.eDy );
points++;
}
}
diff --git a/dlls/win32u/region.c b/dlls/win32u/region.c
index 17eae861cbf..e524dd66f34 100644
--- a/dlls/win32u/region.c
+++ b/dlls/win32u/region.c
@@ -866,8 +866,8 @@ static void translate( POINT *pt, UINT count, const XFORM *xform )
{
double x = pt->x;
double y = pt->y;
- pt->x = floor( x * xform->eM11 + y * xform->eM21 + xform->eDx + 0.5 );
- pt->y = floor( x * xform->eM12 + y * xform->eM22 + xform->eDy + 0.5 );
+ pt->x = GDI_ROUND( x * xform->eM11 + y * xform->eM21 + xform->eDx );
+ pt->y = GDI_ROUND( x * xform->eM12 + y * xform->eM22 + xform->eDy );
pt++;
}
}
--
2.35.1
March 2, 2022
[PATCH] wine.inf: Enable Light theme by default.
by Zhiyi Zhang
Signed-off-by: Zhiyi Zhang <zzhang(a)codeweavers.com>
---
loader/wine.inf.in | 10 ++++++++++
1 file changed, 10 insertions(+)
diff --git a/loader/wine.inf.in b/loader/wine.inf.in
index 0e488d87dcb..3e6194a3929 100644
--- a/loader/wine.inf.in
+++ b/loader/wine.inf.in
@@ -71,6 +71,7 @@ AddReg=\
Services, \
SessionMgr,\
Tapi,\
+ ThemeManager,\
Timezones,\
LicenseInformation
@@ -95,6 +96,7 @@ AddReg=\
Services, \
SessionMgr,\
Tapi,\
+ ThemeManager,\
Timezones,\
VersionInfo,\
LicenseInformation
@@ -121,6 +123,7 @@ AddReg=\
Services, \
SessionMgr,\
Tapi,\
+ ThemeManager,\
Timezones,\
VersionInfo.ntamd64,\
LicenseInformation
@@ -147,6 +150,7 @@ AddReg=\
Services, \
SessionMgr,\
Tapi,\
+ ThemeManager,\
Timezones,\
VersionInfo.ntamd64,\
LicenseInformation
@@ -5494,6 +5498,12 @@ ServiceType=32
StartType=3
ErrorControl=1
+[ThemeManager]
+HKCU,"Software\Microsoft\Windows\CurrentVersion\ThemeManager","ThemeActive",2,"1"
+HKCU,"Software\Microsoft\Windows\CurrentVersion\ThemeManager","DllName",2,"%10%\resources\themes\light\light.msstyles"
+HKCU,"Software\Microsoft\Windows\CurrentVersion\ThemeManager","ColorName",2,"Blue"
+HKCU,"Software\Microsoft\Windows\CurrentVersion\ThemeManager","SizeName",2,"NormalSize"
+
[WinmgmtService]
Description="Provides access to Windows Management Instrumentation"
DisplayName="Windows Management Instrumentation Service"
--
2.32.0
March 2, 2022
Re: [PATCH 2/3] conhost: Only create the new console font once
by Hugh McMaster
Hi Jacek,
On Wed, 2 Mar 2022 at 03:15, Jacek Caban wrote:
>
> On 3/1/22 12:37, Hugh McMaster wrote:
> > case PSN_APPLY:
> > - val = SendDlgItemMessageW( dialog, IDC_FNT_LIST_SIZE, LB_GETCURSEL, 0, 0 );
> > - if (val < di->font_count)
> > - {
> > - LOGFONTW lf;
> > -
> > - fill_logfont( &lf, di->font[val].faceName,
> > - wcslen(di->font[val].faceName) * sizeof(WCHAR),
> > - di->font[val].height, di->font[val].weight );
> > - DeleteObject( select_font_config( &di->config, di->console->output_cp,
> > - di->console->win, &lf ));
> > - }
> > -
> > + DeleteObject( di->hfont );
>
>
> font_preview_proc already deletes current font in its WM_DESTROY, isn't
> that enough to clean up the font?
Yes, it is - we don't want two calls to DeleteObject (not harmful,
just not needed).
Sorry for totally missing the WM_DESTROY case.
March 2, 2022
Re: [PATCH 1/3] conhost: Don't compare the console config if the user cancels the dialog
by Hugh McMaster
Hi Jacek,
On Wed, 2 Mar 2022 at 03:12, Jacek Caban wrote:
>
> On 3/1/22 12:37, Hugh McMaster wrote:
> > - PropertySheetW( &header );
> > + if (!PropertySheetW( &header ))
> > + return TRUE;
>
>
> It would be even better to use ">0" to handle errors.
While I don't see how a modal dialog could result in an error, I'm
happy to handle the extra case. But don't you mean if (PropertySheetW(
&header ) < 1)? Unless you want to do something like if
(!(PropertySheetW( &header ) > 0))?
March 2, 2022
[PATCH 2/2] winusb: Add WinUsb_Free stub.
by Mohamad Al-Jaf
This allows the game Nickelodeon All-Star Brawl to run.
Proton-Issue: https://github.com/ValveSoftware/Proton/issues/5198
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
Proton has disabled this dll to fix the issue. But seeing as
how it affects one game, it's not unreasonable to conclude
it may affect other games.
Since it can be disabled, this entire dll can likely be stubbed.
It probably won't affect games, but I'm not sure if applications
call other functions in this dll and expect an actual implementation.
Though, seeing as how it's still undeveloped, I'm guessing
it's not a very important dll.
I can add stubs in a separate patchset for the other functions
if the wine-dev team wants me to.
Also, I thought about adding heap_free(handle) to make this
into a semi-stub, but wouldn't that cause heap corruption
since the handle is not initialized? I'm not sure why
it's being called first and not the function that
initializes WINUSB_INTERFACE_HANDLE.
---
dlls/winusb/Makefile.in | 5 +++++
dlls/winusb/main.c | 36 ++++++++++++++++++++++++++++++++++++
dlls/winusb/winusb.spec | 2 +-
3 files changed, 42 insertions(+), 1 deletion(-)
create mode 100644 dlls/winusb/main.c
diff --git a/dlls/winusb/Makefile.in b/dlls/winusb/Makefile.in
index c8cab4dbed9..b6f01a1346c 100644
--- a/dlls/winusb/Makefile.in
+++ b/dlls/winusb/Makefile.in
@@ -1 +1,6 @@
MODULE = winusb.dll
+
+EXTRADLLFLAGS = -Wb,--prefer-native
+
+C_SRCS = \
+ main.c
diff --git a/dlls/winusb/main.c b/dlls/winusb/main.c
new file mode 100644
index 00000000000..8376823d88f
--- /dev/null
+++ b/dlls/winusb/main.c
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2022 Mohamad Al-Jaf
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#include <stdarg.h>
+
+#include "windef.h"
+#include "winbase.h"
+#include "winusb.h"
+
+#include "wine/debug.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(usb);
+
+/***********************************************************************
+ * WinUsb_Free (winusb.@)
+ */
+BOOL WINAPI WinUsb_Free(WINUSB_INTERFACE_HANDLE handle)
+{
+ FIXME( "(%p) - stub\n", handle );
+ return TRUE;
+}
diff --git a/dlls/winusb/winusb.spec b/dlls/winusb/winusb.spec
index 09371e9ee46..a0b57d58096 100644
--- a/dlls/winusb/winusb.spec
+++ b/dlls/winusb/winusb.spec
@@ -1,7 +1,7 @@
@ stub WinUsb_AbortPipe
@ stub WinUsb_ControlTransfer
@ stub WinUsb_FlushPipe
-@ stub WinUsb_Free
+@ stdcall WinUsb_Free(ptr)
@ stub WinUsb_GetAssociatedInterface
@ stub WinUsb_GetCurrentAlternateSetting
@ stub WinUsb_GetDescriptor
--
2.35.1
March 1, 2022
[PATCH 1/2] include: Add winusb.h file.
by Mohamad Al-Jaf
Signed-off-by: Mohamad Al-Jaf <mohamadaljaf(a)gmail.com>
---
include/Makefile.in | 1 +
include/winusb.h | 36 ++++++++++++++++++++++++++++++++++++
2 files changed, 37 insertions(+)
create mode 100644 include/winusb.h
diff --git a/include/Makefile.in b/include/Makefile.in
index 2bb8cd672a7..908eaea2261 100644
--- a/include/Makefile.in
+++ b/include/Makefile.in
@@ -830,6 +830,7 @@ SOURCES = \
wintabx.h \
winternl.h \
wintrust.h \
+ winusb.h \
winuser.h \
winuser.rh \
winver.h \
diff --git a/include/winusb.h b/include/winusb.h
new file mode 100644
index 00000000000..188b4380878
--- /dev/null
+++ b/include/winusb.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright (C) 2022 Mohamad Al-Jaf
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#ifndef _WINUSB_H_
+#define _WINUSB_H_
+
+#include <winapifamily.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef PVOID WINUSB_INTERFACE_HANDLE, *PWINUSB_INTERFACE_HANDLE;
+
+BOOL WINAPI WinUsb_Free(WINUSB_INTERFACE_HANDLE);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _WINUSB_H_ */
--
2.35.1
March 1, 2022
[PATCH 6/6] bcrypt/tests: Test for invalid RSA keyblob.
by Santino Mazza
Signed-off-by: Santino Mazza <mazzasantino1206(a)gmail.com>
---
dlls/bcrypt/tests/bcrypt.c | 26 +++++++++++++++++++++++++-
1 file changed, 25 insertions(+), 1 deletion(-)
diff --git a/dlls/bcrypt/tests/bcrypt.c b/dlls/bcrypt/tests/bcrypt.c
index e7619897cfd..1588b72c3fd 100644
--- a/dlls/bcrypt/tests/bcrypt.c
+++ b/dlls/bcrypt/tests/bcrypt.c
@@ -1971,6 +1971,24 @@ static UCHAR rsaFullPrivateBlob[] =
0x9d, 0xe2, 0xcc, 0x5a, 0xf1, 0x68, 0x30, 0xe5, 0xbc, 0x8d, 0xad,
};
+
+static UCHAR rsaPublicBlobWithInvalidPublicExpSize[] =
+{
+ 0x52, 0x53, 0x41, 0x31, 0x00, 0x04, 0x00, 0x00, 0x09, 0x00, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x01, 0x00, 0x01, 0xc7, 0x8f, 0xac, 0x2a, 0xce, 0xbf, 0xc9, 0x6c, 0x7b,
+ 0x85, 0x74, 0x71, 0xbb, 0xff, 0xbb, 0x9b, 0x20, 0x03, 0x79, 0x17, 0x34,
+ 0xe7, 0x26, 0x91, 0x5c, 0x1f, 0x1b, 0x03, 0x3d, 0x46, 0xdf, 0xb6, 0xf2,
+ 0x10, 0x55, 0xf0, 0x39, 0x55, 0x0a, 0xe3, 0x9c, 0x0c, 0x63, 0xc2, 0x14,
+ 0x03, 0x94, 0x51, 0x0d, 0xb4, 0x22, 0x09, 0xf2, 0x5c, 0xb2, 0xd1, 0xc3,
+ 0xac, 0x6f, 0xa8, 0xc4, 0xac, 0xb8, 0xbc, 0x59, 0xe7, 0xed, 0x77, 0x6e,
+ 0xb1, 0x80, 0x58, 0x7d, 0xb2, 0x94, 0x46, 0xe5, 0x00, 0xe2, 0xb7, 0x33,
+ 0x48, 0x7a, 0xd3, 0x78, 0xe9, 0x26, 0x01, 0xc7, 0x00, 0x7b, 0x41, 0x6d,
+ 0x94, 0x3a, 0xe1, 0x50, 0x2b, 0x9f, 0x6b, 0x1c, 0x08, 0xa3, 0xfc, 0x0a,
+ 0x44, 0x81, 0x09, 0x41, 0x80, 0x23, 0x7b, 0xf6, 0x3f, 0xaf, 0x91, 0xa1,
+ 0x87, 0x75, 0x33, 0x15, 0xb8, 0xde, 0x32, 0x30, 0xb4, 0x5e, 0xfd
+};
+
static void test_RSA(void)
{
static UCHAR hash[] =
@@ -2076,7 +2094,7 @@ static void test_RSA(void)
ok(size == size2, "got %lu expected %lu\n", size2, size);
HeapFree(GetProcessHeap(), 0, buf);
- /* export public key */
+ /* import/export public key */
size = 0;
ret = BCryptExportKey(key, NULL, BCRYPT_RSAPUBLIC_BLOB, NULL, 0, &size, 0);
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
@@ -2096,6 +2114,12 @@ static void test_RSA(void)
ret = BCryptDestroyKey(key);
ok(!ret, "got %#lx\n", ret);
+ todo_wine
+ {
+ ret = BCryptImportKeyPair(alg, NULL, BCRYPT_RSAPUBLIC_BLOB, &key, rsaPublicBlobWithInvalidPublicExpSize, sizeof(rsaPublicBlobWithInvalidPublicExpSize), 0);
+ ok(ret == NTE_BAD_DATA, "got %#lx\n", ret);
+ }
+
ret = BCryptImportKeyPair(alg, NULL, BCRYPT_RSAPUBLIC_BLOB, &key, buf, size, 0);
ok(ret == STATUS_SUCCESS, "got %#lx\n", ret);
HeapFree(GetProcessHeap(), 0, buf);
--
2.32.0
March 1, 2022
[PATCH 5/6] ncrypt: Implement NCryptFinalizeKey.
by Santino Mazza
Signed-off-by: Santino Mazza <mazzasantino1206(a)gmail.com>
---
dlls/ncrypt/main.c | 57 ++++++++++++++++++++++++++++++-----
dlls/ncrypt/ncrypt_internal.h | 7 +++++
dlls/ncrypt/tests/ncrypt.c | 4 +--
3 files changed, 58 insertions(+), 10 deletions(-)
diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index 43eff5974ca..958f6924c18 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -66,12 +66,6 @@ SECURITY_STATUS WINAPI NCryptEnumKeys(NCRYPT_PROV_HANDLE provider, const WCHAR *
return NTE_NOT_SUPPORTED;
}
-SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
-{
- FIXME("(%#Ix, %#lx): stub\n", key, flags);
- return NTE_NOT_SUPPORTED;
-}
-
SECURITY_STATUS WINAPI NCryptFreeBuffer(PVOID buf)
{
FIXME("(%p): stub\n", buf);
@@ -282,9 +276,10 @@ SECURITY_STATUS WINAPI NCryptImportKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_H
if(ret != ERROR_SUCCESS)
{
ERR("Error importing keypair with bcrypt %#lx\n", ret);
- return NTE_INTERNAL_ERROR;
+ return NTE_BAD_DATA;
}
+ key_object->key.type = ASYMMETRIC;
set_object_property(key_object, NCRYPT_PROVIDER_HANDLE_PROPERTY, (BYTE *)&provider, sizeof(NCRYPT_PROV_HANDLE));
set_object_property(key_object, NCRYPT_ALGORITHM_GROUP_PROPERTY, (BYTE *)BCRYPT_RSA_ALGORITHM, sizeof(BCRYPT_RSA_ALGORITHM));
set_object_property(key_object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&rsablob->BitLength, sizeof(rsablob->BitLength));
@@ -377,6 +372,7 @@ SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCR
return NTE_INTERNAL_ERROR;
}
+ key_object->key.type = ASYMMETRIC;
set_object_property(key_object, NCRYPT_PROVIDER_HANDLE_PROPERTY, (BYTE *)&provider, sizeof(NCRYPT_PROV_HANDLE));
set_object_property(key_object, NCRYPT_ALGORITHM_GROUP_PROPERTY, (BYTE *)BCRYPT_RSA_ALGORITHM, sizeof(BCRYPT_RSA_ALGORITHM));
set_object_property(key_object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&default_bitlength, sizeof(default_bitlength));
@@ -391,6 +387,53 @@ SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCR
return ERROR_SUCCESS;
}
+SECURITY_STATUS WINAPI NCryptFinalizeKey(NCRYPT_KEY_HANDLE key, DWORD flags)
+{
+ struct object *key_object = (struct object*)key;
+ DWORD key_length;
+ struct object_property *prop;
+ NTSTATUS ret;
+
+ TRACE("(%#Ix, %#lx): stub\n", key, flags);
+
+ if(!key) return NTE_INVALID_HANDLE;
+ if(key_object->key.finalized_key) return NTE_INVALID_HANDLE;
+
+ prop = get_object_property(key_object, NCRYPT_LENGTH_PROPERTY);
+ if(!prop) return NTE_INVALID_HANDLE;
+
+ key_length = *(DWORD *)prop->value;
+ if(key_object->key.type == ASYMMETRIC)
+ {
+ ret = BCryptGenerateKeyPair(key_object->key.alg_prov, &key_object->key.bcrypt_key, key_length, 0);
+ if(ret != ERROR_SUCCESS)
+ {
+ ERR("Error generating key pair\n");
+ return NTE_INTERNAL_ERROR;
+ }
+
+ ret = BCryptFinalizeKeyPair(key_object->key.bcrypt_key, 0);
+ if(ret != ERROR_SUCCESS)
+ {
+ ERR("Error finalizing key pair\n");
+ return NTE_INTERNAL_ERROR;
+ }
+ }
+ else if(key_object->key.type == SYMMETRIC)
+ {
+ FIXME("Symmetric keys not implemented\n");
+ return NTE_NOT_SUPPORTED;
+ }
+ else
+ {
+ ERR("Got handle with invalid key type");
+ return NTE_INVALID_HANDLE;
+ }
+
+ key_object->key.finalized_key = 1;
+ return ERROR_SUCCESS;
+}
+
SECURITY_STATUS WINAPI NCryptVerifySignature(NCRYPT_KEY_HANDLE handle, void *padding, BYTE *hash, DWORD hash_size,
BYTE *signature, DWORD signature_size, DWORD flags)
{
diff --git a/dlls/ncrypt/ncrypt_internal.h b/dlls/ncrypt/ncrypt_internal.h
index 2d916d4fbd8..1163277ccaa 100644
--- a/dlls/ncrypt/ncrypt_internal.h
+++ b/dlls/ncrypt/ncrypt_internal.h
@@ -19,8 +19,15 @@
#include <ncrypt.h>
#include <bcrypt.h>
+enum key_type {
+ SYMMETRIC,
+ ASYMMETRIC
+};
+
struct key
{
+ enum key_type type;
+ DWORD finalized_key;
NCRYPT_PROV_HANDLE storage_prov;
BCRYPT_ALG_HANDLE alg_prov;
BCRYPT_KEY_HANDLE bcrypt_key;
diff --git a/dlls/ncrypt/tests/ncrypt.c b/dlls/ncrypt/tests/ncrypt.c
index e6473cd1e31..926efc0370a 100644
--- a/dlls/ncrypt/tests/ncrypt.c
+++ b/dlls/ncrypt/tests/ncrypt.c
@@ -310,8 +310,6 @@ static void test_finalize_key(void)
ret = NCryptCreatePersistedKey(prov, &key, BCRYPT_RSA_ALGORITHM, NULL, 0, 0);
ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
- todo_wine
- {
ret = NCryptFinalizeKey(key, 0);
ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
@@ -320,7 +318,7 @@ static void test_finalize_key(void)
ret = NCryptFinalizeKey(0, 0);
ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
- }
+
NCryptFreeObject(key);
}
--
2.32.0
March 1, 2022
[PATCH 4/6] ncrypt/tests: Test for NCryptFinalizeKey
by Santino Mazza
Signed-off-by: Santino Mazza <mazzasantino1206(a)gmail.com>
---
dlls/ncrypt/tests/ncrypt.c | 27 +++++++++++++++++++++++++++
1 file changed, 27 insertions(+)
diff --git a/dlls/ncrypt/tests/ncrypt.c b/dlls/ncrypt/tests/ncrypt.c
index 608bf59197e..e6473cd1e31 100644
--- a/dlls/ncrypt/tests/ncrypt.c
+++ b/dlls/ncrypt/tests/ncrypt.c
@@ -298,6 +298,32 @@ static void test_create_persisted_key(void)
NCryptFreeObject(prov);
}
+static void test_finalize_key(void)
+{
+ NCRYPT_PROV_HANDLE prov;
+ NCRYPT_KEY_HANDLE key;
+ SECURITY_STATUS ret;
+
+ ret = NCryptOpenStorageProvider(&prov, NULL, 0);
+ ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+ ret = NCryptCreatePersistedKey(prov, &key, BCRYPT_RSA_ALGORITHM, NULL, 0, 0);
+ ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+ todo_wine
+ {
+ ret = NCryptFinalizeKey(key, 0);
+ ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+
+ ret = NCryptFinalizeKey(key, 0);
+ ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
+
+ ret = NCryptFinalizeKey(0, 0);
+ ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
+ }
+ NCryptFreeObject(key);
+}
+
START_TEST(ncrypt)
{
test_key_import_rsa();
@@ -305,4 +331,5 @@ START_TEST(ncrypt)
test_get_property();
test_set_property();
test_create_persisted_key();
+ test_finalize_key();
}
--
2.32.0
March 1, 2022
[PATCH 3/6] ncrypt: Implement NCryptCreatePersistedKey.
by Santino Mazza
Signed-off-by: Santino Mazza <mazzasantino1206(a)gmail.com>
---
dlls/ncrypt/main.c | 52 ++++++++++++++++++++++++++++++++------
dlls/ncrypt/tests/ncrypt.c | 5 ++--
2 files changed, 47 insertions(+), 10 deletions(-)
diff --git a/dlls/ncrypt/main.c b/dlls/ncrypt/main.c
index 2804708f10f..43eff5974ca 100644
--- a/dlls/ncrypt/main.c
+++ b/dlls/ncrypt/main.c
@@ -30,14 +30,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(ncrypt);
-SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE *key,
- const WCHAR *algid, const WCHAR *name, DWORD keyspec, DWORD flags)
-{
- FIXME("(%#Ix, %p, %s, %s, %#lx, %#lx): stub\n", provider, key, wine_dbgstr_w(algid),
- wine_dbgstr_w(name), keyspec, flags);
- return NTE_NOT_SUPPORTED;
-}
-
SECURITY_STATUS WINAPI NCryptDecrypt(NCRYPT_KEY_HANDLE key, BYTE *input, DWORD insize, void *padding,
BYTE *output, DWORD outsize, DWORD *result, DWORD flags)
{
@@ -355,6 +347,50 @@ SECURITY_STATUS WINAPI NCryptSetProperty(NCRYPT_HANDLE handle, const WCHAR *name
return set_object_property(object, name, input, insize);
}
+SECURITY_STATUS WINAPI NCryptCreatePersistedKey(NCRYPT_PROV_HANDLE provider, NCRYPT_KEY_HANDLE *key,
+ const WCHAR *algid, const WCHAR *name, DWORD keyspec, DWORD flags)
+{
+ struct object *key_object;
+ TRACE("(%#Ix, %p, %s, %s, %#lx, %#lx)\n", provider, key, wine_dbgstr_w(algid),
+ wine_dbgstr_w(name), keyspec, flags);
+
+ if(!provider) return NTE_INVALID_HANDLE;
+ if(!algid) return HRESULT_FROM_WIN32(RPC_X_NULL_REF_POINTER);
+ if(name) FIXME("Persistant keys not supported\n");
+
+ if(!(key_object = allocate_object(KEY)))
+ {
+ ERR("Error allocating memory\n");
+ return NTE_NO_MEMORY;
+ }
+
+ key_object->key.storage_prov = provider;
+ if(!lstrcmpiW(algid, BCRYPT_RSA_ALGORITHM))
+ {
+ NTSTATUS ret = BCryptOpenAlgorithmProvider(&key_object->key.alg_prov, BCRYPT_RSA_ALGORITHM, NULL, 0);
+ DWORD default_bitlength = 1024;
+
+ if(ret != ERROR_SUCCESS)
+ {
+ ERR("Error opening algorithm provider\n");
+ NCryptFreeObject((NCRYPT_HANDLE)key_object);
+ return NTE_INTERNAL_ERROR;
+ }
+
+ set_object_property(key_object, NCRYPT_PROVIDER_HANDLE_PROPERTY, (BYTE *)&provider, sizeof(NCRYPT_PROV_HANDLE));
+ set_object_property(key_object, NCRYPT_ALGORITHM_GROUP_PROPERTY, (BYTE *)BCRYPT_RSA_ALGORITHM, sizeof(BCRYPT_RSA_ALGORITHM));
+ set_object_property(key_object, NCRYPT_LENGTH_PROPERTY, (BYTE *)&default_bitlength, sizeof(default_bitlength));
+ }
+ else
+ {
+ FIXME("Algorithm not handled %s\n", wine_dbgstr_w(algid));
+ return NTE_NOT_SUPPORTED;
+ }
+
+ *key = (NCRYPT_KEY_HANDLE)key_object;
+ return ERROR_SUCCESS;
+}
+
SECURITY_STATUS WINAPI NCryptVerifySignature(NCRYPT_KEY_HANDLE handle, void *padding, BYTE *hash, DWORD hash_size,
BYTE *signature, DWORD signature_size, DWORD flags)
{
diff --git a/dlls/ncrypt/tests/ncrypt.c b/dlls/ncrypt/tests/ncrypt.c
index 8080e465527..608bf59197e 100644
--- a/dlls/ncrypt/tests/ncrypt.c
+++ b/dlls/ncrypt/tests/ncrypt.c
@@ -231,6 +231,7 @@ static void test_set_property(void)
{
ret = NCryptSetProperty(key, NCRYPT_NAME_PROPERTY, (BYTE *)L"Key name", sizeof(L"Key name"), 0);
ok(ret == NTE_NOT_SUPPORTED, "got %#lx\n", ret);
+ }
NCryptFreeObject(key);
key = 0;
@@ -242,6 +243,8 @@ static void test_set_property(void)
ret = NCryptSetProperty(key, NCRYPT_LENGTH_PROPERTY, (BYTE *)&keylength, sizeof(keylength), 0);
ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
+ todo_wine
+ {
ret = NCryptSetProperty(key, NCRYPT_NAME_PROPERTY, (BYTE *)L"Key name", sizeof(L"Key name"), 0);
ok(ret == NTE_NOT_SUPPORTED, "got %#lx\n", ret);
@@ -263,7 +266,6 @@ static void test_create_persisted_key(void)
ret = NCryptOpenStorageProvider(&prov, NULL, 0);
ok(ret == ERROR_SUCCESS, "got %#lx\n", ret);
- todo_wine {
key = 0;
ret = NCryptCreatePersistedKey(0, &key, BCRYPT_RSA_ALGORITHM, NULL, 0, 0);
ok(ret == NTE_INVALID_HANDLE, "got %#lx\n", ret);
@@ -294,7 +296,6 @@ static void test_create_persisted_key(void)
NCryptFinalizeKey(key, 0);
NCryptFreeObject(key);
NCryptFreeObject(prov);
- }
}
START_TEST(ncrypt)
--
2.32.0
March 1, 2022