<div dir="ltr"><div dir="ltr"><div>I ended up working this out.</div><div><br></div><div>
.NET Core is cross-platform and runs on Linux too, so I thought I'd test it on Linux too. One thing I ended up noticing was that the same code worked fine on 64-bit Linux, but failed on 32-bit Windows. I can't find a 64-bit build of Gpg4Win so I was unable to test 64-bit Windows, but I think it would have worked too. This led me to look at the potential differences between 32-bit and 64-bit. <br></div><div><br></div><div>I found that all the calls from C# into GPGME were correctly marked as using the "cdecl" calling convention, however the callback was not, Microsoft compilers default to using "stdcall" calling convention. The main difference between them is that with cdecl the caller is responsible for cleaning up the stack, whereas with stdcall the callee is responsible for cleaning up the stack. Using the wrong one corrupts your stack.  The callback actually seemed to execute fine, but the function that called the callback ended up crashing when it tried to return. 64-bit systems only use one calling convention (Windows differs from "everything else", but it's consistent within the same platform), which is why it worked fine on 64-bit.<br></div><div><br></div><div>So in the end, I spent around a week debugging it, but it ended up just being a single-line change to fix it: <a href="https://github.com/Daniel15/gpgme-sharp/commit/108b6af6abaadd52e31798e0aea930fc18a14498">https://github.com/Daniel15/gpgme-sharp/commit/108b6af6abaadd52e31798e0aea930fc18a14498</a> :D<br></div><div><br></div><div>Thanks,<br></div><div><div><div dir="ltr" class="gmail-m_9024311501817471681gmail_signature"><div dir="ltr"><span style="font-size:12.8px">--</span><br style="font-size:12.8px"><span style="font-size:12.8px">Regards,</span><br style="font-size:12.8px"><span style="font-size:12.8px">Daniel Lo Nigro</span><br style="font-size:12.8px"><a href="https://d.sb/" style="font-size:12.8px" target="_blank">https://d.sb/</a><span style="font-size:12.8px"> | </span><a href="http://twitter.com/Daniel15" style="font-size:12.8px" target="_blank">Twitter</a><span style="font-size:12.8px"> | </span><a href="http://www.facebook.com/daaniel" style="font-size:12.8px" target="_blank">Facebook</a><br></div></div></div><br></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Thu, Feb 7, 2019 at 10:53 PM Daniel Lo Nigro <<a href="mailto:d@d.sb" target="_blank">d@d.sb</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div>Hey Andre, I was just wondering if you had any other ideas about this? I tried to use WinDbg to debug it, which showed this error message:</div><div><br></div><div>> Attempt to execute non-executable address 004fef7c<br></div><div><br></div><div>Full output: <a href="https://gist.github.com/Daniel15/c8c31b9e46d8c2eea6385d7dd1ba6c40" target="_blank">https://gist.github.com/Daniel15/c8c31b9e46d8c2eea6385d7dd1ba6c40</a></div><div><br></div><div>I've been stepping through the code and haven't been able to work out why this happens, particularly since it happens after the passphrase callback has returned (so gpgme is calling the callback fine). However, I've never written any C code, so I'm not familiar with debugging it. The thing I'm not sure how to determine is where that pointer 0x004fef7c is coming from, and whether it's inside the gpgme library or in my app.</div><div><br></div><div>Thanks!<br></div><div><br></div><div><div><div dir="ltr" class="gmail-m_9024311501817471681gmail-m_-9124544907149691955gmail-m_-3869797826828075726gmail_signature"><div dir="ltr"><span style="font-size:12.8px">--</span><br style="font-size:12.8px"><span style="font-size:12.8px">Regards,</span><br style="font-size:12.8px"><span style="font-size:12.8px">Daniel Lo Nigro</span><br style="font-size:12.8px"><a href="https://d.sb/" style="font-size:12.8px" target="_blank">https://d.sb/</a><span style="font-size:12.8px"> | </span><a href="http://twitter.com/Daniel15" style="font-size:12.8px" target="_blank">Twitter</a><span style="font-size:12.8px"> | </span><a href="http://www.facebook.com/daaniel" style="font-size:12.8px" target="_blank">Facebook</a><br></div></div></div><br></div></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Feb 5, 2019 at 10:59 AM Daniel Lo Nigro <<a href="mailto:d@d.sb" target="_blank">d@d.sb</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div dir="ltr"><div></div><div>The code was using gpgme_io_write to write the passphrase followed by a null byte: <a href="https://github.com/wget/gpgme-sharp/blob/master/gpgme-sharp/Context.cs#L353-L354" target="_blank">https://github.com/wget/gpgme-sharp/blob/master/gpgme-sharp/Context.cs#L353-L354</a>. I changed it to gpgme_io_writen and newline. That code was written by someone else way back in 2013 so I wonder if it's been broken this entire time. Here's the changes I've made so far: <a href="https://github.com/wget/gpgme-sharp/compare/master...Daniel15:pinentry" target="_blank">https://github.com/wget/gpgme-sharp/compare/master...Daniel15:pinentry</a><br></div><div><br></div><div>Now I'm getting closer, but there's still some odd behaviour. The first time I run my test app, I get an access violation. However, it does spawn gpg-agent correctly, and the second time I run it, it works fine! I guess gpg-agent is properly receiving/caching the passphrase.<br></div><div><br></div><div><div><div dir="ltr" class="gmail-m_9024311501817471681gmail-m_-9124544907149691955gmail-m_-3869797826828075726gmail-m_2363530041989213947gmail_signature"><div dir="ltr"><span style="font-size:12.8px">--</span><br style="font-size:12.8px"><span style="font-size:12.8px">Regards,</span><br style="font-size:12.8px"><span style="font-size:12.8px">Daniel Lo Nigro</span><br style="font-size:12.8px"><a href="https://d.sb/" style="font-size:12.8px" target="_blank">https://d.sb/</a><span style="font-size:12.8px"> | </span><a href="http://twitter.com/Daniel15" style="font-size:12.8px" target="_blank">Twitter</a><span style="font-size:12.8px"> | </span><a href="http://www.facebook.com/daaniel" style="font-size:12.8px" target="_blank">Facebook</a><br></div></div></div><br></div></div></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Feb 5, 2019 at 10:32 AM Andre Heinecke <<a href="mailto:aheinecke@gnupg.org" target="_blank">aheinecke@gnupg.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
On Tuesday, February 5, 2019 6:21:45 PM GMT Daniel Lo Nigro wrote:<br>
> I'm using gpgme_set_pinentry_mode to set the pinentry mode to "loopback",<br>
> and the access violation is being encountered after my pinentry callback<br>
> returns. It works fine if I don't use loopback, and instead use the<br>
> system's pinentry mechanism.<br>
<br>
This sounds like your passphrase callback returns invalid data. I would have <br>
to look how the PassphraseResult is mapped in the C# bindings but from the C <br>
API:<br>
<br>
The user must write the passphrase, followed by a newline character,<br>
to the file descriptor @var{fd}.  The function @code{gpgme_io_writen}<br>
should be used for the write operation.  Note that if the user returns<br>
0 to indicate success, the user must at least write a newline<br>
character before returning from the callback.<br>
<br>
<br>
I do not think that you need to post your full code, but I would be interested <br>
in seeing your Passphrase callback.<br>
(Sorry If I'm  the only one answering here but in the GnuPG Team I'm the Guy <br>
for "all things windows" ;-) )<br>
<br>
<br>
Regards,<br>
Andre<br>
<br>
-- <br>
GnuPG e.V., Rochusstr. 44, D-40479 Düsseldorf.  VR 11482 Düsseldorf<br>
Vorstand: W.Koch, M.Gollowitzer, A.Heinecke.    Mail: <a href="mailto:board@gnupg.org" target="_blank">board@gnupg.org</a><br>
Finanzamt D-Altstadt, St-Nr: 103/5923/1779.   Tel: +49-2104-4938799</blockquote></div>
</blockquote></div>
</blockquote></div>