Spaces:
Running
Running
/* | |
* This is a fake SSL plugin, actual authentication and crypto | |
* is handled by browser and SocketPlugin | |
*/ | |
function SqueakSSL() { | |
"use strict"; | |
return { | |
getModuleName: function() { return 'SqueakSSL (fake)'; }, | |
interpreterProxy: null, | |
primHandler: null, | |
handleCounter: 0, | |
// Return codes from the core SSL functions | |
SQSSL_OK: 0, | |
SQSSL_NEED_MORE_DATA: -1, | |
SQSSL_INVALID_STATE: -2, | |
SQSSL_BUFFER_TOO_SMALL: -3, | |
SQSSL_INPUT_TOO_LARGE: -4, | |
SQSSL_GENERIC_ERROR: -5, | |
SQSSL_OUT_OF_MEMORY: -6, | |
// SqueakSSL getInt/setInt property IDs | |
SQSSL_PROP_VERSION: 0, | |
SQSSL_PROP_LOGLEVEL: 1, | |
SQSSL_PROP_SSLSTATE: 2, | |
SQSSL_PROP_CERTSTATE: 3, | |
// SqueakSSL getString/setString property IDs | |
SQSSL_PROP_PEERNAME: 0, | |
SQSSL_PROP_CERTNAME: 1, | |
SQSSL_PROP_SERVERNAME: 2, | |
setInterpreter: function(anInterpreter) { | |
this.interpreterProxy = anInterpreter; | |
this.primHandler = this.interpreterProxy.vm.primHandler; | |
return true; | |
}, | |
primitiveCreate: function(argCount) { | |
var name = '{SqueakJS SSL #' + (++this.handleCounter) + '}'; | |
var sqHandle = this.primHandler.makeStString(name); | |
sqHandle.handle = true; | |
this.interpreterProxy.popthenPush(argCount + 1, sqHandle); | |
return true; | |
}, | |
primitiveConnect: function(argCount) { | |
if (argCount !== 5) return false; | |
this.interpreterProxy.popthenPush(argCount + 1, 0); | |
return true; | |
}, | |
primitiveDestroy: function(argCount) { | |
if (argCount !== 1) return false; | |
this.interpreterProxy.popthenPush(argCount + 1, 1); // Non-zero if successful | |
return true; | |
}, | |
primitiveGetIntProperty: function(argCount) { | |
if (argCount !== 2) return false; | |
var handle = this.interpreterProxy.stackObjectValue(1).handle; | |
if (handle === undefined) return false; | |
var propID = this.interpreterProxy.stackIntegerValue(0); | |
var res; | |
if (propID === this.SQSSL_PROP_CERTSTATE) { | |
res = this.SQSSL_OK; // Always valid | |
} else { | |
res = 0; | |
} | |
this.interpreterProxy.popthenPush(argCount + 1, res); | |
return true; | |
}, | |
primitiveSetStringProperty: function(argCount) { | |
if (argCount !== 3) return false; | |
var handle = this.interpreterProxy.stackObjectValue(2).handle; | |
if (handle === undefined) return false; | |
// We don't actually care | |
// var propID = this.interpreterProxy.stackIntegerValue(1); | |
// var value = this.interpreterProxy.stackObjectValue(0); | |
this.interpreterProxy.pop(argCount); | |
return true; | |
}, | |
primitiveGetStringProperty: function(argCount) { | |
if (argCount !== 2) return false; | |
var handle = this.interpreterProxy.stackObjectValue(1).handle; | |
if (handle === undefined) return false; | |
var propID = this.interpreterProxy.stackIntegerValue(0); | |
var res; | |
if (propID === this.SQSSL_PROP_PEERNAME) { | |
res = this.primHandler.makeStString('*'); // Match all | |
} else { | |
res = this.interpreterProxy.nilObject(); | |
} | |
this.interpreterProxy.popthenPush(argCount + 1, res); | |
return true; | |
}, | |
primitiveEncrypt: function(argCount) { | |
if (argCount !== 5) return false; | |
var handle = this.interpreterProxy.stackObjectValue(4).handle; | |
if (handle === undefined) return false; | |
var srcBuf = this.interpreterProxy.stackObjectValue(3); | |
var start = this.interpreterProxy.stackIntegerValue(2) - 1; | |
var length = this.interpreterProxy.stackIntegerValue(1); | |
var dstBuf = this.interpreterProxy.stackObjectValue(0); | |
dstBuf.bytes = srcBuf.bytes; // Just copy all there is | |
this.interpreterProxy.popthenPush(argCount + 1, length); | |
return true; | |
}, | |
primitiveDecrypt: function(argCount) { | |
if (argCount !== 5) return false; | |
var handle = this.interpreterProxy.stackObjectValue(4).handle; | |
if (handle === undefined) return false; | |
var srcBuf = this.interpreterProxy.stackObjectValue(3); | |
var start = this.interpreterProxy.stackIntegerValue(2) - 1; | |
var length = this.interpreterProxy.stackIntegerValue(1); | |
var dstBuf = this.interpreterProxy.stackObjectValue(0); | |
dstBuf.bytes = srcBuf.bytes; // Just copy all there is | |
this.interpreterProxy.popthenPush(argCount + 1, length); | |
return true; | |
} | |
}; | |
} | |
function registerSqueakSSL() { | |
if (typeof Squeak === "object" && Squeak.registerExternalModule) { | |
Squeak.registerExternalModule('SqueakSSL', SqueakSSL()); | |
} else self.setTimeout(registerSqueakSSL, 100); | |
}; | |
registerSqueakSSL(); | |