You cannot select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
	
	
		
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
			
		
		
	
	
			185 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			JavaScript
		
	
| function SignalProtocolStore() {
 | |
|   this.store = {};
 | |
| }
 | |
| 
 | |
| SignalProtocolStore.prototype = {
 | |
|   Direction: { SENDING: 1, RECEIVING: 2 },
 | |
|   getIdentityKeyPair: function() {
 | |
|     return Promise.resolve(this.get('identityKey'));
 | |
|   },
 | |
|   getLocalRegistrationId: function() {
 | |
|     return Promise.resolve(this.get('registrationId'));
 | |
|   },
 | |
|   put: function(key, value) {
 | |
|     if (
 | |
|       key === undefined ||
 | |
|       value === undefined ||
 | |
|       key === null ||
 | |
|       value === null
 | |
|     )
 | |
|       throw new Error('Tried to store undefined/null');
 | |
|     this.store[key] = value;
 | |
|   },
 | |
|   get: function(key, defaultValue) {
 | |
|     if (key === null || key === undefined)
 | |
|       throw new Error('Tried to get value for undefined/null key');
 | |
|     if (key in this.store) {
 | |
|       return this.store[key];
 | |
|     } else {
 | |
|       return defaultValue;
 | |
|     }
 | |
|   },
 | |
|   remove: function(key) {
 | |
|     if (key === null || key === undefined)
 | |
|       throw new Error('Tried to remove value for undefined/null key');
 | |
|     delete this.store[key];
 | |
|   },
 | |
| 
 | |
|   isTrustedIdentity: function(identifier, identityKey) {
 | |
|     if (identifier === null || identifier === undefined) {
 | |
|       throw new error('tried to check identity key for undefined/null key');
 | |
|     }
 | |
|     if (!(identityKey instanceof ArrayBuffer)) {
 | |
|       throw new error('Expected identityKey to be an ArrayBuffer');
 | |
|     }
 | |
|     var trusted = this.get('identityKey' + identifier);
 | |
|     if (trusted === undefined) {
 | |
|       return Promise.resolve(true);
 | |
|     }
 | |
|     return Promise.resolve(identityKey === trusted);
 | |
|   },
 | |
|   loadIdentityKey: function(identifier) {
 | |
|     if (identifier === null || identifier === undefined)
 | |
|       throw new Error('Tried to get identity key for undefined/null key');
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.get('identityKey' + identifier));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   saveIdentity: function(identifier, identityKey) {
 | |
|     if (identifier === null || identifier === undefined)
 | |
|       throw new Error('Tried to put identity key for undefined/null key');
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         var existing = this.get('identityKey' + identifier);
 | |
|         this.put('identityKey' + identifier, identityKey);
 | |
|         if (existing && existing !== identityKey) {
 | |
|           resolve(true);
 | |
|         } else {
 | |
|           resolve(false);
 | |
|         }
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
| 
 | |
|   /* Returns a prekeypair object or undefined */
 | |
|   loadPreKey: function(keyId) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         var res = this.get('25519KeypreKey' + keyId);
 | |
|         resolve(res);
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   storePreKey: function(keyId, keyPair) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.put('25519KeypreKey' + keyId, keyPair));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   removePreKey: function(keyId) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.remove('25519KeypreKey' + keyId));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
| 
 | |
|   /* Returns a signed keypair object or undefined */
 | |
|   loadSignedPreKey: function(keyId) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         var res = this.get('25519KeysignedKey' + keyId);
 | |
|         resolve(res);
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   loadSignedPreKeys: function() {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         var res = [];
 | |
|         for (var i in this.store) {
 | |
|           if (i.startsWith('25519KeysignedKey')) {
 | |
|             res.push(this.store[i]);
 | |
|           }
 | |
|         }
 | |
|         resolve(res);
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   storeSignedPreKey: function(keyId, keyPair) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.put('25519KeysignedKey' + keyId, keyPair));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   removeSignedPreKey: function(keyId) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.remove('25519KeysignedKey' + keyId));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
| 
 | |
|   loadSession: function(identifier) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.get('session' + identifier));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   storeSession: function(identifier, record) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         resolve(this.put('session' + identifier, record));
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   removeAllSessions: function(identifier) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         for (key in this.store) {
 | |
|           if (
 | |
|             key.match(
 | |
|               RegExp('^session' + identifier.replace('+', '\\+') + '.+')
 | |
|             )
 | |
|           ) {
 | |
|             delete this.store[key];
 | |
|           }
 | |
|         }
 | |
|         resolve();
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
|   getDeviceIds: function(identifier) {
 | |
|     return new Promise(
 | |
|       function(resolve) {
 | |
|         var deviceIds = [];
 | |
|         for (key in this.store) {
 | |
|           if (
 | |
|             key.match(
 | |
|               RegExp('^session' + identifier.replace('+', '\\+') + '.+')
 | |
|             )
 | |
|           ) {
 | |
|             deviceIds.push(parseInt(key.split('.')[1]));
 | |
|           }
 | |
|         }
 | |
|         resolve(deviceIds);
 | |
|       }.bind(this)
 | |
|     );
 | |
|   },
 | |
| };
 |