public void createUser( String login, String password, int backupNbr, Captcha captcha, String answer) throws Exception { LOG.info("creating user: "******", " + password + ", " + backupNbr + ", answer=" + answer); LOG.info("captcha=" + captcha); OCPUser user = new OCPUser(this, login, backupNbr); UserPublicInfo upi = user.getPublicInfo(this); ContactMap contactMap = ds().getComponent(ContactMap.class); Contact contact = contactMap.getContact(captcha.contactId); // 1) create the public part of the user. // catpcha is required in order to avoid massive fake user creation Data publicUserData = new Data(this, user, ds().serializer.serialize(upi)); Link publicUserDataLink = new Link(user, this, UserPublicInfo.getKey(this, login), publicUserData.getKey(this)); getClient().createUser(contact, publicUserData, publicUserDataLink, captcha, answer); // 2) create the private part of the user. // no need captcha because creation of object is checked by the user // public info Key key = new Key(hash(ucrypt(password, (login + password).getBytes()))); byte[] content = ucrypt(password, ds().serializer.serialize(user)); Content privateUserData = new Data(this, user, content); Link privateUserDataLink = new Link(user, this, key, privateUserData.getKey(this)); setWithLink(user, privateUserData, privateUserDataLink); }
public Pointer set(OCPUser user, byte[] bytes) throws Exception { // 1) Create all the data objects Key[] keys = new Key[user.getBackupNbr()]; for (int i = 0; i < user.getBackupNbr(); i++) { byte[] bkp = new byte[1]; bkp[0] = (byte) i; byte[] bkpBytes = ByteUtil.concat(bkp, bytes); byte[] ciphertext = user.crypt(bkpBytes); Data data = new Data(this, user, ciphertext); keys[i] = set(data); } // 2) create the pointer link Pointer pointer = makePointer(user, keys); // 3 ) add the pointer to the user index. user.add(this, pointer); return pointer; }
public void remove(OCPUser user, Pointer pointer) throws Exception { // 1) retrieve and remove the key list from pointer Key[] keys = getKeys(user, pointer); for (int i = 0; i < keys.length; i++) { remove(user, keys[i]); } // 2) remove the pointer as a key remove(user, new Key(pointer.getBytes())); // 3) remove the pointer from the user index user.remove(this, pointer); }
private Key[] getKeys(OCPUser user, Pointer pointer) throws Exception { Key pointerKey = new Key(pointer.getBytes()); Data data = (Data) get(pointerKey); if (data == null) { throw new Exception("Cannot get keys for pointer " + pointer); } byte[] ciphertext = data.getContent(); byte[] cleartext = user.decrypt(ciphertext); Key[] keys = (Key[]) ds().serializer.deserialize(cleartext); return keys; }
public byte[] getBytes(OCPUser user, Pointer pointer) throws Exception { // 1) retrieve the key list from pointer Key[] keys = getKeys(user, pointer); // 2) from each key retrieve the object if (keys.length != user.getBackupNbr()) { throw new Exception("nbr of keys different from user backup nbr."); } byte[] result = null; // TODO : check if all bkp are identical and repair if necessary for (int i = 0; i < keys.length; i++) { Data data = (Data) get(keys[i]); if (data != null) { byte[] ciphertext = data.getContent(); byte[] cleartext = user.decrypt(ciphertext); result = ByteUtil.sub(cleartext, 1); break; } } return result; }
public void remove(OCPUser user, Key key) throws Exception { if (isLink(key)) { Link link = getLink(key); remove(user, link.getTargetKey()); } // remove the address corresponding to the key. Address[] address = getAddressList(key); for (byte i = 0; i < address.length; i++) { // sign the address byte[] addressSignature = user.sign(this, address[i].getBytes()); remove(address[i], addressSignature); } }
private Pointer makePointer(OCPUser user, Key[] keys) throws Exception { Data data = new Data(this, user, user.crypt(ds().serializer.serialize(keys))); Pointer pointer = new Pointer(set(data).getBytes()); return pointer; }