[Ironruby-core] OpenSSL

Tomas Matousek Tomas.Matousek at microsoft.com
Mon Jun 21 21:23:07 EDT 2010

You’re heading the right direction and thanks for taking care of this module!

A few comments:

-          RSA constructors: does Ruby convert any parameters via to_s, to_str, etc.? If so you’ll need to use [DefaultProtocol] attribute or other appropriate conversions. The easiest way how to find out what conversions are used in MRI is like so:

class C
  def respond_to? name
      puts name

RSA.new (C.new, C.new, C.new)

-          These are not very efficient:

                private static byte[] PemToDer(string pem_encoded_key) {
                private static string DerToPem(byte[] der_data, bool isPrivate) {

You can use RubyEncoder class to encode/decode base64 (ReadBase64, WriteBase64). It might need some tweaks but that’s all right, feel free to change it.

-          The methods “n”, “e”, etc. should return MutableString instead of byte[]. Byte[] is not a native Ruby type.

-          You shouldn’t catch all exceptions in DecodeRSAPrivateKey, especially when you’re throwing them in the same method:

                    catch (Exception) {

                        return new RSAParameters();


Does Ruby throw any exceptions there? Which?

-          This could be done better using shift operator:

byte[] modint = { lowbyte, highbyte, 0x00, 0x00 };

count = BitConverter.ToInt32(modint, 0);

count = (lowbyte << 24) | (highbyte << 16)

-          Our coding convention is to use braces consistently and “else”, “finally”, “catch” etc. right next to closing brace:

                    if (bt == 0x81) {

                        count = binr.ReadByte();      // data size in next byte

                    } else {

As for compat, I’d target 1.9 first. Write specs and run them against both MRIs. Then we can decide based upon how much they differ.

Accessors – this is the pattern we currently use:


From: ironruby-core-bounces at rubyforge.org [mailto:ironruby-core-bounces at rubyforge.org] On Behalf Of Will Green
Sent: Monday, June 21, 2010 5:17 PM
To: ironruby-core
Subject: [Ironruby-core] OpenSSL

Hello, everyone!

After flailing about a bit this weekend with my utter lack of understanding of cryptography in general, I've started work on fleshing out OpenSSL support. I'll be working on it here: http://github.com/hotgazpacho/ironruby/tree/openssl

I've written some code, more than I probably should have without specs first :-P As this is my first stab at writing extensions for IronRuby, I would appreciate it someone from the core team could take a quick look at it and make sure I'm headed down the right path.

Now that I have a better handle as to what is going on, I'm going to proceed with some spec writing, based off of the MRI C code, found here: http://github.com/ruby/ruby/tree/ruby_1_8_7/ext/openssl

Before I get too far, should I be targeting 1.8.7, or something in the 1.9 series? I haven't checked to see how/if they differ, but I'd like to target one for now to get a base down, and perform an necessary porting later.

One more question: When defining Ruby properties, do I need to define a static C# method for each of the get and set methods, like so:
or is there a way to define a property on an underlying C# object, and mark it with a single attribute for get and set, like so:


Will Green
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://rubyforge.org/pipermail/ironruby-core/attachments/20100622/cbf5578e/attachment-0001.html>

More information about the Ironruby-core mailing list