[squeak-dev] The Inbox: CryptographyPlugins-eem.27.mcz

commits at source.squeak.org commits at source.squeak.org
Thu Jul 14 14:12:02 UTC 2022


A new version of CryptographyPlugins was added to project The Inbox:
http://source.squeak.org/inbox/CryptographyPlugins-eem.27.mcz

==================== Summary ====================

Name: CryptographyPlugins-eem.27
Author: eem
Time: 13 December 2021, 12:12:58.26405 pm
UUID: 63bc0f04-a4d3-4347-84fc-20b64ea64093
Ancestors: CryptographyPlugins-eem.26

Fix alignment crashes in DESPlugin>>#primitiveDESCookKey & SHA2Plugin>>#primitiveSHA512ProcessBufferUpdatingHash with Clang on SSE x86_64.

=============== Diff against CryptographyPlugins-mt.25 ===============

Item was changed:
  ----- Method: DESPlugin>>primitiveDESCookKey (in category 'primitives') -----
  primitiveDESCookKey
  	"preprocess the key to more useful format
  
  	param1 = raw key: ByteArray[8]
  	param2 = 1->encode 0->decode
  	param3 = cooked key:  WordArray[32]"
  
+ 	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- 	<export: true flags: #FastCPrimitiveFlag>
  
  	| rawOop cookedOop encode |
  	interpreterProxy methodArgumentCount = 3
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	rawOop := interpreterProxy stackValue: 2.
+ 	encode := interpreterProxy stackValue: 1.
+ 	cookedOop := interpreterProxy stackValue: 0.
  	((interpreterProxy isBytes: rawOop)
+ 	 and: [(interpreterProxy stSizeOf: rawOop) = 8
+ 	 and: [(interpreterProxy isIntegerObject: encode)
+ 	 and: [(interpreterProxy isWords: cookedOop)
+ 	 and: [(interpreterProxy stSizeOf: cookedOop) = 32]]]])
- 		and: [ (interpreterProxy stSizeOf: rawOop) = 8 ])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	encode := interpreterProxy stackIntegerValue: 1.
- 	cookedOop := interpreterProxy stackValue: 0.
- 	((interpreterProxy isWords: cookedOop)
- 		and: [ (interpreterProxy stSizeOf: cookedOop) = 32 ])
- 		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	self 
  		processKey: (interpreterProxy firstIndexableField: rawOop)
+ 		mode: (interpreterProxy integerValueOf: encode) ~=0
- 		mode: encode~=0
  		to: (interpreterProxy firstIndexableField: cookedOop).
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 3!

Item was changed:
  ----- Method: DESPlugin>>primitiveDESTransform (in category 'primitives') -----
  primitiveDESTransform
  	"encrypt/decrypt some data
  
  	param1 = data key: ByteArray[8]
  	param2 = cooked key:  WordArray[32]"
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| dataOop work cookedOop data |
  	<var: 'data' type: #'unsigned char*'>
  	<var: 'work' declareC: 'unsigned int work[2]'>
  	self cCode: '/* Hi ho, Hi ho...*/' inSmalltalk: [work := CArrayAccessor on: (WordArray new: 2)].
  	interpreterProxy methodArgumentCount = 2
  		ifFalse:[ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	dataOop := interpreterProxy stackValue: 1.
+ 	cookedOop := interpreterProxy stackValue: 0.
  	((interpreterProxy isBytes: dataOop)
+ 	 and: [ (interpreterProxy stSizeOf: dataOop) = 8
+ 	 and: [ (interpreterProxy isWords: cookedOop)
+ 		and: [ (interpreterProxy stSizeOf: cookedOop) = 32 ]]])
- 		and: [ (interpreterProxy stSizeOf: dataOop) = 8 ])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	cookedOop := interpreterProxy stackValue: 0.
- 	((interpreterProxy isWords: cookedOop)
- 		and: [ (interpreterProxy stSizeOf: cookedOop) = 32 ])
- 		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	data := interpreterProxy firstIndexableField: dataOop.
  	self scrunch: data to: work.
  	self encrypt: work with: (interpreterProxy firstIndexableField: cookedOop).
  	self unscrunch: work to: data.
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 2
- 	!

Item was changed:
  ----- Method: DSAPlugin>>primitiveBigDivide (in category 'primitives-integers') -----
  primitiveBigDivide
  	"Called with three LargePositiveInteger arguments, rem, div, quo. Divide div into rem and store the quotient into quo, leaving the remainder in rem."
  	"Assume: quo starts out filled with zeros."
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| rem div quo clpi |
  	interpreterProxy methodArgumentCount = 3 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	quo := interpreterProxy stackValue: 0.
  	div := interpreterProxy stackValue: 1.
  	rem := interpreterProxy stackValue: 2.
  	clpi := interpreterProxy classLargePositiveInteger.
  	((interpreterProxy fetchClassOf: rem) = clpi
  	 and: [(interpreterProxy fetchClassOf: div) = clpi
  	 and: [(interpreterProxy fetchClassOf: quo) = clpi]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	dsaRemainder := interpreterProxy firstIndexableField: rem.
  	dsaDivisor := interpreterProxy firstIndexableField: div.
  	dsaQuotient := interpreterProxy firstIndexableField: quo.
  
  	divisorDigitCount := interpreterProxy stSizeOf: div.
  	remainderDigitCount := interpreterProxy stSizeOf: rem.
  
  	"adjust pointers for base-1 indexing"
  	dsaRemainder := dsaRemainder - 1.
  	dsaDivisor := dsaDivisor - 1.
  	dsaQuotient := dsaQuotient - 1.
  
  	self bigDivideLoop.
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 3!

Item was changed:
  ----- Method: DSAPlugin>>primitiveBigMultiply (in category 'primitives-integers') -----
  primitiveBigMultiply
  	"Multiple f1 by f2, placing the result into prod. f1, f2, and prod must be LargePositiveIntegers, and the length of prod must be the sum of the lengths of f1 and f2."
  	"Assume: prod starts out filled with zeros"
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| prod f2 f1 clpi prodLen f1Len f2Len prodPtr f2Ptr f1Ptr digit carry k sum |
  	<var: #prodPtr type: #'unsigned char *'>
  	<var: #f2Ptr type: #'unsigned char *'>
  	<var: #f1Ptr type: #'unsigned char *'>
  
  	interpreterProxy methodArgumentCount = 3 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	prod := interpreterProxy stackValue: 0.
  	f2 := interpreterProxy stackValue: 1.
  	f1 := interpreterProxy stackValue: 2.
  	clpi := interpreterProxy classLargePositiveInteger.
  	((interpreterProxy fetchClassOf: prod) = clpi
  	 and: [(interpreterProxy fetchClassOf: f2) = clpi
  	 and: [(interpreterProxy fetchClassOf: f1) = clpi]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	prodLen := interpreterProxy stSizeOf: prod.
  	f1Len := interpreterProxy stSizeOf: f1.
  	f2Len := interpreterProxy stSizeOf: f2.
  	prodLen = (f1Len + f2Len) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	prodPtr := interpreterProxy firstIndexableField: prod.
  	f2Ptr := interpreterProxy firstIndexableField: f2.
  	f1Ptr := interpreterProxy firstIndexableField: f1.
  
  	0 to: f1Len-1 do: [:i | 
  		(digit := f1Ptr at: i) ~= 0 ifTrue: [
  			carry := 0.
  			k := i.
  			"Loop invariants: 0 <= carry <= 16rFF, k = i + j - 1"
  			0 to: f2Len-1 do: [:j | 
  				sum := ((f2Ptr at: j) * digit) + (prodPtr at: k) + carry.
  				carry := sum bitShift: -8.
  				prodPtr at: k put: (sum bitAnd: 255).
  				k := k + 1].
  			prodPtr at: k put: carry]].
  
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 3!

Item was changed:
  ----- Method: DSAPlugin>>primitiveExpandBlock (in category 'primitives-SHA') -----
  primitiveExpandBlock
  	"Expand a 64 byte ByteArray (the first argument) into and an Bitmap of 80 32-bit words (the second argument). When reading a 32-bit integer from the ByteArray, consider the first byte to contain the most significant bits of the word (i.e., use big-endian byte ordering)."
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| expanded buf wordPtr bytePtr src v |
  	<var: #wordPtr type: #'unsigned int *'>
  	<var: #bytePtr type: #'unsigned char *'>
  
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	expanded := interpreterProxy stackValue: 0.
  	buf := interpreterProxy stackValue: 1.
  
  	((interpreterProxy isWords: expanded)
  	 and: [(interpreterProxy isBytes: buf)
  	 and: [(interpreterProxy stSizeOf: expanded) = 80
  	 and: [(interpreterProxy stSizeOf: buf) = 64]]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	wordPtr := interpreterProxy firstIndexableField: expanded.
  	bytePtr := interpreterProxy firstIndexableField: buf.
  
  	src := 0.
  	0 to: 15 do: [:i |
  		v := ((bytePtr at: src) << 24) +
  			((bytePtr at: src + 1) << 16) +
  			((bytePtr at: src + 2) << 8) +
  			(bytePtr at: src + 3).
  		wordPtr at: i put: v.
  		src := src + 4].
  
  	16 to: 79 do: [:i |
  		v := (((wordPtr at: i - 3) bitXor:
  			 (wordPtr at: i - 8)) bitXor:
  			 (wordPtr at: i - 14)) bitXor:
  			 (wordPtr at: i - 16).
  		v := self leftRotate: v by: 1.
  		wordPtr at: i put: v].
  
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 2!

Item was changed:
  ----- Method: DSAPlugin>>primitiveHashBlock (in category 'primitives-SHA') -----
  primitiveHashBlock
  	"Hash a Bitmap of 80 32-bit words (the first argument), using the given state (the second argument)."
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| state buf statePtr bufPtr a b c d e tmp |
  	<var: #statePtr type: #'unsigned int *'>
  	<var: #bufPtr type: #'unsigned int *'>
  
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	state := interpreterProxy stackValue: 0.
  	buf := interpreterProxy stackValue: 1.
  	((interpreterProxy isWords: state)
  	 and: [(interpreterProxy isWords: buf)
  	 and: [(interpreterProxy stSizeOf: state) = 5
  	 and: [(interpreterProxy stSizeOf: buf) = 80]]]) ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	statePtr := interpreterProxy firstIndexableField: state.
  	bufPtr := interpreterProxy firstIndexableField: buf.
  
  	a := statePtr at: 0.
  	b := statePtr at: 1.
  	c := statePtr at: 2.
  	d := statePtr at: 3.
  	e := statePtr at: 4.
   
  	0 to: 19 do: [:i |
  		tmp := 16r5A827999 + ((b bitAnd: c) bitOr: (b bitInvert32 bitAnd: d)) +
  				(self leftRotate: a by: 5) +  e + (bufPtr at: i).
  		e := d.  d := c.  c := self leftRotate: b by: 30.  b := a.  a := tmp].
  
  	20 to: 39 do: [:i |
  		tmp := 16r6ED9EBA1 + ((b bitXor: c) bitXor: d) +
  				(self leftRotate: a by: 5) +  e + (bufPtr at: i).
  		e := d.  d := c.  c := self leftRotate: b by: 30.  b := a.  a := tmp].
  
  	40 to: 59 do: [:i |
  		tmp := 16r8F1BBCDC + (((b bitAnd: c) bitOr: (b bitAnd: d)) bitOr: (c bitAnd: d)) +
  				(self leftRotate: a by: 5) +  e + (bufPtr at: i).
  		e := d.  d := c.  c := self leftRotate: b by: 30.  b := a.  a := tmp].
  
  	60 to: 79 do: [:i |
  		tmp := 16rCA62C1D6 + ((b bitXor: c) bitXor: d) +
  				(self leftRotate: a by: 5) +  e + (bufPtr at: i).
  		e := d.  d := c.  c := self leftRotate: b by: 30.  b := a.  a := tmp].
  
  	statePtr at: 0 put: (statePtr at: 0) + a.
  	statePtr at: 1 put: (statePtr at: 1) + b.
  	statePtr at: 2 put: (statePtr at: 2) + c.
  	statePtr at: 3 put: (statePtr at: 3) + d.
  	statePtr at: 4 put: (statePtr at: 4) + e.
  
+ 	interpreterProxy methodReturnReceiver!
- 	interpreterProxy pop: 2!

Item was changed:
  ----- Method: DSAPlugin>>primitiveHighestNonZeroDigitIndex (in category 'primitives-integers') -----
  primitiveHighestNonZeroDigitIndex
  	"Called with one LargePositiveInteger argument. Answer the index of the top-most non-zero digit."
  
  	<export: true flags: #FastCPrimitiveFlag>
  	| arg bigIntPtr i |
  	<var: #bigIntPtr type: #'unsigned char *'>
  
  	interpreterProxy methodArgumentCount = 1 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  	arg := interpreterProxy stackValue: 0.
  	(interpreterProxy fetchClassOf: arg) = interpreterProxy classLargePositiveInteger ifFalse:
  		[^interpreterProxy primitiveFailFor: PrimErrBadArgument].
  
  	bigIntPtr := interpreterProxy firstIndexableField: arg.
  	i := interpreterProxy stSizeOf: arg.
  	[i > 0 and: [(bigIntPtr at: (i := i - 1)) = 0]] whileTrue. "scan down from end to first non-zero digit"
  
+ 	interpreterProxy methodReturnInteger: i + 1!
- 	interpreterProxy pop: 1.
- 	interpreterProxy pushInteger: i + 1!

Item was changed:
  ----- Method: MD5Plugin>>primitiveDecodeState (in category 'primitives') -----
  primitiveDecodeState
  
  	<export: true flags: #FastCPrimitiveFlag>
  	
  	| bytesOop |
  	interpreterProxy methodArgumentCount = 1 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
+ 	bytesOop := interpreterProxy stackValue: 0.
- 	bytesOop := interpreterProxy stackObjectValue: 0.
  	((interpreterProxy isBytes: bytesOop)
+ 	 and: [ (interpreterProxy stSizeOf: bytesOop) = 16 ])
- 		and: [ (interpreterProxy stSizeOf: bytesOop) = 16 ])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	self 
  		decode: (interpreterProxy firstIndexableField: bytesOop)
  		sizeInIntegers: 4.
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: MD5Plugin>>primitiveInitializeState (in category 'primitives') -----
  primitiveInitializeState
  
  	<export: true flags: #FastCPrimitiveFlag>
  	
  	| bytesOop |
  	interpreterProxy methodArgumentCount = 1 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
+ 	bytesOop := interpreterProxy stackValue: 0.
- 	bytesOop := interpreterProxy stackObjectValue: 0.
  	((interpreterProxy isBytes: bytesOop)
+ 	 and: [ (interpreterProxy stSizeOf: bytesOop) = 16 ])
- 		and: [ (interpreterProxy stSizeOf: bytesOop) = 16 ])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	self md5InitializeState: (interpreterProxy firstIndexableField: bytesOop).
  	interpreterProxy methodReturnReceiver
  !

Item was changed:
  ----- Method: MD5Plugin>>primitiveProcessBufferWithState (in category 'primitives') -----
  primitiveProcessBufferWithState
  
  	<export: true flags: #FastCPrimitiveFlag>
  	
  	| bufferOop stateOop |
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  
+ 	bufferOop := interpreterProxy stackValue: 1.
+ 	stateOop := interpreterProxy stackValue: 0.
- 	bufferOop := interpreterProxy stackObjectValue: 1.
  	((interpreterProxy isBytes: bufferOop)
+ 	and: [ (interpreterProxy stSizeOf: bufferOop) = 64
+ 	and: [(interpreterProxy isBytes: stateOop)
+ 	and: [ (interpreterProxy stSizeOf: stateOop) = 16 ]]])
- 		and: [ (interpreterProxy stSizeOf: bufferOop) = 64 ])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  
- 	stateOop := interpreterProxy stackObjectValue: 0.
- 	((interpreterProxy isBytes: stateOop)
- 		and: [ (interpreterProxy stSizeOf: stateOop) = 16 ])
- 		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 
  	self 
  		md5ProcessBuffer: (interpreterProxy firstIndexableField: bufferOop)
  		withState: (interpreterProxy firstIndexableField: stateOop).
  		
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: SHA2Plugin>>primitiveCopyDoubleWordsIntoBytesBigEndian (in category 'primitives sha512') -----
  primitiveCopyDoubleWordsIntoBytesBigEndian
  
  	<export: true flags: #FastCPrimitiveFlag>
+ 	| doubleWordsOop bytesOop doubleWordCount byteCount |
- 	| doubleWordsOop bytesOop doubleWordCount byteCount doubleWords bytes |
- 	<var: 'doubleWords' type: #'unsigned long long*'>
- 	<var: 'bytes' type: #'unsigned char*'>
  	
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  
+ 	doubleWordsOop := interpreterProxy stackValue: 1.
+ 	bytesOop := interpreterProxy stackValue: 0.
+ 	((interpreterProxy isLong64s: doubleWordsOop)
+ 	and: [interpreterProxy isBytes: bytesOop]) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	doubleWordsOop := interpreterProxy stackObjectValue: 1.
- 	"TODO: there's no easy way to check whether doubleWordsOop is a DoubleWord object, so be creative here"
- 	(interpreterProxy isWordsOrBytes: doubleWordsOop) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	doubleWordCount := interpreterProxy stSizeOf: doubleWordsOop.
- 	(interpreterProxy byteSizeOf: doubleWordsOop) = (doubleWordCount * 8) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  
+ 	doubleWordCount := interpreterProxy stSizeOf: doubleWordsOop.
- 	bytesOop := interpreterProxy stackObjectValue: 0.
- 	(interpreterProxy isBytes: bytesOop) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	byteCount := interpreterProxy stSizeOf: bytesOop.
  	doubleWordCount * 8 = byteCount ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  
- 	doubleWords := interpreterProxy firstIndexableField: doubleWordsOop.
- 	bytes := interpreterProxy firstIndexableField: bytesOop.
  	self
+ 		copyDoubleWords: (interpreterProxy firstIndexableField: doubleWordsOop)
+ 		into: (interpreterProxy firstIndexableField: bytesOop)
- 		copyDoubleWords: doubleWords
- 		into: (self cCoerce: bytes to: #'unsigned long long*')
  		count: doubleWordCount.
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: SHA2Plugin>>primitiveCopyWordsIntoBytesBigEndian (in category 'primitives sha256') -----
  primitiveCopyWordsIntoBytesBigEndian
  	"Copy all words into bytes in big-endian byte order."
  
  	<export: true flags: #FastCPrimitiveFlag>
+ 	| wordsOop bytesOop wordCount byteCount |
- 	| wordsOop bytesOop wordCount byteCount words bytes |
- 	<var: 'bytes' type: #'unsigned char*'>
- 	<var: 'words' type: #'unsigned int*'>
  	
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
+ 	wordsOop := interpreterProxy stackValue: 1.
+ 	bytesOop := interpreterProxy stackValue: 0.
+ 	((interpreterProxy isWords: wordsOop)
+ 	and: [interpreterProxy isBytes: bytesOop]) ifFalse:
+ 		[ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	wordsOop := interpreterProxy stackObjectValue: 1.
- 	(interpreterProxy isWords: wordsOop) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	bytesOop := interpreterProxy stackObjectValue: 0.
- 	(interpreterProxy isBytes: bytesOop) ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  	wordCount := interpreterProxy stSizeOf: wordsOop.
  	byteCount := interpreterProxy stSizeOf: bytesOop.
  	wordCount * 4 = byteCount ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 	words := interpreterProxy firstIndexableField: wordsOop.
- 	bytes := interpreterProxy firstIndexableField: bytesOop.
  	self
+ 		copyWords: (interpreterProxy firstIndexableField: wordsOop)
+ 		into: (interpreterProxy firstIndexableField: bytesOop)
- 		copyWords: words
- 		into: bytes
  		count: wordCount.
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: SHA2Plugin>>primitiveSHA256ProcessBufferUpdatingHash (in category 'primitives sha256') -----
  primitiveSHA256ProcessBufferUpdatingHash
  	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
+ 	| bufferOop hashOop |
- 	| bufferOop hashOop buffer hash |
- 	<var: 'buffer' type: #'unsigned char *'>
- 	<var: 'hash' type: #'unsigned int *'>
  	
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  
  	hashOop := interpreterProxy stackValue: 0.
  	bufferOop := interpreterProxy stackValue: 1.
  	((interpreterProxy isBytes: bufferOop)
  	 and: [ (interpreterProxy byteSizeOf: bufferOop) = 64
  	 and: [ (interpreterProxy isWords: hashOop)
  	 and: [ (interpreterProxy stSizeOf: hashOop) = 8 ]]])
  		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  
+ 	self sha256ProcessBuffer: (interpreterProxy firstIndexableField: bufferOop)
+ 		updatingHash: (interpreterProxy firstIndexableField: hashOop).
- 	buffer := interpreterProxy firstIndexableField: bufferOop.
- 	hash := interpreterProxy firstIndexableField: hashOop.
  
- 	self sha256ProcessBuffer: buffer updatingHash: hash.
- 
  	interpreterProxy methodReturnReceiver!

Item was changed:
  ----- Method: SHA2Plugin>>primitiveSHA512ProcessBufferUpdatingHash (in category 'primitives sha512') -----
  primitiveSHA512ProcessBufferUpdatingHash
  
+ 	<export: true flags: #(FastCPrimitiveFlag FastCPrimitiveAlignForFloatsFlag)>
- 	<export: true flags: #FastCPrimitiveFlag>
  
+ 	| bufferOop hashOop |
- 	<var: 'buffer' type: #'unsigned char*'>
- 	<var: 'hash' type: #'unsigned long long*'>
- 	| bufferOop hashOop buffer hash |
  	
  	interpreterProxy methodArgumentCount = 2 ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadNumArgs ].
  
+ 	bufferOop := interpreterProxy stackValue: 1.
+ 	hashOop := interpreterProxy stackValue: 0.
- 	bufferOop := interpreterProxy stackObjectValue: 1.
  	((interpreterProxy isBytes: bufferOop)
+ 	 and: [ (interpreterProxy stSizeOf: bufferOop) = 128
+ 	 and: [ (interpreterProxy isLong64s: hashOop)
+ 	 and: [ (interpreterProxy stSizeOf: hashOop) = 8]]]) ifFalse:
+ 		[ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 		and: [ (interpreterProxy stSizeOf: bufferOop) = 128 ])
- 		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
  
+ 	self sha512ProcessBuffer: (interpreterProxy firstIndexableField: bufferOop)
+ 		updatingHash: (interpreterProxy firstIndexableField: hashOop).
- 	hashOop := interpreterProxy stackObjectValue: 0.
- 	"TODO: there's no easy way to check whether doubleWordsOop is a DoubleWord object, so be creative here"
- 	((interpreterProxy isWordsOrBytes: hashOop)
- 		and: [ (interpreterProxy stSizeOf: hashOop) = 8
- 		and: [ (interpreterProxy byteSizeOf: hashOop) = 64 ] ])
- 		ifFalse: [ ^interpreterProxy primitiveFailFor: PrimErrBadArgument ].
- 
- 	buffer := interpreterProxy firstIndexableField: bufferOop.
- 	hash := interpreterProxy firstIndexableField: hashOop.
- 
- 	self sha512ProcessBuffer: buffer updatingHash: hash.
  	
  	interpreterProxy methodReturnReceiver!



More information about the Squeak-dev mailing list